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)),
+ },
+ },
+});