From cea91954b7c0e9f1cb89970fad1f05880938c25e Mon Sep 17 00:00:00 2001 From: My Name is Tito Date: Tue, 20 Oct 2026 13:41:40 +1300 Subject: [PATCH] chore: fix ultracite and typecheck issues --- .changeset/26b56a05.md | 5 + .vscode/settings.json | 5 + .zed/settings.json | 16 +- __tests__/cli.test.ts | 213 ++++++++------- __tests__/client-legacy.test.js | 28 ++ __tests__/client.test.ts | 378 ++++++++++++-------------- __tests__/format.test.ts | 29 +- __tests__/index.test.ts | 23 +- __tests__/normalize.test.ts | 19 +- __tests__/release.test.ts | 21 +- __tests__/schemas.test.ts | 20 +- bun.lock | 462 ++++++++++++++++++++++---------- lefthook.yml | 32 ++- oxlint.config.ts | 7 +- package.json | 20 +- scripts/add-changeset.ts | 104 ++++--- scripts/publish.ts | 92 +++++-- src/cli.ts | 81 +++++- src/codex/auth.ts | 42 ++- src/codex/client.ts | 71 ++++- src/codex/schemas.ts | 98 ++++--- src/codex/types.ts | 76 +++--- src/errors/index.ts | 5 + src/index.ts | 7 + src/package-metadata.ts | 10 +- src/usage/format.ts | 71 ++++- src/usage/normalize.ts | 38 ++- vitest.config.ts | 11 + 28 files changed, 1267 insertions(+), 717 deletions(-) create mode 100644 .changeset/26b56a05.md create mode 100644 __tests__/client-legacy.test.js create mode 100644 vitest.config.ts diff --git a/.changeset/26b56a05.md b/.changeset/26b56a05.md new file mode 100644 index 0000000..7de5111 --- /dev/null +++ b/.changeset/26b56a05.md @@ -0,0 +1,5 @@ +--- +"@mynameistito/codex-usage": patch +--- + +Update lint/test tooling dependencies and fix the reported Ultracite and TypeScript issues. diff --git a/.vscode/settings.json b/.vscode/settings.json index ed5af0b..a7c5e7d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -55,5 +55,10 @@ }, "editor.codeActionsOnSave": { "source.fixAll.oxc": "explicit" + }, + "js/ts.tsdk.path": "node_modules/typescript/lib", + "js/ts.tsdk.promptToUseWorkspaceVersion": true, + "[astro]": { + "editor.defaultFormatter": "astro-build.astro-vscode" } } diff --git a/.zed/settings.json b/.zed/settings.json index 9250bfb..666ae56 100644 --- a/.zed/settings.json +++ b/.zed/settings.json @@ -30,10 +30,24 @@ "disableNestedConfig": false, "fixKind": "safe_fix", "run": "onType", - "typeAware": true, + "typeAware": null, "unusedDisableDirectives": "deny" } } + }, + "vtsls": { + "settings": { + "javascript": { + "preferences": { + "includePackageJsonAutoImports": "on" + } + }, + "typescript": { + "preferences": { + "includePackageJsonAutoImports": "on" + } + } + } } }, "languages": { diff --git a/__tests__/cli.test.ts b/__tests__/cli.test.ts index 883293a..f88a671 100644 --- a/__tests__/cli.test.ts +++ b/__tests__/cli.test.ts @@ -1,22 +1,31 @@ -import { afterEach, describe, expect, test } from "bun:test"; +import { spawnSync } from "node:child_process"; import { mkdtemp, rm, writeFile } from "node:fs/promises"; -import { createRequire } from "node:module"; import { tmpdir } from "node:os"; import path from "node:path"; -import { Cause, Effect } from "effect"; +import { Cause, Effect, Exit, Schema } from "effect"; +import { afterEach, describe, expect, it } from "vitest"; import { formatUnexpectedCliError, parseArgs, runCli } from "@/cli.js"; import type { JsonValue } from "@/codex/types.js"; - -const requirePackageJson = createRequire(import.meta.url); -const packageJson: { readonly name: string; readonly version: string } = - requirePackageJson("../package.json"); +import { packageTitle } from "@/package-metadata.js"; const testBaseUrl = "https://example.test/backend-api"; const originalFetch = globalThis.fetch; const tempDirs: string[] = []; +const isJsonValueArray = ( + value: JsonValue | readonly JsonValue[] +): value is readonly JsonValue[] => Array.isArray(value); + +const failureText = (exit: Exit.Exit): string => { + if (Exit.isFailure(exit)) { + return exit.cause.toString(); + } + + throw new Error("Expected the operation to fail"); +}; + interface FetchCall { readonly body: unknown; readonly headers: Headers; @@ -44,41 +53,54 @@ const createAuthFile = async (): Promise => { const mockFetch = (body: JsonValue | readonly JsonValue[]): FetchCall[] => { const calls: FetchCall[] = []; - const bodies = Array.isArray(body) ? [...body] : [body]; - // SAFETY: this test double implements the global fetch contract for every call. - globalThis.fetch = (( - input: Parameters[0], - init?: Parameters[1] - ) => { - const request = input instanceof Request ? input : null; - calls.push({ - body: init?.body, - headers: new Headers(init?.headers ?? request?.headers), - method: init?.method ?? request?.method ?? "GET", - url: request?.url ?? String(input), - }); - - return Promise.resolve(Response.json(bodies.shift() ?? body)); - }) as typeof fetch; + const bodies = isJsonValueArray(body) ? [...body] : [body]; + globalThis.fetch = Object.assign( + async (input: RequestInfo | URL, init?: Parameters[1]) => { + let url: string; + let requestHeaders: Headers | undefined; + let requestMethod: string | undefined; + + if (input instanceof Request) { + const { headers, method, url: requestUrl } = input; + url = requestUrl; + requestHeaders = headers; + requestMethod = method; + } else if (input instanceof URL) { + url = input.href; + } else { + url = input; + } + + calls.push({ + body: init?.body, + headers: new Headers(init?.headers ?? requestHeaders), + method: init?.method ?? requestMethod ?? "GET", + url, + }); + + return await Promise.resolve(Response.json(bodies.shift() ?? body)); + }, + { preconnect: () => null } + ); return calls; }; -afterEach(async () => { - globalThis.fetch = originalFetch; +describe(parseArgs, () => { + afterEach(async () => { + globalThis.fetch = originalFetch; - await Promise.all( - tempDirs - .splice(0) - .map((directory) => rm(directory, { force: true, recursive: true })) - ); -}); + await Promise.all( + tempDirs.splice(0).map(async (directory) => { + await rm(directory, { force: true, recursive: true }); + }) + ); + }); -describe("parseArgs", () => { - test("defaults to status", async () => { + it("defaults to status", async () => { const parsed = await Effect.runPromise(parseArgs([])); - expect(parsed).toEqual({ + expect(parsed).toStrictEqual({ command: "status", confirm: false, json: false, @@ -87,16 +109,13 @@ describe("parseArgs", () => { expect(parsed.baseUrl).toBeUndefined(); }); - test("requires explicit confirmation for reset through runCli", async () => { + it("requires explicit confirmation for reset through runCli", async () => { const exit = await Effect.runPromiseExit(runCli(["reset"])); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain("without --confirm"); - } + expect(failureText(exit)).toContain("without --confirm"); }); - test("help takes precedence over later commands", async () => { + it("help takes precedence over later commands", async () => { const parsed = await Effect.runPromise( parseArgs(["--help", "reset", "--confirm"]) ); @@ -104,7 +123,7 @@ describe("parseArgs", () => { expect(parsed.command).toBe("help"); }); - test("accepts verbose flags without treating them as unknown arguments", async () => { + it("accepts verbose flags without treating them as unknown arguments", async () => { const parsed = await Effect.runPromise( parseArgs(["status", "--verbose", "-v"]) ); @@ -112,8 +131,9 @@ describe("parseArgs", () => { expect(parsed.command).toBe("status"); }); - test("dispatches status json with fake auth and mocked fetch", async () => { + it("dispatches status json with fake auth and mocked fetch", async () => { const authPath = await createAuthFile(); + const calls = mockFetch({ plan_type: "pro", rate_limit: { @@ -139,7 +159,10 @@ describe("parseArgs", () => { testBaseUrl, ]) ); - const parsed: { readonly planType?: string } = JSON.parse(output); + + const parsed = Schema.decodeUnknownSync( + Schema.Struct({ planType: Schema.optionalKey(Schema.String) }) + )(JSON.parse(output)); expect(parsed.planType).toBe("pro"); expect(calls).toHaveLength(1); @@ -150,7 +173,7 @@ describe("parseArgs", () => { expect(calls[0]?.headers.get("chatgpt-account-id")).toBe("test-account-id"); }); - test("dispatches resets json with fake auth and mocked fetch", async () => { + it("dispatches resets json with fake auth and mocked fetch", async () => { const authPath = await createAuthFile(); const calls = mockFetch({ available_count: 3, credits: [] }); @@ -164,7 +187,12 @@ describe("parseArgs", () => { testBaseUrl, ]) ); - const parsed: { readonly available_count?: number } = JSON.parse(output); + + const parsed = Schema.decodeUnknownSync( + Schema.Struct({ + available_count: Schema.optionalKey(Schema.Number), + }) + )(JSON.parse(output)); expect(parsed.available_count).toBe(3); expect(calls).toHaveLength(1); @@ -172,8 +200,9 @@ describe("parseArgs", () => { expect(calls[0]?.url).toBe(`${testBaseUrl}/wham/rate-limit-reset-credits`); }); - test("dispatches confirmed reset json with the soonest-expiring credit", async () => { + it("dispatches confirmed reset json with the soonest-expiring credit", async () => { const authPath = await createAuthFile(); + const calls = mockFetch([ { available_count: 3, @@ -209,24 +238,34 @@ describe("parseArgs", () => { testBaseUrl, ]) ); - const parsed: { readonly code?: string } = JSON.parse(output); + + const parsed = Schema.decodeUnknownSync( + Schema.Struct({ code: Schema.optionalKey(Schema.String) }) + )(JSON.parse(output)); expect(parsed.code).toBe("reset"); - expect(calls).toHaveLength(2); - expect(calls[0]?.method).toBe("GET"); - expect(calls[0]?.url).toBe(`${testBaseUrl}/wham/rate-limit-reset-credits`); - expect(calls[1]?.method).toBe("POST"); - expect(calls[1]?.url).toBe( - `${testBaseUrl}/wham/rate-limit-reset-credits/consume` - ); - expect(JSON.parse(String(calls[1]?.body))).toEqual({ - credit_id: "RateLimitResetCredit_soonest", - redeem_request_id: expect.any(String), - }); + expect(calls.map(({ method, url }) => ({ method, url }))).toStrictEqual([ + { method: "GET", url: `${testBaseUrl}/wham/rate-limit-reset-credits` }, + { + method: "POST", + url: `${testBaseUrl}/wham/rate-limit-reset-credits/consume`, + }, + ]); + + const consumeRequest = Schema.decodeUnknownSync( + Schema.Struct({ + credit_id: Schema.String, + redeem_request_id: Schema.String, + }) + )(JSON.parse(String(calls[1]?.body))); + + expect(consumeRequest.credit_id).toBe("RateLimitResetCredit_soonest"); + expect(consumeRequest.redeem_request_id.length).toBeGreaterThan(0); }); - test("refuses confirmed reset when no credits are available", async () => { + it("refuses confirmed reset when no credits are available", async () => { const authPath = await createAuthFile(); + const calls = mockFetch({ available_count: 0, credits: [ @@ -249,15 +288,13 @@ describe("parseArgs", () => { ]) ); - expect(exit._tag).toBe("Failure"); expect(calls).toHaveLength(1); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain("No available reset credits"); - } + expect(failureText(exit)).toContain("No available reset credits"); }); - test("refuses confirmed reset when available credits have invalid expiry dates", async () => { + it("refuses confirmed reset when available credits have invalid expiry dates", async () => { const authPath = await createAuthFile(); + const calls = mockFetch({ available_count: 1, credits: [ @@ -280,14 +317,11 @@ describe("parseArgs", () => { ]) ); - expect(exit._tag).toBe("Failure"); expect(calls).toHaveLength(1); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain("No available reset credits"); - } + expect(failureText(exit)).toContain("No available reset credits"); }); - test("rejects insecure remote base URLs before fetching", async () => { + it("rejects insecure remote base URLs before fetching", async () => { const authPath = await createAuthFile(); const calls = mockFetch({ plan_type: "pro" }); @@ -301,52 +335,47 @@ describe("parseArgs", () => { ]) ); - expect(exit._tag).toBe("Failure"); expect(calls).toHaveLength(0); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "Base URL must use HTTPS unless it is localhost" - ); - } + expect(failureText(exit)).toContain( + "Base URL must use HTTPS unless it is localhost" + ); }); - test("exits with usage code for invalid CLI base URLs", async () => { + it("exits with usage code for invalid CLI base URLs", async () => { const authPath = await createAuthFile(); - const child = Bun.spawn( + + const child = spawnSync( + process.execPath, [ - process.execPath, - "src/cli.ts", + "dist/cli.js", "status", "--auth", authPath, "--base-url", "http://example.test", ], - { stderr: "pipe", stdout: "pipe" } + { encoding: "utf-8" } ); - const [exitCode, stderr] = await Promise.all([ - child.exited, - new Response(child.stderr).text(), - ]); - - expect(exitCode).toBe(2); - expect(stderr).toContain("Base URL must use HTTPS unless it is localhost"); + expect(child.status).toBe(2); + expect(child.stderr).toContain( + "Base URL must use HTTPS unless it is localhost" + ); }); - test("formats unexpected failures concisely by default", () => { + it("formats unexpected failures concisely by default", () => { const message = formatUnexpectedCliError(Cause.die("boom"), []); expect(message).toBe("An unexpected error occurred"); }); - test("formats unexpected failures verbosely with --verbose", () => { + it("formats unexpected failures verbosely with --verbose", () => { const message = formatUnexpectedCliError(Cause.die("boom"), ["--verbose"]); expect(message).toContain("boom"); }); - test("prints package name and version in status output", async () => { + it("prints package name and version in status output", async () => { const authPath = await createAuthFile(); mockFetch({ plan_type: "pro" }); @@ -354,8 +383,6 @@ describe("parseArgs", () => { runCli(["status", "--auth", authPath, "--base-url", testBaseUrl]) ); - expect(output.split("\n")[0]).toBe( - `${packageJson.name} v${packageJson.version}` - ); + expect(output.split("\n")[0]).toBe(packageTitle()); }); }); diff --git a/__tests__/client-legacy.test.js b/__tests__/client-legacy.test.js new file mode 100644 index 0000000..21f2150 --- /dev/null +++ b/__tests__/client-legacy.test.js @@ -0,0 +1,28 @@ +import { Effect, Exit, Redacted } from "effect"; +import { describe, expect, it } from "vitest"; + +import { createCodexClient } from "../src/codex/client.js"; + +describe("legacy consume-reset calls", () => { + it("rejects positional string arguments", async () => { + const clientExit = await Effect.runPromiseExit( + createCodexClient( + { + accessToken: Redacted.make("access-token"), + accountId: "account-id", + }, + { baseUrl: "https://example.com" } + ).pipe( + Effect.flatMap((client) => + client.consumeResetCredit("redeem-request-id") + ) + ) + ); + + const failureMessage = Exit.isFailure(clientExit) + ? clientExit.cause.toString() + : ""; + + expect(failureMessage).toContain("expects an options object"); + }); +}); diff --git a/__tests__/client.test.ts b/__tests__/client.test.ts index b95e0ca..63200f5 100644 --- a/__tests__/client.test.ts +++ b/__tests__/client.test.ts @@ -1,6 +1,5 @@ -import { afterEach, describe, expect, test } from "bun:test"; - -import { Effect, Redacted } from "effect"; +import { Effect, Exit, Redacted, Schema } from "effect"; +import { afterEach, describe, expect, it } from "vitest"; import { createCodexClient } from "@/codex/client.js"; import type { CodexClient } from "@/codex/client.js"; @@ -14,6 +13,14 @@ const tokens = { const originalFetch = globalThis.fetch; +const failureText = (exit: Exit.Exit): string => { + if (Exit.isFailure(exit)) { + return exit.cause.toString(); + } + + throw new Error("Expected the operation to fail"); +}; + const defaultOptions: CodexClientOptions = { baseUrl: "https://example.com" }; const withClient = ( @@ -23,69 +30,59 @@ const withClient = ( createCodexClient(tokens, options).pipe(Effect.flatMap(run)); const mockResponse = (body: JsonValue | readonly JsonValue[]): void => { - // SAFETY: this test double implements the global fetch contract for every call. - const fetchMock = Object.assign(() => Promise.resolve(Response.json(body)), { - preconnect: () => null, - }); + const fetchMock = Object.assign( + async () => await Promise.resolve(Response.json(body)), + { preconnect: () => null } + ); + globalThis.fetch = fetchMock; }; -describe("createCodexClient", () => { +describe(createCodexClient, () => { afterEach(() => { globalThis.fetch = originalFetch; }); - test("rejects usage responses that are arrays", async () => { + it("rejects usage responses that are arrays", async () => { mockResponse([]); const exit = await Effect.runPromiseExit( withClient((client) => client.fetchUsage()) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "Usage response was not an object" - ); - } + expect(failureText(exit)).toContain("Usage response was not an object"); }); - test("rejects insecure remote base URLs", async () => { + it("rejects insecure remote base URLs", async () => { const exit = await Effect.runPromiseExit( createCodexClient(tokens, { baseUrl: "http://example.com" }) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "Base URL must use HTTPS unless it is localhost" - ); - } + expect(failureText(exit)).toContain( + "Base URL must use HTTPS unless it is localhost" + ); }); - test("rejects unsupported loopback URL schemes", async () => { + it("rejects unsupported loopback URL schemes", async () => { const exit = await Effect.runPromiseExit( createCodexClient(tokens, { baseUrl: "ftp://localhost" }) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "Base URL must use HTTP or HTTPS" - ); - } + expect(failureText(exit)).toContain("Base URL must use HTTP or HTTPS"); }); - test("allows HTTP loopback base URLs", async () => { + it("allows HTTP loopback base URLs", async () => { const calls: string[] = []; - // SAFETY: this test double implements the global fetch contract for every call. + const fetchMock = Object.assign( - (input: Parameters[0]) => { - calls.push(String(input)); - return Promise.resolve(Response.json({ plan_type: "pro" })); + async (input: RequestInfo | URL) => { + calls.push(input instanceof Request ? input.url : input.toString()); + + return await Promise.resolve(Response.json({ plan_type: "pro" })); }, { preconnect: () => null } ); + globalThis.fetch = fetchMock; await Effect.runPromise( @@ -94,55 +91,49 @@ describe("createCodexClient", () => { }) ); - expect(calls).toEqual(["http://localhost:8787/wham/usage"]); + expect(calls).toStrictEqual(["http://localhost:8787/wham/usage"]); }); - test("rejects base URLs that include credentials", async () => { + it("rejects base URLs that include credentials", async () => { const exit = await Effect.runPromiseExit( createCodexClient(tokens, { baseUrl: "https://user:pass@example.com" }) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "Base URL must not include credentials" - ); - } + expect(failureText(exit)).toContain( + "Base URL must not include credentials" + ); }); - test("rejects base URLs that include query strings", async () => { + it("rejects base URLs that include query strings", async () => { const exit = await Effect.runPromiseExit( createCodexClient(tokens, { baseUrl: "https://example.com?query=value" }) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "Base URL must not include a query string or fragment" - ); - } + expect(failureText(exit)).toContain( + "Base URL must not include a query string or fragment" + ); }); - test("rejects base URLs that include fragments", async () => { + it("rejects base URLs that include fragments", async () => { const exit = await Effect.runPromiseExit( createCodexClient(tokens, { baseUrl: "https://example.com#fragment" }) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "Base URL must not include a query string or fragment" - ); - } + expect(failureText(exit)).toContain( + "Base URL must not include a query string or fragment" + ); }); - test("only appends backend-api for exact ChatGPT hostnames", async () => { + it("only appends backend-api for exact ChatGPT hostnames", async () => { const calls: string[] = []; - // SAFETY: this test double implements the global fetch contract for every call. - globalThis.fetch = ((input: Parameters[0]) => { - calls.push(String(input)); - return Promise.resolve(Response.json({ plan_type: "pro" })); - }) as typeof fetch; + globalThis.fetch = Object.assign( + async (input: RequestInfo | URL) => { + calls.push(input instanceof Request ? input.url : input.toString()); + + return await Promise.resolve(Response.json({ plan_type: "pro" })); + }, + { preconnect: () => null } + ); await Effect.runPromise( withClient((client) => client.fetchUsage(), { @@ -150,16 +141,19 @@ describe("createCodexClient", () => { }) ); - expect(calls).toEqual(["https://chatgpt.com.evil.test/wham/usage"]); + expect(calls).toStrictEqual(["https://chatgpt.com.evil.test/wham/usage"]); }); - test("appends backend-api for exact ChatGPT hostnames", async () => { + it("appends backend-api for exact ChatGPT hostnames", async () => { const calls: string[] = []; - // SAFETY: this test double implements the global fetch contract for every call. - globalThis.fetch = ((input: Parameters[0]) => { - calls.push(String(input)); - return Promise.resolve(Response.json({ plan_type: "pro" })); - }) as typeof fetch; + globalThis.fetch = Object.assign( + async (input: RequestInfo | URL) => { + calls.push(input instanceof Request ? input.url : input.toString()); + + return await Promise.resolve(Response.json({ plan_type: "pro" })); + }, + { preconnect: () => null } + ); await Effect.runPromise( withClient((client) => client.fetchUsage(), { @@ -167,38 +161,32 @@ describe("createCodexClient", () => { }) ); - expect(calls).toEqual(["https://chatgpt.com/backend-api/wham/usage"]); + expect(calls).toStrictEqual(["https://chatgpt.com/backend-api/wham/usage"]); }); - test("rejects unexpected ChatGPT base URL paths", async () => { + it("rejects unexpected ChatGPT base URL paths", async () => { const exit = await Effect.runPromiseExit( createCodexClient(tokens, { baseUrl: "https://chatgpt.com/foo" }) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "ChatGPT base URL path must be /backend-api or omitted" - ); - } + expect(failureText(exit)).toContain( + "ChatGPT base URL path must be /backend-api or omitted" + ); }); - test("rejects ChatGPT paths that only prefix backend-api", async () => { + it("rejects ChatGPT paths that only prefix backend-api", async () => { const exit = await Effect.runPromiseExit( createCodexClient(tokens, { baseUrl: "https://chatgpt.com/backend-api-v2", }) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "ChatGPT base URL path must be /backend-api or omitted" - ); - } + expect(failureText(exit)).toContain( + "ChatGPT base URL path must be /backend-api or omitted" + ); }); - test("rejects malformed nested rate limit windows", async () => { + it("rejects malformed nested rate limit windows", async () => { mockResponse({ plan_type: "pro", rate_limit: { @@ -210,232 +198,208 @@ describe("createCodexClient", () => { withClient((client) => client.fetchUsage()) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "Usage response had an invalid shape" - ); - } + expect(failureText(exit)).toContain("Usage response had an invalid shape"); }); - test("rejects reset credits responses that are arrays", async () => { + it("rejects reset credits responses that are arrays", async () => { mockResponse([]); const exit = await Effect.runPromiseExit( withClient((client) => client.fetchResetCredits()) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "Reset credits response was not an object" - ); - } + expect(failureText(exit)).toContain( + "Reset credits response was not an object" + ); }); - test("rejects malformed reset credits payloads", async () => { + it("rejects malformed reset credits payloads", async () => { mockResponse({ available_count: "not-a-number" }); const exit = await Effect.runPromiseExit( withClient((client) => client.fetchResetCredits()) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "Reset credits response had an invalid shape" - ); - } + expect(failureText(exit)).toContain( + "Reset credits response had an invalid shape" + ); }); - test("rejects non-object reset credit entries", async () => { + it("rejects non-object reset credit entries", async () => { mockResponse({ credits: [null] }); const exit = await Effect.runPromiseExit( withClient((client) => client.fetchResetCredits()) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "Reset credits response had an invalid shape" - ); - } + expect(failureText(exit)).toContain( + "Reset credits response had an invalid shape" + ); }); - test("rejects reset credit entries with invalid field types", async () => { + it("rejects reset credit entries with invalid field types", async () => { mockResponse({ credits: [{ expires_at: 123 }] }); const exit = await Effect.runPromiseExit( withClient((client) => client.fetchResetCredits()) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "Reset credits response had an invalid shape" - ); - } + expect(failureText(exit)).toContain( + "Reset credits response had an invalid shape" + ); }); - test("rejects consume reset responses that are arrays", async () => { + it("rejects consume reset responses that are arrays", async () => { mockResponse([]); const exit = await Effect.runPromiseExit( withClient((client) => client.consumeResetCredit()) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "Consume reset response was not an object" - ); - } + expect(failureText(exit)).toContain( + "Consume reset response was not an object" + ); }); - test("rejects malformed consume reset responses", async () => { + it("rejects malformed consume reset responses", async () => { mockResponse({ code: "reset", windows_reset: "not-a-number" }); const exit = await Effect.runPromiseExit( withClient((client) => client.consumeResetCredit()) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "Consume reset response had an invalid shape" - ); - } + expect(failureText(exit)).toContain( + "Consume reset response had an invalid shape" + ); }); - test("accepts known consume reset response codes", async () => { + it("accepts known consume reset response codes", async () => { const codes = [ "already_redeemed", "no_credit", "nothing_to_reset", "reset", ] as const; + let nextCode = 0; - // SAFETY: this test double implements the global fetch contract for every call. + const fetchMock = Object.assign( - () => { + async () => { const code = codes[nextCode]; nextCode += 1; - return Promise.resolve(Response.json({ code, windows_reset: 1 })); + + return await Promise.resolve(Response.json({ code, windows_reset: 1 })); }, { preconnect: () => null } ); + globalThis.fetch = fetchMock; const responses = await Promise.all( - codes.map(() => - Effect.runPromise(withClient((client) => client.consumeResetCredit())) + codes.map( + async () => + await Effect.runPromise( + withClient((client) => client.consumeResetCredit()) + ) ) ); - expect(responses).toEqual( + expect(responses).toStrictEqual( codes.map((code) => ({ code, windows_reset: 1 })) ); }); - test("rejects unknown consume reset response codes", async () => { + it("rejects unknown consume reset response codes", async () => { mockResponse({ code: "unexpected", windows_reset: 1 }); const exit = await Effect.runPromiseExit( withClient((client) => client.consumeResetCredit()) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain( - "Consume reset response had an invalid shape" - ); - } - }); - - test("rejects legacy positional string arguments", async () => { - const exit = await Effect.runPromiseExit( - withClient((client) => - client.consumeResetCredit( - // SAFETY: this intentionally passes a legacy string to test runtime rejection. - "redeem-request-id" as Parameters< - CodexClient["consumeResetCredit"] - >[0] - ) - ) + expect(failureText(exit)).toContain( + "Consume reset response had an invalid shape" ); - - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - expect(exit.cause.toString()).toContain("expects an options object"); - } }); - test("treats null options as defaults", async () => { + it("treats null options as defaults", async () => { const bodies: unknown[] = []; - // SAFETY: this test double implements the global fetch contract for every call. - globalThis.fetch = (( - _input: Parameters[0], - init?: Parameters[1] - ) => { - bodies.push(init?.body); - return Promise.resolve( - Response.json({ code: "reset", windows_reset: 1 }) - ); - }) as typeof fetch; + globalThis.fetch = Object.assign( + async (_input: RequestInfo | URL, init?: Parameters[1]) => { + bodies.push(init?.body); + + return await Promise.resolve( + Response.json({ code: "reset", windows_reset: 1 }) + ); + }, + { preconnect: () => null } + ); await Effect.runPromise( withClient((client) => client.consumeResetCredit(null)) ); - expect(JSON.parse(String(bodies[0]))).toEqual({ - redeem_request_id: expect.any(String), - }); + const requestSchema = Schema.Struct({ redeem_request_id: Schema.String }); + + const requestBody = Schema.decodeUnknownSync(requestSchema)( + JSON.parse(String(bodies[0])) + ); + + expect(requestBody.redeem_request_id.length).toBeGreaterThan(0); }); - test("reuses redeem_request_id when the consume effect is retried", async () => { + it("reuses redeem_request_id when the consume effect is retried", async () => { const bodies: unknown[] = []; let attempt = 0; - // SAFETY: this test double implements the global fetch contract for every call. - globalThis.fetch = (( - _input: Parameters[0], - init?: Parameters[1] - ) => { - bodies.push(init?.body); - attempt += 1; - if (attempt === 1) { - return Promise.reject(new DOMException("timeout", "TimeoutError")); - } - return Promise.resolve( - Response.json({ code: "reset", windows_reset: 1 }) - ); - }) as typeof fetch; + globalThis.fetch = Object.assign( + async (_input: RequestInfo | URL, init?: Parameters[1]) => { + bodies.push(init?.body); + attempt += 1; + + if (attempt === 1) { + throw new DOMException("timeout", "TimeoutError"); + } + + return await Promise.resolve( + Response.json({ code: "reset", windows_reset: 1 }) + ); + }, + { preconnect: () => null } + ); await Effect.runPromise( withClient((client) => { const consume = client.consumeResetCredit(); + return consume.pipe(Effect.retry({ times: 1 })); }) ); expect(bodies).toHaveLength(2); - const first = JSON.parse(String(bodies[0])); - const second = JSON.parse(String(bodies[1])); + const requestSchema = Schema.Struct({ redeem_request_id: Schema.String }); + + const first = Schema.decodeUnknownSync(requestSchema)( + JSON.parse(String(bodies[0])) + ); + + const second = Schema.decodeUnknownSync(requestSchema)( + JSON.parse(String(bodies[1])) + ); + expect(first.redeem_request_id).toBe(second.redeem_request_id); }); - test("sends creditId when provided via options object", async () => { + it("sends creditId when provided via options object", async () => { const bodies: unknown[] = []; - // SAFETY: this test double implements the global fetch contract for every call. - globalThis.fetch = (( - _input: Parameters[0], - init?: Parameters[1] - ) => { - bodies.push(init?.body); - return Promise.resolve( - Response.json({ code: "reset", windows_reset: 1 }) - ); - }) as typeof fetch; + globalThis.fetch = Object.assign( + async (_input: RequestInfo | URL, init?: Parameters[1]) => { + bodies.push(init?.body); + + return await Promise.resolve( + Response.json({ code: "reset", windows_reset: 1 }) + ); + }, + { preconnect: () => null } + ); await Effect.runPromise( withClient((client) => @@ -446,7 +410,7 @@ describe("createCodexClient", () => { ) ); - expect(JSON.parse(String(bodies[0]))).toEqual({ + expect(JSON.parse(String(bodies[0]))).toStrictEqual({ credit_id: "RateLimitResetCredit_test", redeem_request_id: "redeem-request-id", }); diff --git a/__tests__/format.test.ts b/__tests__/format.test.ts index 409e40d..1eff83f 100644 --- a/__tests__/format.test.ts +++ b/__tests__/format.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, setSystemTime, test } from "bun:test"; +import { describe, expect, it, vi } from "vitest"; import type { CodexUsagePayload, @@ -7,8 +7,8 @@ import type { import { formatResetCredits, formatUsage } from "@/usage/format.js"; import { normalizeUsagePayload } from "@/usage/normalize.js"; -describe("formatUsage", () => { - test("prints usage windows and reset credits", () => { +describe(formatUsage, () => { + it("prints usage windows and reset credits", () => { const payload: CodexUsagePayload = { plan_type: "pro", rate_limit: { @@ -32,17 +32,14 @@ describe("formatUsage", () => { normalizeUsagePayload(payload, new Date("2026-06-19T00:00:00Z")) ); - expect(output).toContain("Codex usage"); - expect(output).toContain("Plan: Pro"); - expect(output).toContain("Reset credits available: 3"); - expect(output).toContain("5h limit"); - expect(output).toContain("Weekly limit"); - expect(output).toContain("75% left"); + expect(output).toMatch( + /Codex usage[\s\S]*Plan: Pro[\s\S]*Reset credits available: 3[\s\S]*5h limit[\s\S]*75% left[\s\S]*Weekly limit/u + ); }); }); -describe("formatResetCredits", () => { - test("prints reset credit details", () => { +describe(formatResetCredits, () => { + it("prints reset credit details", () => { const payload: RateLimitResetCreditsPayload = { available_count: 1, credits: [ @@ -63,7 +60,7 @@ describe("formatResetCredits", () => { expect(output).toContain("...23456789"); }); - test("prints recently expired reset credits as expired", () => { + it("prints recently expired reset credits as expired", () => { const payload: RateLimitResetCreditsPayload = { available_count: 0, credits: [ @@ -79,12 +76,13 @@ describe("formatResetCredits", () => { expect(formatResetCredits(payload)).toContain("expired"); }); - test("labels expiry relative to the local calendar day", () => { + it("labels expiry relative to the local calendar day", () => { const previousTz = process.env.TZ; process.env.TZ = "Pacific/Auckland"; const fixedNow = new Date(2026, 6, 7, 23, 0, 0); - setSystemTime(fixedNow); + vi.useFakeTimers(); + vi.setSystemTime(fixedNow); try { const payload: RateLimitResetCreditsPayload = { @@ -102,7 +100,8 @@ describe("formatResetCredits", () => { expect(formatResetCredits(payload)).toContain("expires tomorrow"); expect(formatResetCredits(payload)).not.toContain("expires today"); } finally { - setSystemTime(); + vi.useRealTimers(); + if (previousTz === undefined) { delete process.env.TZ; } else { diff --git a/__tests__/index.test.ts b/__tests__/index.test.ts index 7e628bf..b59fff0 100644 --- a/__tests__/index.test.ts +++ b/__tests__/index.test.ts @@ -1,4 +1,6 @@ -import { describe, expect, test } from "bun:test"; +import { execFileSync } from "node:child_process"; + +import { describe, expect, it } from "vitest"; import { CliError, @@ -10,7 +12,7 @@ import { import type { CodexUsageError } from "@/index.js"; describe("public exports", () => { - test("exports error classes from the package root", () => { + it("exports error classes from the package root", () => { const errors: CodexUsageError[] = [ new CodexAuthError({ message: "missing auth" }), new CodexConfigError({ message: "invalid base URL" }), @@ -26,7 +28,7 @@ describe("public exports", () => { expect(new CliError({ exitCode: 1, message: "failed" })).toBeInstanceOf( CliError ); - expect(errors.map((error) => error._tag)).toEqual([ + expect(errors.map((error) => error._tag)).toStrictEqual([ "CodexAuthError", "CodexConfigError", "CodexHttpError", @@ -34,18 +36,11 @@ describe("public exports", () => { ]); }); - test("built CLI prints help without accessing the network", async () => { - await Bun.$`bun run build`.quiet(); - - const child = Bun.spawn([process.execPath, "dist/cli.js", "--help"], { - stdout: "pipe", + it("built CLI prints help without accessing the network", () => { + const stdout = execFileSync(process.execPath, ["dist/cli.js", "--help"], { + encoding: "utf-8", }); - const [exitCode, stdout] = await Promise.all([ - child.exited, - new Response(child.stdout).text(), - ]); - expect(exitCode).toBe(0); - expect(stdout).toStartWith("codex-usage\n\nUsage:"); + expect(stdout.startsWith("codex-usage\n\nUsage:")).toBeTruthy(); }, 15_000); }); diff --git a/__tests__/normalize.test.ts b/__tests__/normalize.test.ts index 6abfbd3..e94fdb6 100644 --- a/__tests__/normalize.test.ts +++ b/__tests__/normalize.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, it } from "vitest"; import type { CodexUsagePayload } from "@/codex/types.js"; import { @@ -6,20 +6,20 @@ import { normalizeUsagePayload, } from "@/usage/normalize.js"; -describe("limitLabelForWindow", () => { - test("labels known Codex windows by duration", () => { +describe(limitLabelForWindow, () => { + it("labels known Codex windows by duration", () => { expect(limitLabelForWindow(18_000, "primary")).toBe("5h"); expect(limitLabelForWindow(604_800, "secondary")).toBe("weekly"); }); - test("falls back by window kind for unknown durations", () => { + it("falls back by window kind for unknown durations", () => { expect(limitLabelForWindow(123, "primary")).toBe("usage"); expect(limitLabelForWindow(123, "secondary")).toBe("secondary usage"); }); }); -describe("normalizeUsagePayload", () => { - test("maps main and additional limits", () => { +describe(normalizeUsagePayload, () => { + it("maps main and additional limits", () => { const payload: CodexUsagePayload = { additional_rate_limits: [ { @@ -64,10 +64,9 @@ describe("normalizeUsagePayload", () => { expect(usage.resetCreditsAvailable).toBe(2); expect(usage.limits).toHaveLength(2); - expect(usage.limits[0]?.windows.map((window) => window.label)).toEqual([ - "5h", - "weekly", - ]); + expect( + usage.limits[0]?.windows.map((window) => window.label) + ).toStrictEqual(["5h", "weekly"]); expect(usage.limits[1]?.windows[0]?.label).toBe("daily"); }); }); diff --git a/__tests__/release.test.ts b/__tests__/release.test.ts index 447bcfb..74017c9 100644 --- a/__tests__/release.test.ts +++ b/__tests__/release.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { describe, expect, it } from "vitest"; import { extractReleaseNotes, runNpmRelease } from "../scripts/publish.js"; import type { CommandResult } from "../scripts/publish.js"; @@ -10,7 +10,7 @@ const result = (exitCode: number, stdout = "", stderr = ""): CommandResult => ({ }); describe("release helpers", () => { - test("matches the exact changelog version heading", () => { + it("matches the exact changelog version heading", () => { const changelog = [ "## 1.2.30", "Wrong release notes", @@ -24,14 +24,15 @@ describe("release helpers", () => { ); }); - test("does not stage after an npm view error", async () => { + it("does not stage after an npm view error", async () => { const calls: string[][] = []; await expect( runNpmRelease( - (command, args) => { + async (command, args) => { calls.push([command, ...args]); - return Promise.resolve(result(1, "", "npm error code E401")); + + return await Promise.resolve(result(1, "", "npm error code E401")); }, { name: "example", version: "1.0.0" } ) @@ -40,24 +41,26 @@ describe("release helpers", () => { expect(calls).toHaveLength(1); }); - test("stages directly with trusted publishing", async () => { + it("stages directly with trusted publishing", async () => { const calls: string[][] = []; + const responses = [ result(1, "", "npm error code E404"), result(0, "staged"), ]; await runNpmRelease( - (command, args) => { + async (command, args) => { calls.push([command, ...args]); - return Promise.resolve( + + return await Promise.resolve( responses.shift() ?? result(1, "", "unexpected call") ); }, { name: "example", version: "1.0.0" } ); - expect(calls).toEqual([ + expect(calls).toStrictEqual([ ["npm", "view", "example@1.0.0", "version"], ["npm", "stage", "publish", "."], ]); diff --git a/__tests__/schemas.test.ts b/__tests__/schemas.test.ts index 79a14f1..503779b 100644 --- a/__tests__/schemas.test.ts +++ b/__tests__/schemas.test.ts @@ -1,11 +1,10 @@ -import { describe, expect, test } from "bun:test"; - -import { Effect } from "effect"; +import { Effect, Exit } from "effect"; +import { describe, expect, it } from "vitest"; import { parseResetCreditsPayload } from "@/codex/schemas.js"; -describe("parseResetCreditsPayload", () => { - test("does not embed rejected response values in parse error messages", async () => { +describe(parseResetCreditsPayload, () => { + it("does not embed rejected response values in parse error messages", async () => { const exit = await Effect.runPromiseExit( parseResetCreditsPayload({ available_count: "not-a-number", @@ -18,12 +17,9 @@ describe("parseResetCreditsPayload", () => { }) ); - expect(exit._tag).toBe("Failure"); - if (exit._tag === "Failure") { - const message = exit.cause.toString(); - expect(message).toContain("Reset credits response had an invalid shape"); - expect(message).not.toContain("RateLimitResetCredit_secret123456789"); - expect(message).not.toContain("not-a-number"); - } + const message = Exit.isFailure(exit) ? exit.cause.toString() : ""; + expect(message).toContain("Reset credits response had an invalid shape"); + expect(message).not.toContain("RateLimitResetCredit_secret123456789"); + expect(message).not.toContain("not-a-number"); }); }); diff --git a/bun.lock b/bun.lock index 2220dc8..2204b29 100644 --- a/bun.lock +++ b/bun.lock @@ -5,21 +5,25 @@ "": { "name": "@mynameistito/codex-usage", "dependencies": { - "effect": "4.0.2", + "effect": "4.0.5", }, "devDependencies": { "@changesets/cli": "^3.0.3", - "@types/bun": "^1.4.2", + "@types/bun": "^1.4.3", "@typescript/native": "npm:typescript@^7.0.2", "eslint-plugin-github": "6.1.2", + "eslint-plugin-jsdoc": "^65.1.0", "eslint-plugin-sonarjs": "^4.2.2", - "knip": "^6.41.0", - "lefthook": "^2.2.1", - "oxfmt": "^0.72.0", - "oxlint": "^1.87.0", + "eslint-plugin-tsdoc": "^0.5.4", + "knip": "^6.42.1", + "lefthook": "^2.2.2", + "oxfmt": "^0.71.0", + "oxlint": "^1.86.0", + "oxlint-tsgolint": "^7.0.2004", "tsdown": "^0.23.1", "typescript": "npm:@typescript/typescript6@^6.0.2", - "ultracite": "8.0.0", + "ultracite": "8.0.1", + "vitest": "^5.0.5", }, }, }, @@ -70,12 +74,18 @@ "@clack/prompts": ["@clack/prompts@1.8.1", "", { "dependencies": { "@clack/core": "1.5.1", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ=="], + "@dual-bundle/import-meta-resolve": ["@dual-bundle/import-meta-resolve@4.2.1", "", {}, "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg=="], + "@emnapi/core": ["@emnapi/core@1.11.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="], "@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="], "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], + "@es-joy/jsdoccomment": ["@es-joy/jsdoccomment@0.98.0", "", { "dependencies": { "@types/estree": "^1.0.9", "@typescript-eslint/types": "^8.70.0", "comment-parser": "1.4.9", "esquery": "^1.7.0", "jsdoc-type-pratt-parser": "~9.2.2" } }, "sha512-QS+b7I2aaSM+gZfDz1b9E4B367JJ2qTjFXRKF289iKkh9sYdZ21Q5MiF/Duzouy3J0C4VhM3I/8f2F4+zT8gYQ=="], + + "@es-joy/resolve.exports": ["@es-joy/resolve.exports@1.2.0", "", {}, "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g=="], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.10.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], @@ -108,6 +118,12 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.6.0", "", {}, "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + "@keyv/bigmap": ["@keyv/bigmap@1.3.1", "", { "dependencies": { "hashery": "^1.4.0", "hookified": "^1.15.0" }, "peerDependencies": { "keyv": "^5.6.0" } }, "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ=="], "@keyv/serialize": ["@keyv/serialize@1.1.1", "", {}, "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA=="], @@ -118,6 +134,10 @@ "@manypkg/tools": ["@manypkg/tools@2.1.2", "", { "dependencies": { "jju": "^1.4.0", "tinyglobby": "^0.2.13", "yaml": "^2.9.0" } }, "sha512-6QEf6yqFbETdwGITKq57aYoPfX/3K8XFNwsAlx0C1M7o8cb79sv1M3w+tWuWvIcSbNqrLF7OD7YpZMVVz335hQ=="], + "@microsoft/tsdoc": ["@microsoft/tsdoc@0.17.1", "", {}, "sha512-VHyYyyoH63jFoO3shpw9Zfijk5v/9p/VrClW35z0/q6ooK7sSmxpzOkS4iZPxs3vO4XtBW4H38HRAKkAMIK7DA=="], + + "@microsoft/tsdoc-config": ["@microsoft/tsdoc-config@0.18.3", "", { "dependencies": { "@microsoft/tsdoc": "0.17.1", "ajv": "~8.18.0", "jju": "~1.4.0", "resolve": "~1.22.2" } }, "sha512-0I0rGXo1eJziw3EEErkDS9p/0RzBcyOiV+zbSDqOZTeURmhtut+WIvpih0LM5g+ZpZ9SyFxDfkhAcl/r8e2zGw=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.2.5", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, "sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA=="], "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], @@ -126,45 +146,45 @@ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - "@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.153.0", "", { "os": "android", "cpu": "arm" }, "sha512-BcWu25dMwMjHpaDCEidmpAi7rGg1qZoihJeUUH9bD55pVZ0z4Wa5CQgqSTo0R41H81oozisQKW3WqvAN2m77IQ=="], + "@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.154.0", "", { "os": "android", "cpu": "arm" }, "sha512-sDdEtDl7vKdCvf54j72RJbowE3jCmyRz/+oOB6IAwQxAHZ0eI+Dcj4hvVnm0b9Dy31plUkdmfds9C+/Zt895Tg=="], - "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.153.0", "", { "os": "android", "cpu": "arm64" }, "sha512-9l5rdp2DhRqVriBHsNpu5cEf+hizZ4B58rt93HzyQEBUgZiC6qe2oFpaAAnXGCxHGnQExI1s7S2G0QhFacUZ6w=="], + "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.154.0", "", { "os": "android", "cpu": "arm64" }, "sha512-UHrDPELzvWZoVkIDdSycj4bzcTMCJG3IbN++mSUgVBaUtNtWHjQ98U6Vz5bpF/1Ic3FYJyYhMr74huO5tVvpZw=="], - "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.153.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-EcpsyRXHhENDpekpG4QNaSZj2F/BAz4Gh4o89zZwNss86R8KyRSQ6sXbAj74Xyeb4z3j/yBZZ6joQZhraIWyfw=="], + "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.154.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-mokYzajOSXxtSRDWCdHARGdntrKH+rZZ24Jzo8AtafyNzz0NARmpMm26Tc5B6qiGrr6UliWibHCOif1qRN2vaA=="], - "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.153.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-hlj80HUQy07/2lYp6rmxH+3u+H2ik3rjLR52CUdPApxmZCNxASDUf/+ykTzAHS/fehftmVMATKvPaWmuLHuasg=="], + "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.154.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-WbtUBrclOVItWfLRSvs+Z/WLtXxJ2Ctv50PyuX894HzDN5/e0qzxVpTNPIVMzOerBhgKtFsSMcfxlYIAbvdVgg=="], - "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.153.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-fWRcv2pMSh1qtez46MOu8vuUJ5fiaQZPHSphbWulbL7SHBMKfRgZl2PzjXZYQJbq7NEXyXbgIuIuUm+/Rmkv8w=="], + "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.154.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-YooHZSLawOe2fqm+lDdG8oAaQh2NYV/RMYTYzWRLy72stm2BgE9O/8Al6kFENjkmzyyBccDLLBirGxVtpzQfrw=="], - "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.153.0", "", { "os": "linux", "cpu": "arm" }, "sha512-paZeUK1GXShl/bOJQET1/8AQxayFeuN4SIWAkgTRxE7ZQwv9uYSB2n0648smygP22N7jcI3zxAm0Z+ALNiIKxg=="], + "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.154.0", "", { "os": "linux", "cpu": "arm" }, "sha512-hKOwhZbrXdTwc4bGVfbLCXl9f2swl6zWdISocLQSNX9MgPmwHE3qGzOUkCrkuGpwdCVHPnkfOwsqTuYsrP5uNg=="], - "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.153.0", "", { "os": "linux", "cpu": "arm" }, "sha512-qFPp5NwMf4K1C0O+DCVGmcbOaYyYAq98Rvv9p4VSfb777iUwlJCqMUxf6QG9N5f5ls4TEX6LitOZHi+6GL6rYQ=="], + "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.154.0", "", { "os": "linux", "cpu": "arm" }, "sha512-tnjiooXEU013349O/yxKbF5Cusp1CfHWQ8kYR8tGeRzR/P4sOpQGQo21fsS71M0fMD6ESLq+lbvXFWi43PuKeQ=="], - "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.153.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-oufEhZCX7saeo27Logra8cvBR1jQ/yw2zUI2hHmWw3qA/XYqEW31FOvLQBv7DWN32NjVdlcaP11WBBZTJo4k9g=="], + "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.154.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Cao2kj+8d7BT6XJU1gV9eVQjV+Cr+e8vQm3tddDRZiM2hHrMDxwy3j6t+ofaSl0idyuPPCZ4AlpmQoj8yOT1QA=="], - "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.153.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-zXYzuAqng85h6+LI3iRm0zeMLX1/K2z41ZAMWxVRgt0D10VvZUaV5q+TEB46KDhoKBpdexoTLC6QoB/EiP2oqQ=="], + "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.154.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-uiwA0V3q8llWA7/8r+a9BBjk4j5YMDmi6wfOsyQfGOJMQSLHEiZ3HI8ulea766ykUa9wJFWk9XWEl4uJrZLQqw=="], - "@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.153.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-J7+NLwLEzdkKM9cKyPHH/AjXXstWOs98KYgLrPPnO4N9MO8EZRBfPNnBcS3S67uMOBkRpUmCl2FhRnWdQ5CbBA=="], + "@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.154.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-LICfN0Xs4Zdko+bJy6eOAEQojDuIR26suF2JtOsMaXjgbCrpRSH7/NCvJhY13YvYBx12V6hnwrL8n0lk0rbNJQ=="], - "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.153.0", "", { "os": "linux", "cpu": "none" }, "sha512-sD0K11GQTLWylln54nPMMTtgmBbQrR5It/vMpZpy/fogiw8O2AvIE+9LuWUXddrWk9zvFIHGRcSgFn4IHOfoYg=="], + "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.154.0", "", { "os": "linux", "cpu": "none" }, "sha512-gbbSYxLF8ssRbQ2qQPy+2EhGNwNH1bAoRdkk6cnWaKHqmCikpSIPtpXjFbCCtjTi0uojqOM3ghFQwQPbDQsU0Q=="], - "@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.153.0", "", { "os": "linux", "cpu": "none" }, "sha512-7L66uql2BhvSz51LwfExjOdn6et/ydTiQxl23VApdKzJhTc3TczA1Qt6VR/UcvlQrL2ZbytIJb447vh7p5wmUw=="], + "@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.154.0", "", { "os": "linux", "cpu": "none" }, "sha512-nSnRYYDLCcRVjSQzF3g6rKqCNYwo5o+aQgnn8BBXfe+ofCgMGlGqkfRyvXm6ptZvoxNkkWtLlqM8W7Xc3j6ZnQ=="], - "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.153.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hXV3T7mNyrPR19rbPYkglkQJtoM/UNo/xwbZeeqdAxEg8PXgb4LXXuxPpGgI4bzRRCWwLUxdDSS58xIyC2u1TA=="], + "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.154.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-BxBQoJKtzRQgZEKQIt6CDUm8RGKC5T8Qo4576yDa5/xgc10X3fBDItMbRabzLtbUBfTqKLl+8AVr/H6CF7W22g=="], - "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.153.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Da8Vqs1xdtoDYtEjmozD7wGgJeLBQkMbR0WUBECOSxodyX5DXy8ySlvJWbukyO2Q0+TM9EK+4LT6tbq0jCg4hQ=="], + "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.154.0", "", { "os": "linux", "cpu": "x64" }, "sha512-/whkust2vYy+GjRUVL5cWaJmEu6jkdFfo5mkxgckyeOX61eMwo4iBoiwzeJZeMWAdzb/XOtQyLApHhFht3sOWA=="], - "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.153.0", "", { "os": "linux", "cpu": "x64" }, "sha512-zGAPxNTIIw6X5WyTRscIFE/oDjpdNtrrl32ing6NOXdGjzRucadnxBilexLdeYQ9YxixF93GujpXyQ0jw7ddSg=="], + "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.154.0", "", { "os": "linux", "cpu": "x64" }, "sha512-EXURTyW9riw4B/kZnnE+58emAtw6+3VEszQfXUZkRqGaKIcmWDYkZtKB+xY/blHvuZ+Qy/fDclc31nmUCgtkSA=="], - "@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.153.0", "", { "os": "none", "cpu": "arm64" }, "sha512-GoHzpqP5XyPIp9DHokoEdCp+K4UPl/h1neFj1uXnUB3pJYyOQ7NOhFVOttNUgCGcj2eywAvu5cRivTOSq4S10g=="], + "@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.154.0", "", { "os": "none", "cpu": "arm64" }, "sha512-ZRFooyH3qsR6vuR4jFGlG3XM36490SvvXtNaUahBK4zHpooMdTHNaOMtGGJI0EW38m5hi4rOco9kw7ZwCIp28w=="], - "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.153.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-xGcy12tO9k7zFbeyQzEuilfWfQpyRq23/fLPfN3wjSWuWv58k46fQT1hsO1KFNykZuVGW9xSJE/z592TmAoSDA=="], + "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.154.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-U0Vp+4lvwUa/PnOCJTZOjydj1rX2+VLHz4Y2vSFqlN8/7LTiURgD7z4uQ9yNv9O/NlU3mELBnPDlu7aaSYG1zQ=="], - "@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.153.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-o1ykUjWncvXX6N5a4KebgLjtD8zRui+f1llMhSGoSC9oP2KOqapRpdwmZ3NcNG0axFouwVKmhGBjd+IhA8BksA=="], + "@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.154.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-Hc8QgsFY5eUUP25we8TISUruibG2cDt0H4IcPG9RKdabb6odkCzIqjV6Gk9beGWGuOwMVCr81H/Su1q363LCCg=="], - "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.153.0", "", { "os": "win32", "cpu": "x64" }, "sha512-gxQz7G96Up136fd+2zWrP+o6FYGs9NO4Dyv55IoeJFJUDwLFHcLYY11hhA5wQKs0HoM57Q8esQ3nEVhnCdsjAQ=="], + "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.154.0", "", { "os": "win32", "cpu": "x64" }, "sha512-hD7judkUMA/hZPoamvKADs6+an1smp8UTK0aMYRijkvi00K/1vl7vEtmyn2JyQ9S+vibtnfcNzxqTLGyJUZCRQ=="], - "@oxc-project/types": ["@oxc-project/types@0.153.0", "", {}, "sha512-jSNrRIyvPVLL5E1z/tS5zLAprosGz/FuI1PWwEOz59j3E4TTTzSpqKb/RDGqJhhW0QHYISGXxq582wGx6T11Tw=="], + "@oxc-project/types": ["@oxc-project/types@0.154.0", "", {}, "sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA=="], "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA=="], @@ -204,81 +224,93 @@ "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-UqGPmo56KDfLlfXFAFIrNflHT8tFxWGEivWg3Zeyp4Uy2NlKN1FGPr6/BxcLGG3+kZ6Wp14g5Uj+n71boqZfiw=="], - "@oxfmt/binding-android-arm-eabi": ["@oxfmt/binding-android-arm-eabi@0.72.0", "", { "os": "android", "cpu": "arm" }, "sha512-u4U1uaDOVBuorGNC/07NLm48nECHOiJJka002YGML16Md2DRvf38RGBt01lH60EOGvNlFVmbLoksQedNBoZHKw=="], + "@oxfmt/binding-android-arm-eabi": ["@oxfmt/binding-android-arm-eabi@0.71.0", "", { "os": "android", "cpu": "arm" }, "sha512-l31EyBfB4egJeFua11aQFEUE9nnDtfpWCadqQovm0WL30t/yUHtdFl/5HyFXvd5xT8Ewh3U4TI9f30GowrQ1fw=="], + + "@oxfmt/binding-android-arm64": ["@oxfmt/binding-android-arm64@0.71.0", "", { "os": "android", "cpu": "arm64" }, "sha512-E8q39SUZzSXQ08oZoFoTkxRADkdBNgL6De4qgZYr2O4JCunwqrZwAyCebxIF3yVHBafHM30WUkhTkDi+jNYZOw=="], + + "@oxfmt/binding-darwin-arm64": ["@oxfmt/binding-darwin-arm64@0.71.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-pTteTrN88DicrmJ3DocBmpNDa6Umfh0iveEG8rnAlDFQpclmtDS7hnIvZbIEV9mDO0Ot1U0sjtoJQ1itd/ZMhQ=="], + + "@oxfmt/binding-darwin-x64": ["@oxfmt/binding-darwin-x64@0.71.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-G5melRC3IiNEgXlNKJhSExJYQGAQIppHFp2cl/wFrqQcEwmc4k4TkrHaFTR29SDudjoW5AZq5cXPGJDqtlH/Yg=="], - "@oxfmt/binding-android-arm64": ["@oxfmt/binding-android-arm64@0.72.0", "", { "os": "android", "cpu": "arm64" }, "sha512-GCnM+Ae2mWOKC+92y3FOb6eZJeVnBAVz82e3lITUUg+kxukYKzBNAvJ/hhHIfa2A0md55SYYhdWPddSSy3KPVA=="], + "@oxfmt/binding-freebsd-x64": ["@oxfmt/binding-freebsd-x64@0.71.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Hb1P5yKb9aiH2VSbm3Ml37mKjzqpunYet9krw/YK7V5JsAUJDQlju3Yk/dEqQvJD/usBvpi01Vbk9ZDNo0a8Cw=="], - "@oxfmt/binding-darwin-arm64": ["@oxfmt/binding-darwin-arm64@0.72.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-LjQ8tlevdtwraFlWC6AnQ1Forzde0clRmnsP3QmK+ydSElDt/J+5Jc+m+//Ly1G97aP7WCNUw110QMIUw2K7xA=="], + "@oxfmt/binding-linux-arm-gnueabihf": ["@oxfmt/binding-linux-arm-gnueabihf@0.71.0", "", { "os": "linux", "cpu": "arm" }, "sha512-r7n4JEO+rkp0kaP3ia+0hv6FzK3PQIHqaF0jxGuhjJ4JHVX9ZVRbgpDVDW+OloyuJsRWpWFDKIHe8gfl1p/4mQ=="], - "@oxfmt/binding-darwin-x64": ["@oxfmt/binding-darwin-x64@0.72.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-+ZbcxhB1C34RQR5IldSyY6Z/yalJIxHXhP36PGE4sEq0f/lgL5jCLmOKoDeVm8dqd9gFGDsd1bNWHSGCAwdSkw=="], + "@oxfmt/binding-linux-arm-musleabihf": ["@oxfmt/binding-linux-arm-musleabihf@0.71.0", "", { "os": "linux", "cpu": "arm" }, "sha512-EEynTF4nakgqDhVCmd3cHQCmTcw0BM8ea6eHigTdtZ3yxdsBNv+dYkt+OpDDZx1n/jzjI7J+Ht7IgkqFWuJUxQ=="], - "@oxfmt/binding-freebsd-x64": ["@oxfmt/binding-freebsd-x64@0.72.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-yGPhA8sePEBFV9iGcprhyOk3Bz3fZshswMH3DpYIPZFLT1DG5LjiZ0j6AJQpSueaL6bUK0av1K+5+fe+ldy5EQ=="], + "@oxfmt/binding-linux-arm64-gnu": ["@oxfmt/binding-linux-arm64-gnu@0.71.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-7VgJIrywCwR/G6YMv+HqsccUt8Z4q4mbM2xR+Ry/6AeMk4pCmZ9aO4Srd3mmrvVu8PsCZGP7oHEHSXWTmyloaQ=="], - "@oxfmt/binding-linux-arm-gnueabihf": ["@oxfmt/binding-linux-arm-gnueabihf@0.72.0", "", { "os": "linux", "cpu": "arm" }, "sha512-/g5axuqFMcAtoQrFLR5EJEMDjR5Ea4GuzpdDmMpPWAgrF1DmL4kD1NPNVlpXEOxpFJnD6lPvLKYj1lzdlrfifA=="], + "@oxfmt/binding-linux-arm64-musl": ["@oxfmt/binding-linux-arm64-musl@0.71.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-AOCaminv/+fhinUXKvtPZT4POhNYmN9GfvaJdgJa1AbvuzClWGwDIXfJg8eu3sYaVL2B68jNvmS7LZGAYa0z3A=="], - "@oxfmt/binding-linux-arm-musleabihf": ["@oxfmt/binding-linux-arm-musleabihf@0.72.0", "", { "os": "linux", "cpu": "arm" }, "sha512-InVitdHbS09PM+w+WinIiyX37rC9R3L7lUP9mKy9uKTEDSUFaLjWsLoreRIxKivnv7Ndqc6Trvi+K+b6ZzhiJg=="], + "@oxfmt/binding-linux-ppc64-gnu": ["@oxfmt/binding-linux-ppc64-gnu@0.71.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-0SHxuaa4QRLM7jfsd8wc6L7KdLg+FR6/ah9k1eAvcrK/Sni7oxchMvsjwUsyakVAta+wBVDkjJTr7/RFU0uUGA=="], - "@oxfmt/binding-linux-arm64-gnu": ["@oxfmt/binding-linux-arm64-gnu@0.72.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-WKjlyRAxpPjXoqeuwFBim5LscgvY+RNEiZ971C9JlRQZONhJTsXDki/oHFYQE+fzzRpzXh3owZvOdT3kNL2g+g=="], + "@oxfmt/binding-linux-riscv64-gnu": ["@oxfmt/binding-linux-riscv64-gnu@0.71.0", "", { "os": "linux", "cpu": "none" }, "sha512-UNKj1+rPorTK6uSlQzpN96vDNbHbL/63zcpznweo0ImQdkDdtQCS7G3puxX++2cESPKT2B56Y6DICUmFTJde5A=="], - "@oxfmt/binding-linux-arm64-musl": ["@oxfmt/binding-linux-arm64-musl@0.72.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-poafnbsPpJhR+5Mbwpf8CscugTyiRAzjTOxRVn8ra3X2jnURs2xL5Du2xl5g2iW85lICMglpmLf8jDjZEbNgzQ=="], + "@oxfmt/binding-linux-riscv64-musl": ["@oxfmt/binding-linux-riscv64-musl@0.71.0", "", { "os": "linux", "cpu": "none" }, "sha512-5cVXKj7a0mWu7GU6/bZgNyv+KtLgM5S9cnT26Os2/abj8pK/bklHsbdYEHGLLniGjNYkyzwem8mZciPCaDtilw=="], - "@oxfmt/binding-linux-ppc64-gnu": ["@oxfmt/binding-linux-ppc64-gnu@0.72.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-zNUi0gKRsO7S3IfPzsTbnm88OedPuX32hmZFWZRWHvWJlAoZRwVbeO6Nb3hng4vDgL7qUKp4TGqzPz1mhsycYg=="], + "@oxfmt/binding-linux-s390x-gnu": ["@oxfmt/binding-linux-s390x-gnu@0.71.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-lNpcMuZvyU1V/CY5h19hac03m4E4PLSYRckcxZOynSPojI4Mwt6nEu9wT/gVf0bclH3xGEWjwqApnSTgjkd2oA=="], - "@oxfmt/binding-linux-riscv64-gnu": ["@oxfmt/binding-linux-riscv64-gnu@0.72.0", "", { "os": "linux", "cpu": "none" }, "sha512-qTY7z/iyF/rWI2HWwWMevXqZW5PZUOofUy2afK7v6rseXnpld3yjgyIk6pCux3DqWQ0lB+f5atvLJNBwzLvFsw=="], + "@oxfmt/binding-linux-x64-gnu": ["@oxfmt/binding-linux-x64-gnu@0.71.0", "", { "os": "linux", "cpu": "x64" }, "sha512-5/Z6pUewQpknXqC4/ykK6Zc6RiteAnPem1Ci7K1RZLVF6w6MMjwHjR4vsjijW4Czidgv7HKeVglGjElADliT9w=="], - "@oxfmt/binding-linux-riscv64-musl": ["@oxfmt/binding-linux-riscv64-musl@0.72.0", "", { "os": "linux", "cpu": "none" }, "sha512-w18qfo8vEMD6EKEHtzTvjc6jH8yCyXIT1Bn7PFWJd0PpZyzH/VQDx4xvjCh0LGz6GRzqiezbisTdG9AoXtpkZQ=="], + "@oxfmt/binding-linux-x64-musl": ["@oxfmt/binding-linux-x64-musl@0.71.0", "", { "os": "linux", "cpu": "x64" }, "sha512-uVdG2N/4GEbOeljpQ+xv+NeEwJWJGj0WaxSiSYnoiqIYy3RWrWd3rGUmxWXP1A8+ferNvvwFoDAtvgsDUvBuSw=="], - "@oxfmt/binding-linux-s390x-gnu": ["@oxfmt/binding-linux-s390x-gnu@0.72.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-grW8HwEir+vK7fCcq1ZgL3NHQCfZ1PidiERE9Hbf+24xGys+DoDaoqTht4ccfn0PcBwbViLkwkda/KNpJu2KRQ=="], + "@oxfmt/binding-openharmony-arm64": ["@oxfmt/binding-openharmony-arm64@0.71.0", "", { "os": "none", "cpu": "arm64" }, "sha512-1LwEZmSDRFKeBaGd/Hgj2xI3SmgGFpF4YtgkSx0sTYdTiZfHWbcFvRIBjL1YiDNdQd9Khda3Ij8CoqBULjskDg=="], - "@oxfmt/binding-linux-x64-gnu": ["@oxfmt/binding-linux-x64-gnu@0.72.0", "", { "os": "linux", "cpu": "x64" }, "sha512-wQJRQfWBRIn88Pkr449EUViwRayrYUScg7ty+Ihiem21mQ9BUA6S9e/4RAgyNk9lMag0KBouyKskjq61rOC0WQ=="], + "@oxfmt/binding-win32-arm64-msvc": ["@oxfmt/binding-win32-arm64-msvc@0.71.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-5tplmkeMXmza3PUptJQy25wCPJbIAg5g5r7zs+DI+7eEYOqbY+7roMdSH2zbDvv1Pb4oTDJ6NWYx9IRxBxXwhQ=="], - "@oxfmt/binding-linux-x64-musl": ["@oxfmt/binding-linux-x64-musl@0.72.0", "", { "os": "linux", "cpu": "x64" }, "sha512-T1B0uQzafxuGPjjaPrZJ497nxoi1BiI65JfsYc56nNpmev3msfb/iaTmH2kQuNFqa8PKxpMlf3GhWrWBvBPORQ=="], + "@oxfmt/binding-win32-ia32-msvc": ["@oxfmt/binding-win32-ia32-msvc@0.71.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-T2LWgh3Vx4PYDjtcqRRGDyCsVxeF/VE5xTpUQiCm65bNLwMpRnJYj6Hlkf6qRM3+jxCIOqHD1kVHNQCCiAVMNQ=="], - "@oxfmt/binding-openharmony-arm64": ["@oxfmt/binding-openharmony-arm64@0.72.0", "", { "os": "none", "cpu": "arm64" }, "sha512-OKxxgTurl7+hypVplO8QRAbbQlwEs0j1Y6FZv+ZN2qNbdxQk2muMlzuJNBGTCWwxQ0rkkOD1uK/DW1fvzoUSJA=="], + "@oxfmt/binding-win32-x64-msvc": ["@oxfmt/binding-win32-x64-msvc@0.71.0", "", { "os": "win32", "cpu": "x64" }, "sha512-L06SVp7Hu1EQTkh3+PHnKK26dxVbEpOG2InMwCooTE4MA437b5FgfTleCCiGn4ykISHnHU6UHaIg7SiMO7rBHA=="], - "@oxfmt/binding-win32-arm64-msvc": ["@oxfmt/binding-win32-arm64-msvc@0.72.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-L78TKzURqvjuZOCo88ixMbPXf/RP7u31Y0cmjJ/KEmrHmfYhmhEvsDaTYPiyTRne64jUgCbADfY0YeoQk4/Xyw=="], + "@oxlint-tsgolint/darwin-arm64": ["@oxlint-tsgolint/darwin-arm64@7.0.2004", "", { "os": "darwin", "cpu": "arm64" }, "sha512-uJk3ttju7Lz+Nv8WG4CsLyewoL1qf/Ny8S8OksJ7Bm/F14Tc9gMfW6arM1PCc57IzH/X/I79YsCWTgxX1FKibQ=="], - "@oxfmt/binding-win32-ia32-msvc": ["@oxfmt/binding-win32-ia32-msvc@0.72.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-gQtFW+Ii8BWgtJTAD17TY/WsdNS5gUfAPov8iI1jeq4r9lRRYImmxPL08UU00/RLaCfBJwh2UgINnDY0iOiZ+A=="], + "@oxlint-tsgolint/darwin-x64": ["@oxlint-tsgolint/darwin-x64@7.0.2004", "", { "os": "darwin", "cpu": "x64" }, "sha512-0BFfHTzDxNDFPcu0UZAXT6CyCJHAXM0dZveyDb4KEHa2qF/DSnOKOrmvK/wFuFol9kvijbGM9JfuOsor+zWXRw=="], - "@oxfmt/binding-win32-x64-msvc": ["@oxfmt/binding-win32-x64-msvc@0.72.0", "", { "os": "win32", "cpu": "x64" }, "sha512-uhooIN+DCzWX5uH7mQkSVCsODqsGluGJ4n3ch4+mITtWKpESMDjUJUSDBAVFuYQDwqY2McPDKdKJbM0oZVW/Qw=="], + "@oxlint-tsgolint/linux-arm64": ["@oxlint-tsgolint/linux-arm64@7.0.2004", "", { "os": "linux", "cpu": "arm64" }, "sha512-TAehQc+qdRXyDN3nl/r/3/oPrBVrbtrDeGMkFyG6mf+XphpoJ2lAMVFLclyvrVZCw02RbKROjyw8h72XwQQHcw=="], - "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.87.0", "", { "os": "android", "cpu": "arm" }, "sha512-22tVIHlB9898OYsBKmYB6He1MCSqdTmK1BVWuSNUTVrpS0KWNege+U9uEYqGJ+KatQag0r/oU44i3OOs46z7HQ=="], + "@oxlint-tsgolint/linux-x64": ["@oxlint-tsgolint/linux-x64@7.0.2004", "", { "os": "linux", "cpu": "x64" }, "sha512-LPunZvm6ZbWPfHMAyfZf9ci3HHvNEzLejO8zdqO3GoVGoSEHqqufHUD7+OgeatVSaJP7uXDJ2HaNOHIoH7go4Q=="], - "@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.87.0", "", { "os": "android", "cpu": "arm64" }, "sha512-JfZQ3MWf74n8ov0DojZpkOduIubYJvZL5tbTMMhDutsal6u1xH1QuNpN+lK+EQwF8AeAfgwTR2fgh5U2br27XA=="], + "@oxlint-tsgolint/win32-arm64": ["@oxlint-tsgolint/win32-arm64@7.0.2004", "", { "os": "win32", "cpu": "arm64" }, "sha512-FVWplzDImWhiuawnIZVETaQecv4GWom6Jv4Fx2xj7hhXXDZ5okEgiw1gTCImHTIQsi2ycC5oSxVwrn69bMh7iw=="], - "@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.87.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-rkx6Xvvw93z2GImVOyvbZwAZcoY0Z6MJW177XNsSB+i/CBsH7ANyelTp01VZyIkM3iSXtqKVb4+ptBgPHap5pQ=="], + "@oxlint-tsgolint/win32-x64": ["@oxlint-tsgolint/win32-x64@7.0.2004", "", { "os": "win32", "cpu": "x64" }, "sha512-7PsxuUx11Ry9DYTWcljTzRbmZY9B6O9fFFfZV+aodQEMy6pfRT3fhoQRv9PtGN/89z1pPz3nFKrsFm6WqNtX7w=="], - "@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.87.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-cw5nYw7L/pQ2SgGBgOcg/Qo89llQre3vIc/kuBLhSICzu1r5s8L76H3ug6AIFsD98WpROj8/z5JVzkf4daxHaQ=="], + "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.89.0", "", { "os": "android", "cpu": "arm" }, "sha512-Pflpba5F3gRAQ12sWglRxvWTHEdAusNDvmi4Y5N1T5SY1AGkM7AixOnET8qkrnLJ/F32qAlNokO6eCknT8tmnw=="], - "@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.87.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-x/SuznE6loRZK9gz9AS4ZmzNzSu+5KdeoCS+sVHhnrE8HM6AD8UyTjwldQTTqlXGvkwHASgB0NiTNOc3o3PdAg=="], + "@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.89.0", "", { "os": "android", "cpu": "arm64" }, "sha512-dYmyD1x7LaPlb79vZWUcpTShk8dI9z1I+IubtqrBxWNJaDhQdPHwcsvg7q5StTU4xWyd9AwPfLaTYFZY8NZgtQ=="], - "@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.87.0", "", { "os": "linux", "cpu": "arm" }, "sha512-+JEDmCAXiiFmKhAjZhgAOwaHWY6WENOQ5QA+lFuY59tgsUCDOTRi46B+lENK6CWvtxsXpwkZXNOgpjAQcpIpnA=="], + "@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.89.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Z/oxOPiIqiS7fItRdxaaOEC+6GD3OpGi0IxoR0dMefzQHolsKLzScw2DNcu/5gUPok3tv+G9mslvYB5bo3i0qg=="], - "@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.87.0", "", { "os": "linux", "cpu": "arm" }, "sha512-/uC9XqXLAC9AHFLNycwmSQEvKqGrOCgU+uXALI7gNW0DG81TJ/3T2eHnKdRvcb5R1gFEfjxDwI4e4zIa29rICQ=="], + "@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.89.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-eAjTkHSjAxrdCPJxO6y5sPQL5pYLKb2kvxZz9UU7tXnOZk9I/HLtkvx9S7GHY883k+AmL/eC7mqFt+w7WCwk0w=="], - "@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.87.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-FTRYPsBy/M728vnUv7l+KAwSAa3Qi4BQbhVvy7NYuMTZ0sUa/OWsbMx79HVFw6u/5KWcaYayDsoOiv7xbevzDg=="], + "@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.89.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0lNCA9Tl1n1FKpqy2/9ckp0kIuSrtJ/l9bMRgaEhOtM7TsOHshFuwOcvW8oA9teXLMOJT61LjEKWiaHDFGxF/w=="], - "@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.87.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-6sC+N7IY0h1egd8SrYUGNN7CUyKJZ4bIZakKa7V7hfinf4jfi8Kq4+klJvFp5DqXcwMn44I5MeBwmJluO1odFg=="], + "@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.89.0", "", { "os": "linux", "cpu": "arm" }, "sha512-OTFEvi9W+JczaZD1Caj17SGCoW8H7TE+fvx0D7ATEWa1Lohn91UMxFQ6r145SiGy/yCxeIwptMys/RAM7gSVSQ=="], - "@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.87.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-d5Mnn+ICbhoJPi37Ccjy+86T5qfH2+mSTrTMBXNPfB+wqSWOayBBLLIrCXdUy1YssluCVdGkl+DO9w5r5ODmUA=="], + "@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.89.0", "", { "os": "linux", "cpu": "arm" }, "sha512-fRxgNHvBLswj6MrhW2uBq5UDhPRQlCbHeq/Nf8yuG9zOxhDsXqX/mi2PX1axgsQxMm88el7HLiJAzglAnflYxw=="], - "@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.87.0", "", { "os": "linux", "cpu": "none" }, "sha512-sf5YWuUo1Dx9loqWCgF8P278MycfcD4JHjDC/LV5j11L3Lqa4PFiwCjD6B8kP4AjsgZZkLn3xbpJEtZBaccs4Q=="], + "@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.89.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-v9ENzHvwrQoYSWTtviH1pOYc7R9UovDxVofnck50cNmPihRRTcrg5X0UlRbLOZ7IVtxPOlh2hb7kDO+FpE8SfQ=="], - "@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.87.0", "", { "os": "linux", "cpu": "none" }, "sha512-+aCraYbmK3uU3P0rFojjeaK9pGY6JvBDXh/0CM+gPyWKmNmXmnFe0qj4qj02U4ibFpbd9Pa9CmDvIdjJUd29rA=="], + "@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.89.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-vfffe8mQ484AzVadlUOFpgL+JDwhvs9hrzxTgQP1FVfi4ZEUUYeffXlzC9dFV7Dgnu5s/KrNKvfmG6HxBd/ISQ=="], - "@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.87.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-7rzbZQIljo6VLWVPqUyLa2P/WV3VFsJB4M52R4NCUJn1A50yjtUsHxiMHFL9opEKGFIiTbZ3VQzmtcJOPUq4NQ=="], + "@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.89.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Buonlp4hVS7RGNP5M7bPpGNQrenyzA2C64JcO/oz9C1c6dGOXJ7VEAnaiAMY7voou0JYyCJdvDVlFQc5DZX3DQ=="], - "@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.87.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Dry46Fa+AXE/xt9J/YriujU1pU9mzfNWHGQwtOYibAFH8HLrKWCi93AhIGnuUMiwn2JbuBkRyz51f50Ly4r4ow=="], + "@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.89.0", "", { "os": "linux", "cpu": "none" }, "sha512-1eVwJJrJ3lYIPT+cm7BcBBZZXY6IQZP/oyonaruTor/MrVyWOpvnwt1oD5CLdsHg5aVBIxXodQSvt+1gK6ck5w=="], - "@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.87.0", "", { "os": "linux", "cpu": "x64" }, "sha512-f/HMZez74gJvnRpGz+b5sdGyWrEgRLmFTXg9sNoqjPWogGxYHUhXKTKyMiYsu9rUGR2ciYqL3fk+Ua4JhMJbRA=="], + "@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.89.0", "", { "os": "linux", "cpu": "none" }, "sha512-fRQQsKUGShdEL5Fl9o9uhj3grkZbeXKLv0icQ5tspUCNYSDy8wzzEcP1WC2bKdTQ0rSszbKlO3iiHORxV22DLg=="], - "@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.87.0", "", { "os": "none", "cpu": "arm64" }, "sha512-lEC6ZfPZm/07JlB7FsOWX9o1RiHlXiBW594LSUGuXmekC8LZmvUPP9XzE2WZcNxJi5cHA/Fw56o02c3JxgMA5g=="], + "@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.89.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-dEtYjIy6+fHcjKklsmtmMkZRhwHr2UbzjmpvuPtQYSeN9awQ2hx5JLms5Wvri+8P/NZtD8v5hfgHALUql+/Ycg=="], - "@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.87.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-afBWKOD36dUiA9AenaiWpCg8xfyUVPYznyAAVXu413brK4RA5UI/Xoc4yfeGIT8G1a44MV+JR7hioryerBDzGQ=="], + "@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.89.0", "", { "os": "linux", "cpu": "x64" }, "sha512-hqjwIj5KOYM8Wjef/p7IruNi1iByLhSzbMBk62y22P/E8q7Jj0Pp+DeUTKTRYyZYCDtU1wEGlnWOnttHbyNIww=="], - "@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.87.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-daptNsEOuru4/nJTxV4DBHNJ5GepzmaBVQf+jjgKQGi9NRlZKik+RFq4hUL7ewsF1pwjKM+SkYaMbF82UwFGnw=="], + "@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.89.0", "", { "os": "linux", "cpu": "x64" }, "sha512-iAQN3e6o9UgUCcdGwqRx/jYcKbG3HK7ur3rH6lTqVcQeNGZ85AeWIg6cgn/edwFQ0ofEZZItMwkzyCVTahnvEA=="], - "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.87.0", "", { "os": "win32", "cpu": "x64" }, "sha512-k+m/EShyXE29J/r1fjk0HlAzhN5JhIvj044oSJkXTEkCLrWZQgXb/3r4q5LTw/eaKW/4GuMXG2xmiJs3s5rPNw=="], + "@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.89.0", "", { "os": "none", "cpu": "arm64" }, "sha512-MNxjEByz3N/7Q4qFQuPWvc14TpN9LoD3pECEDsJTZbP/wyB7U+hduUXEl7QAbbgVezFwsb9sWtNUO6XVBndOhg=="], + + "@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.89.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-xxe+i9wfuFso/VnoL4mfj0UlzE+cfCFiUB06vkXCMyQdgVVmItF5FfAF4tATAktSU6uHruWR+FjqvAT9cHZZzg=="], + + "@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.89.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-saFy07cO94E664glwgLmKLI40HgTL1PY86y4T6+ud4niX4H0Kdqjcmqmjps7mQNdBytV5guGbXDdyQtRfeLbLA=="], + + "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.89.0", "", { "os": "win32", "cpu": "x64" }, "sha512-hLFJ/o0f/dTJh/EW0vmcbREYSQO9tYgfiAAlsOkiLFiJuRRWvYtFELUXN5o2ijpSo/tlO1n+YlWN58tZwPG18A=="], "@pkgr/core": ["@pkgr/core@0.3.6", "", {}, "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA=="], @@ -286,35 +318,35 @@ "@quansync/fs": ["@quansync/fs@1.1.0", "", { "dependencies": { "quansync": "^1.0.0" } }, "sha512-qAPG/t3HqML1TlN7sY/pTbEjzFVAKsMjNNMGheyDosro+kT4iw2KCUoHcVdmliwWjorm4elZbgNQyU2eD97eDg=="], - "@rolldown/binding-android-arm-eabi": ["@rolldown/binding-android-arm-eabi@1.2.13", "", { "os": "android", "cpu": "arm" }, "sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA=="], + "@rolldown/binding-android-arm-eabi": ["@rolldown/binding-android-arm-eabi@1.2.14", "", { "os": "android", "cpu": "arm" }, "sha512-aWR+XKH9+rW7m5fWq/5360J3mHycrx/o6xZM2DQFdJnTMdyP7/WzxPjhtLbVWdKo2y612/4U1bWqb3HQhiF7vg=="], - "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.13", "", { "os": "android", "cpu": "arm64" }, "sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ=="], + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.14", "", { "os": "android", "cpu": "arm64" }, "sha512-QiVxHofl6A8lQU7WAtOUY4QMVZXohxwz7WJJoeh8NBEUyKfIkMRKhYyq8az/1RypNiIXzNTtiS6KwHz0erxYRQ=="], - "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.13", "", { "os": "darwin", "cpu": "arm64" }, "sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA=="], + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.14", "", { "os": "darwin", "cpu": "arm64" }, "sha512-lTQOzHuBIooh3jIr5XINQkjPGEuGy+Dsy0meXDr6Sjty0b99kYgGh4uBC/8mJX1T0kC8d6S0aPP1Y+bHkh6aBw=="], - "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw=="], + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.14", "", { "os": "darwin", "cpu": "x64" }, "sha512-hyMKEGatjmBYCs/Q4sbIcL/GqpFEqsX3wc+HYVQ/85A4rxc1o7rPm4DUI4GV4k/h0ITddwFSGpqQunI14GXjTA=="], - "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.13", "", { "os": "freebsd", "cpu": "x64" }, "sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ=="], + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.14", "", { "os": "freebsd", "cpu": "x64" }, "sha512-u371GbXoVXrEgP20PwzoGNOdAOqAMhzo19JzzY+V4YmmnC+DTOoqdbMu+O+54emM59Mik/UdrtWgcuEDKWRPKA=="], - "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.13", "", { "os": "linux", "cpu": "arm" }, "sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg=="], + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.14", "", { "os": "linux", "cpu": "arm" }, "sha512-BqwKsdZQf6EqVWr8fv2MrDYzAvOZ7+NYFSJESRGs87fkseEhs0TU9TXgRJTkZoRRkxTizyEg1LKUXfU3/78uqg=="], - "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ=="], + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-SD9kY8M009x/7s57Z1dgUVlP5+uYBgKQK0Tkr1WIWngrtUJmRCW1RJFMY7QDla2khXhmg2i5Io7MUjcmZNZ/KQ=="], - "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow=="], + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-BJ2CL19M6uuWesMgnqJzgxoI+N+eV7b0A9O9vLV42y+gitC41fNa8KElau1tHVzuLWX5GzEuxMPhAO0tQXQMkg=="], - "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.13", "", { "os": "linux", "cpu": "ppc64" }, "sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig=="], + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.14", "", { "os": "linux", "cpu": "ppc64" }, "sha512-4+Kl8daPV8NDHaD7mfCcc1pRM+Qg7ab8DyMm5FG5WoZgv4h2i3KFN1CybYBNbQqmuYm7ftJLvmMI1eHYJ22S/Q=="], - "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.13", "", { "os": "linux", "cpu": "s390x" }, "sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw=="], + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.14", "", { "os": "linux", "cpu": "s390x" }, "sha512-V/h8ePq1fKDrmtFMz6xcCN3DKvuvMRrwwD1q0PkBeeo4DpK64biaKvqWGVxqCeYKqeRk7gE7/iKPxLCn08O97A=="], - "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.13", "", { "os": "linux", "cpu": "x64" }, "sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ=="], + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.14", "", { "os": "linux", "cpu": "x64" }, "sha512-WxalXzgrLVpKC93xfpaJ3gCXUWzeCr+FRCbDVD2mUAy4L6Vo3lNVz0epUEUpxPWJkLNYUwM4OSIikv36OJ9mLg=="], - "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.13", "", { "os": "linux", "cpu": "x64" }, "sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw=="], + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.14", "", { "os": "linux", "cpu": "x64" }, "sha512-3G3tnAmTpdk9jO3GQtyHXqeFD2SlecfTws/Y3M2mmj9nMBwwuLT4kur8sZKeu7ENUHSpVO3cIsm5A52LEWWwlg=="], - "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.13", "", { "os": "none", "cpu": "arm64" }, "sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw=="], + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.14", "", { "os": "none", "cpu": "arm64" }, "sha512-qyr5XiNGxm2ytx17vvtcJ9nXn6v1gENETi503bJx3OGwZ1tSonj7BosxbMa/xeAfSl5iS9X6KjEWYXLu6v1L7Q=="], - "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.13", "", { "os": "win32", "cpu": "arm64" }, "sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ=="], + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.14", "", { "os": "win32", "cpu": "arm64" }, "sha512-oA4o5o0S2yB199YyYXDzKUv1Z56Rc+mgOjwm7Z/vJ9Z8igiDPYvoOuDyo6g7AK/ZaF09nPhDKVnGBcYHO11GXA=="], - "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.13", "", { "os": "win32", "cpu": "x64" }, "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg=="], + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.14", "", { "os": "win32", "cpu": "x64" }, "sha512-9mE94bf2GZUaR/fUSXCMpBoWkctu421Mi0ORpm4zqfbkjKep7RxzPFa5etcGs5h+2KApoWBOA/hAJa/7saGgEQ=="], "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], @@ -322,13 +354,19 @@ "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], + "@sindresorhus/base62": ["@sindresorhus/base62@1.0.0", "", {}, "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA=="], + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], "@sonarsource/analyzer-commons-configurations": ["@sonarsource/analyzer-commons-configurations@2.31.0-5284", "", {}, "sha512-ruk3blMs9BE9RNSp9LPpWZAIjxJmq4Cp00E3cELIHz7Kym3WxdWGRlKOMYLRQ5tJg/de7jN5AtEElY3bGIfTcw=="], "@tybys/wasm-util": ["@tybys/wasm-util@0.10.4", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A=="], - "@types/bun": ["@types/bun@1.4.2", "", { "dependencies": { "bun-types": "1.4.2" } }, "sha512-GimotNn7+ZV0uVArItBbriZsR1oNf0+WTzPkdcFrzShI7k2norL0uzEaJT8T33dWr7O/c9ZDuAFQrctKCi72oQ=="], + "@types/bun": ["@types/bun@1.4.3", "", { "dependencies": { "bun-types": "1.4.3" } }, "sha512-N67Pqy8JXbAY/j0tNraS3V5mubGvc6rrrNDmDCtZLlFzccbUJPDb0tvgUBC5q4m8ybkP93Jcn1QB+RYQ6PvBhw=="], + + "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], + + "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], @@ -340,25 +378,25 @@ "@types/node": ["@types/node@26.6.5", "", { "dependencies": { "undici-types": "~8.9.0" } }, "sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.71.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.71.1", "@typescript-eslint/type-utils": "8.71.1", "@typescript-eslint/utils": "8.71.1", "@typescript-eslint/visitor-keys": "8.71.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.71.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-nNlBf6HuotqMgZvSkWD5hNdemiBIxQ2NmrlgfcUIeZRs+BbakjscCQRq/Hb74EFVnFiSWWdL12JruqwBy3ERDw=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.72.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.72.0", "@typescript-eslint/type-utils": "8.72.0", "@typescript-eslint/utils": "8.72.0", "@typescript-eslint/visitor-keys": "8.72.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.72.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-aysKgysPX9XOv/dk95UkvUDe++Q3n3dJPG9CEWT3RUccxfkPJ+Qn6nhKPDhZXU6Ofo9kgwGWwKyQCnZIXTgngg=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.71.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.71.1", "@typescript-eslint/types": "8.71.1", "@typescript-eslint/typescript-estree": "8.71.1", "@typescript-eslint/visitor-keys": "8.71.1", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-oM/5sAqz/l1v/zYK1qTOPrn2+JIrBGC1V6uNYucRO5gh6eT9vWJ/RhPbGE59byvZEUQ4VP6XkLBaS5Jti5jpvw=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.72.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.72.0", "@typescript-eslint/types": "8.72.0", "@typescript-eslint/typescript-estree": "8.72.0", "@typescript-eslint/visitor-keys": "8.72.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-0O+x3ynciD6zuXb1CKSu165haQV6ey53DKhHHUnujP7U+XlltJG+/keT0Xhd1HXCze+IHf7Tvt39ovyepX/LNw=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.71.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.71.1", "@typescript-eslint/types": "^8.71.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Oijc9RUsohHjncg6iGi7gCtjnEjYt9FWv9u6ygK8uKcHK5eLjLAkqERQ9BaytbpceOFdk6kifPCS/zAZE+A99g=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.72.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.72.0", "@typescript-eslint/types": "^8.72.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-bzHngBbmIgzj6TsTjVUCntGx6FFLgE7mPjpO0PzHycOaZHXqS43XnrkFIHRS16LLr/xO6FHSXG3GJFo/F4bSBQ=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.71.1", "", { "dependencies": { "@typescript-eslint/types": "8.71.1", "@typescript-eslint/visitor-keys": "8.71.1" } }, "sha512-1YUDZXdTnXLlob03SFHBipdyMBsDVm7zoSz0ytTJ39dk5J1TgsTK03VlR/dLXG/RLLUrPcYbD4rp23BmHxHP0w=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.72.0", "", { "dependencies": { "@typescript-eslint/types": "8.72.0", "@typescript-eslint/visitor-keys": "8.72.0" } }, "sha512-JewPyJOYcXBSAS7PIgufscHOwZqhTGyBRiQJhhuDln66tMchxvvt7nJ90JKKIoOelmdHA3kAQbm9cEUHc4JSEA=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.71.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-oTvkml5SxXhgg+WWKhod5qWQICDXtOB+/Hi9VdPKFAANJ2b7YOgMffgvzXuqog7R6A/JtrzRf128dsxummyWhg=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.72.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-0vbxCf7xLVPSjcOdm6eQbgViH8EDJ8xnl1laLT9yoqSz2YmcSfSg5Vdl0JUvZf6rcuJ0ZivJIuMD4edTg8obaA=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.71.1", "", { "dependencies": { "@typescript-eslint/types": "8.71.1", "@typescript-eslint/typescript-estree": "8.71.1", "@typescript-eslint/utils": "8.71.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-kH3t3jZCYv2PZSBEWPKTariLrCaoF1CLoPitYFBJOhAGEwWnSRAtGEifrfrpBa4K9JlwWNZotgA5w3/wLSk/FQ=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.72.0", "", { "dependencies": { "@typescript-eslint/types": "8.72.0", "@typescript-eslint/typescript-estree": "8.72.0", "@typescript-eslint/utils": "8.72.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gEXxmmbSTSOVTC37IYYvremOM31v+UN2W772bJxmVYPhAOPSUxtacyb7wkm1EhkYKU6KzFJsdU44DCV4to0LWw=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.71.1", "", {}, "sha512-ybYnPTUwg3VQQOFEiBPLs8Jxl1ry2vXdn1kVKguomBbvxpetdu3MKTNDqFNUrlG8ylP9MpZosmXMFYlGQHk1oQ=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.72.0", "", {}, "sha512-Adfoy59kxNEjT5E5fnyrp7GpHYuWs8ONbdohu4ez6IU46qDq8LltG90tLmkucZB2uhYL8mqBjtXqGd8yhfjXqQ=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.71.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.71.1", "@typescript-eslint/tsconfig-utils": "8.71.1", "@typescript-eslint/types": "8.71.1", "@typescript-eslint/visitor-keys": "8.71.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-pSKSEK1JJpHs6KiKVtABCE4iJK5d7FLFzDXQNBQ2oRY7LEd3UwOt3TZemTgu9syTIf56dJWlTn/pdmrO9oKUXQ=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.72.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.72.0", "@typescript-eslint/tsconfig-utils": "8.72.0", "@typescript-eslint/types": "8.72.0", "@typescript-eslint/visitor-keys": "8.72.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gwLfFgWcw15tN2KXDCJvxEOQjPn+P3j/n3eSqkZ5sX4VpW9Cosodr+tWwBZRvJT3TcKx6HnPRGZMCNAiP1Xhug=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.71.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.71.1", "@typescript-eslint/types": "8.71.1", "@typescript-eslint/typescript-estree": "8.71.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-CBjT6gfAz3DW2j9Q4moFnqt208Aq+506sVGXfpRcyAeqn0EpayL0mjdWoCO2t3RC7GewNrFxdeehuEaPg6DMzQ=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.72.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.72.0", "@typescript-eslint/types": "8.72.0", "@typescript-eslint/typescript-estree": "8.72.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-0up3oArJZBYnzOaEXKo8DmI43QvMZyPoFEt9LWzRJcyl/RcJjfKKPebknN1VbTgXBf3M/KggUh5uUMdURLnseg=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.71.1", "", { "dependencies": { "@typescript-eslint/types": "8.71.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-0GxiUGqMU0qXJt58cBsiG3DP8lUmBaFo2vChtUX+CT7PnR3v/VGLLrzVP4K9r1lNiZXjHYefMBbPunplr09v6w=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.72.0", "", { "dependencies": { "@typescript-eslint/types": "8.72.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-E2mroviasaWecDzTGiGMtuEguuLVOeRggnrIn93CJuxYJzQBHbyymlT08aVQydbBal5538o+JkBKXh2sRuCyIA=="], "@typescript/native": ["typescript@7.0.2", "", { "optionalDependencies": { "@typescript/typescript-aix-ppc64": "7.0.2", "@typescript/typescript-darwin-arm64": "7.0.2", "@typescript/typescript-darwin-x64": "7.0.2", "@typescript/typescript-freebsd-arm64": "7.0.2", "@typescript/typescript-freebsd-x64": "7.0.2", "@typescript/typescript-linux-arm": "7.0.2", "@typescript/typescript-linux-arm64": "7.0.2", "@typescript/typescript-linux-loong64": "7.0.2", "@typescript/typescript-linux-mips64el": "7.0.2", "@typescript/typescript-linux-ppc64": "7.0.2", "@typescript/typescript-linux-riscv64": "7.0.2", "@typescript/typescript-linux-s390x": "7.0.2", "@typescript/typescript-linux-x64": "7.0.2", "@typescript/typescript-netbsd-arm64": "7.0.2", "@typescript/typescript-netbsd-x64": "7.0.2", "@typescript/typescript-openbsd-arm64": "7.0.2", "@typescript/typescript-openbsd-x64": "7.0.2", "@typescript/typescript-sunos-x64": "7.0.2", "@typescript/typescript-win32-arm64": "7.0.2", "@typescript/typescript-win32-x64": "7.0.2" }, "bin": { "tsc": "bin/tsc" } }, "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA=="], @@ -404,31 +442,35 @@ "@typescript/typescript-win32-x64": ["@typescript/typescript-win32-x64@7.0.2", "", { "os": "win32", "cpu": "x64" }, "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g=="], - "@yuku-core/binding-android-arm64": ["@yuku-core/binding-android-arm64@0.18.1", "", { "os": "android", "cpu": "arm64" }, "sha512-1XTUWTmnpwXNyPwRLSQDjvHu7WPgykzCniYtTk+5ppnriznVONWd9TRPcFxCR8dlZ7HFGtv8v1wzbQmtmVlHNQ=="], + "@vitest/mocker": ["@vitest/mocker@5.0.5", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.31", "@vitest/spy": "5.0.5", "estree-walker": "^3.0.3", "magic-string": "^1.4.3" }, "peerDependencies": { "msw": "^2.4.9 || ^3.0.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg=="], + + "@vitest/spy": ["@vitest/spy@5.0.5", "", {}, "sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw=="], + + "@yuku-core/binding-android-arm64": ["@yuku-core/binding-android-arm64@0.19.0", "", { "os": "android", "cpu": "arm64" }, "sha512-wdL2XmTiZixAOaHk9Z0JJZ8u9Qm8d333Zjpc6gaxXFX+UR5BlsfxZ7a2+2Rm71pamppsPYGUGFq2oVLbh6DISw=="], - "@yuku-core/binding-darwin-arm64": ["@yuku-core/binding-darwin-arm64@0.18.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-7A7IPB/kEzIlm9Lwj6qVQ3ZORUH96mpqDWgGxkjmaAWGAfV4roTZWN+o7bW22BzcW55xbUKcZRslSZ8WRyqdQw=="], + "@yuku-core/binding-darwin-arm64": ["@yuku-core/binding-darwin-arm64@0.19.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-7sNJa6XJhyetnTy64jw3NEi4YgUcezHk1G5GH9FSvXAuC8wIlbaOwT9lgq5qo5sspjrZJQlBR1TWflP49uRpMw=="], - "@yuku-core/binding-darwin-x64": ["@yuku-core/binding-darwin-x64@0.18.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-aBZgmsAf1u/ps042xE9pgH9zOY57Rn0K8BXOWjQ2dAIg4W5nyQ/Oo3U3+VAcaEeBt6Q/XCwnCUpshFpWQaOCrw=="], + "@yuku-core/binding-darwin-x64": ["@yuku-core/binding-darwin-x64@0.19.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-pTC7dYEc59isdyizc3nsuyFNBu2LU5wMYZ1be6UMr59PY/AJNtO1aBLWV0MgL/z7C1nv/2sX4TNjGgKLoeevJw=="], - "@yuku-core/binding-freebsd-x64": ["@yuku-core/binding-freebsd-x64@0.18.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-yOEEjmEW2XQWpoa+4J3+eVMhXd/4kMTXoLJ9WkhXMMeRpKGBtFGjX2uxV6qKuoti3talOnmMdi2/kvqkX+O4wQ=="], + "@yuku-core/binding-freebsd-x64": ["@yuku-core/binding-freebsd-x64@0.19.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xrZjF6XOEwyLOiDIfrwDdRCS6ghxcJeirNC1KivQhVcUwlRonaU79S3/Uiyx3lBylPnT8qKJ3/aMT+H52nGTJQ=="], - "@yuku-core/binding-linux-arm-gnu": ["@yuku-core/binding-linux-arm-gnu@0.18.1", "", { "os": "linux", "cpu": "arm" }, "sha512-klpvuNubx19bsox50+ioEYfvwUj/+O6ML9YBDjzsz9PULffyOYxkR+i63BYvg//jAcEE9oHIQphm2Wz3vmk1TA=="], + "@yuku-core/binding-linux-arm-gnu": ["@yuku-core/binding-linux-arm-gnu@0.19.0", "", { "os": "linux", "cpu": "arm" }, "sha512-0OyIH53C0I1CbADHn9FSdCfX5qbpeLwJhmOVhonFJNYheybOnkSJ50qGMfTJIb8y5zrwqvLs7FVBvz6Fk8maZg=="], - "@yuku-core/binding-linux-arm-musl": ["@yuku-core/binding-linux-arm-musl@0.18.1", "", { "os": "linux", "cpu": "arm" }, "sha512-eUG20Eh3Ycrm2D5WvRIn7BJp1+iPiFL0zLDdavVM5B6ymYEEmgrs6mime/h2y4Is1GA9uGyBBJQHaqKTcRiEng=="], + "@yuku-core/binding-linux-arm-musl": ["@yuku-core/binding-linux-arm-musl@0.19.0", "", { "os": "linux", "cpu": "arm" }, "sha512-z/iPfkCOCSXE34VXNt0uP1ORSW+4mEa9b5CiJcWZeqZH08g49bFU/jRM2T04f+Wpw5mJ6HIzNBiojxeAbrHjeg=="], - "@yuku-core/binding-linux-arm64-gnu": ["@yuku-core/binding-linux-arm64-gnu@0.18.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-og2/svnJ2Awjz4INj2lQh0KQMwy4FrVCtD5SgfoZNxdv5knG6XdIyIvZycRCeyk15AkHdhwJqCsHJFcB3tjTxg=="], + "@yuku-core/binding-linux-arm64-gnu": ["@yuku-core/binding-linux-arm64-gnu@0.19.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jLNTi+gzaRwBJ+gwhCJ+rDb5dmx/8hEBx93UWd7hjMSqPTL1D1wvVSvXVAldV5kALvju7b0/m51EHEhs4+I1fA=="], - "@yuku-core/binding-linux-arm64-musl": ["@yuku-core/binding-linux-arm64-musl@0.18.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-dmkidtxAY3iSUOFAOwnp7w8nVx1s9QdSdyiJPVw0TkBlLhQySuQer3Pir3tmhIhHC+Oc2Bn0f0QQpFNAMvzTPQ=="], + "@yuku-core/binding-linux-arm64-musl": ["@yuku-core/binding-linux-arm64-musl@0.19.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-YwyPIdW/rN2Fmv0MTFWi47FaB3F9g+2b+sJISyAw83Yd60RWH4T3Nx6XkAHHVN+uKJNBAd6So7/BVihSiFYvuQ=="], - "@yuku-core/binding-linux-x64-gnu": ["@yuku-core/binding-linux-x64-gnu@0.18.1", "", { "os": "linux", "cpu": "x64" }, "sha512-eXAZacTOzJbzv6sT/4h03MBE4DNGObfuTg3L6+FGADFt8Sam7peyhaFAekQIwvLETX3WYXhMwTehKPB69sdmcA=="], + "@yuku-core/binding-linux-x64-gnu": ["@yuku-core/binding-linux-x64-gnu@0.19.0", "", { "os": "linux", "cpu": "x64" }, "sha512-/vskaAXVX3ESR43FiTdfiYS7z1b9uoQJwVQ/0RgUHgN2sWoAyCZs+aX4CgU7eKGIHTVfp9VFwv+c+2XchYiEtQ=="], - "@yuku-core/binding-linux-x64-musl": ["@yuku-core/binding-linux-x64-musl@0.18.1", "", { "os": "linux", "cpu": "x64" }, "sha512-mdeItxbo5No5ht5XdHh0mCHDBne/STUuzphzGQQxVX+XSsBPbUHsZkmUAahycR6RoEP2UF/YBhg1M5f0phBO9A=="], + "@yuku-core/binding-linux-x64-musl": ["@yuku-core/binding-linux-x64-musl@0.19.0", "", { "os": "linux", "cpu": "x64" }, "sha512-FuXL5igeSKib9Rye02TdH+D6SQezTyGxIATMu1Qsn/QywrzwpGl35OLpS2C1x5vpGLeVE2XgiLd5mVPFHmIglQ=="], - "@yuku-core/binding-win32-arm64": ["@yuku-core/binding-win32-arm64@0.18.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-0CyeB03Lr/QV9XHGyuChJ3V99X9M/6Q+3JB3ZRJWjqs13G1qIeIiHwsaCfqIJsqei9wxBtaKWZ1vBU7ApQfMEA=="], + "@yuku-core/binding-win32-arm64": ["@yuku-core/binding-win32-arm64@0.19.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-YuJAe7zEKT1Xa7LuHlhGJpPnYQeVtvo0rZvNjJRqkH0hQGOw4C8QeP30Tg5VKGzZfo2x8CjhjEhKt4TmLwfmdg=="], - "@yuku-core/binding-win32-x64": ["@yuku-core/binding-win32-x64@0.18.1", "", { "os": "win32", "cpu": "x64" }, "sha512-p0zG4bkR4++W011YbcP7Thg0UunaX9Lfg6U3nHEEwLrvTNy4P0+I5GO762tdjLozZpZwWLV/HmYNeecyOS2y5g=="], + "@yuku-core/binding-win32-x64": ["@yuku-core/binding-win32-x64@0.19.0", "", { "os": "win32", "cpu": "x64" }, "sha512-o8iY/mXwlRkedp0LNTr4+TEfXTPQwoNZmv6k+1WIAd1ZXEn8xJJTBCtB0osaVvdZo/x/cNmV16UrWrrGpM5Mvw=="], - "@yuku-toolchain/types": ["@yuku-toolchain/types@0.18.1", "", {}, "sha512-rWtqVdjA8O34nV/4mBFIdUm5Zj+FIzZDR7P2PEpqXXp53VEHabTROu7j2RjzzJbLMVYjW6gDKwOgPgiKRA+x4w=="], + "@yuku-toolchain/types": ["@yuku-toolchain/types@0.19.0", "", {}, "sha512-tFkNbsP4WXX9UMUC5syJGdK9dPMLK0PPaIuXCcCYH75sZ8MrebfBZ2XvCILRTw8AgLivSSCfDa4R67iYBDa4Kg=="], "acorn": ["acorn@8.19.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw=="], @@ -442,6 +484,8 @@ "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "are-docs-informative": ["are-docs-informative@0.1.1", "", {}, "sha512-sqRsNQBwbKLRX0jV5Cu5uzmtflf892n4Vukz7T659ebL4pz3mpOqCMU7lxMoBTFwnp10E3YB5ZcyHM41W5bcDA=="], + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], @@ -458,6 +502,8 @@ "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], + "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], + "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="], "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], @@ -470,21 +516,21 @@ "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.11.28", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-br0LOmjJqr6Rt4AEkadbcNf67Zpo7EPwKsWbjnRrJIa1QYFHQBqM4C7F2WTbV8ahTEcg1Eo+Y0aWjjORInYFyA=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.30", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-YJs6Pz17RMNv8HoyKREtCY38E3BV1nPkWVmIb+XN1uHC1Vqt3KZCH/uJH9ZKRoiKb/icZ6tvehyee6RZNbFfRA=="], "brace-expansion": ["brace-expansion@5.0.12", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - "browserslist": ["browserslist@4.29.3", "", { "dependencies": { "baseline-browser-mapping": "^2.11.26", "caniuse-lite": "^1.0.30001813", "electron-to-chromium": "^1.5.439", "node-releases": "^2.0.57", "update-browserslist-db": "^1.3.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA=="], + "browserslist": ["browserslist@4.29.4", "", { "dependencies": { "baseline-browser-mapping": "^2.11.29", "caniuse-lite": "^1.0.30001816", "electron-to-chromium": "^1.5.459", "node-releases": "^2.0.59", "update-browserslist-db": "^1.3.4" }, "bin": { "browserslist": "cli.js" } }, "sha512-2TcbbiwXEq+N0kD36tykpCfyyQigUXmuwNQbnPp4Xk4PX9JOqVIKjJlIDjpH7uY6tmRGoAd+apeT1p60T8wsdA=="], "builtin-modules": ["builtin-modules@3.3.0", "", {}, "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw=="], - "bun-types": ["bun-types@1.4.2", "", { "dependencies": { "@types/node": "*" } }, "sha512-bxV1FgK7yBIzjRe5zBozIM4Bem11ZJcCXSrjWRG3YWLt8yFDePu4cLjpebO8OvPeIE9trbyPF4fuj3Cia4Fj3w=="], + "bun-types": ["bun-types@1.4.3", "", { "dependencies": { "@types/node": "*", "undici-types": "*" } }, "sha512-tinRJNGOmUN+tEAsn2y2e942n9JHRHR42iUYzDH75NmhJqVBokGSQkkfSFdNWwsANIdrK6ACH9t01M452YyTwg=="], "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], - "cac": ["cac@7.0.1", "", {}, "sha512-86diuUyeeWM8CrqhpGCaDafrzjS1s++7sWy2AbAPoFNz/xKv7ID57CR4pZsMuGCh60PtsnEx4z68b+Vgt07VPw=="], + "cac": ["cac@7.1.0", "", {}, "sha512-LMDU/U2yA4IPIY8KT0NsNPWEYZvAMkbgyspxJ6btJaYV+WMDOHAZCmB0lsTObiHaRS1V/ztKAl7+TSkTqXyeoA=="], "cacheable": ["cacheable@2.5.0", "", { "dependencies": { "@cacheable/memory": "^2.2.0", "@cacheable/utils": "^2.5.0", "hookified": "^1.15.0", "keyv": "^5.6.0", "qified": "^0.10.1" } }, "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g=="], @@ -496,7 +542,9 @@ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001815", "", {}, "sha512-uDybUEyfgbyJJ93J1vikTylBX31AkdVYeVPeffMQpf8XN7hSfr0oZOn4VFOIMNvtU5+rHvC5Udg2TgtJKHm23Q=="], + "caniuse-lite": ["caniuse-lite@1.0.30001816", "", {}, "sha512-+8Yx7BXCoqk6IF8yTicjfUR6D/ldJzdlsodlEOiOSPmhK844WIgk67/zIQaGAOxNkZyyvBlrRFnLvqKIoqbAFw=="], + + "chai": ["chai@6.3.0", "", {}, "sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -512,6 +560,8 @@ "commander": ["commander@15.0.0", "", {}, "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg=="], + "comment-parser": ["comment-parser@1.4.9", "", {}, "sha512-+2AvZKjJaNq9GQljm3tr0utwrig5BL+jgJGvz5rDpGKNIp+ojcRXWUwBbh/sGIi1QCprR6PsKFakub+w1v+4hQ=="], + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], @@ -538,15 +588,17 @@ "defu": ["defu@6.1.7", "", {}, "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="], + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], "dts-resolver": ["dts-resolver@3.0.0", "", { "peerDependencies": { "oxc-resolver": ">=11.0.0" }, "optionalPeers": ["oxc-resolver"] }, "sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q=="], "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - "effect": ["effect@4.0.2", "", {}, "sha512-YeYnLqSFrL4+tCOXRrfNP03w8FILoF/wDl+ukraJAGzXrjcS383W7LAAvGBbLatEyktmLxRq+9xJinx7QzXW5A=="], + "effect": ["effect@4.0.5", "", {}, "sha512-BY4/28NlpOd99yzmV741xbVGmp+1U7tks4oB7F/Png64bTa5tm5eCA6W0RiXsnuLDDoJpjfVSo4Dnq4BZb/89Q=="], - "electron-to-chromium": ["electron-to-chromium@1.5.452", "", {}, "sha512-cVvk1YBSj6571VmV6hdJTqj94Y79xSu8cj6Y9t6ae4Y4431z8/7EJFvu3rVp90xhfuv9BpPKUmaLfTo4+FOGBg=="], + "electron-to-chromium": ["electron-to-chromium@1.5.459", "", {}, "sha512-4SC9HHSFjO/liAhifpdOL5hG9b4BP7/5G3y3UPZVO8trlAXr1CaUEEJL0gWK3kOcYcZrOA5rkwG45Gra/lTIgg=="], "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], @@ -562,6 +614,8 @@ "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + "es-module-lexer": ["es-module-lexer@2.3.2", "", {}, "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw=="], + "es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], @@ -572,9 +626,9 @@ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], - "eslint": ["eslint@10.12.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.7.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "11.1.5 || >11.1.6 <12", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-npHjrHb2o4ehH3mE+YuxABR+0gyb0aVWCIolgJDArwCiHEIsonBm3ZKjel5b0U5+a+MbEvIyRCGCzD3eKKK2NA=="], + "eslint": ["eslint@10.13.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.7.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "11.1.5 || >11.1.6 <12", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-UohDjD4zSzEwhf58M3O7vc/ycc8O1I7dNlhtD0WxE8Px8EHNJKtUwzBqrzeGhisRuv2ag4sAYswszCJRgKXYUg=="], "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], @@ -594,21 +648,25 @@ "eslint-plugin-import": ["eslint-plugin-import@2.32.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA=="], + "eslint-plugin-jsdoc": ["eslint-plugin-jsdoc@65.3.15", "", { "dependencies": { "@es-joy/jsdoccomment": "~0.98.0", "@es-joy/resolve.exports": "1.2.0", "@typescript-eslint/utils": "^8.70.1", "are-docs-informative": "^0.1.1", "comment-parser": "1.4.9", "debug": "^4.4.3", "escape-string-regexp": "^5.0.0", "espree": "^11.2.0", "esquery": "^1.7.0", "html-entities": "^2.6.0", "object-deep-merge": "^2.0.1", "parse-imports-exports": "^0.2.4", "semver": "^7.8.5", "spdx-expression-parse": "^5.0.0", "to-valid-identifier": "^1.0.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-cpU66X+daaX2X6cndE0grdLAIlodysI3KuUEdrJd6FvQHuuYOOvMRAdy8ToYjyJrsoUv0fXkMclA5RM5kaipMw=="], + "eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="], "eslint-plugin-no-only-tests": ["eslint-plugin-no-only-tests@3.4.0", "", {}, "sha512-4S3/9Nb7A2tiMcpzEQE9bQSlpeOz6WJkgryBuou/SA8W2x2c8Zf4j0NvTKBjv6qNhF9T79tmkecm/0CHqV0UGg=="], - "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.6", "", { "dependencies": { "prettier-linter-helpers": "^1.0.1", "synckit": "^0.11.13" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ=="], + "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.7", "", { "dependencies": { "prettier-linter-helpers": "^1.0.1", "synckit": "^0.12.3" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-WjHyn3GrFd+ZR0rzsLiM4zJZ35PZMOE0SUIxzGmnWNG0126yNfJKJzObmmkYDwHJfGlkz3PSlzyG9ez/LJntwg=="], "eslint-plugin-sonarjs": ["eslint-plugin-sonarjs@4.2.2", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@sonarsource/analyzer-commons-configurations": "^2.31.0-5284", "builtin-modules": "^3.3.0", "bytes": "^3.1.2", "functional-red-black-tree": "^1.0.1", "globals": "^17.12.0", "jsx-ast-utils-x": "^0.1.0", "lodash.merge": "^4.6.2", "minimatch": "^10.2.6", "scslre": "^0.3.0", "semver": "^7.8.5", "ts-api-utils": "^2.5.0", "typescript": ">=5 <6.1.0", "yaml": "^2.9.1" }, "peerDependencies": { "eslint": "^8.0.0 || ^9.0.0 || ^10.0.0" } }, "sha512-usNF9GfP89ibwhfxpZaCMW40sC7UEOusDgDCk7lyqAhh4AYdbBaAgLVL5Y/QS0jSed8eJ2ACGH6zzE8ezd/yZQ=="], + "eslint-plugin-tsdoc": ["eslint-plugin-tsdoc@0.5.4", "", { "dependencies": { "@microsoft/tsdoc": "0.17.1", "@microsoft/tsdoc-config": "0.18.3", "@typescript-eslint/utils": "~8.56.0" }, "peerDependencies": { "eslint": ">=7" }, "optionalPeers": ["eslint"] }, "sha512-TEtalhim3aByMLXWmPRYadb91Y2K2yQWYPOXmp8x/NYtrHsE0/mdlDe9idWBB2oF+eUa88P5pgLIZbXjjjibDg=="], + "eslint-rule-documentation": ["eslint-rule-documentation@1.0.23", "", {}, "sha512-pWReu3fkohwyvztx/oQWWgld2iad25TfUdi6wvhhaDPIQjHU/pyvlKgXFw1kX31SQK2Nq9MH+vRDWB0ZLy8fYw=="], "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], @@ -616,9 +674,13 @@ "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - "execa": ["execa@10.1.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "figures": "^6.1.0", "get-stream": "^9.0.1", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.3.1", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "which-command": "^0.1.0", "yoctocolors": "^2.2.0" } }, "sha512-5HT/600HqXEtmkb9mK/PkTWw+bQSCzPnWiZ4/87wD3Hi0wFzCapOuNT9p4M08PDd+KLHdHvFhKjOWmNx/npRNQ=="], + "execa": ["execa@10.2.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "figures": "^6.1.0", "get-stream": "^9.0.1", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.3.1", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "which-command": "^0.1.0", "yoctocolors": "^2.2.0" } }, "sha512-j1pFOVxaybMVCTNHSBuISL2KQcDS3KIE1wBmUp4n2X+1FgaQI2ZDJVy9TYxDyMCzYojRIMh9O8X/UoWZtxTJdw=="], + + "expect-type": ["expect-type@1.4.0", "", {}, "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], @@ -634,6 +696,8 @@ "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="], + "fast-uri": ["fast-uri@3.1.9", "", {}, "sha512-hS/0Wt3Ya043oKXs0sIxrMpKQITXhMLIrVAKKXi4gozGC9v7YRWVnXIZzjNPTO02M9BdxLCWqK1yRXgNziVyJQ=="], + "fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="], "fastq": ["fastq@1.20.3", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw=="], @@ -660,6 +724,8 @@ "formatly": ["formatly@0.11.4", "", { "dependencies": { "fd-package-json": "^2.0.0", "package-manager-detector": "^1.8.0" }, "bin": { "formatly": "bin/index.mjs" } }, "sha512-TeCC10lP8KCgoX+Fe5lryILIT0/Dy+nP0OSVnsuB5CwXoLuOdqxCYlPFF1inR8S/zTy1ec7TjhS2TeRKWzzImA=="], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], "function.prototype.name": ["function.prototype.name@1.2.0", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2", "hasown": "^2.0.4", "is-callable": "^1.2.7", "is-document.all": "^1.0.0" } }, "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew=="], @@ -710,6 +776,8 @@ "hookified": ["hookified@1.15.1", "", {}, "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg=="], + "html-entities": ["html-entities@2.6.0", "", {}, "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ=="], + "human-id": ["human-id@4.2.2", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-Z+8unD6em/MJwyrkWQ2M3wygRGI1+MztbutiNwk1DCuEPXOZRWGjtcMPZYP1exY9iNZMhd7ZOSMQSo9WYtiQRw=="], "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="], @@ -796,6 +864,8 @@ "js-yaml": ["js-yaml@4.3.2", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA=="], + "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@9.2.3", "", { "dependencies": { "@types/estree": "^1.0.9" } }, "sha512-xsCb5EbmLWNlQ8v5zQIgSYSyf1rSyVPjh8p9G2xviOl1weHm8a611fHWUOGn7ISquCL6LoBKZvh0tcKmpVGgzw=="], + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], @@ -812,7 +882,7 @@ "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], - "knip": ["knip@6.41.0", "", { "dependencies": { "formatly": "^0.11.4", "get-tsconfig": "4.14.3", "jiti": "^2.7.0", "oxc-parser": "^0.153.0", "oxc-resolver": "11.24.2", "picomatch": "^4.0.7", "smol-toml": "^1.9.0", "strip-json-comments": "5.0.3", "tinyglobby": "^0.2.17", "unbash": "^5.0.0", "yaml": "^2.9.1", "zod": "^4.6.5" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-DrhQlIuV6xScd5Q+WTF1znd1w41QzxFGCtAHXCajsH/ndGMotHoNYbdXbuFtzW3mIOmniHtZ7zCtvnQkUmJtQQ=="], + "knip": ["knip@6.42.1", "", { "dependencies": { "formatly": "^0.11.4", "get-tsconfig": "4.14.3", "jiti": "^2.7.0", "oxc-parser": "^0.154.0", "oxc-resolver": "11.24.2", "picomatch": "^4.0.7", "smol-toml": "^1.9.0", "strip-json-comments": "5.0.3", "tinyglobby": "^0.2.17", "unbash": "^6.0.0", "yaml": "^2.9.1", "zod": "^4.6.5" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-gKJVsiT4LJQ0lfc8uSHOCzkOY8adAXNFGarIeODZbJOkBnQRVsG3e0UZFnO4LMwjA82A5tBWX/VgoeTYcjdKiQ=="], "language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="], @@ -820,30 +890,56 @@ "launch-editor": ["launch-editor@2.14.2", "", { "dependencies": { "picocolors": "^1.1.1", "shell-quote": "^1.10.0" } }, "sha512-NHJEb30MGBCkmZXLZwz25t37QR4aY03ZzPYUJXOJaOa92uWwExI9SBQUuIznBYc1xkD7cJNGX7oc3Nl3sq2kQQ=="], - "lefthook": ["lefthook@2.2.1", "", { "optionalDependencies": { "lefthook-darwin-arm64": "2.2.1", "lefthook-darwin-x64": "2.2.1", "lefthook-freebsd-arm64": "2.2.1", "lefthook-freebsd-x64": "2.2.1", "lefthook-linux-arm64": "2.2.1", "lefthook-linux-x64": "2.2.1", "lefthook-openbsd-arm64": "2.2.1", "lefthook-openbsd-x64": "2.2.1", "lefthook-windows-arm64": "2.2.1", "lefthook-windows-x64": "2.2.1" }, "bin": { "lefthook": "bin/index.js" } }, "sha512-aKEwhQzGbLMkZu5vrFYKJzLvLVblWATYITmN7Ak4qRCDPCoFJhmeJZFuYf3nTXuqG9xTBE+J8xaAEPL2tpuWyw=="], + "lefthook": ["lefthook@2.2.2", "", { "optionalDependencies": { "lefthook-android-arm64": "2.2.2", "lefthook-darwin-arm64": "2.2.2", "lefthook-darwin-x64": "2.2.2", "lefthook-freebsd-arm64": "2.2.2", "lefthook-freebsd-x64": "2.2.2", "lefthook-linux-arm64": "2.2.2", "lefthook-linux-x64": "2.2.2", "lefthook-openbsd-arm64": "2.2.2", "lefthook-openbsd-x64": "2.2.2", "lefthook-windows-arm64": "2.2.2", "lefthook-windows-x64": "2.2.2" }, "bin": { "lefthook": "bin/index.js" } }, "sha512-37fYHAhL12r1twaEV0PA5TwoIT491eTGGYjhhXxlYNMq3DSkiGZBQ++Jfk5maXj0vq52NRauLtMikBKtbNJs3Q=="], + + "lefthook-android-arm64": ["lefthook-android-arm64@2.2.2", "", { "os": "android", "cpu": "arm64" }, "sha512-wb9rQQFLX7u1dJLxvMrq9VUfMYi5kxM7tJQ6Y4mWEOwaU+SmIm2wjoT/nromKq27Y8fh2Qd7FgCD3G1wfW8CnQ=="], - "lefthook-darwin-arm64": ["lefthook-darwin-arm64@2.2.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-SyuDBT5HqNQfi607vMHrYJu45bRN7JoIFdyxLjEPVe34UnZJCesmeYBODEYTyCfRZjPOaTbton4Padu+qvqfCQ=="], + "lefthook-darwin-arm64": ["lefthook-darwin-arm64@2.2.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-6V8D3bLnD/60Xhqn0o2EQD6H3Fe/U9LGkt4WF1O/3eBHbux+5ZJqoH0hfrC+Bi9Dy1Ve1AWxiAY7U2asYl8qVA=="], - "lefthook-darwin-x64": ["lefthook-darwin-x64@2.2.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-qkIdM89T3OxpLp9rssPSdRQ7QKkX0l07xWxxOaZfECn5iB2xVXSD9FQSjYUMNGXtJJWOGqdKqBngGTB/ShDZtQ=="], + "lefthook-darwin-x64": ["lefthook-darwin-x64@2.2.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-fH/kArZ9ZZ65wCFtvBMgGcq25qwQpkQ5jp93ba+8wpjgxxzjczYGluwHvM/NQDJWLOFXuKXW0yFs76SramQkyQ=="], - "lefthook-freebsd-arm64": ["lefthook-freebsd-arm64@2.2.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-0jdr/9Q5cGuazrEVquv29AOD77aPc2jAmFU4EtqVVg3PhMJjAyt7bQeA9qdwHhaHhLnaeUZwMwo3IleVm+D4wg=="], + "lefthook-freebsd-arm64": ["lefthook-freebsd-arm64@2.2.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-MCRsU01ju989QQffOfS3gCeFfyVDXs5B/FzR65fmrNvqcxb98fldvfzzoAbnK2q6SBJlRT3QT1tNEMCxddCwlA=="], - "lefthook-freebsd-x64": ["lefthook-freebsd-x64@2.2.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JFKyNZ9qQp9NsuFyAg/CJIBurIHX3AUayFXxuoDMATWAIhhlyK0YMtpWgEFIl1M2iGLBLQ3TiLoCCRnbwndNDg=="], + "lefthook-freebsd-x64": ["lefthook-freebsd-x64@2.2.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-LkKuJU0S2oLimeoHwPTy1TLWB6GcN0t5lLxiXNlsBKUkr6R47QRcvPMZMoXmu3IetQtd+WliXMLE8qTwi2fqBg=="], - "lefthook-linux-arm64": ["lefthook-linux-arm64@2.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-na8Ezm7pK44+WsQqj9tES7v8VseM1MrNeNJhUnM8eINV22KYptWam8evfjZxY3NYxOTwn6f/Zpe/BBvcLKMaTQ=="], + "lefthook-linux-arm64": ["lefthook-linux-arm64@2.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-d+HFtS2DEKaOnD7vRU0tUz8pNgHwsUYmQ22+1dyXpOrXGyzNXR0AqX5KsIRF36JGhVvO5X5Anw5QYgR3mxVSuA=="], - "lefthook-linux-x64": ["lefthook-linux-x64@2.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-wl7CR5uNkOiZ38SkW4l9O6wf/Nllbkw90ZZonXRFkbgrnPjLMhZGUt9ucewsPwBQ/ckU1t08JuBHeOywB/CFow=="], + "lefthook-linux-x64": ["lefthook-linux-x64@2.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-N/OlQyAhcU6RAXjrwFxLsh70sn96rBoi+XkuLJ8CVBkk9Ci3VDXQayDZTNz5B1xML8RwoMcV8Wblniy1xFOmSA=="], - "lefthook-openbsd-arm64": ["lefthook-openbsd-arm64@2.2.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-UFwL+AGSqkhQ15kuKl5FMRx/UqbcfcQbGFg5ggYzhT7qBOsTu3a9POXRxt3hsalBeMgkDWsv3IaPlj51YGpCAg=="], + "lefthook-openbsd-arm64": ["lefthook-openbsd-arm64@2.2.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-6G/gKXcpIwC+XcODg7ELZYP/hIrVIHQxhy2GoRdVyecmpGMFj+BZo3iqcUmeWusQMuL+UdNexbkrUaeJalIkNw=="], - "lefthook-openbsd-x64": ["lefthook-openbsd-x64@2.2.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-IMKEuxJLo91C1yjhJ42EadfXUb3ECMkvTKpSt17kwaiyZsvvZ8LGdrXwQZiLNJt2M5ECuTVCQUvDimM6mGraOw=="], + "lefthook-openbsd-x64": ["lefthook-openbsd-x64@2.2.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-eMJGi3/tqKEqu7XCZlqwQWRtK5JlL/9diaqqgRlEdlRD7GxwzHZN21z6awbITum9emea3lALvXFe6V8odQLGOA=="], - "lefthook-windows-arm64": ["lefthook-windows-arm64@2.2.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-Pi8vOvObjg8HJDl8d96s7jsI6TN33klpqv6tXSXpoKEeoAwEh5Y9NawO6bzoOpLfAxf2SfMBcuaBzFQ5zE2gjA=="], + "lefthook-windows-arm64": ["lefthook-windows-arm64@2.2.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-4P1EaQb5xG1zhYD1RLJ6TEGdFkmHkB+Slqx6yRDPKuBDNxMiD0+kTAAdUY2E8xPuRR35xHpVPR+b3/HtzPrjQQ=="], - "lefthook-windows-x64": ["lefthook-windows-x64@2.2.1", "", { "os": "win32", "cpu": "x64" }, "sha512-7FtuPrc1XzxIFLAbzneOF1hr9r/vGi2lcMpX14QG9d/mnLhwu4EyNBh48JNEqsQqrOB9QKavsNqxVl1e8zcukA=="], + "lefthook-windows-x64": ["lefthook-windows-x64@2.2.2", "", { "os": "win32", "cpu": "x64" }, "sha512-9Ck4zancQilBfXT3ZeRipm7Lcq4RQfxyMpy8SAVINw0t/BrbjsT25V46ZuziERcwdajnE4myfMzC33GoCBwr7g=="], "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + "lightningcss": ["lightningcss@1.33.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.33.0", "lightningcss-darwin-arm64": "1.33.0", "lightningcss-darwin-x64": "1.33.0", "lightningcss-freebsd-x64": "1.33.0", "lightningcss-linux-arm-gnueabihf": "1.33.0", "lightningcss-linux-arm64-gnu": "1.33.0", "lightningcss-linux-arm64-musl": "1.33.0", "lightningcss-linux-x64-gnu": "1.33.0", "lightningcss-linux-x64-musl": "1.33.0", "lightningcss-win32-arm64-msvc": "1.33.0", "lightningcss-win32-x64-msvc": "1.33.0" } }, "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA=="], + + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.33.0", "", { "os": "android", "cpu": "arm64" }, "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.33.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.33.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.33.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.33.0", "", { "os": "linux", "cpu": "arm" }, "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.33.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.33.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.33.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.33.0", "", { "os": "linux", "cpu": "x64" }, "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.33.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.33.0", "", { "os": "win32", "cpu": "x64" }, "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA=="], + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], @@ -858,6 +954,8 @@ "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], + "magic-string": ["magic-string@1.4.3", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.6.0" } }, "sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ=="], + "magicast": ["magicast@0.5.5", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, "sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA=="], "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], @@ -876,16 +974,20 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + "nanoid": ["nanoid@3.3.20", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ=="], + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], "node-exports-info": ["node-exports-info@1.6.2", "", { "dependencies": { "array.prototype.flatmap": "^1.3.3", "es-errors": "^1.3.0", "object.entries": "^1.1.9", "semver": "^6.3.1" } }, "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag=="], - "node-releases": ["node-releases@2.0.58", "", {}, "sha512-BdiKAgbfRlvfMq/XzO/AF9NPmaA8a+YpLAyAFTVFBj3gARrAIfWvNq7Q7NE4se3KgFu0KkrvQMxTS0XVnsGzHg=="], + "node-releases": ["node-releases@2.0.59", "", {}, "sha512-5qr2okC4ItAI0hG5SaV0HoYMpnM/Y6+Oqr7AmPYy/2uEoGvS+GbSKLeRxSS1uAdu59yz0ouzcuXievSgg///WA=="], "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], "nypm": ["nypm@0.6.10", "", { "dependencies": { "citty": "^0.2.2", "pathe": "^2.0.3", "tinyexec": "^1.3.1" }, "bin": { "nypm": "./dist/cli.mjs" } }, "sha512-W72Hrj1petq+b3Hk2aAC+9zswetlIFTnDW4s5djseZh2nYqBbyQLOtj472HwcbcWykPBUW1WpWpjOd4nK6gMRw=="], + "object-deep-merge": ["object-deep-merge@2.0.1", "", {}, "sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg=="], + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], @@ -908,13 +1010,15 @@ "own-keys": ["own-keys@1.0.2", "", { "dependencies": { "call-bound": "^1.0.4", "get-intrinsic": "^1.3.0", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg=="], - "oxc-parser": ["oxc-parser@0.153.0", "", { "dependencies": { "@oxc-project/types": "^0.153.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.153.0", "@oxc-parser/binding-android-arm64": "0.153.0", "@oxc-parser/binding-darwin-arm64": "0.153.0", "@oxc-parser/binding-darwin-x64": "0.153.0", "@oxc-parser/binding-freebsd-x64": "0.153.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.153.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.153.0", "@oxc-parser/binding-linux-arm64-gnu": "0.153.0", "@oxc-parser/binding-linux-arm64-musl": "0.153.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.153.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.153.0", "@oxc-parser/binding-linux-riscv64-musl": "0.153.0", "@oxc-parser/binding-linux-s390x-gnu": "0.153.0", "@oxc-parser/binding-linux-x64-gnu": "0.153.0", "@oxc-parser/binding-linux-x64-musl": "0.153.0", "@oxc-parser/binding-openharmony-arm64": "0.153.0", "@oxc-parser/binding-win32-arm64-msvc": "0.153.0", "@oxc-parser/binding-win32-ia32-msvc": "0.153.0", "@oxc-parser/binding-win32-x64-msvc": "0.153.0" } }, "sha512-cEnpyyV1OJRXv++SFNw0z8i+2o/cr88rVLaOYJafELDoHM5yHvCAbwGRLvxuany6SNLcbblSMUyZaGzH+quSYg=="], + "oxc-parser": ["oxc-parser@0.154.0", "", { "dependencies": { "@oxc-project/types": "^0.154.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.154.0", "@oxc-parser/binding-android-arm64": "0.154.0", "@oxc-parser/binding-darwin-arm64": "0.154.0", "@oxc-parser/binding-darwin-x64": "0.154.0", "@oxc-parser/binding-freebsd-x64": "0.154.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.154.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.154.0", "@oxc-parser/binding-linux-arm64-gnu": "0.154.0", "@oxc-parser/binding-linux-arm64-musl": "0.154.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.154.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.154.0", "@oxc-parser/binding-linux-riscv64-musl": "0.154.0", "@oxc-parser/binding-linux-s390x-gnu": "0.154.0", "@oxc-parser/binding-linux-x64-gnu": "0.154.0", "@oxc-parser/binding-linux-x64-musl": "0.154.0", "@oxc-parser/binding-openharmony-arm64": "0.154.0", "@oxc-parser/binding-win32-arm64-msvc": "0.154.0", "@oxc-parser/binding-win32-ia32-msvc": "0.154.0", "@oxc-parser/binding-win32-x64-msvc": "0.154.0" } }, "sha512-Gr/6fkjZwi937c4Tsz8y0iO4U0FLPkZI6JSVucLAIvQyqh379px7RS8ORIc0HOORbFjXZ6zyqWLl53qxhSeofw=="], "oxc-resolver": ["oxc-resolver@11.24.2", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.24.2", "@oxc-resolver/binding-android-arm64": "11.24.2", "@oxc-resolver/binding-darwin-arm64": "11.24.2", "@oxc-resolver/binding-darwin-x64": "11.24.2", "@oxc-resolver/binding-freebsd-x64": "11.24.2", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.24.2", "@oxc-resolver/binding-linux-arm-musleabihf": "11.24.2", "@oxc-resolver/binding-linux-arm64-gnu": "11.24.2", "@oxc-resolver/binding-linux-arm64-musl": "11.24.2", "@oxc-resolver/binding-linux-ppc64-gnu": "11.24.2", "@oxc-resolver/binding-linux-riscv64-gnu": "11.24.2", "@oxc-resolver/binding-linux-riscv64-musl": "11.24.2", "@oxc-resolver/binding-linux-s390x-gnu": "11.24.2", "@oxc-resolver/binding-linux-x64-gnu": "11.24.2", "@oxc-resolver/binding-linux-x64-musl": "11.24.2", "@oxc-resolver/binding-openharmony-arm64": "11.24.2", "@oxc-resolver/binding-wasm32-wasi": "11.24.2", "@oxc-resolver/binding-win32-arm64-msvc": "11.24.2", "@oxc-resolver/binding-win32-x64-msvc": "11.24.2" } }, "sha512-FY91FiDBj7ls5MsFS9jN3tjz2o0/zsdSsymlakySaBwVJZorHhkWyICLZMKxlu1R9vYo+sd3z1jwb4J8x7bNDw=="], - "oxfmt": ["oxfmt@0.72.0", "", { "dependencies": { "tinypool": "2.2.0" }, "optionalDependencies": { "@oxfmt/binding-android-arm-eabi": "0.72.0", "@oxfmt/binding-android-arm64": "0.72.0", "@oxfmt/binding-darwin-arm64": "0.72.0", "@oxfmt/binding-darwin-x64": "0.72.0", "@oxfmt/binding-freebsd-x64": "0.72.0", "@oxfmt/binding-linux-arm-gnueabihf": "0.72.0", "@oxfmt/binding-linux-arm-musleabihf": "0.72.0", "@oxfmt/binding-linux-arm64-gnu": "0.72.0", "@oxfmt/binding-linux-arm64-musl": "0.72.0", "@oxfmt/binding-linux-ppc64-gnu": "0.72.0", "@oxfmt/binding-linux-riscv64-gnu": "0.72.0", "@oxfmt/binding-linux-riscv64-musl": "0.72.0", "@oxfmt/binding-linux-s390x-gnu": "0.72.0", "@oxfmt/binding-linux-x64-gnu": "0.72.0", "@oxfmt/binding-linux-x64-musl": "0.72.0", "@oxfmt/binding-openharmony-arm64": "0.72.0", "@oxfmt/binding-win32-arm64-msvc": "0.72.0", "@oxfmt/binding-win32-ia32-msvc": "0.72.0", "@oxfmt/binding-win32-x64-msvc": "0.72.0" }, "peerDependencies": { "svelte": "^5.0.0", "vite-plus": "*" }, "optionalPeers": ["svelte", "vite-plus"], "bin": { "oxfmt": "bin/oxfmt" } }, "sha512-16OQeL0uhPZbfmT9S9WWM0Nv9+BmVi8Ra1uTYaSKj/qSCs6FB30KOhz9JoNYw6thT+K5bVxsk/tSEOu497i34g=="], + "oxfmt": ["oxfmt@0.71.0", "", { "dependencies": { "tinypool": "2.2.0" }, "optionalDependencies": { "@oxfmt/binding-android-arm-eabi": "0.71.0", "@oxfmt/binding-android-arm64": "0.71.0", "@oxfmt/binding-darwin-arm64": "0.71.0", "@oxfmt/binding-darwin-x64": "0.71.0", "@oxfmt/binding-freebsd-x64": "0.71.0", "@oxfmt/binding-linux-arm-gnueabihf": "0.71.0", "@oxfmt/binding-linux-arm-musleabihf": "0.71.0", "@oxfmt/binding-linux-arm64-gnu": "0.71.0", "@oxfmt/binding-linux-arm64-musl": "0.71.0", "@oxfmt/binding-linux-ppc64-gnu": "0.71.0", "@oxfmt/binding-linux-riscv64-gnu": "0.71.0", "@oxfmt/binding-linux-riscv64-musl": "0.71.0", "@oxfmt/binding-linux-s390x-gnu": "0.71.0", "@oxfmt/binding-linux-x64-gnu": "0.71.0", "@oxfmt/binding-linux-x64-musl": "0.71.0", "@oxfmt/binding-openharmony-arm64": "0.71.0", "@oxfmt/binding-win32-arm64-msvc": "0.71.0", "@oxfmt/binding-win32-ia32-msvc": "0.71.0", "@oxfmt/binding-win32-x64-msvc": "0.71.0" }, "peerDependencies": { "svelte": "^5.0.0", "vite-plus": "*" }, "optionalPeers": ["svelte", "vite-plus"], "bin": { "oxfmt": "bin/oxfmt" } }, "sha512-lUPUl0d/+Io5pDrsPXWs6rB4N/bpB78oj9CTDpnbulfDz+0r3XXcHPlQ7kRPJ2GjIT4nX+/mcqunOeP9BvsEtg=="], + + "oxlint": ["oxlint@1.89.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.89.0", "@oxlint/binding-android-arm64": "1.89.0", "@oxlint/binding-darwin-arm64": "1.89.0", "@oxlint/binding-darwin-x64": "1.89.0", "@oxlint/binding-freebsd-x64": "1.89.0", "@oxlint/binding-linux-arm-gnueabihf": "1.89.0", "@oxlint/binding-linux-arm-musleabihf": "1.89.0", "@oxlint/binding-linux-arm64-gnu": "1.89.0", "@oxlint/binding-linux-arm64-musl": "1.89.0", "@oxlint/binding-linux-ppc64-gnu": "1.89.0", "@oxlint/binding-linux-riscv64-gnu": "1.89.0", "@oxlint/binding-linux-riscv64-musl": "1.89.0", "@oxlint/binding-linux-s390x-gnu": "1.89.0", "@oxlint/binding-linux-x64-gnu": "1.89.0", "@oxlint/binding-linux-x64-musl": "1.89.0", "@oxlint/binding-openharmony-arm64": "1.89.0", "@oxlint/binding-win32-arm64-msvc": "1.89.0", "@oxlint/binding-win32-ia32-msvc": "1.89.0", "@oxlint/binding-win32-x64-msvc": "1.89.0" }, "peerDependencies": { "oxlint-tsgolint": ">=7.0.2003", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-a25hkfo61okGPvJz432fRIPoxlKtNnOVy9w4rzrmGgNm4iVTPwpSQlmdqNWnp6p9QyyPVfAZRgnf5XvSBZFk/A=="], - "oxlint": ["oxlint@1.87.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.87.0", "@oxlint/binding-android-arm64": "1.87.0", "@oxlint/binding-darwin-arm64": "1.87.0", "@oxlint/binding-darwin-x64": "1.87.0", "@oxlint/binding-freebsd-x64": "1.87.0", "@oxlint/binding-linux-arm-gnueabihf": "1.87.0", "@oxlint/binding-linux-arm-musleabihf": "1.87.0", "@oxlint/binding-linux-arm64-gnu": "1.87.0", "@oxlint/binding-linux-arm64-musl": "1.87.0", "@oxlint/binding-linux-ppc64-gnu": "1.87.0", "@oxlint/binding-linux-riscv64-gnu": "1.87.0", "@oxlint/binding-linux-riscv64-musl": "1.87.0", "@oxlint/binding-linux-s390x-gnu": "1.87.0", "@oxlint/binding-linux-x64-gnu": "1.87.0", "@oxlint/binding-linux-x64-musl": "1.87.0", "@oxlint/binding-openharmony-arm64": "1.87.0", "@oxlint/binding-win32-arm64-msvc": "1.87.0", "@oxlint/binding-win32-ia32-msvc": "1.87.0", "@oxlint/binding-win32-x64-msvc": "1.87.0" }, "peerDependencies": { "oxlint-tsgolint": ">=7.0.2003", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-drxVlaW7Oqq7wSy1CN25znRu00aRq8n57Q2wniJRxCmtYVz07ufCm7EVDPQFZURrTgQIjzKrVEHAD/HcvJXObg=="], + "oxlint-tsgolint": ["oxlint-tsgolint@7.0.2004", "", { "optionalDependencies": { "@oxlint-tsgolint/darwin-arm64": "7.0.2004", "@oxlint-tsgolint/darwin-x64": "7.0.2004", "@oxlint-tsgolint/linux-arm64": "7.0.2004", "@oxlint-tsgolint/linux-x64": "7.0.2004", "@oxlint-tsgolint/win32-arm64": "7.0.2004", "@oxlint-tsgolint/win32-x64": "7.0.2004" }, "bin": { "tsgolint": "./bin/tsgolint.js" } }, "sha512-vQ9WDF3fiZJvRdSDosNOflerOCOpwol6vWzVDxW76RcU19cjTh7engvkHLvmv+tzedR8fAiJUVUGr6IVZdkzXQ=="], "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], @@ -924,8 +1028,12 @@ "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-imports-exports": ["parse-imports-exports@0.2.4", "", { "dependencies": { "parse-statements": "1.0.11" } }, "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ=="], + "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], + "parse-statements": ["parse-statements@1.0.11", "", {}, "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA=="], + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], "path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], @@ -942,6 +1050,8 @@ "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + "postcss": ["postcss@8.5.31", "", { "dependencies": { "nanoid": "^3.3.20", "picocolors": "^1.1.1", "source-map-js": "^1.2.2" } }, "sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg=="], + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], "prettier": ["prettier@3.9.10", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA=="], @@ -966,21 +1076,25 @@ "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], - "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "reserved-identifiers": ["reserved-identifiers@1.2.0", "", {}, "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw=="], + + "resolve": ["resolve@1.22.13", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.17.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-Dj/cW9zBV2aRj6XzCxuGIs3ESZKv02jixne3q6jFZYZ3/Tg09gHHviSMDL4kObh9pqSahdRHEnDoaP2gn8YLhA=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - "resolve.exports": ["resolve.exports@2.0.3", "", {}, "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A=="], + "resolve.exports": ["resolve.exports@2.0.4", "", {}, "sha512-zepuGL0ulf+nt+XaFrlKeaiTJeyPFPLLY62+ncq1/VTHBdt3HsfXOH60priZ6tnXQozdGcDeIF5JVTanvIcYWQ=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - "rolldown": ["rolldown@1.2.13", "", { "dependencies": { "@oxc-project/types": "=0.153.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.13", "@rolldown/binding-android-arm64": "1.2.13", "@rolldown/binding-darwin-arm64": "1.2.13", "@rolldown/binding-darwin-x64": "1.2.13", "@rolldown/binding-freebsd-x64": "1.2.13", "@rolldown/binding-linux-arm-gnueabihf": "1.2.13", "@rolldown/binding-linux-arm64-gnu": "1.2.13", "@rolldown/binding-linux-arm64-musl": "1.2.13", "@rolldown/binding-linux-ppc64-gnu": "1.2.13", "@rolldown/binding-linux-s390x-gnu": "1.2.13", "@rolldown/binding-linux-x64-gnu": "1.2.13", "@rolldown/binding-linux-x64-musl": "1.2.13", "@rolldown/binding-openharmony-arm64": "1.2.13", "@rolldown/binding-win32-arm64-msvc": "1.2.13", "@rolldown/binding-win32-x64-msvc": "1.2.13" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-/5apOkwWxtACcQtZ5WlrAsKS4JwXVThQPJZ3RqIruRY9UG9M8e0VlXN068xum/JRKA4aIUoJ13ghe/kGCvidiQ=="], + "rolldown": ["rolldown@1.2.14", "", { "dependencies": { "@oxc-project/types": "=0.154.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.14", "@rolldown/binding-android-arm64": "1.2.14", "@rolldown/binding-darwin-arm64": "1.2.14", "@rolldown/binding-darwin-x64": "1.2.14", "@rolldown/binding-freebsd-x64": "1.2.14", "@rolldown/binding-linux-arm-gnueabihf": "1.2.14", "@rolldown/binding-linux-arm64-gnu": "1.2.14", "@rolldown/binding-linux-arm64-musl": "1.2.14", "@rolldown/binding-linux-ppc64-gnu": "1.2.14", "@rolldown/binding-linux-s390x-gnu": "1.2.14", "@rolldown/binding-linux-x64-gnu": "1.2.14", "@rolldown/binding-linux-x64-musl": "1.2.14", "@rolldown/binding-openharmony-arm64": "1.2.14", "@rolldown/binding-win32-arm64-msvc": "1.2.14", "@rolldown/binding-win32-x64-msvc": "1.2.14" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-eTBTTqMR6uHKLgcUqpJP8ntzDI6V4LYA8negAMBEI7gkgVvOdrx6VsvS2Ym+83KhOPdLCHWJu0w7UQFJZhHKNw=="], - "rolldown-plugin-dts": ["rolldown-plugin-dts@0.28.7", "", { "dependencies": { "dts-resolver": "^3.0.0", "get-tsconfig": "5.0.0-beta.6", "obug": "^3.0.0", "yuku-ast": "^0.18.1", "yuku-codegen": "^0.18.1", "yuku-parser": "^0.18.1" }, "peerDependencies": { "@typescript/native-preview": "*", "@volar/typescript": "~2.4.0", "@vue/language-core": "~3.2.0 || ~3.3.0", "rolldown": "^1.2.0", "typescript": "^5.0.0 || ^6.0.0 || ~7.0.0", "vue-tsc": "~3.2.0 || ~3.3.0" }, "optionalPeers": ["@typescript/native-preview", "@volar/typescript", "@vue/language-core", "typescript", "vue-tsc"] }, "sha512-o0lA6/NPzBAhMFgnIVJgW4eMBbMBQ8sXEbq4GqEHloerWMLqLNatpFy5AlWpEKskFShWKNghMMI8naul9Lgo5Q=="], + "rolldown-plugin-dts": ["rolldown-plugin-dts@0.28.8", "", { "dependencies": { "dts-resolver": "^3.0.0", "get-tsconfig": "5.0.0-beta.6", "obug": "^3.0.0", "yuku-ast": "^0.19.0", "yuku-codegen": "^0.19.0", "yuku-parser": "^0.19.0" }, "peerDependencies": { "@typescript/native-preview": "*", "@volar/typescript": "~2.4.0", "@vue/language-core": "~3.2.0 || ~3.3.0", "rolldown": "^1.2.0", "typescript": "^5.0.0 || ^6.0.0 || ~7.0.0", "vue-tsc": "~3.2.0 || ~3.3.0" }, "optionalPeers": ["@typescript/native-preview", "@volar/typescript", "@vue/language-core", "typescript", "vue-tsc"] }, "sha512-FVhfqxorCWcc20BVT5eVRfRjzLLl6mgzjcMR4gSBf0K4oQMXT0qoHhhzfXy0L7y83fQy7Ug5ZDNk90xM3/LiCQ=="], "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], @@ -1024,6 +1138,14 @@ "source-map-js": ["source-map-js@1.2.2", "", {}, "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw=="], + "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], + + "spdx-expression-parse": ["spdx-expression-parse@5.0.0", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-vngmw3Rgn+o2arXNbnZaj5UtOEBuWBfvaI+Wc8GFfykIhA5/vdK9/Sp/XkLv63dykz2rxKDvKEHupF5P0FORcQ=="], + + "spdx-license-ids": ["spdx-license-ids@3.0.24", "", {}, "sha512-cLS9TtWkIQFyLkJ3/5aFQAOHOSKTlOs/7WDut/XPSdjom1fJhUdkepeJAKXa9Y05+FabHd0sti+Et559vDtkpQ=="], + + "std-env": ["std-env@4.3.0", "", {}, "sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag=="], + "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], "string-width": ["string-width@8.3.0", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ=="], @@ -1050,7 +1172,9 @@ "svg-element-attributes": ["svg-element-attributes@1.3.1", "", {}, "sha512-Bh05dSOnJBf3miNMqpsormfNtfidA/GxQVakhtn0T4DECWKeXQRQUceYjJ+OxYiiLdGe4Jo9iFV8wICFapFeIA=="], - "synckit": ["synckit@0.11.13", "", { "dependencies": { "@pkgr/core": "^0.3.6" } }, "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg=="], + "synckit": ["synckit@0.12.3", "", { "dependencies": { "@dual-bundle/import-meta-resolve": "^4.2.1", "@pkgr/core": "^0.3.6" } }, "sha512-U+/AXT6LWsxnj2vz9HeUuPWBNgdWxjyIEjEPdbJARC9txmgPzo2VEdqnFo4hHaNyMPtycyVJrSaQYeQv/PoyyA=="], + + "tinybench": ["tinybench@6.2.2", "", {}, "sha512-nIZ2N2dFpjBsg2hgitKu7mA+FvsIJuGJOwysRngmVRRmWgR/UyPjwJj8c/fT/dhm8EkHnF5EOogRf+0Z2qrimA=="], "tinyexec": ["tinyexec@1.3.1", "", {}, "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA=="], @@ -1060,6 +1184,8 @@ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + "to-valid-identifier": ["to-valid-identifier@1.0.0", "", { "dependencies": { "@sindresorhus/base62": "^1.0.0", "reserved-identifiers": "^1.0.0" } }, "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw=="], + "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="], @@ -1082,13 +1208,13 @@ "typescript": ["@typescript/typescript6@6.0.2", "", { "dependencies": { "@typescript/old": "npm:typescript@^6" }, "bin": { "tsc6": "bin/tsc6" } }, "sha512-mbCddXd+jm7hfx7w2YU64/Av4/NqqeG3GoRZgxPcgoTxYjhrcfJRw9ULch71SS4G+Q3bOXFhRvPqjguN0Hyp5w=="], - "typescript-eslint": ["typescript-eslint@8.71.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.71.1", "@typescript-eslint/parser": "8.71.1", "@typescript-eslint/typescript-estree": "8.71.1", "@typescript-eslint/utils": "8.71.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-oiNVPC3/NbV1FpaHU07l8O6ynqG9v4PAiW2WvTrAmZdR0f2HI/gE668ElMLCK7Xbsu5k2fK5C4fXNiq05j7/nQ=="], + "typescript-eslint": ["typescript-eslint@8.72.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.72.0", "@typescript-eslint/parser": "8.72.0", "@typescript-eslint/typescript-estree": "8.72.0", "@typescript-eslint/utils": "8.72.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-r26Fkc8As+mZvqp7SLsMmNFyYUup/6CjK7/eHBHmhOw6GH6n6YFxHVFrG0jN1c5CMpDzelLPxvgeCOzx7BjN+A=="], "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="], - "ultracite": ["ultracite@8.0.0", "", { "dependencies": { "@clack/prompts": "^1.8.1", "cli-truncate": "^6.1.1", "commander": "^15.0.0", "deepmerge": "^4.3.1", "empathic": "^2.1.0", "execa": "^10.0.1", "fast-glob": "^3.3.3", "find-workspaces": "^0.3.1", "jsonc-parser": "^3.3.1", "log-update": "^8.0.0", "magicast": "^0.5.5", "npm-run-path": "^6.0.0", "nypm": "^0.6.10", "resolve.exports": "^2.0.3", "semver": "^7.8.5", "string-width": "^8.3.0", "which-command": "^0.1.0", "yaml": "^2.9.1", "zod": "^4.6.5" }, "peerDependencies": { "@biomejs/biome": "^2.5.0", "eslint": "^10.9.0", "oxfmt": ">=0.71.0 <1", "oxlint": "^1.86.0", "prettier": "^3.5.3", "stylelint": "^17.0.0" }, "optionalPeers": ["@biomejs/biome", "eslint", "oxfmt", "oxlint", "prettier", "stylelint"], "bin": { "ultracite": "dist/index.js" } }, "sha512-52y2Zzp6ngUPJIjvcnoyM2p4qSDwOCzrWwHvKfxNcOdRRuhmrTLqzwMpGhnhz2LC2POEO8GV7EcggbwTRmHEdA=="], + "ultracite": ["ultracite@8.0.1", "", { "dependencies": { "@clack/prompts": "^1.8.1", "cli-truncate": "^6.1.1", "commander": "^15.0.0", "deepmerge": "^4.3.1", "empathic": "^2.1.0", "execa": "^10.0.1", "fast-glob": "^3.3.3", "find-workspaces": "^0.3.1", "jsonc-parser": "^3.3.1", "log-update": "^8.0.0", "magicast": "^0.5.5", "npm-run-path": "^6.0.0", "nypm": "^0.6.10", "resolve.exports": "^2.0.3", "semver": "^7.8.5", "string-width": "^8.3.0", "which-command": "^0.1.0", "yaml": "^2.9.1", "zod": "^4.6.5" }, "peerDependencies": { "@biomejs/biome": "^2.5.0", "eslint": "^10.9.0", "oxfmt": ">=0.71.0 <1", "oxlint": "^1.86.0", "prettier": "^3.5.3", "stylelint": "^17.0.0" }, "optionalPeers": ["@biomejs/biome", "eslint", "oxfmt", "oxlint", "prettier", "stylelint"], "bin": { "ultracite": "dist/index.js" } }, "sha512-4XtB3My7o/O8uveSBPjMO6aPwkO7LEGDf2RCuR4jMVSJ4JByLNIb8+xpCR5M+HssgPrl0aSTQ/40od80ItmiqQ=="], - "unbash": ["unbash@5.0.0", "", {}, "sha512-RYNm/ISFtflWpIcXTPHHLJZ0mqzInav+L9ke9PcL+hHsSf9+Fd/syPb614Mlqs/O3AYgjnvxDOFl0a+zVqi1/w=="], + "unbash": ["unbash@6.0.0", "", {}, "sha512-vD5CvvFLVQDhXdNyNEPPa/tHPCK3HLySddOine+OZLDYIH1cMImGNgnw9+NkizToaPsFsQlwiyPGMiK+uwtYVw=="], "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], @@ -1104,6 +1230,10 @@ "verkit": ["verkit@0.5.0", "", {}, "sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g=="], + "vite": ["vite@8.3.4", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", "postcss": "^8.5.29", "rolldown": "~1.2.12", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ=="], + + "vitest": ["vitest@5.0.5", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/mocker": "5.0.5", "chai": "^6.3.0", "es-module-lexer": "^2.3.2", "expect-type": "^1.4.0", "magic-string": "^1.4.3", "obug": "^3.0.0", "picomatch": "^4.0.7", "std-env": "^4.3.0", "tinybench": "^6.2.2", "tinyexec": "^1.3.1", "tinyglobby": "^0.2.17", "why-is-node-running": "3.2.1" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "5.0.5", "@vitest/browser-preview": "5.0.5", "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", "@vitest/coverage-istanbul": "5.0.5", "@vitest/coverage-v8": "5.0.5", "@vitest/ui": "5.0.5", "happy-dom": "*", "jsdom": "*", "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "./vitest.mjs" } }, "sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg=="], + "walk-up-path": ["walk-up-path@4.0.0", "", {}, "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A=="], "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], @@ -1118,6 +1248,8 @@ "which-typed-array": ["which-typed-array@1.1.24", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ=="], + "why-is-node-running": ["why-is-node-running@3.2.1", "", { "bin": { "why-is-node-running": "cli.js" } }, "sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ=="], + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], "wrap-ansi": ["wrap-ansi@10.0.2", "", { "dependencies": { "ansi-styles": "^6.2.3", "string-width": "^8.2.0" } }, "sha512-6OLRNZqRntVGBm26ghZ5eZhCuWWyOkRCSn8XsOIuq5stpCE/tjLbdozd93naILZig0lmD8ANfRwnhn0DLeXGlg=="], @@ -1128,15 +1260,15 @@ "yoctocolors": ["yoctocolors@2.2.0", "", {}, "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg=="], - "yuku-ast": ["yuku-ast@0.18.1", "", { "dependencies": { "@yuku-toolchain/types": "^0.18.1" } }, "sha512-Y9YgmYeExF+13IOm4r9pTgmQiCVJtrhq014st78eAckWlCkbjzNd2AVrQHng5uiLz9j31O4sGYhuP3znSKJv9w=="], + "yuku-ast": ["yuku-ast@0.19.0", "", { "dependencies": { "@yuku-toolchain/types": "^0.19.0" } }, "sha512-PyCsiScaelhxBGzL8dyeJkLqvRZycoh78R31Vrt/WqYrm0hMFoKwIw/X7Dx5mBKLWAMlV9I9HEyBOHnj2gZVyw=="], - "yuku-codegen": ["yuku-codegen@0.18.1", "", { "dependencies": { "@yuku-toolchain/types": "^0.18.1" } }, "sha512-0tNgBfNHW6+tEBGEf1N20C6tDsFR9Vj344Ey01wgAMeP+j0zR5WBF8dyzOu5oA/n6Yz6YqV1ZcASdi0cin+q8A=="], + "yuku-codegen": ["yuku-codegen@0.19.0", "", { "dependencies": { "@yuku-toolchain/types": "^0.19.0" } }, "sha512-uymAKHjDuaP4BEpkXC/BSLz4DUEF5oArZ5AuD3888nb2miChjWSgpPdojEJxm3pjpXkgUaCRJQyNAbnMN33wHg=="], - "yuku-core": ["yuku-core@0.18.1", "", { "dependencies": { "@yuku-toolchain/types": "^0.18.1" }, "optionalDependencies": { "@yuku-core/binding-android-arm64": "0.18.1", "@yuku-core/binding-darwin-arm64": "0.18.1", "@yuku-core/binding-darwin-x64": "0.18.1", "@yuku-core/binding-freebsd-x64": "0.18.1", "@yuku-core/binding-linux-arm-gnu": "0.18.1", "@yuku-core/binding-linux-arm-musl": "0.18.1", "@yuku-core/binding-linux-arm64-gnu": "0.18.1", "@yuku-core/binding-linux-arm64-musl": "0.18.1", "@yuku-core/binding-linux-x64-gnu": "0.18.1", "@yuku-core/binding-linux-x64-musl": "0.18.1", "@yuku-core/binding-win32-arm64": "0.18.1", "@yuku-core/binding-win32-x64": "0.18.1" } }, "sha512-8PEOCKEi7r3nPY5cF0ZtJJSQj0ftwd0GC4En8fDQIP3nxw5ysSDwM0RcEuyHBblowRb82ad9AsExpqnKXAtC1Q=="], + "yuku-core": ["yuku-core@0.19.0", "", { "dependencies": { "@yuku-toolchain/types": "^0.19.0" }, "optionalDependencies": { "@yuku-core/binding-android-arm64": "0.19.0", "@yuku-core/binding-darwin-arm64": "0.19.0", "@yuku-core/binding-darwin-x64": "0.19.0", "@yuku-core/binding-freebsd-x64": "0.19.0", "@yuku-core/binding-linux-arm-gnu": "0.19.0", "@yuku-core/binding-linux-arm-musl": "0.19.0", "@yuku-core/binding-linux-arm64-gnu": "0.19.0", "@yuku-core/binding-linux-arm64-musl": "0.19.0", "@yuku-core/binding-linux-x64-gnu": "0.19.0", "@yuku-core/binding-linux-x64-musl": "0.19.0", "@yuku-core/binding-win32-arm64": "0.19.0", "@yuku-core/binding-win32-x64": "0.19.0" } }, "sha512-kYK9e1XdfirNhkipzW0wmMcSWcVF/CWnuugodfVYRCUwvoBefweL9HzB96OiKEhsx78V5WbUxbJqlizMX869Qg=="], - "yuku-parser": ["yuku-parser@0.18.1", "", { "dependencies": { "@yuku-toolchain/types": "^0.18.1", "yuku-core": "0.18.1" } }, "sha512-t5pANCF6k9rgJre7jk8DMAU4lEoI1oWWZgXk0fcvmCYQquFVWv0rf6Awwt56nnPiHb0E24dhtrpfgf9ChTCbrQ=="], + "yuku-parser": ["yuku-parser@0.19.0", "", { "dependencies": { "@yuku-toolchain/types": "^0.19.0", "yuku-core": "0.19.0" } }, "sha512-XrBh9ZiQK5mJVRxZBAvD6LwRyAYrK3MFtH3+onyuxFL5hFD44EC3QOmIC1FjTj6H2MMwq46/NAI+NZxLZPZgxg=="], - "zod": ["zod@4.6.5", "", {}, "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q=="], + "zod": ["zod@4.6.7", "", {}, "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg=="], "@cacheable/memory/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], @@ -1144,6 +1276,8 @@ "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + "@eslint/eslintrc/espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], "@eslint/eslintrc/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], @@ -1152,7 +1286,9 @@ "@keyv/bigmap/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.12", "", {}, "sha512-/8UvqAPU9DGTI9k4mxtf49U37Isfwr8Uts96+SBHIkFxPJnHS0Ew4f00sM4Scd8V8EjM0jUNtVDdv1kPdt35lg=="], + "@microsoft/tsdoc-config/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.13", "", {}, "sha512-2E8Q6rh+1RRSq/YdaGsNfXsEZy9FVqv6BSSrkmZJP7BnaoPnRfKL+YaofPvP+5rzdk144qSm6i4+hvPgUcbV4Q=="], "cacheable/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], @@ -1162,12 +1298,14 @@ "eslint/escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint/espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], - "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + "eslint-import-resolver-node/resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + "eslint-plugin-eslint-comments/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + "eslint-plugin-github/typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1182,7 +1320,7 @@ "eslint-plugin-jsx-a11y/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint-plugin-tsdoc/@typescript-eslint/utils": ["@typescript-eslint/utils@8.56.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.56.1", "@typescript-eslint/types": "8.56.1", "@typescript-eslint/typescript-estree": "8.56.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA=="], "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], @@ -1194,8 +1332,12 @@ "rolldown-plugin-dts/get-tsconfig": ["get-tsconfig@5.0.0-beta.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw=="], + "@eslint/eslintrc/espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "@eslint/eslintrc/minimatch/brace-expansion": ["brace-expansion@1.1.21", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw=="], + "@microsoft/tsdoc-config/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "eslint-plugin-import/eslint/@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], "eslint-plugin-import/eslint/@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], @@ -1212,6 +1354,8 @@ "eslint-plugin-import/eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint-plugin-import/eslint/espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "eslint-plugin-import/eslint/file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], "eslint-plugin-import/minimatch/brace-expansion": ["brace-expansion@1.1.21", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw=="], @@ -1230,10 +1374,18 @@ "eslint-plugin-jsx-a11y/eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint-plugin-jsx-a11y/eslint/espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "eslint-plugin-jsx-a11y/eslint/file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], "eslint-plugin-jsx-a11y/minimatch/brace-expansion": ["brace-expansion@1.1.21", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw=="], + "eslint-plugin-tsdoc/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.56.1", "", { "dependencies": { "@typescript-eslint/types": "8.56.1", "@typescript-eslint/visitor-keys": "8.56.1" } }, "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w=="], + + "eslint-plugin-tsdoc/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.56.1", "", {}, "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw=="], + + "eslint-plugin-tsdoc/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.56.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.56.1", "@typescript-eslint/tsconfig-utils": "8.56.1", "@typescript-eslint/types": "8.56.1", "@typescript-eslint/visitor-keys": "8.56.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg=="], + "@eslint/eslintrc/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "eslint-plugin-import/eslint/@eslint/config-array/@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], @@ -1247,5 +1399,17 @@ "eslint-plugin-jsx-a11y/eslint/file-entry-cache/flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], "eslint-plugin-jsx-a11y/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "eslint-plugin-tsdoc/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.56.1", "", { "dependencies": { "@typescript-eslint/types": "8.56.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw=="], + + "eslint-plugin-tsdoc/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.56.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.56.1", "@typescript-eslint/types": "^8.56.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ=="], + + "eslint-plugin-tsdoc/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.56.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ=="], + + "eslint-plugin-tsdoc/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.56.1", "", { "dependencies": { "@typescript-eslint/types": "8.56.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw=="], + + "eslint-plugin-tsdoc/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.72.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-0vbxCf7xLVPSjcOdm6eQbgViH8EDJ8xnl1laLT9yoqSz2YmcSfSg5Vdl0JUvZf6rcuJ0ZivJIuMD4edTg8obaA=="], + + "eslint-plugin-tsdoc/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service/@typescript-eslint/types": ["@typescript-eslint/types@8.72.0", "", {}, "sha512-Adfoy59kxNEjT5E5fnyrp7GpHYuWs8ONbdohu4ez6IU46qDq8LltG90tLmkucZB2uhYL8mqBjtXqGd8yhfjXqQ=="], } } diff --git a/lefthook.yml b/lefthook.yml index 0e19112..e6fd858 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -1,12 +1,28 @@ pre-commit: jobs: - - run: bun x ultracite fix + - run: bunx ultracite fix {staged_files} glob: - - "**/*.js" - - "**/*.jsx" - - "**/*.ts" - - "**/*.tsx" - - "**/*.json" - - "**/*.jsonc" - - "**/*.css" + - "*.js" + - "*.jsx" + - "*.mjs" + - "*.cjs" + - "*.ts" + - "*.tsx" + - "*.mts" + - "*.cts" + - "*.json" + - "*.jsonc" + - "*.css" + - "*.scss" + - "*.less" + - "*.vue" + - "*.svelte" + - "*.astro" + - "*.html" + - "*.md" + - "*.mdx" + - "*.yaml" + - "*.yml" + - "*.graphql" + - "*.gql" stage_fixed: true diff --git a/oxlint.config.ts b/oxlint.config.ts index f568b89..62bde48 100644 --- a/oxlint.config.ts +++ b/oxlint.config.ts @@ -2,11 +2,14 @@ import { defineConfig } from "oxlint"; import antiSlop from "ultracite/oxlint/anti-slop"; import core from "ultracite/oxlint/core"; import { selectJsPlugins } from "ultracite/oxlint/js-plugins"; +import vitest from "ultracite/oxlint/vitest"; -const jsPlugins = selectJsPlugins(["github", "sonarjs"]); +const jsPlugins = selectJsPlugins(["github", "jsdoc-js", "sonarjs", "tsdoc"]); export default defineConfig({ - extends: [core, antiSlop, jsPlugins], + env: core.env, + extends: [antiSlop, core, vitest, jsPlugins], ignorePatterns: core.ignorePatterns, jsPlugins: jsPlugins.jsPlugins, + options: { typeAware: true }, }); diff --git a/package.json b/package.json index 83412eb..2c124d6 100644 --- a/package.json +++ b/package.json @@ -33,25 +33,29 @@ "knip": "knip", "prepare": "lefthook install", "release": "bun run ./scripts/publish.ts", - "test": "bun test", + "test": "bun run build && vitest run", "typecheck": "tsc --noEmit" }, "dependencies": { - "effect": "4.0.2" + "effect": "4.0.5" }, "devDependencies": { "@changesets/cli": "^3.0.3", - "@types/bun": "^1.4.2", + "@types/bun": "^1.4.3", "@typescript/native": "npm:typescript@^7.0.2", "eslint-plugin-github": "6.1.2", + "eslint-plugin-jsdoc": "^65.1.0", "eslint-plugin-sonarjs": "^4.2.2", - "knip": "^6.41.0", - "lefthook": "^2.2.1", - "oxfmt": "^0.72.0", - "oxlint": "^1.87.0", + "eslint-plugin-tsdoc": "^0.5.4", + "knip": "^6.42.1", + "lefthook": "^2.2.2", + "oxfmt": "^0.71.0", + "oxlint": "^1.86.0", + "oxlint-tsgolint": "^7.0.2004", "tsdown": "^0.23.1", "typescript": "npm:@typescript/typescript6@^6.0.2", - "ultracite": "8.0.0" + "ultracite": "8.0.1", + "vitest": "^5.0.5" }, "packageManager": "bun@1.4.3" } diff --git a/scripts/add-changeset.ts b/scripts/add-changeset.ts index c0621ad..0e4f853 100644 --- a/scripts/add-changeset.ts +++ b/scripts/add-changeset.ts @@ -18,13 +18,21 @@ import path from "node:path"; import { Schema } from "effect"; /** Subset of `package.json` fields read by this script. */ -interface PackageJson { - dependencies?: Record; - devDependencies?: Record; - name?: string; - optionalDependencies?: Record; - peerDependencies?: Record; -} +const PackageJsonSchema = Schema.Struct({ + dependencies: Schema.optionalKey(Schema.Record(Schema.String, Schema.String)), + devDependencies: Schema.optionalKey( + Schema.Record(Schema.String, Schema.String) + ), + name: Schema.optionalKey(Schema.String), + optionalDependencies: Schema.optionalKey( + Schema.Record(Schema.String, Schema.String) + ), + peerDependencies: Schema.optionalKey( + Schema.Record(Schema.String, Schema.String) + ), +}); + +type PackageJson = typeof PackageJsonSchema.Type; /** Supported Changesets semver bump types. */ type ChangesetType = "patch" | "minor" | "major"; @@ -35,7 +43,19 @@ const PACKAGE_JSON_FILENAME = "package.json"; /** Allowed Changesets bump types. */ const changesetTypes = ["patch", "minor", "major"] as const; -/** Returns whether `type` is a supported Changesets bump type. */ +/** Prints a fatal CLI message and terminates the process. + * @param message - Error message to print. + * @returns Never returns because the process exits. + */ +const fail = (message: string): never => { + console.error(message); + process.exit(1); +}; + +/** Returns whether `type` is a supported Changesets bump type. + * @param type - Candidate Changesets bump type. + * @returns Whether the value is a supported bump type. + */ const isChangesetType = (type: string | undefined): type is ChangesetType => type !== undefined && changesetTypes.some((value) => value === type); @@ -43,6 +63,7 @@ const isChangesetType = (type: string | undefined): type is ChangesetType => * Walks parent directories from `startDir` until a `package.json` is found. * * @param startDir - Directory to begin searching from. + * @returns The first parent directory containing `package.json`. */ const findProjectRoot = (startDir: string) => { let currentDir = startDir; @@ -59,25 +80,24 @@ const findProjectRoot = (startDir: string) => { return currentDir; } - console.error(`Could not find ${PACKAGE_JSON_FILENAME} from script location`); - process.exit(1); + return fail(`Could not find ${PACKAGE_JSON_FILENAME} from script location`); }; /** * Reads and parses `package.json` from `packageJsonPath`. * * @param packageJsonPath - Absolute path to `package.json`. + * @returns Parsed package metadata. */ const readPackageJson = (packageJsonPath: string) => { try { - const packageJson: PackageJson = JSON.parse( - readFileSync(packageJsonPath, "utf-8") + return Schema.decodeUnknownSync(PackageJsonSchema)( + JSON.parse(readFileSync(packageJsonPath, "utf-8")) ); - return packageJson; } catch (error) { const message = error instanceof Error ? error.message : "Unknown error"; - console.error(`Failed to read package.json: ${message}`); - process.exit(1); + + return fail(`Failed to read package.json: ${message}`); } }; @@ -85,22 +105,25 @@ const readPackageJson = (packageJsonPath: string) => { * Returns the package name from parsed `package.json` metadata. * * @param packageJson - Parsed package metadata. + * @returns Valid package name. */ const getPackageName = (packageJson: PackageJson) => { - if (!Schema.is(Schema.String)(packageJson.name) || !packageJson.name.trim()) { - console.error("package.json must include a non-empty name field"); - process.exit(1); + if (packageJson.name === undefined || packageJson.name.trim().length === 0) { + return fail("package.json must include a non-empty name field"); } return packageJson.name; }; -/** Returns whether `@changesets/cli` is declared in `package.json`. */ +/** Returns whether `@changesets/cli` is declared in `package.json`. + * @param packageJson - Parsed package metadata. + * @returns Whether Changesets is declared in any dependency group. + */ const hasChangesetsCliDependency = (packageJson: PackageJson) => Boolean( - packageJson.dependencies?.["@changesets/cli"] || - packageJson.devDependencies?.["@changesets/cli"] || - packageJson.optionalDependencies?.["@changesets/cli"] || + packageJson.dependencies?.["@changesets/cli"] ?? + packageJson.devDependencies?.["@changesets/cli"] ?? + packageJson.optionalDependencies?.["@changesets/cli"] ?? packageJson.peerDependencies?.["@changesets/cli"] ); @@ -109,15 +132,16 @@ const hasChangesetsCliDependency = (packageJson: PackageJson) => * * @param packageJson - Parsed package metadata. * @param projectRoot - Repository root directory. + * @returns Nothing when the dependency is installed; otherwise exits. */ const assertChangesetsCliInstalled = ( packageJson: PackageJson, projectRoot: string -) => { +): void => { if (!hasChangesetsCliDependency(packageJson)) { - console.error('Missing dependency: "@changesets/cli"'); - console.error('Install it with: bun add -d "@changesets/cli"'); - process.exit(1); + fail( + 'Missing dependency: "@changesets/cli"\nInstall it with: bun add -d "@changesets/cli"' + ); } const requireFromProject = createRequire( @@ -127,9 +151,9 @@ const assertChangesetsCliInstalled = ( try { requireFromProject.resolve("@changesets/cli/package.json"); } catch { - console.error('Dependency "@changesets/cli" is declared but not installed'); - console.error("Run: bun install"); - process.exit(1); + fail( + 'Dependency "@changesets/cli" is declared but not installed\nRun: bun install' + ); } }; @@ -137,20 +161,22 @@ const assertChangesetsCliInstalled = ( * Parses and validates the requested Changesets bump type. * * @param type - Raw CLI type argument. + * @returns Validated Changesets bump type. */ const parseChangesetType = (type: string | undefined): ChangesetType => { if (isChangesetType(type)) { return type; } - console.error(`Invalid type: ${type}. Must be patch, minor, or major.`); - process.exit(1); + return fail(`Invalid type: ${type}. Must be patch, minor, or major.`); }; /** * Generates a unique changeset filename inside `.changeset`. * * @param changesetDir - Absolute path to the `.changeset` directory. + * @param content - Changeset file contents. + * @returns Absolute path to the newly created changeset. */ const createChangesetFile = (changesetDir: string, content: string) => { mkdirSync(changesetDir, { recursive: true }); @@ -161,17 +187,19 @@ const createChangesetFile = (changesetDir: string, content: string) => { try { writeFileSync(filename, content, { flag: "wx" }); + return filename; } catch (error) { - // SAFETY: filesystem failures expose `code` through Node's documented error shape. - if ((error as NodeJS.ErrnoException).code !== "EEXIST") { + if ( + !Schema.is(Schema.Struct({ code: Schema.String }))(error) || + error.code !== "EEXIST" + ) { throw error; } } } - console.error("Could not generate a unique changeset filename"); - process.exit(1); + return fail("Could not generate a unique changeset filename"); }; const args = process.argv.slice(2); @@ -196,9 +224,11 @@ const projectRoot = findProjectRoot(import.meta.dirname); const packageJsonPath = path.join(projectRoot, PACKAGE_JSON_FILENAME); const packageJson = readPackageJson(packageJsonPath); const packageName = getPackageName(packageJson); + assertChangesetsCliInstalled(packageJson, projectRoot); const changesetDir = path.join(projectRoot, ".changeset"); + const content = `--- "${packageName}": ${changesetType} --- @@ -208,7 +238,11 @@ ${summary.trim()} const filename = createChangesetFile(changesetDir, content); const relativeFilename = path.relative(projectRoot, filename); + console.log(`✓ Created changeset: ${relativeFilename}`); + console.log(` Package: ${packageName}`); + console.log(` Type: ${changesetType}`); + console.log(` Summary: ${summary}`); diff --git a/scripts/publish.ts b/scripts/publish.ts index 76c64e7..9fb525c 100644 --- a/scripts/publish.ts +++ b/scripts/publish.ts @@ -2,7 +2,7 @@ import { appendFileSync, readFileSync } from "node:fs"; -import { Schema } from "effect"; +import { Predicate, Schema } from "effect"; /** Package metadata required by the release workflow. */ export interface ReleasePackage { @@ -40,6 +40,9 @@ export class ReleaseError extends Error { /** Stable discriminant for release errors. */ readonly _tag = "ReleaseError" as const; + /** Creates a release error with a human-readable message. + * @param message - Explanation of the release failure. + */ constructor(message: string) { super(message); this.name = "ReleaseError"; @@ -50,7 +53,10 @@ const PACKAGE_JSON_PATH = "package.json"; const CHANGELOG_PATH = "CHANGELOG.md"; const PUBLISHED_VERSION_CONFLICT = "Cannot stage previously published version"; -/** Parses the release subcommand passed to `node --run release`. */ +/** Parses the release subcommand passed to `node --run release`. + * @param command - Raw subcommand argument. + * @returns The supported release command. + */ export const parseReleaseCommand = ( command: string | undefined ): ReleaseCommand => { @@ -61,29 +67,30 @@ export const parseReleaseCommand = ( throw new ReleaseError("Usage: node --run release -- "); }; -/** Reads and parses package metadata needed by release operations. */ +/** Reads and parses package metadata needed by release operations. + * @param packageJsonPath - Package metadata file path. + * @returns Validated release package metadata. + */ export const readReleasePackage = ( packageJsonPath = PACKAGE_JSON_PATH ): ReleasePackage => { - // SAFETY: package.json is validated by the field checks below before use. const parsed: unknown = JSON.parse(readFileSync(packageJsonPath, "utf-8")); - if (!parsed || Array.isArray(parsed)) { + if (!Predicate.isObject(parsed) || Array.isArray(parsed)) { throw new ReleaseError("package.json must contain an object"); } - // SAFETY: the preceding object check establishes the container invariant; fields are checked below. - const packageJson = parsed as { - readonly name?: unknown; - readonly version?: unknown; - }; - const { name, version } = packageJson; + if (!("name" in parsed) || !("version" in parsed)) { + throw new ReleaseError("package.json must include name and version fields"); + } + + const { name, version } = parsed; - if (!Schema.is(Schema.String)(name) || !name.trim()) { + if (!Schema.is(Schema.String)(name) || name.trim().length === 0) { throw new ReleaseError("package.json must include a non-empty name field"); } - if (!Schema.is(Schema.String)(version) || !version.trim()) { + if (!Schema.is(Schema.String)(version) || version.trim().length === 0) { throw new ReleaseError( "package.json must include a non-empty version field" ); @@ -92,11 +99,17 @@ export const readReleasePackage = ( return { name, version }; }; -/** Returns the npm package spec for a release package. */ +/** Returns the npm package spec for a release package. + * @param releasePackage - Package name and version. + * @returns The npm package specifier. + */ export const packageSpec = (releasePackage: ReleasePackage) => `${releasePackage.name}@${releasePackage.version}`; -/** Returns GitHub Actions outputs shared by release subcommands. */ +/** Returns GitHub Actions outputs shared by release subcommands. + * @param releasePackage - Package name and version. + * @returns Shared release output values. + */ export const createBaseOutputs = ( releasePackage: ReleasePackage ): ReleaseOutputs => ({ @@ -105,14 +118,18 @@ export const createBaseOutputs = ( version: releasePackage.version, }); -/** Writes release outputs to GitHub Actions when `GITHUB_OUTPUT` is present. */ +/** Writes release outputs to GitHub Actions when `GITHUB_OUTPUT` is present. + * @param outputs - Release output key/value pairs. + * @returns Nothing. + */ export const writeGithubOutputs = (outputs: ReleaseOutputs) => { const outputPath = process.env["GITHUB_OUTPUT"]; + const lines = Object.entries(outputs).map( ([key, value]) => `${key}=${value}` ); - if (outputPath) { + if (outputPath !== undefined && outputPath.length > 0) { appendFileSync(outputPath, `${lines.join("\n")}\n`); } @@ -121,12 +138,17 @@ export const writeGithubOutputs = (outputs: ReleaseOutputs) => { } }; -/** Runs an external command without invoking a shell. */ +/** Runs an external command without invoking a shell. + * @param command - Executable name. + * @param args - Arguments passed to the executable. + * @returns Captured command result. + */ export const runCommand: CommandRunner = async (command, args) => { const processResult = Bun.spawn([command, ...args], { stderr: "pipe", stdout: "pipe", }); + const [stdout, stderr, exitCode] = await Promise.all([ new Response(processResult.stdout).text(), new Response(processResult.stderr).text(), @@ -136,7 +158,11 @@ export const runCommand: CommandRunner = async (command, args) => { return { exitCode, stderr, stdout }; }; -/** Stages the package with npm or reports that it is already released. */ +/** Stages the package with npm or reports that it is already released. + * @param runner - External command runner. + * @param releasePackage - Package being released. + * @returns Completion promise. + */ export const runNpmRelease = async ( runner: CommandRunner = runCommand, releasePackage = readReleasePackage() @@ -148,10 +174,12 @@ export const runNpmRelease = async ( if (published.exitCode === 0) { console.log(`${spec} is already published`); writeGithubOutputs({ ...baseOutputs, published: "true" }); + return; } const publishedOutput = `${published.stdout}${published.stderr}`; + if (!/E404|404 Not Found|is not in this registry/iu.test(publishedOutput)) { throw new ReleaseError( `npm view failed with ${published.exitCode}: ${publishedOutput.trim()}` @@ -167,6 +195,7 @@ export const runNpmRelease = async ( if (publishOutput.includes(PUBLISHED_VERSION_CONFLICT)) { console.log(`${spec} is already published or staged`); writeGithubOutputs({ ...baseOutputs, published: "true" }); + return; } @@ -178,17 +207,23 @@ export const runNpmRelease = async ( writeGithubOutputs({ ...baseOutputs, staged: "true" }); }; -/** Extracts release notes for `version` from a Changesets changelog. */ +/** Extracts release notes for `version` from a Changesets changelog. + * @param changelog - Full changelog contents. + * @param version - Version whose notes are selected. + * @returns Release notes or a fallback title. + */ export const extractReleaseNotes = (changelog: string, version: string) => { const escapedVersion = version.replaceAll(/[.*+?^${}()|[\]\\]/gu, "\\$&"); const heading = new RegExp(`^## ${escapedVersion}[ \\t]*$`, "mu"); const match = heading.exec(changelog); const newlineStart = match ? match.index + match[0].length : -1; let bodyStart = -1; + if (newlineStart !== -1) { const newlineLength = changelog.startsWith("\r\n", newlineStart) ? 2 : 1; bodyStart = newlineStart + newlineLength; } + const nextHeading = bodyStart === -1 ? -1 : changelog.indexOf("\n## ", bodyStart); @@ -201,7 +236,12 @@ export const extractReleaseNotes = (changelog: string, version: string) => { .trim(); }; -/** Creates a GitHub release unless the tag already exists. */ +/** Creates a GitHub release unless the tag already exists. + * @param runner - External command runner. + * @param releasePackage - Package being released. + * @param changelog - Changelog used to create release notes. + * @returns Completion promise. + */ export const runGitHubRelease = async ( runner: CommandRunner = runCommand, releasePackage = readReleasePackage(), @@ -212,12 +252,13 @@ export const runGitHubRelease = async ( if (existingRelease.exitCode === 0) { console.log(`GitHub release ${tag} already exists`); + return; } const target = process.env["GITHUB_SHA"]; - if (!target) { + if (target === undefined || target.length === 0) { throw new ReleaseError("GITHUB_SHA is required to create a GitHub release"); } @@ -243,12 +284,16 @@ export const runGitHubRelease = async ( } }; -/** Dispatches a release subcommand. */ +/** Dispatches a release subcommand. + * @param args - Command-line arguments after the executable name. + * @returns Completion promise. + */ export const runRelease = async (args: readonly string[]) => { const command = parseReleaseCommand(args[0]); if (command === "npm") { await runNpmRelease(); + return; } @@ -261,6 +306,7 @@ if (import.meta.main) { } catch (error) { const message = error instanceof Error ? error.message : "Unknown release error"; + console.error(message); process.exit(1); } diff --git a/src/cli.ts b/src/cli.ts index 01225f3..fd00cba 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -8,7 +8,12 @@ import { Cause, Effect, Option } from "effect"; import { readCodexAuth } from "@/codex/auth.js"; import { createCodexClient } from "@/codex/client.js"; -import type { RateLimitResetCredit } from "@/codex/types.js"; +import type { + ConsumeResetResponse, + NormalizedUsage, + RateLimitResetCredit, + RateLimitResetCreditsPayload, +} from "@/codex/types.js"; import { CliError } from "@/errors/index.js"; import type { CodexUsageError } from "@/errors/index.js"; import { packageTitle } from "@/package-metadata.js"; @@ -65,6 +70,7 @@ Options: * @param args - Full argv slice being parsed. * @param index - Index of the option token in `args`. * @param option - Option name used in error messages. + * @returns The option value or a CLI usage error. */ const readOptionValue = ( args: readonly string[], @@ -73,7 +79,8 @@ const readOptionValue = ( ): Effect.Effect => Effect.gen(function* readOptionValueEffect() { const value = args[index + 1]; - if (!value || value.startsWith("-")) { + + if (value === undefined || value.length === 0 || value.startsWith("-")) { return yield* new CliError({ exitCode: 2, message: `Missing value for ${option}`, @@ -104,6 +111,7 @@ interface ArgParseStep { * @param args - Full argv slice being parsed. * @param index - Index of the token to parse. * @param state - Mutable parse accumulator. + * @returns Parse progress or a CLI argument error. */ const parseNextArg = ( args: readonly string[], @@ -115,16 +123,19 @@ const parseNextArg = ( if (arg === "-h" || arg === "--help") { state.command = "help"; + return { nextIndex: index + 1, stop: true }; } if (arg === "--json") { state.json = true; + return { nextIndex: index + 1, stop: false }; } if (arg === "-y" || arg === "--confirm" || arg === "--yes") { state.confirm = true; + return { nextIndex: index + 1, stop: false }; } @@ -134,16 +145,19 @@ const parseNextArg = ( if (arg === "--auth") { state.authPath = yield* readOptionValue(args, index, arg); + return { nextIndex: index + 2, stop: false }; } if (arg === "--base-url") { state.baseUrl = yield* readOptionValue(args, index, arg); + return { nextIndex: index + 2, stop: false }; } if (arg === "status" || arg === "resets" || arg === "reset") { state.command = arg; + return { nextIndex: index + 1, stop: false }; } @@ -157,6 +171,7 @@ const parseNextArg = ( * Parses CLI argv into a typed command description. * * @param args - Arguments after the executable name. + * @returns Parsed arguments or a CLI usage error. */ export const parseArgs = ( args: readonly string[] @@ -169,8 +184,10 @@ export const parseArgs = ( }; let index = 0; + while (index < args.length) { const step = yield* parseNextArg(args, index, state); + if (step.stop) { break; } @@ -187,6 +204,7 @@ export const parseArgs = ( if (state.authPath !== undefined) { parsed.authPath = state.authPath; } + if (state.baseUrl !== undefined) { parsed.baseUrl = state.baseUrl; } @@ -194,23 +212,30 @@ export const parseArgs = ( return parsed; }); -/** Serializes a value as pretty-printed JSON with a trailing newline. */ -const stringifyJson = (value: Value): string => - `${JSON.stringify(value, null, 2)}\n`; +/** Serializes a value as pretty-printed JSON with a trailing newline. + * @param value - Value to serialize. + * @returns Pretty-printed JSON with a trailing newline. + */ +const stringifyJson = ( + value: NormalizedUsage | RateLimitResetCreditsPayload | ConsumeResetResponse +): string => `${JSON.stringify(value, null, 2)}\n`; /** * Returns the expiry timestamp for credit selection, or `null` when invalid. * * Credits without an expiry are treated as never expiring. + * @param credit - Reset credit to inspect. + * @returns Expiry timestamp, positive infinity when absent, or `null` when invalid. */ const timestampForCreditExpiry = ( credit: RateLimitResetCredit ): number | null => { - if (!credit.expires_at) { + if (credit.expires_at === undefined || credit.expires_at.length === 0) { return Number.POSITIVE_INFINITY; } const timestamp = Date.parse(credit.expires_at); + return Number.isNaN(timestamp) ? null : timestamp; }; @@ -219,17 +244,23 @@ const timestampForCreditExpiry = ( * * @param credits - Reset credits returned by the Codex API. * @param now - Current timestamp used for expiry comparisons. + * @returns The soonest-expiring available credit, or `null`. */ const pickSoonestExpiringCredit = ( credits: readonly RateLimitResetCredit[], now = Date.now() ): RateLimitResetCredit | null => { const availableCredits = credits.filter((credit) => { - if (!credit.id || (credit.status ?? "available") !== "available") { + if ( + credit.id === undefined || + credit.id.length === 0 || + (credit.status ?? "available") !== "available" + ) { return false; } const expiresAt = timestampForCreditExpiry(credit); + return ( expiresAt !== null && (expiresAt === Number.POSITIVE_INFINITY || expiresAt > now) @@ -249,7 +280,10 @@ const pickSoonestExpiringCredit = ( ); }; -/** Builds optional {@link CodexClientOptions} from parsed CLI args. */ +/** Builds optional {@link CodexClientOptions} from parsed CLI args. + * @param parsed - Parsed command-line arguments. + * @returns Client options containing configured overrides. + */ const clientOptionsForArgs = (parsed: ParsedArgs) => parsed.baseUrl === undefined ? {} : { baseUrl: parsed.baseUrl }; @@ -257,6 +291,7 @@ const clientOptionsForArgs = (parsed: ParsedArgs) => * Executes a parsed CLI command and returns the output to print. * * @param parsed - Parsed CLI arguments. + * @returns Command output or a typed CLI/API error. */ const runParsed = ( parsed: ParsedArgs @@ -275,6 +310,7 @@ const runParsed = ( } const tokens = yield* readCodexAuth(parsed.authPath); + const client = yield* createCodexClient( tokens, clientOptionsForArgs(parsed) @@ -282,6 +318,7 @@ const runParsed = ( if (parsed.command === "status") { const usage = yield* client.fetchUsage(); + return parsed.json ? stringifyJson(usage) : formatUsage(usage, { title: packageTitle() }); @@ -289,12 +326,14 @@ const runParsed = ( if (parsed.command === "resets") { const credits = yield* client.fetchResetCredits(); + return parsed.json ? stringifyJson(credits) : formatResetCredits(credits); } const credits = yield* client.fetchResetCredits(); const credit = pickSoonestExpiringCredit(credits.credits ?? []); - if (!credit?.id) { + + if (credit === null || credit.id === undefined || credit.id.length === 0) { return yield* new CliError({ exitCode: 1, message: "No available reset credits to redeem.", @@ -302,6 +341,7 @@ const runParsed = ( } const response = yield* client.consumeResetCredit({ creditId: credit.id }); + return parsed.json ? stringifyJson(response) : formatConsumeResetResponse(response); @@ -311,31 +351,44 @@ const runParsed = ( * Parses argv and runs the requested CLI command. * * @param args - Arguments after the executable name. + * @returns Command output or a typed CLI/API error. */ export const runCli = ( args: readonly string[] ): Effect.Effect => parseArgs(args).pipe(Effect.flatMap(runParsed)); -/** Returns whether argv requests verbose unexpected-error output. */ +/** Returns whether argv requests verbose unexpected-error output. + * @param args - Command-line arguments. + * @returns Whether verbose output was requested. + */ export const isVerboseCli = (args: readonly string[]): boolean => args.includes("--verbose") || args.includes("-v"); -/** Formats an unexpected CLI failure for stderr. */ +/** Formats an unexpected CLI failure for stderr. + * @param cause - Unexpected failure cause. + * @param args - Command-line arguments. + * @returns Concise or verbose error text. + */ export const formatUnexpectedCliError = ( cause: Cause.Cause, args: readonly string[] ): string => isVerboseCli(args) ? Cause.pretty(cause) : "An unexpected error occurred"; -/** Prints a tagged CLI or Codex error and returns the process exit code. */ +/** Prints a tagged CLI or Codex error and returns the process exit code. + * @param error - Typed CLI/API error. + * @returns Appropriate process exit code. + */ const printError = (error: CodexUsageError): number => { if (error._tag === "CodexHttpError") { console.error(`${error.message}: HTTP ${error.status} ${error.statusText}`); + return 1; } console.error(error.message); + if (error._tag === "CliError") { return error.exitCode; } @@ -344,16 +397,18 @@ const printError = (error: CodexUsageError): number => { }; if ( - process.argv[1] && + process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href ) { const cliArgs = process.argv.slice(2); const exit = await Effect.runPromiseExit(runCli(cliArgs)); + if (exit._tag === "Success") { const output = exit.value; process.stdout.write(output); } else { const failure = Cause.findErrorOption(exit.cause); + if (Option.isSome(failure)) { process.exitCode = printError(failure.value); } else { diff --git a/src/codex/auth.ts b/src/codex/auth.ts index 30e7804..8ff1a2c 100644 --- a/src/codex/auth.ts +++ b/src/codex/auth.ts @@ -7,15 +7,35 @@ import { Effect, Redacted, Schema } from "effect"; import type { CodexAuthTokens, JsonValue } from "@/codex/types.js"; import { CodexAuthError } from "@/errors/index.js"; -/** Returns the default Codex auth file path under the user home directory. */ +/** Returns the default Codex auth file path under the user home directory. + * @returns The default auth file path. + */ const defaultCodexAuthPath = (): string => path.join(homedir(), ".codex", "auth.json"); -interface JsonObject { - readonly [key: string]: JsonValue; -} +type JsonObject = Readonly>; + +const isJsonValue = (value: unknown): value is JsonValue => { + if ( + value === null || + typeof value === "string" || + typeof value === "number" || + typeof value === "boolean" + ) { + return true; + } + + if (Array.isArray(value)) { + return value.every(isJsonValue); + } + + return typeof value === "object" && Object.values(value).every(isJsonValue); +}; -/** Returns whether `value` is a plain object record. */ +/** Returns whether `value` is a plain object record. + * @param value - JSON value to inspect. + * @returns Whether the value is an object record. + */ const isRecord = (value: JsonValue): value is JsonObject => value !== null && !Array.isArray(value) && @@ -28,12 +48,14 @@ const isNonEmptyString = (value: JsonValue): value is string => * Parses a decoded `auth.json` object into redacted Codex API credentials. * * @param value - Parsed JSON value from a Codex auth file. + * @returns Parsed credentials or a typed auth error. */ export const parseAuthTokens = ( value: JsonValue ): Effect.Effect => Effect.gen(function* parseAuthTokensEffect() { const tokens = isRecord(value) ? (value["tokens"] ?? null) : null; + if (!isRecord(tokens)) { return yield* new CodexAuthError({ message: "Missing tokens object in .codex/auth.json", @@ -62,6 +84,7 @@ export const parseAuthTokens = ( * Reads and parses Codex credentials from `auth.json`. * * @param authPath - Path to the auth file. Defaults to `~/.codex/auth.json`. + * @returns Parsed credentials or a typed auth error. */ export const readCodexAuth = ( authPath = defaultCodexAuthPath() @@ -73,7 +96,7 @@ export const readCodexAuth = ( cause, message: `Could not read Codex auth file at ${authPath}`, }), - try: () => readFile(authPath, "utf-8"), + try: async () => await readFile(authPath, "utf-8"), }); const parsed = yield* Effect.try({ @@ -83,7 +106,12 @@ export const readCodexAuth = ( message: `Could not parse Codex auth file at ${authPath}`, }), try: () => { - const parsedValue: JsonValue = JSON.parse(raw); + const parsedValue: unknown = JSON.parse(raw); + + if (!isJsonValue(parsedValue)) { + throw new TypeError("Auth file contains a non-JSON value"); + } + return parsedValue; }, }); diff --git a/src/codex/client.ts b/src/codex/client.ts index f9c9139..113de24 100644 --- a/src/codex/client.ts +++ b/src/codex/client.ts @@ -31,6 +31,27 @@ const DEFAULT_REQUEST_TIMEOUT_MS = 30_000; /** Default `User-Agent` header sent to the Codex API. */ const DEFAULT_USER_AGENT = "codex-cli"; +/** Returns whether an unknown value is a JSON value. + * @param value - Candidate JSON value. + * @returns Whether the candidate is valid JSON data. + */ +const isJsonValue = (value: unknown): value is JsonValue => { + if ( + value === null || + typeof value === "string" || + typeof value === "number" || + typeof value === "boolean" + ) { + return true; + } + + if (Array.isArray(value)) { + return value.every(isJsonValue); + } + + return typeof value === "object" && Object.values(value).every(isJsonValue); +}; + /** Hostnames that require the `/backend-api` path prefix. */ const CHATGPT_HOSTNAMES = new Set(["chat.openai.com", "chatgpt.com"]); @@ -40,7 +61,10 @@ export interface ConsumeResetCreditOptions { readonly redeemRequestId?: string; } -/** Returns whether `value` is a plain consume-reset options object. */ +/** Returns whether `value` is a plain consume-reset options object. + * @param value - Candidate consume-reset options. + * @returns Whether the value is an options object. + */ const isConsumeResetCreditOptions = ( value: ConsumeResetCreditOptions | null ): value is ConsumeResetCreditOptions => @@ -50,6 +74,7 @@ const isConsumeResetCreditOptions = ( * Normalizes consume-reset options and rejects legacy positional callers. * * @param consumeOptions - Options object, or `undefined`/`null` for defaults. + * @returns Normalized options or a typed parse error. */ const normalizeConsumeResetCreditOptions = ( consumeOptions?: ConsumeResetCreditOptions | null @@ -71,7 +96,10 @@ const normalizeConsumeResetCreditOptions = ( return Effect.succeed(consumeOptions); }; -/** Returns whether `hostname` refers to a loopback interface. */ +/** Returns whether `hostname` refers to a loopback interface. + * @param hostname - URL hostname to inspect. + * @returns Whether the hostname is a loopback address. + */ const isLoopbackHostname = (hostname: string): boolean => { if (hostname === "localhost") { return true; @@ -96,12 +124,14 @@ const isLoopbackHostname = (hostname: string): boolean => { * Normalizes and validates a Codex API base URL. * * @param baseUrl - Candidate base URL. Defaults to {@link DEFAULT_BASE_URL}. + * @returns Normalized URL or a typed configuration error. */ const normalizeBaseUrl = ( baseUrl = DEFAULT_BASE_URL ): Effect.Effect => Effect.gen(function* normalizeBaseUrlEffect() { let parsed: URL; + try { parsed = new URL(baseUrl); } catch (error) { @@ -111,13 +141,13 @@ const normalizeBaseUrl = ( }); } - if (parsed.username || parsed.password) { + if (parsed.username.length > 0 || parsed.password.length > 0) { return yield* new CodexConfigError({ message: "Base URL must not include credentials", }); } - if (parsed.search || parsed.hash) { + if (parsed.search.length > 0 || parsed.hash.length > 0) { return yield* new CodexConfigError({ message: "Base URL must not include a query string or fragment", }); @@ -136,6 +166,7 @@ const normalizeBaseUrl = ( } let normalized = parsed.toString(); + while (normalized.endsWith("/")) { normalized = normalized.slice(0, -1); } @@ -143,9 +174,11 @@ const normalizeBaseUrl = ( if (CHATGPT_HOSTNAMES.has(parsed.hostname)) { const { pathname: parsedPathname } = parsed; let pathname = parsedPathname; + while (pathname.endsWith("/")) { pathname = pathname.slice(0, -1); } + pathname ||= "/"; if (pathname === "/") { @@ -162,7 +195,11 @@ const normalizeBaseUrl = ( return normalized; }); -/** Builds JSON request headers for authenticated Codex POST requests. */ +/** Builds JSON request headers for authenticated Codex POST requests. + * @param tokens - Redacted credentials used for authentication. + * @param userAgent - User-agent header value. + * @returns Authenticated JSON request headers. + */ const jsonHeaders = ( tokens: CodexAuthTokens, userAgent: string @@ -173,7 +210,11 @@ const jsonHeaders = ( "User-Agent": userAgent, }); -/** Builds request headers for authenticated Codex GET requests. */ +/** Builds request headers for authenticated Codex GET requests. + * @param tokens - Redacted credentials used for authentication. + * @param userAgent - User-agent header value. + * @returns Authenticated request headers. + */ const getHeaders = ( tokens: CodexAuthTokens, userAgent: string @@ -188,6 +229,7 @@ const getHeaders = ( * * @param url - Fully qualified request URL. * @param init - Fetch request options. + * @returns Parsed JSON response or a typed HTTP/parse error. */ const requestJson = ( url: string, @@ -208,8 +250,8 @@ const requestJson = ( ? "TIMEOUT" : "NETWORK_ERROR", }), - try: () => - fetch(url, { + try: async () => + await fetch(url, { ...init, signal: init.signal ?? AbortSignal.timeout(DEFAULT_REQUEST_TIMEOUT_MS), @@ -224,7 +266,7 @@ const requestJson = ( status: response.status, statusText: response.statusText, }), - try: () => response.text(), + try: async () => await response.text(), }); if (!response.ok) { @@ -243,7 +285,12 @@ const requestJson = ( value: body, }), try: () => { - const parsedValue: JsonValue = JSON.parse(body); + const parsedValue: unknown = JSON.parse(body); + + if (!isJsonValue(parsedValue)) { + throw new TypeError("Response contains a non-JSON value"); + } + return parsedValue; }, }); @@ -272,6 +319,7 @@ export interface CodexClient { * * @param tokens - Redacted credentials from {@link readCodexAuth}. * @param options - Optional base URL and user-agent overrides. + * @returns An authenticated client or a typed configuration error. */ export const createCodexClient = ( tokens: CodexAuthTokens, @@ -298,7 +346,8 @@ export const createCodexClient = ( `${baseUrl}/wham/rate-limit-reset-credits/consume`, { body: JSON.stringify( - resolvedOptions.creditId + resolvedOptions.creditId !== undefined && + resolvedOptions.creditId.length > 0 ? { credit_id: resolvedOptions.creditId, redeem_request_id: diff --git a/src/codex/schemas.ts b/src/codex/schemas.ts index 5d4bb2a..3e87461 100644 --- a/src/codex/schemas.ts +++ b/src/codex/schemas.ts @@ -21,45 +21,47 @@ const RateLimitWindowSnapshotSchema = Schema.Struct({ /** Schema for primary and secondary rate-limit details in usage responses. */ const RateLimitStatusDetailsSchema = Schema.Struct({ - allowed: Schema.optional(Schema.Boolean), - limit_reached: Schema.optional(Schema.Boolean), - primary_window: Schema.optional(Schema.NullOr(RateLimitWindowSnapshotSchema)), - secondary_window: Schema.optional( + allowed: Schema.optionalKey(Schema.Boolean), + limit_reached: Schema.optionalKey(Schema.Boolean), + primary_window: Schema.optionalKey( + Schema.NullOr(RateLimitWindowSnapshotSchema) + ), + secondary_window: Schema.optionalKey( Schema.NullOr(RateLimitWindowSnapshotSchema) ), }); /** Schema for prepaid credit status details in usage responses. */ const CreditStatusDetailsSchema = Schema.Struct({ - balance: Schema.optional(Schema.NullOr(Schema.String)), - has_credits: Schema.optional(Schema.Boolean), - unlimited: Schema.optional(Schema.Boolean), + balance: Schema.optionalKey(Schema.NullOr(Schema.String)), + has_credits: Schema.optionalKey(Schema.Boolean), + unlimited: Schema.optionalKey(Schema.Boolean), }); /** Schema for individual spend-control limit details in usage responses. */ const SpendControlLimitDetailsSchema = Schema.Struct({ - limit: Schema.optional(Schema.String), - remaining: Schema.optional(Schema.String), - remaining_percent: Schema.optional(Schema.Number), - reset_after_seconds: Schema.optional(Schema.Number), - reset_at: Schema.optional(Schema.Number), - used: Schema.optional(Schema.String), - used_percent: Schema.optional(Schema.Number), + limit: Schema.optionalKey(Schema.String), + remaining: Schema.optionalKey(Schema.String), + remaining_percent: Schema.optionalKey(Schema.Number), + reset_after_seconds: Schema.optionalKey(Schema.Number), + reset_at: Schema.optionalKey(Schema.Number), + used: Schema.optionalKey(Schema.String), + used_percent: Schema.optionalKey(Schema.Number), }); /** Schema for spend-control status details in usage responses. */ const SpendControlStatusDetailsSchema = Schema.Struct({ - individual_limit: Schema.optional( + individual_limit: Schema.optionalKey( Schema.NullOr(SpendControlLimitDetailsSchema) ), - reached: Schema.optional(Schema.Boolean), + reached: Schema.optionalKey(Schema.Boolean), }); /** Schema for additional metered rate limits in usage responses. */ const AdditionalRateLimitDetailsSchema = Schema.Struct({ limit_name: Schema.String, metered_feature: Schema.String, - rate_limit: Schema.optional(Schema.NullOr(RateLimitStatusDetailsSchema)), + rate_limit: Schema.optionalKey(Schema.NullOr(RateLimitStatusDetailsSchema)), }); /** Schema for rate-limit reached classification in usage responses. */ @@ -74,19 +76,19 @@ const RateLimitResetCreditsSummarySchema = Schema.Struct({ /** Schema for the Codex `/wham/usage` response payload. */ const CodexUsagePayloadSchema = Schema.Struct({ - additional_rate_limits: Schema.optional( + additional_rate_limits: Schema.optionalKey( Schema.NullOr(Schema.Array(AdditionalRateLimitDetailsSchema)) ), - credits: Schema.optional(Schema.NullOr(CreditStatusDetailsSchema)), + credits: Schema.optionalKey(Schema.NullOr(CreditStatusDetailsSchema)), plan_type: Schema.String, - rate_limit: Schema.optional(Schema.NullOr(RateLimitStatusDetailsSchema)), - rate_limit_reached_type: Schema.optional( + rate_limit: Schema.optionalKey(Schema.NullOr(RateLimitStatusDetailsSchema)), + rate_limit_reached_type: Schema.optionalKey( Schema.NullOr(RateLimitReachedTypeSchema) ), - rate_limit_reset_credits: Schema.optional( + rate_limit_reset_credits: Schema.optionalKey( Schema.NullOr(RateLimitResetCreditsSummarySchema) ), - spend_control: Schema.optional( + spend_control: Schema.optionalKey( Schema.NullOr(SpendControlStatusDetailsSchema) ), }); @@ -100,20 +102,20 @@ const RateLimitResetCreditStatusSchema = Schema.Literals([ /** Schema for a single banked reset credit. */ const RateLimitResetCreditSchema = Schema.Struct({ - description: Schema.optional(Schema.String), - expires_at: Schema.optional(Schema.String), - granted_at: Schema.optional(Schema.String), - id: Schema.optional(Schema.String), - profile_user_id: Schema.optional(Schema.String), - redeemed_at: Schema.optional(Schema.NullOr(Schema.String)), - status: Schema.optional(RateLimitResetCreditStatusSchema), - title: Schema.optional(Schema.String), + description: Schema.optionalKey(Schema.String), + expires_at: Schema.optionalKey(Schema.String), + granted_at: Schema.optionalKey(Schema.String), + id: Schema.optionalKey(Schema.String), + profile_user_id: Schema.optionalKey(Schema.String), + redeemed_at: Schema.optionalKey(Schema.NullOr(Schema.String)), + status: Schema.optionalKey(RateLimitResetCreditStatusSchema), + title: Schema.optionalKey(Schema.String), }); /** Schema for the Codex reset-credits list response payload. */ const RateLimitResetCreditsPayloadSchema = Schema.Struct({ - available_count: Schema.optional(Schema.Number), - credits: Schema.optional(Schema.Array(RateLimitResetCreditSchema)), + available_count: Schema.optionalKey(Schema.Number), + credits: Schema.optionalKey(Schema.Array(RateLimitResetCreditSchema)), }); /** Schema for the Codex consume-reset response payload. */ @@ -127,19 +129,28 @@ const ConsumeResetResponseSchema = Schema.Struct({ windows_reset: Schema.Number, }); -/** Returns whether `value` is a non-null, non-array object. */ -interface JsonObject { - readonly [key: string]: JsonValue; -} +/** Returns whether `value` is a non-null, non-array object. + * @param value - JSON value to inspect. + * @returns Whether the value is an object. + */ +type JsonObject = Readonly>; const isObject = (value: JsonValue): value is JsonObject => value !== null && !Array.isArray(value); -/** Builds a tagged parse error for the rejected API payload. */ +/** Builds a tagged parse error for the rejected API payload. + * @param message - Parse failure message. + * @param value - Rejected JSON value. + * @returns Typed parse error. + */ const parseError = (message: string, value: JsonValue): CodexParseError => new CodexParseError({ message, value }); -/** Maps a schema decode failure into a `CodexParseError`. */ +/** Maps a schema decode failure into a `CodexParseError`. + * @param invalidPayloadMessage - Message for invalid payload shapes. + * @param value - Rejected object value. + * @returns Typed parse error. + */ const invalidPayloadError = ( invalidPayloadMessage: string, value: JsonObject @@ -148,19 +159,23 @@ const invalidPayloadError = ( /** * Decodes an API payload with `schema`, preserving Effect parse diagnostics on * shape mismatches while keeping dedicated messages for non-object inputs. + * @param params - Input, messages, and decoder for the payload. + * @returns Decoded payload or a typed parse error. */ const parseSchema = (params: { readonly input: JsonValue; readonly invalidPayloadMessage: string; readonly notObjectMessage: string; - readonly schema: Schema.ConstraintDecoder; + readonly schema: Schema.ConstraintDecoder; }): Effect.Effect => { const { input } = params; + if (!isObject(input)) { return Effect.fail(parseError(params.notObjectMessage, input)); } const decoded = Schema.decodeUnknownExit(params.schema)(input); + if (Exit.isFailure(decoded)) { return Effect.fail( invalidPayloadError(params.invalidPayloadMessage, input) @@ -174,6 +189,7 @@ const parseSchema = (params: { * Parses a Codex usage API payload into a typed structure. * * @param input - Raw JSON value from the usage endpoint. + * @returns Parsed usage payload or a typed parse error. */ export const parseUsagePayload = ( input: JsonValue @@ -189,6 +205,7 @@ export const parseUsagePayload = ( * Parses a rate-limit reset credits API payload into a typed structure. * * @param input - Raw JSON value from the reset-credits endpoint. + * @returns Parsed reset-credit payload or a typed parse error. */ export const parseResetCreditsPayload = ( input: JsonValue @@ -204,6 +221,7 @@ export const parseResetCreditsPayload = ( * Parses a consume-reset API response into a typed structure. * * @param input - Raw JSON value from the consume-reset endpoint. + * @returns Parsed consume-reset response or a typed parse error. */ export const parseConsumeResetResponse = ( input: JsonValue diff --git a/src/codex/types.ts b/src/codex/types.ts index bc4625b..dac7dd2 100644 --- a/src/codex/types.ts +++ b/src/codex/types.ts @@ -11,14 +11,14 @@ export type JsonValue = /** Redacted Codex API credentials read from `auth.json`. */ export interface CodexAuthTokens { - readonly accessToken: Redacted; + readonly accessToken: Redacted; readonly accountId: string; } /** Optional overrides when constructing a {@link CodexClient}. */ export interface CodexClientOptions { - readonly baseUrl?: string | undefined; - readonly userAgent?: string | undefined; + readonly baseUrl?: string; + readonly userAgent?: string; } /** Raw rate-limit window snapshot returned by the Codex usage API. */ @@ -31,41 +31,41 @@ export interface RateLimitWindowSnapshot { /** Raw primary/secondary rate-limit details from the Codex usage API. */ export interface RateLimitStatusDetails { - readonly allowed?: boolean | undefined; - readonly limit_reached?: boolean | undefined; - readonly primary_window?: RateLimitWindowSnapshot | null | undefined; - readonly secondary_window?: RateLimitWindowSnapshot | null | undefined; + readonly allowed?: boolean; + readonly limit_reached?: boolean; + readonly primary_window?: RateLimitWindowSnapshot | null; + readonly secondary_window?: RateLimitWindowSnapshot | null; } /** Raw prepaid-credit status details from the Codex usage API. */ export interface CreditStatusDetails { - readonly has_credits?: boolean | undefined; - readonly unlimited?: boolean | undefined; - readonly balance?: string | null | undefined; + readonly has_credits?: boolean; + readonly unlimited?: boolean; + readonly balance?: string | null; } /** Raw individual spend-control limit details from the Codex usage API. */ export interface SpendControlLimitDetails { - readonly limit?: string | undefined; - readonly used?: string | undefined; - readonly remaining?: string | undefined; - readonly used_percent?: number | undefined; - readonly remaining_percent?: number | undefined; - readonly reset_after_seconds?: number | undefined; - readonly reset_at?: number | undefined; + readonly limit?: string; + readonly used?: string; + readonly remaining?: string; + readonly used_percent?: number; + readonly remaining_percent?: number; + readonly reset_after_seconds?: number; + readonly reset_at?: number; } /** Raw spend-control status wrapper from the Codex usage API. */ export interface SpendControlStatusDetails { - readonly reached?: boolean | undefined; - readonly individual_limit?: SpendControlLimitDetails | null | undefined; + readonly reached?: boolean; + readonly individual_limit?: SpendControlLimitDetails | null; } /** Raw additional metered rate limit entry from the Codex usage API. */ export interface AdditionalRateLimitDetails { readonly limit_name: string; readonly metered_feature: string; - readonly rate_limit?: RateLimitStatusDetails | null | undefined; + readonly rate_limit?: RateLimitStatusDetails | null; } /** Raw rate-limit reached classification from the Codex usage API. */ @@ -81,18 +81,14 @@ export interface RateLimitResetCreditsSummary { /** Parsed Codex `/wham/usage` response payload. */ export interface CodexUsagePayload { readonly plan_type: string; - readonly rate_limit?: RateLimitStatusDetails | null | undefined; - readonly credits?: CreditStatusDetails | null | undefined; - readonly spend_control?: SpendControlStatusDetails | null | undefined; + readonly rate_limit?: RateLimitStatusDetails | null; + readonly credits?: CreditStatusDetails | null; + readonly spend_control?: SpendControlStatusDetails | null; readonly additional_rate_limits?: | readonly AdditionalRateLimitDetails[] - | null - | undefined; - readonly rate_limit_reached_type?: RateLimitReachedType | null | undefined; - readonly rate_limit_reset_credits?: - | RateLimitResetCreditsSummary - | null - | undefined; + | null; + readonly rate_limit_reached_type?: RateLimitReachedType | null; + readonly rate_limit_reset_credits?: RateLimitResetCreditsSummary | null; } /** A single normalized primary or secondary usage window for display. */ @@ -132,20 +128,20 @@ type RateLimitResetCreditStatus = "available" | "expired" | "redeemed"; /** A single banked rate-limit reset credit from the Codex API. */ export interface RateLimitResetCredit { - readonly id?: string | undefined; - readonly title?: string | undefined; - readonly status?: RateLimitResetCreditStatus | undefined; - readonly profile_user_id?: string | undefined; - readonly granted_at?: string | undefined; - readonly expires_at?: string | undefined; - readonly redeemed_at?: string | null | undefined; - readonly description?: string | undefined; + readonly id?: string; + readonly title?: string; + readonly status?: RateLimitResetCreditStatus; + readonly profile_user_id?: string; + readonly granted_at?: string; + readonly expires_at?: string; + readonly redeemed_at?: string | null; + readonly description?: string; } /** Parsed Codex `/wham/rate-limit-reset-credits` response payload. */ export interface RateLimitResetCreditsPayload { - readonly available_count?: number | undefined; - readonly credits?: readonly RateLimitResetCredit[] | undefined; + readonly available_count?: number; + readonly credits?: readonly RateLimitResetCredit[]; } /** Known result codes returned by the consume-reset endpoint. */ diff --git a/src/errors/index.ts b/src/errors/index.ts index 00135f3..49722ca 100644 --- a/src/errors/index.ts +++ b/src/errors/index.ts @@ -1,7 +1,12 @@ /** Tagged errors used by the Codex usage CLI and client. */ export { CodexAuthError } from "@/errors/auth-error.js"; + export { CliError } from "@/errors/cli-error.js"; + export { CodexConfigError } from "@/errors/config-error.js"; + export { CodexHttpError } from "@/errors/http-error.js"; + export { CodexParseError } from "@/errors/parse-error.js"; + export type { CodexUsageError } from "@/errors/usage-error.js"; diff --git a/src/index.ts b/src/index.ts index 21566a7..8c4a3fe 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,8 +5,11 @@ * and tagged errors used by the CLI and downstream consumers. */ export { parseAuthTokens, readCodexAuth } from "@/codex/auth.js"; + export { createCodexClient } from "@/codex/client.js"; + export type { CodexClient, ConsumeResetCreditOptions } from "@/codex/client.js"; + export { CliError, CodexAuthError, @@ -14,16 +17,20 @@ export { CodexHttpError, CodexParseError, } from "@/errors/index.js"; + export type { CodexUsageError } from "@/errors/index.js"; + export { formatConsumeResetResponse, formatResetCredits, formatUsage, } from "@/usage/format.js"; + export { limitLabelForWindow, normalizeUsagePayload, } from "@/usage/normalize.js"; + export type { AdditionalRateLimitDetails, CodexAuthTokens, diff --git a/src/package-metadata.ts b/src/package-metadata.ts index 4317f83..52a41b2 100644 --- a/src/package-metadata.ts +++ b/src/package-metadata.ts @@ -9,7 +9,10 @@ interface PackageMetadata { readonly version: string; } -/** Type guard for {@link PackageMetadata}. */ +/** Type guard for {@link PackageMetadata}. + * @param value - Candidate package metadata. + * @returns Whether the value has package name and version strings. + */ const isPackageMetadata = (value: unknown): value is PackageMetadata => { if (typeof value !== "object" || value === null) { return false; @@ -22,9 +25,12 @@ const isPackageMetadata = (value: unknown): value is PackageMetadata => { return "version" in value && typeof value.version === "string"; }; -/** Returns the published package name and version for CLI headings. */ +/** Returns the published package name and version for CLI headings. + * @returns The formatted package title, or the fallback CLI name. + */ export const packageTitle = (): string => { const metadata: unknown = requirePackageJson("../package.json"); + if (!isPackageMetadata(metadata)) { return "codex-usage"; } diff --git a/src/usage/format.ts b/src/usage/format.ts index 12b24ce..555d6e4 100644 --- a/src/usage/format.ts +++ b/src/usage/format.ts @@ -11,13 +11,19 @@ interface FormatUsageOptions { readonly title?: string; } -/** Capitalizes the first character and lowercases the remainder. */ +/** Capitalizes the first character and lowercases the remainder. + * @param value - Text to convert. + * @returns The title-cased text. + */ const titleCase = (value: string): string => value.length === 0 ? value : value[0]?.toUpperCase() + value.slice(1).toLowerCase(); -/** Maps raw Codex plan type identifiers to display labels. */ +/** Maps raw Codex plan type identifiers to display labels. + * @param planType - API plan identifier. + * @returns A human-readable plan label. + */ const formatPlanType = (planType: string): string => { if (planType === "prolite") { return "Pro Lite"; @@ -37,13 +43,17 @@ const formatPlanType = (planType: string): string => { /** Accepted date inputs for {@link formatDateTime}. */ type NullableDateInput = Date | string | null; -/** Formats a date value for CLI output, or `None` when absent. */ +/** Formats a date value for CLI output, or `None` when absent. + * @param value - Date value to format. + * @returns A localized date and time, or `None` when absent. + */ const formatDateTime = (value: NullableDateInput | undefined): string => { - if (!value) { + if (value === undefined || value === null) { return "None"; } const date = value instanceof Date ? value : new Date(value); + if (Number.isNaN(date.getTime())) { return String(value); } @@ -54,40 +64,56 @@ const formatDateTime = (value: NullableDateInput | undefined): string => { }).format(date); }; -/** Formats a duration in seconds as a compact CLI countdown string. */ +/** Formats a duration in seconds as a compact CLI countdown string. + * @param seconds - Duration to format. + * @returns Compact countdown text. + */ const secondsToDuration = (seconds: number): string => { if (!Number.isFinite(seconds) || seconds <= 0) { return "now"; } const minutes = Math.ceil(seconds / 60); + if (minutes < 60) { return `${minutes}m`; } const hours = Math.floor(minutes / 60); const remainder = minutes % 60; + if (hours < 24) { return remainder === 0 ? `${hours}h` : `${hours}h ${remainder}m`; } const days = Math.floor(hours / 24); const hourRemainder = hours % 24; + return hourRemainder === 0 ? `${days}d` : `${days}d ${hourRemainder}h`; }; -/** Formats a percentage value with no fractional digits. */ +/** Formats a percentage value with no fractional digits. + * @param value - Percentage to format. + * @returns Percentage text. + */ const percent = (value: number): string => `${value.toFixed(0)}%`; -/** Renders a fixed-width ASCII progress bar for remaining quota. */ +/** Renders a fixed-width ASCII progress bar for remaining quota. + * @param remainingPercent - Remaining quota percentage. + * @returns A 20-segment progress bar. + */ const progressBar = (remainingPercent: number): string => { const segments = 20; const ratio = Math.min(1, Math.max(0, remainingPercent / 100)); const filled = Math.round(ratio * segments); + return `[${"#".repeat(filled)}${"-".repeat(segments - filled)}]`; }; -/** Formats a single normalized usage window for CLI output. */ +/** Formats a single normalized usage window for CLI output. + * @param window - Normalized usage window. + * @returns The formatted window details. + */ const formatWindow = (window: NormalizedRateLimitWindow): string => { const resetText = window.resetsAt ? `${formatDateTime(window.resetsAt)} (${secondsToDuration(window.resetAfterSeconds)})` @@ -106,6 +132,7 @@ const formatWindow = (window: NormalizedRateLimitWindow): string => { * * @param usage - Normalized usage returned by {@link normalizeUsagePayload}. * @param options - Optional heading override. + * @returns Human-readable usage output. */ export const formatUsage = ( usage: NormalizedUsage, @@ -127,6 +154,7 @@ export const formatUsage = ( } lines.push(""); + if (limit.id !== "codex") { lines.push(`${limit.name} (${limit.id})`); } @@ -145,13 +173,19 @@ type NullableString = string | null; /** Number of milliseconds in one calendar day. */ const millisecondsPerDay = 86_400_000; -/** Returns the local-midnight timestamp for the calendar day containing `date`. */ +/** Returns the local-midnight timestamp for the calendar day containing `date`. + * @param date - Date whose calendar day is used. + * @returns The timestamp at local midnight. + */ const startOfLocalDay = (date: Date): number => new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime(); /** * Counts whole local calendar days from `from` until `to`. * Same-day values return `0`; the next local day returns `1`. + * @param from - Start date. + * @param to - End date. + * @returns Number of whole local calendar days. */ const calendarDaysBetween = (from: Date, to: Date): number => Math.floor( @@ -161,23 +195,28 @@ const calendarDaysBetween = (from: Date, to: Date): number => /** * Formats a human-readable expiry countdown for reset-credit timestamps. * Returns an empty string for missing or invalid values. + * @param value - Expiry timestamp. + * @returns Human-readable countdown text. */ const daysUntil = (value: NullableString | undefined): string => { - if (!value) { + if (value === undefined || value === null || value.length === 0) { return ""; } const date = new Date(value); + if (Number.isNaN(date.getTime())) { return ""; } const millisecondsUntilExpiry = date.getTime() - Date.now(); + if (millisecondsUntilExpiry < 0) { return "expired"; } const days = calendarDaysBetween(new Date(), date); + if (days === 0) { return "expires today"; } @@ -189,7 +228,10 @@ const daysUntil = (value: NullableString | undefined): string => { return `${days} days left`; }; -/** Returns the shortened suffix of a reset-credit identifier for display. */ +/** Returns the shortened suffix of a reset-credit identifier for display. + * @param credit - Credit whose identifier is displayed. + * @returns Short identifier suffix or `unknown`. + */ const shortCreditId = (credit: RateLimitResetCredit): string => credit.id?.replace(/^RateLimitResetCredit_/u, "").slice(-8) ?? "unknown"; @@ -197,14 +239,17 @@ const shortCreditId = (credit: RateLimitResetCredit): string => * Formats reset-credit inventory for CLI output. * * @param payload - Reset-credit payload from the Codex API. + * @returns Human-readable reset-credit inventory. */ export const formatResetCredits = ( payload: RateLimitResetCreditsPayload ): string => { const credits = payload.credits ?? []; + const available = payload.available_count ?? credits.filter((credit) => credit.status === "available").length; + const lines = ["Codex rate limit reset credits", `Available: ${available}`]; if (credits.length === 0) { @@ -225,7 +270,7 @@ export const formatResetCredits = ( ` Credit ID: ...${shortCreditId(credit)}` ); - if (credit.description) { + if (credit.description !== undefined && credit.description.length > 0) { lines.push(` Note: ${credit.description}`); } } @@ -237,10 +282,12 @@ export const formatResetCredits = ( * Formats a consume-reset API response for CLI output. * * @param response - Parsed consume-reset response from the Codex API. + * @returns Human-readable reset result. */ export const formatConsumeResetResponse = ( response: ConsumeResetResponse ): string => { const result = response.code.replaceAll("_", " "); + return `Reset result: ${result}\nWindows reset: ${response.windows_reset}\n`; }; diff --git a/src/usage/normalize.ts b/src/usage/normalize.ts index 14f0d35..f2e3b11 100644 --- a/src/usage/normalize.ts +++ b/src/usage/normalize.ts @@ -10,7 +10,10 @@ import type { SpendControlLimitDetails, } from "@/codex/types.js"; -/** Converts a positive window length in seconds to rounded minutes. */ +/** Converts a positive window length in seconds to rounded minutes. + * @param seconds - Window length to convert. + * @returns Rounded minutes, or `null` for invalid lengths. + */ const secondsToMinutes = (seconds: number): number | null => { if (!Number.isFinite(seconds) || seconds <= 0) { return null; @@ -19,7 +22,11 @@ const secondsToMinutes = (seconds: number): number | null => { return Math.ceil(seconds / 60); }; -/** Returns whether `minutes` is within five percent of `expected`. */ +/** Returns whether `minutes` is within five percent of `expected`. + * @param minutes - Rounded window length in minutes. + * @param expected - Expected window length in minutes. + * @returns Whether the values are within five percent. + */ const isApproximateWindow = (minutes: number, expected: number): boolean => minutes >= expected * 0.95 && minutes <= expected * 1.05; @@ -28,6 +35,7 @@ const isApproximateWindow = (minutes: number, expected: number): boolean => * * @param windowSeconds - Window length reported by the Codex API. * @param kind - Whether the window is primary or secondary. + * @returns A display label for the window duration. */ export const limitLabelForWindow = ( windowSeconds: number, @@ -65,7 +73,10 @@ export const limitLabelForWindow = ( return kind === "secondary" ? "secondary usage" : "usage"; }; -/** Clamps a percentage value into the inclusive `0..100` range. */ +/** Clamps a percentage value into the inclusive `0..100` range. + * @param value - Percentage value to clamp. + * @returns A finite percentage between 0 and 100. + */ const clampPercent = (value: number): number => { if (!Number.isFinite(value)) { return 0; @@ -79,6 +90,7 @@ const clampPercent = (value: number): number => { * * @param kind - Whether the window is primary or secondary. * @param window - Raw window snapshot from the Codex API. + * @returns Normalized window details, or `null` when absent. */ const normalizeWindow = ( kind: "primary" | "secondary", @@ -89,6 +101,7 @@ const normalizeWindow = ( } const usedPercent = clampPercent(window.used_percent); + const resetsAt = window.reset_at > 0 ? new Date(window.reset_at * 1000) : null; @@ -103,7 +116,10 @@ const normalizeWindow = ( }; }; -/** Normalizes the primary and secondary windows for a rate-limit block. */ +/** Normalizes the primary and secondary windows for a rate-limit block. + * @param details - Rate-limit details, if available. + * @returns The available normalized windows. + */ const normalizeWindows = ( details: RateLimitStatusDetails | null | undefined ): readonly NormalizedRateLimitWindow[] => @@ -112,7 +128,10 @@ const normalizeWindows = ( normalizeWindow("secondary", details?.secondary_window), ].filter((window): window is NormalizedRateLimitWindow => window !== null); -/** Builds a normalized rate-limit record from shared API fields. */ +/** Builds a normalized rate-limit record from shared API fields. + * @param params - Shared and limit-specific rate-limit values. + * @returns A normalized rate-limit record. + */ const normalizeLimit = (params: { readonly id: string; readonly name: string | null; @@ -133,7 +152,11 @@ const normalizeLimit = (params: { windows: normalizeWindows(params.details), }); -/** Normalizes an additional metered rate limit from the usage payload. */ +/** Normalizes an additional metered rate limit from the usage payload. + * @param planType - Account plan identifier. + * @param limit - Additional metered limit from the API. + * @returns A normalized rate-limit record. + */ const normalizeAdditionalLimit = ( planType: string, limit: AdditionalRateLimitDetails @@ -153,12 +176,14 @@ const normalizeAdditionalLimit = ( * * @param payload - Parsed usage response from the Codex API. * @param capturedAt - Timestamp to record on the normalized snapshot. + * @returns The normalized usage snapshot. */ export const normalizeUsagePayload = ( payload: CodexUsagePayload, capturedAt = new Date() ): NormalizedUsage => { const individualLimit = payload.spend_control?.individual_limit ?? null; + const primaryLimit = normalizeLimit({ credits: payload.credits ?? null, details: payload.rate_limit, @@ -168,6 +193,7 @@ export const normalizeUsagePayload = ( planType: payload.plan_type, rateLimitReachedType: payload.rate_limit_reached_type?.type ?? null, }); + const additionalLimits = (payload.additional_rate_limits ?? []).map((limit) => normalizeAdditionalLimit(payload.plan_type, limit) ); diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..50ff173 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,11 @@ +import { fileURLToPath, URL } from "node:url"; + +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + resolve: { + alias: { + "@": fileURLToPath(new URL("src", import.meta.url)), + }, + }, +});