From 9d6135cbaa7252cf32a86e0bbbbf96f051f628a7 Mon Sep 17 00:00:00 2001 From: alitariksahin Date: Fri, 6 Feb 2026 16:51:26 +0300 Subject: [PATCH 01/29] feat: add missing bulk action methods to sdk --- src/client/dlq.test.ts | 64 +++++++++++++++++++++ src/client/dlq.ts | 27 ++++++++- src/client/index.test.ts | 117 +++++++++++++++++++++++++++++++++++++++ src/client/index.ts | 22 +++++++- src/client/types.ts | 80 +++++++++++++------------- 5 files changed, 268 insertions(+), 42 deletions(-) diff --git a/src/client/dlq.test.ts b/src/client/dlq.test.ts index 647e2b13..a60fa578 100644 --- a/src/client/dlq.test.ts +++ b/src/client/dlq.test.ts @@ -450,4 +450,68 @@ describe("DLQ", () => { }); }); }); + + describe("delete", () => { + test("should delete a single DLQ message", async () => { + const dlqId = `dlq-${nanoid()}`; + const deleted = 1; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.delete({ dlqIds: [dlqId] }); + expect(result.deleted).toBe(deleted); + }, + responseFields: { + status: 200, + body: { deleted }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?dlqIds=${dlqId}`, + token, + }, + }); + }); + + test("should delete multiple DLQ messages", async () => { + const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`, `dlq-${nanoid()}`]; + const deleted = 3; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.delete({ dlqIds }); + expect(result.deleted).toBe(deleted); + }, + responseFields: { + status: 200, + body: { deleted }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}&dlqIds=${dlqIds[2]}`, + token, + }, + }); + }); + + test("should handle empty array of DLQ IDs", async () => { + const deleted = 0; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.delete({ dlqIds: [] }); + expect(result.deleted).toBe(deleted); + }, + responseFields: { + status: 200, + body: { deleted }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq`, + token, + }, + }); + }); + }); }); diff --git a/src/client/dlq.ts b/src/client/dlq.ts index 1232efd4..e5f85878 100644 --- a/src/client/dlq.ts +++ b/src/client/dlq.ts @@ -78,7 +78,7 @@ type PublicDLQMessage = Pick< >; export class DLQ { - constructor(private client: QStashClient) {} + constructor(private client: QStashClient) { } /** * list the items in the DLQ @@ -157,10 +157,11 @@ export class DLQ { async resume(parameters: DLQResumeRestartOptions): Promise; async resume(parameters: DLQResumeRestartOptions) { const { headers, queryParams } = DLQ.handleDLQOptions(parameters); + const path = queryParams ? `resume?${queryParams}` : "resume"; const { workflowRuns } = await this.client.http.request<{ workflowRuns: DLQResumeRestartResponse[]; }>({ - path: ["v2", "workflows", "dlq", `resume?${queryParams}`], + path: ["v2", "workflows", "dlq", path], headers, method: "POST", }); @@ -217,10 +218,11 @@ export class DLQ { async restart(parameters: DLQResumeRestartOptions): Promise; async restart(parameters: DLQResumeRestartOptions) { const { headers, queryParams } = DLQ.handleDLQOptions(parameters); + const path = queryParams ? `restart?${queryParams}` : "restart"; const { workflowRuns } = await this.client.http.request<{ workflowRuns: DLQResumeRestartResponse[]; }>({ - path: ["v2", "workflows", "dlq", `restart?${queryParams}`], + path: ["v2", "workflows", "dlq", path], headers, method: "POST", }); @@ -247,6 +249,25 @@ export class DLQ { return response; } + /** + * Delete multiple DLQ messages using their `dlqId`s + * + * @param dlqIds - The IDs of the DLQ messages to delete + * @returns number of deleted DLQ messages + */ + + async delete(request: { dlqIds: string | string[] }) { + const queryParams = DLQ.getDlqIdQueryParameter(request.dlqIds); + const path = queryParams ? `dlq?${queryParams}` : "dlq"; + const response = await this.client.http.request<{ + deleted: number; + }>({ + path: ["v2", "workflows", path], + method: "DELETE", + }); + return response; + } + /** * Handles DLQ options and prepares headers and query parameters. * diff --git a/src/client/index.test.ts b/src/client/index.test.ts index 0edf6ba5..ec23ccb6 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -95,6 +95,123 @@ describe("workflow client", () => { const throws = () => client.cancel({}); expect(throws).toThrow("The `cancel` method cannot be called without any options."); }); + + test("should cancel with label filter", async () => { + const filters = { label: "test-label" }; + await mockQStashServer({ + execute: async () => { + await client.cancel({ filters }); + }, + responseFields: { + status: 200, + body: { cancelled: 1 }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + token, + body: { label: "test-label" }, + }, + }); + }); + + test("should cancel with fromDate and toDate filters (converted to numbers)", async () => { + const filters = { + fromDate: "1640995200000", + toDate: "1672531200000", + }; + await mockQStashServer({ + execute: async () => { + await client.cancel({ filters }); + }, + responseFields: { + status: 200, + body: { cancelled: 2 }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + token, + body: { + fromDate: 1640995200000, + toDate: 1672531200000, + }, + }, + }); + }); + + test("should cancel with all filter fields", async () => { + const filters = { + label: "my-workflow-label", + fromDate: "1640995200000", + toDate: "1672531200000", + }; + await mockQStashServer({ + execute: async () => { + await client.cancel({ filters }); + }, + responseFields: { + status: 200, + body: { cancelled: 3 }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + token, + body: { + label: "my-workflow-label", + fromDate: 1640995200000, + toDate: 1672531200000, + }, + }, + }); + }); + + test("should cancel with filters when only fromDate is provided", async () => { + const filters = { + fromDate: "1640995200000", + }; + await mockQStashServer({ + execute: async () => { + await client.cancel({ filters }); + }, + responseFields: { + status: 200, + body: { cancelled: 1 }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + token, + body: { + fromDate: 1640995200000, + }, + }, + }); + }); + + test("should cancel with filters when only toDate is provided", async () => { + const filters = { + toDate: "1672531200000", + }; + await mockQStashServer({ + execute: async () => { + await client.cancel({ filters }); + }, + responseFields: { + status: 200, + body: { cancelled: 1 }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + token, + body: { + toDate: 1672531200000, + }, + }, + }); + }); }); describe("cancel - live", () => { diff --git a/src/client/index.ts b/src/client/index.ts index 55e4c438..14633b47 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -5,7 +5,7 @@ import { getWorkflowRunId } from "../utils"; import { triggerFirstInvocation } from "../workflow-requests"; import { WorkflowContext } from "../context"; import { DLQ } from "./dlq"; -import { TriggerOptions, WorkflowRunLog, WorkflowRunLogs } from "./types"; +import { WorkflowFilters, TriggerOptions, WorkflowRunLog, WorkflowRunLogs } from "./types"; import { SDK_TELEMETRY, WORKFLOW_LABEL_HEADER } from "../constants"; type ClientConfig = ConstructorParameters[0]; @@ -23,7 +23,17 @@ export class Client { private client: QStashClient; constructor(clientConfig: ClientConfig) { - // TODO: add warning back + if (!clientConfig?.token) { + console.error( + "QStash token is required for Upstash Workflow!\n\n" + + "To fix this:\n" + + "1. Get your token from the Upstash Console (https://console.upstash.com/qstash)\n" + + "2. Initialize the workflow client with:\n\n" + + " const client = new Client({\n" + + " token: ''\n" + + " });" + ); + } this.client = new QStashClient(clientConfig); } @@ -81,10 +91,12 @@ export class Client { public async cancel({ ids, urlStartingWith, + filters, all, }: { ids?: string | string[]; urlStartingWith?: string; + filters?: WorkflowFilters; all?: true; }) { let body: string; @@ -96,6 +108,12 @@ export class Client { body = JSON.stringify({ workflowUrl: urlStartingWith }); } else if (all) { body = "{}"; + } else if (filters) { + body = JSON.stringify({ + ...filters, + ...(filters.fromDate ? { fromDate: Number(filters.fromDate) } : {}), + ...(filters.toDate ? { toDate: Number(filters.toDate) } : {}), + }); } else { throw new TypeError("The `cancel` method cannot be called without any options."); } diff --git a/src/client/types.ts b/src/client/types.ts index aa59d38a..eef28812 100644 --- a/src/client/types.ts +++ b/src/client/types.ts @@ -167,50 +167,50 @@ export type StepError = { type StepLogGroup = | { - /** - * Log which belongs to a single step - */ - steps: [StepLog]; - /** - * Log which belongs to a single step - */ - type: "sequential"; - } + /** + * Log which belongs to a single step + */ + steps: [StepLog]; + /** + * Log which belongs to a single step + */ + type: "sequential"; + } | { + /** + * Log which belongs to parallel steps + */ + steps: StepLog[]; + /** + * Log which belongs to parallel steps + */ + type: "parallel"; + } + | { + /** + * Log which belongs to the next step + */ + steps: { + messageId: string; + state: "STEP_PROGRESS" | "STEP_RETRY" | "STEP_FAILED" | "STEP_CANCELED"; /** - * Log which belongs to parallel steps - */ - steps: StepLog[]; - /** - * Log which belongs to parallel steps + * retries */ - type: "parallel"; - } - | { + retries: number; /** - * Log which belongs to the next step + * retry delay parameter for the step if it was set */ - steps: { - messageId: string; - state: "STEP_PROGRESS" | "STEP_RETRY" | "STEP_FAILED" | "STEP_CANCELED"; - /** - * retries - */ - retries: number; - /** - * retry delay parameter for the step if it was set - */ - retryDelay?: string; - /** - * errors which occured in the step - */ - errors?: StepError[]; - }[]; + retryDelay?: string; /** - * Log which belongs to the next step + * errors which occured in the step */ - type: "next"; - }; + errors?: StepError[]; + }[]; + /** + * Log which belongs to the next step + */ + type: "next"; + }; type FailureFunctionLog = { /** @@ -447,3 +447,9 @@ export type DLQResumeRestartResponse = { */ workflowCreatedAt: string; }; + +export type WorkflowFilters = { + fromDate?: string + toDate?: string + label?: string +} \ No newline at end of file From afbc058b84296c52eebcf3c786056771bfbc6479 Mon Sep 17 00:00:00 2001 From: alitariksahin Date: Tue, 10 Feb 2026 10:03:52 +0300 Subject: [PATCH 02/29] fix: reviews --- src/client/dlq.test.ts | 352 ++++++++++++++++++++++++++++++++++++--- src/client/dlq.ts | 130 +++++++++++---- src/client/index.test.ts | 19 +++ src/client/index.ts | 4 +- src/client/types.ts | 12 +- 5 files changed, 447 insertions(+), 70 deletions(-) diff --git a/src/client/dlq.test.ts b/src/client/dlq.test.ts index a60fa578..9eb01b39 100644 --- a/src/client/dlq.test.ts +++ b/src/client/dlq.test.ts @@ -161,12 +161,12 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.resume({ dlqId }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); + expect(result[0].workflowRunId).toBe(workflowRunId); + expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, - body: { workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, + body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, }, receivesRequest: { method: "POST", @@ -192,7 +192,7 @@ describe("DLQ", () => { }, responseFields: { status: 200, - body: { workflowRuns: responses }, + body: { cursor: "", workflowRuns: responses }, }, receivesRequest: { method: "POST", @@ -212,12 +212,12 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.resume({ dlqId, flowControl }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); + expect(result[0].workflowRunId).toBe(workflowRunId); + expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, - body: { workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, + body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, }, receivesRequest: { method: "POST", @@ -240,12 +240,12 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.resume({ dlqId, retries }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); + expect(result[0].workflowRunId).toBe(workflowRunId); + expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, - body: { workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, + body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, }, receivesRequest: { method: "POST", @@ -268,12 +268,12 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.resume({ dlqId, flowControl, retries }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); + expect(result[0].workflowRunId).toBe(workflowRunId); + expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, - body: { workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, + body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, }, receivesRequest: { method: "POST", @@ -287,6 +287,155 @@ describe("DLQ", () => { }, }); }); + + test("should resume multiple DLQ messages with flow control", async () => { + const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; + const flowControl = { key: "test-key", rate: 10, parallelism: 5 }; + const responses = [ + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, + ]; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.resume({ dlqId: dlqIds, flowControl }); + expect(Array.isArray(result)).toBe(true); + expect(result).toEqual(responses); + }, + responseFields: { + status: 200, + body: { cursor: "", workflowRuns: responses }, + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, + token, + headers: { + "Upstash-Flow-Control-Key": "test-key", + "Upstash-Flow-Control-Value": "parallelism=5, rate=10", + }, + }, + }); + }); + + test("should resume multiple DLQ messages with retries", async () => { + const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; + const retries = 5; + const responses = [ + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, + ]; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.resume({ dlqId: dlqIds, retries }); + expect(Array.isArray(result)).toBe(true); + expect(result).toEqual(responses); + }, + responseFields: { + status: 200, + body: { cursor: "", workflowRuns: responses }, + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, + token, + headers: { + "Upstash-Retries": "5", + }, + }, + }); + }); + + test("should resume multiple DLQ messages with all parameters", async () => { + const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; + const flowControl = { key: "test-key", rate: 10, parallelism: 5 }; + const retries = 3; + const responses = [ + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, + ]; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.resume({ dlqId: dlqIds, flowControl, retries }); + expect(Array.isArray(result)).toBe(true); + expect(result).toEqual(responses); + }, + responseFields: { + status: 200, + body: { cursor: "", workflowRuns: responses }, + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, + token, + headers: { + "Upstash-Flow-Control-Key": "test-key", + "Upstash-Flow-Control-Value": "parallelism=5, rate=10", + "Upstash-Retries": "3", + }, + }, + }); + }); + + test("should resume DLQ messages with filters", async () => { + const responses = [ + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, + ]; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.resume({ label: "my-label" }); + expect(Array.isArray(result)).toBe(true); + expect(result).toEqual(responses); + }, + responseFields: { + status: 200, + body: { cursor: "", workflowRuns: responses }, + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume`, + token, + headers: { + "Content-Type": "application/json", + }, + body: { label: "my-label" }, + }, + }); + }); + + test("should resume DLQ messages with multiple filters", async () => { + const responses = [ + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, + ]; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.resume({ + label: "my-label", + workflowUrl: "https://example.com/workflow", + }); + expect(Array.isArray(result)).toBe(true); + expect(result).toEqual(responses); + }, + responseFields: { + status: 200, + body: { cursor: "", workflowRuns: responses }, + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume`, + token, + headers: { + "Content-Type": "application/json", + }, + body: { label: "my-label", workflowUrl: "https://example.com/workflow" }, + }, + }); + }); }); describe("restart", () => { @@ -298,12 +447,12 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.restart({ dlqId }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); + expect(result[0].workflowRunId).toBe(workflowRunId); + expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, - body: { workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, + body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, }, receivesRequest: { method: "POST", @@ -329,7 +478,7 @@ describe("DLQ", () => { }, responseFields: { status: 200, - body: { workflowRuns: responses }, + body: { cursor: "", workflowRuns: responses }, }, receivesRequest: { method: "POST", @@ -349,12 +498,12 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.restart({ dlqId, flowControl }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); + expect(result[0].workflowRunId).toBe(workflowRunId); + expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, - body: { workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, + body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, }, receivesRequest: { method: "POST", @@ -377,12 +526,12 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.restart({ dlqId, retries }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); + expect(result[0].workflowRunId).toBe(workflowRunId); + expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, - body: { workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, + body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, }, receivesRequest: { method: "POST", @@ -405,12 +554,12 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.restart({ dlqId, flowControl, retries }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); + expect(result[0].workflowRunId).toBe(workflowRunId); + expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, - body: { workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, + body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, }, receivesRequest: { method: "POST", @@ -424,6 +573,155 @@ describe("DLQ", () => { }, }); }); + + test("should restart multiple DLQ messages with flow control", async () => { + const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; + const flowControl = { key: "test-key", rate: 10, parallelism: 5 }; + const responses = [ + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, + ]; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.restart({ dlqId: dlqIds, flowControl }); + expect(Array.isArray(result)).toBe(true); + expect(result).toEqual(responses); + }, + responseFields: { + status: 200, + body: { cursor: "", workflowRuns: responses }, + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, + token, + headers: { + "Upstash-Flow-Control-Key": "test-key", + "Upstash-Flow-Control-Value": "parallelism=5, rate=10", + }, + }, + }); + }); + + test("should restart multiple DLQ messages with retries", async () => { + const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; + const retries = 5; + const responses = [ + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, + ]; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.restart({ dlqId: dlqIds, retries }); + expect(Array.isArray(result)).toBe(true); + expect(result).toEqual(responses); + }, + responseFields: { + status: 200, + body: { cursor: "", workflowRuns: responses }, + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, + token, + headers: { + "Upstash-Retries": "5", + }, + }, + }); + }); + + test("should restart multiple DLQ messages with all parameters", async () => { + const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; + const flowControl = { key: "test-key", rate: 10, parallelism: 5 }; + const retries = 3; + const responses = [ + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, + ]; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.restart({ dlqId: dlqIds, flowControl, retries }); + expect(Array.isArray(result)).toBe(true); + expect(result).toEqual(responses); + }, + responseFields: { + status: 200, + body: { cursor: "", workflowRuns: responses }, + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, + token, + headers: { + "Upstash-Flow-Control-Key": "test-key", + "Upstash-Flow-Control-Value": "parallelism=5, rate=10", + "Upstash-Retries": "3", + }, + }, + }); + }); + + test("should restart DLQ messages with filters", async () => { + const responses = [ + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, + ]; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.restart({ label: "my-label" }); + expect(Array.isArray(result)).toBe(true); + expect(result).toEqual(responses); + }, + responseFields: { + status: 200, + body: { cursor: "", workflowRuns: responses }, + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart`, + token, + headers: { + "Content-Type": "application/json", + }, + body: { label: "my-label" }, + }, + }); + }); + + test("should restart DLQ messages with multiple filters", async () => { + const responses = [ + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, + ]; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.restart({ + label: "my-label", + workflowUrl: "https://example.com/workflow", + }); + expect(Array.isArray(result)).toBe(true); + expect(result).toEqual(responses); + }, + responseFields: { + status: 200, + body: { cursor: "", workflowRuns: responses }, + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart`, + token, + headers: { + "Content-Type": "application/json", + }, + body: { label: "my-label", workflowUrl: "https://example.com/workflow" }, + }, + }); + }); }); describe("retryFailureFunction", () => { @@ -440,7 +738,7 @@ describe("DLQ", () => { }, responseFields: { status: 200, - body: { workflowRunId, workflowCreatedAt }, + body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, }, receivesRequest: { method: "POST", diff --git a/src/client/dlq.ts b/src/client/dlq.ts index e5f85878..aa1a0c32 100644 --- a/src/client/dlq.ts +++ b/src/client/dlq.ts @@ -1,5 +1,9 @@ import { Client as QStashClient } from "@upstash/qstash"; -import { DLQResumeRestartOptions, DLQResumeRestartResponse } from "./types"; +import { + DLQResumeRestartOptions, + DLQResumeRestartResponse, + WorkflowBulkFilters, +} from "./types"; import { prepareFlowControl } from "../qstash/headers"; type QStashDLQFilterOptions = NonNullable< @@ -131,14 +135,13 @@ export class DLQ { * retries: 3, * }); * - * console.log(response.workflowRunId); // ID of the new workflow run + * console.log(response[0].workflowRunId); // ID of the new workflow run * ``` * * Example with multiple DLQ IDs: * ```ts * const response = await client.dlq.resume({ * dlqId: ["dlq-12345", "dlq-67890"], - * // other parameters... * }); * console.log(response[0].workflowRunId); // ID of the first workflow run * console.log(response[1].workflowRunId); // ID of the second workflow run @@ -153,10 +156,28 @@ export class DLQ { * If not passed, retries settings of the failing workflow will be used. * @returns run id and creation time of the new workflow run(s). */ - async resume(parameters: DLQResumeRestartOptions): Promise; - async resume(parameters: DLQResumeRestartOptions): Promise; - async resume(parameters: DLQResumeRestartOptions) { - const { headers, queryParams } = DLQ.handleDLQOptions(parameters); + async resume( + request: DLQResumeRestartOptions | WorkflowBulkFilters + ): Promise { + // Filter-based resume + if (!("dlqId" in request)) { + const { workflowRuns } = await this.client.http.request<{ + workflowRuns: DLQResumeRestartResponse[]; + }>({ + path: ["v2", "workflows", "dlq", "resume"], + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + ...request, + ...(request.fromDate ? { fromDate: Number(request.fromDate) } : {}), + ...(request.toDate ? { toDate: Number(request.toDate) } : {}), + }), + method: "POST", + }); + return workflowRuns; + } + + // DLQ ID-based resume + const { headers, queryParams } = DLQ.handleDLQOptions(request); const path = queryParams ? `resume?${queryParams}` : "resume"; const { workflowRuns } = await this.client.http.request<{ workflowRuns: DLQResumeRestartResponse[]; @@ -165,11 +186,7 @@ export class DLQ { headers, method: "POST", }); - - if (Array.isArray(parameters.dlqId)) { - return workflowRuns; - } - return workflowRuns[0]; + return workflowRuns; } /** @@ -192,14 +209,13 @@ export class DLQ { * retries: 3, * }); * - * console.log(response.workflowRunId); // ID of the new workflow run + * console.log(response[0].workflowRunId); // ID of the new workflow run * ``` * * Example with multiple DLQ IDs: * ```ts * const response = await client.dlq.restart({ * dlqId: ["dlq-12345", "dlq-67890"], - * // other parameters... * }); * console.log(response[0].workflowRunId); // ID of the first workflow run * console.log(response[1].workflowRunId); // ID of the second workflow run @@ -214,10 +230,28 @@ export class DLQ { * If not passed, retries settings of the failing workflow will be used. * @returns run id and creation time of the new workflow run(s). */ - async restart(parameters: DLQResumeRestartOptions): Promise; - async restart(parameters: DLQResumeRestartOptions): Promise; - async restart(parameters: DLQResumeRestartOptions) { - const { headers, queryParams } = DLQ.handleDLQOptions(parameters); + async restart( + request: DLQResumeRestartOptions | WorkflowBulkFilters + ): Promise { + // Filter-based restart + if (!("dlqId" in request)) { + const { workflowRuns } = await this.client.http.request<{ + workflowRuns: DLQResumeRestartResponse[]; + }>({ + path: ["v2", "workflows", "dlq", "restart"], + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + ...request, + ...(request.fromDate ? { fromDate: Number(request.fromDate) } : {}), + ...(request.toDate ? { toDate: Number(request.toDate) } : {}), + }), + method: "POST", + }); + return workflowRuns; + } + + // DLQ ID-based restart + const { headers, queryParams } = DLQ.handleDLQOptions(request); const path = queryParams ? `restart?${queryParams}` : "restart"; const { workflowRuns } = await this.client.http.request<{ workflowRuns: DLQResumeRestartResponse[]; @@ -226,11 +260,7 @@ export class DLQ { headers, method: "POST", }); - - if (Array.isArray(parameters.dlqId)) { - return workflowRuns; - } - return workflowRuns[0]; + return workflowRuns; } /** @@ -241,31 +271,59 @@ export class DLQ { * @returns response with workflow run information */ async retryFailureFunction({ dlqId }: Pick, "dlqId">) { - const response = await this.client.http.request({ + const { workflowRuns } = await this.client.http.request<{ + workflowRuns: DLQResumeRestartResponse[]; + }>({ path: ["v2", "workflows", "dlq", "callback", dlqId], method: "POST", }); - return response; + return workflowRuns[0]; } /** - * Delete multiple DLQ messages using their `dlqId`s + * Delete DLQ messages. * - * @param dlqIds - The IDs of the DLQ messages to delete - * @returns number of deleted DLQ messages + * Can be called with: + * - A single dlqId: `delete("id")` + * - An array of dlqIds: `delete(["id1", "id2"])` + * - An object with dlqIds: `delete({ dlqIds: ["id1", "id2"] })` + * - A filter object: `delete({ label: "my-label", fromDate: "..." })` */ + async delete( + request: string | string[] | { dlqIds: string | string[] } | WorkflowBulkFilters + ): Promise<{ deleted: number }> { + // Handle string or string[] - direct dlqIds + if (typeof request === "string" || Array.isArray(request)) { + const queryParams = DLQ.getDlqIdQueryParameter(request); + const path = queryParams ? `dlq?${queryParams}` : "dlq"; + return await this.client.http.request<{ deleted: number }>({ + path: ["v2", "workflows", path], + method: "DELETE", + }); + } - async delete(request: { dlqIds: string | string[] }) { - const queryParams = DLQ.getDlqIdQueryParameter(request.dlqIds); - const path = queryParams ? `dlq?${queryParams}` : "dlq"; - const response = await this.client.http.request<{ - deleted: number; - }>({ - path: ["v2", "workflows", path], + // Handle object with dlqIds + if ("dlqIds" in request) { + const queryParams = DLQ.getDlqIdQueryParameter(request.dlqIds); + const path = queryParams ? `dlq?${queryParams}` : "dlq"; + return await this.client.http.request<{ deleted: number }>({ + path: ["v2", "workflows", path], + method: "DELETE", + }); + } + + // Handle filters (WorkflowBulkFilters) + return await this.client.http.request<{ deleted: number }>({ + path: ["v2", "workflows", "dlq"], method: "DELETE", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + ...request, + ...(request.fromDate ? { fromDate: Number(request.fromDate) } : {}), + ...(request.toDate ? { toDate: Number(request.toDate) } : {}), + }), }); - return response; } /** diff --git a/src/client/index.test.ts b/src/client/index.test.ts index ec23ccb6..3ef90a31 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -54,6 +54,25 @@ describe("workflow client", () => { }); }); + test("should cancel single workflow run id passed as array", async () => { + const ids = [`wfr-${nanoid()}`]; + await mockQStashServer({ + execute: async () => { + await client.cancel({ ids }); + }, + responseFields: { + status: 200, + body: { cancelled: 1 }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + token, + body: { workflowRunIds: ids }, + }, + }); + }); + test("should cancel workflowUrl", async () => { const urlStartingWith = "http://workflow-endpoint.com"; await mockQStashServer({ diff --git a/src/client/index.ts b/src/client/index.ts index 14633b47..ba2d7ee5 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -5,7 +5,7 @@ import { getWorkflowRunId } from "../utils"; import { triggerFirstInvocation } from "../workflow-requests"; import { WorkflowContext } from "../context"; import { DLQ } from "./dlq"; -import { WorkflowFilters, TriggerOptions, WorkflowRunLog, WorkflowRunLogs } from "./types"; +import { WorkflowBulkFilters, TriggerOptions, WorkflowRunLog, WorkflowRunLogs } from "./types"; import { SDK_TELEMETRY, WORKFLOW_LABEL_HEADER } from "../constants"; type ClientConfig = ConstructorParameters[0]; @@ -96,7 +96,7 @@ export class Client { }: { ids?: string | string[]; urlStartingWith?: string; - filters?: WorkflowFilters; + filters?: Pick; all?: true; }) { let body: string; diff --git a/src/client/types.ts b/src/client/types.ts index eef28812..98d5492f 100644 --- a/src/client/types.ts +++ b/src/client/types.ts @@ -448,8 +448,10 @@ export type DLQResumeRestartResponse = { workflowCreatedAt: string; }; -export type WorkflowFilters = { - fromDate?: string - toDate?: string - label?: string -} \ No newline at end of file +export type WorkflowBulkFilters = { + workflowRunIds?: string[]; + workflowUrl?: string; + fromDate?: string; + toDate?: string; + label?: string; +}; From f1b53b09e09aff5b2a05cb1b7a29e71728a6ae54 Mon Sep 17 00:00:00 2001 From: alitariksahin Date: Tue, 10 Feb 2026 14:04:13 +0300 Subject: [PATCH 03/29] fix: cancel method --- src/client/dlq.ts | 8 ++----- src/client/index.test.ts | 15 +++++-------- src/client/index.ts | 47 +++++++++++++++++++++++++--------------- src/client/types.ts | 2 +- 4 files changed, 38 insertions(+), 34 deletions(-) diff --git a/src/client/dlq.ts b/src/client/dlq.ts index aa1a0c32..d7b0b1e5 100644 --- a/src/client/dlq.ts +++ b/src/client/dlq.ts @@ -1,9 +1,5 @@ import { Client as QStashClient } from "@upstash/qstash"; -import { - DLQResumeRestartOptions, - DLQResumeRestartResponse, - WorkflowBulkFilters, -} from "./types"; +import { DLQResumeRestartOptions, DLQResumeRestartResponse, WorkflowBulkFilters } from "./types"; import { prepareFlowControl } from "../qstash/headers"; type QStashDLQFilterOptions = NonNullable< @@ -82,7 +78,7 @@ type PublicDLQMessage = Pick< >; export class DLQ { - constructor(private client: QStashClient) { } + constructor(private client: QStashClient) {} /** * list the items in the DLQ diff --git a/src/client/index.test.ts b/src/client/index.test.ts index 3ef90a31..051c145c 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -110,16 +110,11 @@ describe("workflow client", () => { }); }); - test("should throw if no option", async () => { - const throws = () => client.cancel({}); - expect(throws).toThrow("The `cancel` method cannot be called without any options."); - }); - test("should cancel with label filter", async () => { const filters = { label: "test-label" }; await mockQStashServer({ execute: async () => { - await client.cancel({ filters }); + await client.cancel({ ...filters }); }, responseFields: { status: 200, @@ -141,7 +136,7 @@ describe("workflow client", () => { }; await mockQStashServer({ execute: async () => { - await client.cancel({ filters }); + await client.cancel({ ...filters }); }, responseFields: { status: 200, @@ -167,7 +162,7 @@ describe("workflow client", () => { }; await mockQStashServer({ execute: async () => { - await client.cancel({ filters }); + await client.cancel({ ...filters }); }, responseFields: { status: 200, @@ -192,7 +187,7 @@ describe("workflow client", () => { }; await mockQStashServer({ execute: async () => { - await client.cancel({ filters }); + await client.cancel({ ...filters }); }, responseFields: { status: 200, @@ -215,7 +210,7 @@ describe("workflow client", () => { }; await mockQStashServer({ execute: async () => { - await client.cancel({ filters }); + await client.cancel({ ...filters }); }, responseFields: { status: 200, diff --git a/src/client/index.ts b/src/client/index.ts index ba2d7ee5..7ed5587e 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -5,7 +5,7 @@ import { getWorkflowRunId } from "../utils"; import { triggerFirstInvocation } from "../workflow-requests"; import { WorkflowContext } from "../context"; import { DLQ } from "./dlq"; -import { WorkflowBulkFilters, TriggerOptions, WorkflowRunLog, WorkflowRunLogs } from "./types"; +import { TriggerOptions, WorkflowRunLog, WorkflowRunLogs } from "./types"; import { SDK_TELEMETRY, WORKFLOW_LABEL_HEADER } from "../constants"; type ClientConfig = ConstructorParameters[0]; @@ -84,6 +84,10 @@ export class Client { * @param ids run id of the workflow to delete * @param urlStartingWith cancel workflows starting with this url. Will be ignored * if `ids` parameter is set. + * @param workflowUrl cancel workflows with this url. + * @param fromDate cancel workflows created after this date. + * @param toDate cancel workflows created before this date. + * @param label cancel workflows with this label. * @param all set to true in order to cancel all workflows. Will be ignored * if `ids` or `urlStartingWith` parameters are set. * @returns true if workflow is succesfully deleted. Otherwise throws QStashError @@ -91,37 +95,46 @@ export class Client { public async cancel({ ids, urlStartingWith, - filters, + workflowUrl, + fromDate, + toDate, + label, + /** + * @deprecated by default if no option is provided, all workflows will be cancelled. + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars all, }: { ids?: string | string[]; urlStartingWith?: string; - filters?: Pick; + workflowUrl?: string; + fromDate?: string; + toDate?: string; + label?: string; all?: true; }) { - let body: string; + let body: Record = {}; if (ids) { const runIdArray = typeof ids === "string" ? [ids] : ids; - body = JSON.stringify({ workflowRunIds: runIdArray }); + body = { workflowRunIds: runIdArray }; + } else if (workflowUrl) { + body = { workflowUrl }; } else if (urlStartingWith) { - body = JSON.stringify({ workflowUrl: urlStartingWith }); - } else if (all) { - body = "{}"; - } else if (filters) { - body = JSON.stringify({ - ...filters, - ...(filters.fromDate ? { fromDate: Number(filters.fromDate) } : {}), - ...(filters.toDate ? { toDate: Number(filters.toDate) } : {}), - }); - } else { - throw new TypeError("The `cancel` method cannot be called without any options."); + body = { workflowUrl: urlStartingWith }; } + body = { + ...body, + ...(fromDate ? { fromDate: Number(fromDate) } : {}), + ...(toDate ? { toDate: Number(toDate) } : {}), + ...(label ? { label } : {}), + }; + const result = await this.client.http.request<{ cancelled: number }>({ path: ["v2", "workflows", "runs"], method: "DELETE", - body, + body: JSON.stringify(body), headers: { "Content-Type": "application/json", }, diff --git a/src/client/types.ts b/src/client/types.ts index 98d5492f..7ef47b01 100644 --- a/src/client/types.ts +++ b/src/client/types.ts @@ -449,7 +449,7 @@ export type DLQResumeRestartResponse = { }; export type WorkflowBulkFilters = { - workflowRunIds?: string[]; + workflowRunId?: string; workflowUrl?: string; fromDate?: string; toDate?: string; From 4703788f4a9d773d7246dd5489639e29c70f0747 Mon Sep 17 00:00:00 2001 From: alitariksahin Date: Tue, 10 Feb 2026 14:08:51 +0300 Subject: [PATCH 04/29] fix: linting --- src/client/index.ts | 12 ++++---- src/client/types.ts | 74 ++++++++++++++++++++++----------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/client/index.ts b/src/client/index.ts index 7ed5587e..4dbfbe71 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -26,12 +26,12 @@ export class Client { if (!clientConfig?.token) { console.error( "QStash token is required for Upstash Workflow!\n\n" + - "To fix this:\n" + - "1. Get your token from the Upstash Console (https://console.upstash.com/qstash)\n" + - "2. Initialize the workflow client with:\n\n" + - " const client = new Client({\n" + - " token: ''\n" + - " });" + "To fix this:\n" + + "1. Get your token from the Upstash Console (https://console.upstash.com/qstash)\n" + + "2. Initialize the workflow client with:\n\n" + + " const client = new Client({\n" + + " token: ''\n" + + " });" ); } this.client = new QStashClient(clientConfig); diff --git a/src/client/types.ts b/src/client/types.ts index 7ef47b01..75115ccb 100644 --- a/src/client/types.ts +++ b/src/client/types.ts @@ -167,50 +167,50 @@ export type StepError = { type StepLogGroup = | { - /** - * Log which belongs to a single step - */ - steps: [StepLog]; - /** - * Log which belongs to a single step - */ - type: "sequential"; - } - | { - /** - * Log which belongs to parallel steps - */ - steps: StepLog[]; - /** - * Log which belongs to parallel steps - */ - type: "parallel"; - } + /** + * Log which belongs to a single step + */ + steps: [StepLog]; + /** + * Log which belongs to a single step + */ + type: "sequential"; + } | { - /** - * Log which belongs to the next step - */ - steps: { - messageId: string; - state: "STEP_PROGRESS" | "STEP_RETRY" | "STEP_FAILED" | "STEP_CANCELED"; /** - * retries + * Log which belongs to parallel steps + */ + steps: StepLog[]; + /** + * Log which belongs to parallel steps */ - retries: number; + type: "parallel"; + } + | { /** - * retry delay parameter for the step if it was set + * Log which belongs to the next step */ - retryDelay?: string; + steps: { + messageId: string; + state: "STEP_PROGRESS" | "STEP_RETRY" | "STEP_FAILED" | "STEP_CANCELED"; + /** + * retries + */ + retries: number; + /** + * retry delay parameter for the step if it was set + */ + retryDelay?: string; + /** + * errors which occured in the step + */ + errors?: StepError[]; + }[]; /** - * errors which occured in the step + * Log which belongs to the next step */ - errors?: StepError[]; - }[]; - /** - * Log which belongs to the next step - */ - type: "next"; - }; + type: "next"; + }; type FailureFunctionLog = { /** From 85d34f886b31b3bd6ad43b5b54b8d67ea75a88ef Mon Sep 17 00:00:00 2001 From: alitariksahin Date: Tue, 10 Feb 2026 14:34:08 +0300 Subject: [PATCH 05/29] fix: return types --- src/client/dlq.test.ts | 32 ++++++++++++++++---------------- src/client/dlq.ts | 34 +++++++++++++++++++++++++++------- 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/client/dlq.test.ts b/src/client/dlq.test.ts index 9eb01b39..7c54dc2f 100644 --- a/src/client/dlq.test.ts +++ b/src/client/dlq.test.ts @@ -161,8 +161,8 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.resume({ dlqId }); - expect(result[0].workflowRunId).toBe(workflowRunId); - expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); + expect(result.workflowRunId).toBe(workflowRunId); + expect(result.workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, @@ -212,8 +212,8 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.resume({ dlqId, flowControl }); - expect(result[0].workflowRunId).toBe(workflowRunId); - expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); + expect(result.workflowRunId).toBe(workflowRunId); + expect(result.workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, @@ -240,8 +240,8 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.resume({ dlqId, retries }); - expect(result[0].workflowRunId).toBe(workflowRunId); - expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); + expect(result.workflowRunId).toBe(workflowRunId); + expect(result.workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, @@ -268,8 +268,8 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.resume({ dlqId, flowControl, retries }); - expect(result[0].workflowRunId).toBe(workflowRunId); - expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); + expect(result.workflowRunId).toBe(workflowRunId); + expect(result.workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, @@ -447,8 +447,8 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.restart({ dlqId }); - expect(result[0].workflowRunId).toBe(workflowRunId); - expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); + expect(result.workflowRunId).toBe(workflowRunId); + expect(result.workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, @@ -498,8 +498,8 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.restart({ dlqId, flowControl }); - expect(result[0].workflowRunId).toBe(workflowRunId); - expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); + expect(result.workflowRunId).toBe(workflowRunId); + expect(result.workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, @@ -526,8 +526,8 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.restart({ dlqId, retries }); - expect(result[0].workflowRunId).toBe(workflowRunId); - expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); + expect(result.workflowRunId).toBe(workflowRunId); + expect(result.workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, @@ -554,8 +554,8 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.restart({ dlqId, flowControl, retries }); - expect(result[0].workflowRunId).toBe(workflowRunId); - expect(result[0].workflowCreatedAt).toBe(workflowCreatedAt); + expect(result.workflowRunId).toBe(workflowRunId); + expect(result.workflowCreatedAt).toBe(workflowCreatedAt); }, responseFields: { status: 200, diff --git a/src/client/dlq.ts b/src/client/dlq.ts index d7b0b1e5..e9eb826e 100644 --- a/src/client/dlq.ts +++ b/src/client/dlq.ts @@ -78,7 +78,7 @@ type PublicDLQMessage = Pick< >; export class DLQ { - constructor(private client: QStashClient) {} + constructor(private client: QStashClient) { } /** * list the items in the DLQ @@ -131,7 +131,7 @@ export class DLQ { * retries: 3, * }); * - * console.log(response[0].workflowRunId); // ID of the new workflow run + * console.log(response.workflowRunId); // ID of the new workflow run * ``` * * Example with multiple DLQ IDs: @@ -152,9 +152,17 @@ export class DLQ { * If not passed, retries settings of the failing workflow will be used. * @returns run id and creation time of the new workflow run(s). */ + async resume( + request: DLQResumeRestartOptions + ): Promise; + async resume( + request: DLQResumeRestartOptions + ): Promise; + async resume(request: WorkflowBulkFilters): Promise; + async resume( request: DLQResumeRestartOptions | WorkflowBulkFilters - ): Promise { + ): Promise { // Filter-based resume if (!("dlqId" in request)) { const { workflowRuns } = await this.client.http.request<{ @@ -182,7 +190,9 @@ export class DLQ { headers, method: "POST", }); - return workflowRuns; + + // Return single response for string dlqId, array for array dlqId + return typeof request.dlqId === "string" ? workflowRuns[0] : workflowRuns; } /** @@ -205,7 +215,7 @@ export class DLQ { * retries: 3, * }); * - * console.log(response[0].workflowRunId); // ID of the new workflow run + * console.log(response.workflowRunId); // ID of the new workflow run * ``` * * Example with multiple DLQ IDs: @@ -226,9 +236,17 @@ export class DLQ { * If not passed, retries settings of the failing workflow will be used. * @returns run id and creation time of the new workflow run(s). */ + async restart( + request: DLQResumeRestartOptions + ): Promise; + async restart( + request: DLQResumeRestartOptions + ): Promise; + async restart(request: WorkflowBulkFilters): Promise; + async restart( request: DLQResumeRestartOptions | WorkflowBulkFilters - ): Promise { + ): Promise { // Filter-based restart if (!("dlqId" in request)) { const { workflowRuns } = await this.client.http.request<{ @@ -256,7 +274,9 @@ export class DLQ { headers, method: "POST", }); - return workflowRuns; + + // Return single response for string dlqId, array for array dlqId + return typeof request.dlqId === "string" ? workflowRuns[0] : workflowRuns; } /** From c04c24b33142393a055d7fe496f35605bbed22a5 Mon Sep 17 00:00:00 2001 From: alitariksahin Date: Tue, 17 Feb 2026 12:57:02 +0300 Subject: [PATCH 06/29] fix: require all:true param for cancel method --- src/client/dlq.ts | 18 +++++------------- src/client/index.test.ts | 30 +++++++++++++++++++++-------- src/client/index.ts | 41 ++++++++++++++++++++-------------------- 3 files changed, 47 insertions(+), 42 deletions(-) diff --git a/src/client/dlq.ts b/src/client/dlq.ts index e9eb826e..4767b6b9 100644 --- a/src/client/dlq.ts +++ b/src/client/dlq.ts @@ -78,7 +78,7 @@ type PublicDLQMessage = Pick< >; export class DLQ { - constructor(private client: QStashClient) { } + constructor(private client: QStashClient) {} /** * list the items in the DLQ @@ -152,12 +152,8 @@ export class DLQ { * If not passed, retries settings of the failing workflow will be used. * @returns run id and creation time of the new workflow run(s). */ - async resume( - request: DLQResumeRestartOptions - ): Promise; - async resume( - request: DLQResumeRestartOptions - ): Promise; + async resume(request: DLQResumeRestartOptions): Promise; + async resume(request: DLQResumeRestartOptions): Promise; async resume(request: WorkflowBulkFilters): Promise; async resume( @@ -236,12 +232,8 @@ export class DLQ { * If not passed, retries settings of the failing workflow will be used. * @returns run id and creation time of the new workflow run(s). */ - async restart( - request: DLQResumeRestartOptions - ): Promise; - async restart( - request: DLQResumeRestartOptions - ): Promise; + async restart(request: DLQResumeRestartOptions): Promise; + async restart(request: DLQResumeRestartOptions): Promise; async restart(request: WorkflowBulkFilters): Promise; async restart( diff --git a/src/client/index.test.ts b/src/client/index.test.ts index 051c145c..3e830b81 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -20,11 +20,12 @@ describe("workflow client", () => { const ids = `wfr-${nanoid()}`; await mockQStashServer({ execute: async () => { - await client.cancel({ ids }); + const result = await client.cancel({ ids }); + expect(result).toEqual({ cancelled: 1 }); }, responseFields: { status: 200, - body: "msgId", + body: { cancelled: 1 }, }, receivesRequest: { method: "DELETE", @@ -39,11 +40,12 @@ describe("workflow client", () => { const ids = [`wfr-${nanoid()}`, `wfr-${nanoid()}`]; await mockQStashServer({ execute: async () => { - await client.cancel({ ids }); + const result = await client.cancel({ ids }); + expect(result).toEqual({ cancelled: 2 }); }, responseFields: { status: 200, - body: "msgId", + body: { cancelled: 2 }, }, receivesRequest: { method: "DELETE", @@ -77,11 +79,12 @@ describe("workflow client", () => { const urlStartingWith = "http://workflow-endpoint.com"; await mockQStashServer({ execute: async () => { - await client.cancel({ urlStartingWith }); + const result = await client.cancel({ urlStartingWith }); + expect(result).toEqual({ cancelled: 5 }); }, responseFields: { status: 200, - body: "msgId", + body: { cancelled: 5 }, }, receivesRequest: { method: "DELETE", @@ -95,11 +98,12 @@ describe("workflow client", () => { test("should cancel all", async () => { await mockQStashServer({ execute: async () => { - await client.cancel({ all: true }); + const result = await client.cancel({ all: true }); + expect(result).toEqual({ cancelled: 10 }); }, responseFields: { status: 200, - body: "msgId", + body: { cancelled: 10 }, }, receivesRequest: { method: "DELETE", @@ -110,6 +114,16 @@ describe("workflow client", () => { }); }); + test("should throw error when called without any options", async () => { + await expect(async () => { + await client.cancel({}); + }).toThrow(TypeError); + + await expect(async () => { + await client.cancel({}); + }).toThrow("The `cancel` method cannot be called without any options."); + }); + test("should cancel with label filter", async () => { const filters = { label: "test-label" }; await mockQStashServer({ diff --git a/src/client/index.ts b/src/client/index.ts index 4dbfbe71..2c3d82e9 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -26,12 +26,12 @@ export class Client { if (!clientConfig?.token) { console.error( "QStash token is required for Upstash Workflow!\n\n" + - "To fix this:\n" + - "1. Get your token from the Upstash Console (https://console.upstash.com/qstash)\n" + - "2. Initialize the workflow client with:\n\n" + - " const client = new Client({\n" + - " token: ''\n" + - " });" + "To fix this:\n" + + "1. Get your token from the Upstash Console (https://console.upstash.com/qstash)\n" + + "2. Initialize the workflow client with:\n\n" + + " const client = new Client({\n" + + " token: ''\n" + + " });" ); } this.client = new QStashClient(clientConfig); @@ -99,10 +99,6 @@ export class Client { fromDate, toDate, label, - /** - * @deprecated by default if no option is provided, all workflows will be cancelled. - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars all, }: { ids?: string | string[]; @@ -113,24 +109,27 @@ export class Client { label?: string; all?: true; }) { - let body: Record = {}; + let body: Record = + { + ...(fromDate ? { fromDate: Number(fromDate) } : {}), + ...(toDate ? { toDate: Number(toDate) } : {}), + ...(label ? { label } : {}), + }; + if (ids) { const runIdArray = typeof ids === "string" ? [ids] : ids; - body = { workflowRunIds: runIdArray }; + body = { ...body, workflowRunIds: runIdArray }; } else if (workflowUrl) { - body = { workflowUrl }; + body = { ...body, workflowUrl }; } else if (urlStartingWith) { - body = { workflowUrl: urlStartingWith }; + body = { ...body, workflowUrl: urlStartingWith }; + } else if (all) { + body = { ...body }; + } else if (Object.keys(body).length === 0) { + throw new TypeError("The `cancel` method cannot be called without any options."); } - body = { - ...body, - ...(fromDate ? { fromDate: Number(fromDate) } : {}), - ...(toDate ? { toDate: Number(toDate) } : {}), - ...(label ? { label } : {}), - }; - const result = await this.client.http.request<{ cancelled: number }>({ path: ["v2", "workflows", "runs"], method: "DELETE", From 96474fada4e69c27796c902a273c39a1114b423b Mon Sep 17 00:00:00 2001 From: alitariksahin Date: Fri, 20 Feb 2026 13:35:33 +0300 Subject: [PATCH 07/29] fix: require all:true param and add exactmatch param --- src/client/dlq.test.ts | 158 +++++++++++++++++++++++++++++++++++++++ src/client/dlq.ts | 8 +- src/client/index.test.ts | 137 ++++++++++++++++++++++++++++++++- src/client/index.ts | 5 +- src/client/types.ts | 79 ++++++++++---------- 5 files changed, 341 insertions(+), 46 deletions(-) diff --git a/src/client/dlq.test.ts b/src/client/dlq.test.ts index 7c54dc2f..7113dee9 100644 --- a/src/client/dlq.test.ts +++ b/src/client/dlq.test.ts @@ -811,5 +811,163 @@ describe("DLQ", () => { }, }); }); + + test("should delete a single DLQ message passed as a plain string", async () => { + const dlqId = `dlq-${nanoid()}`; + const deleted = 1; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.delete(dlqId); + expect(result.deleted).toBe(deleted); + }, + responseFields: { + status: 200, + body: { deleted }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?dlqIds=${dlqId}`, + token, + }, + }); + }); + + test("should delete multiple DLQ messages passed as a plain string array", async () => { + const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; + const deleted = 2; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.delete(dlqIds); + expect(result.deleted).toBe(deleted); + }, + responseFields: { + status: 200, + body: { deleted }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, + token, + }, + }); + }); + + test("should delete DLQ messages with label filter", async () => { + const deleted = 4; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.delete({ label: "my-label" }); + expect(result.deleted).toBe(deleted); + }, + responseFields: { + status: 200, + body: { deleted }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq`, + token, + body: { label: "my-label" }, + }, + }); + }); + + test("should delete DLQ messages with workflowUrl filter", async () => { + const deleted = 2; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.delete({ workflowUrl: "https://example.com/workflow" }); + expect(result.deleted).toBe(deleted); + }, + responseFields: { + status: 200, + body: { deleted }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq`, + token, + body: { workflowUrl: "https://example.com/workflow" }, + }, + }); + }); + + test("should delete DLQ messages with fromDate and toDate filters (converted to numbers)", async () => { + const deleted = 3; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.delete({ + fromDate: "1640995200000", + toDate: "1672531200000", + }); + expect(result.deleted).toBe(deleted); + }, + responseFields: { + status: 200, + body: { deleted }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq`, + token, + body: { fromDate: 1640995200000, toDate: 1672531200000 }, + }, + }); + }); + + test("should delete DLQ messages with multiple filters", async () => { + const deleted = 1; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.delete({ + label: "my-label", + workflowUrl: "https://example.com/workflow", + fromDate: "1640995200000", + }); + expect(result.deleted).toBe(deleted); + }, + responseFields: { + status: 200, + body: { deleted }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq`, + token, + body: { + label: "my-label", + workflowUrl: "https://example.com/workflow", + fromDate: 1640995200000, + }, + }, + }); + }); + + test("should delete all DLQ messages with all:true filter", async () => { + const deleted = 10; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.delete({ all: true }); + expect(result.deleted).toBe(deleted); + }, + responseFields: { + status: 200, + body: { deleted }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq`, + token, + body: {}, + }, + }); + }); }); }); diff --git a/src/client/dlq.ts b/src/client/dlq.ts index 4767b6b9..3dc04d36 100644 --- a/src/client/dlq.ts +++ b/src/client/dlq.ts @@ -78,7 +78,7 @@ type PublicDLQMessage = Pick< >; export class DLQ { - constructor(private client: QStashClient) {} + constructor(private client: QStashClient) { } /** * list the items in the DLQ @@ -166,7 +166,7 @@ export class DLQ { }>({ path: ["v2", "workflows", "dlq", "resume"], headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ + body: request.all ? JSON.stringify({}) : JSON.stringify({ ...request, ...(request.fromDate ? { fromDate: Number(request.fromDate) } : {}), ...(request.toDate ? { toDate: Number(request.toDate) } : {}), @@ -246,7 +246,7 @@ export class DLQ { }>({ path: ["v2", "workflows", "dlq", "restart"], headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ + body: request.all ? JSON.stringify({}) : JSON.stringify({ ...request, ...(request.fromDate ? { fromDate: Number(request.fromDate) } : {}), ...(request.toDate ? { toDate: Number(request.toDate) } : {}), @@ -326,7 +326,7 @@ export class DLQ { path: ["v2", "workflows", "dlq"], method: "DELETE", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ + body: request.all ? JSON.stringify({}) : JSON.stringify({ ...request, ...(request.fromDate ? { fromDate: Number(request.fromDate) } : {}), ...(request.toDate ? { toDate: Number(request.toDate) } : {}), diff --git a/src/client/index.test.ts b/src/client/index.test.ts index 3e830b81..4321174d 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -15,6 +15,37 @@ describe("workflow client", () => { const token = nanoid(); const client = new Client({ baseUrl: MOCK_QSTASH_SERVER_URL, token }); + describe("constructor", () => { + test("should log an error when token is missing", () => { + const errors: unknown[] = []; + const originalConsoleError = console.error; + console.error = (...args: unknown[]) => { + errors.push(...args); + }; + + new Client({ token: "" }); + + console.error = originalConsoleError; + + expect(errors.length).toBeGreaterThan(0); + expect(String(errors[0])).toContain("QStash token is required"); + }); + + test("should not log an error when token is provided", () => { + const errors: unknown[] = []; + const originalConsoleError = console.error; + console.error = (...args: unknown[]) => { + errors.push(...args); + }; + + new Client({ token: nanoid() }); + + console.error = originalConsoleError; + + expect(errors.length).toBe(0); + }); + }); + describe("cancel - mocked", () => { test("should cancel single workflow run id", async () => { const ids = `wfr-${nanoid()}`; @@ -95,6 +126,46 @@ describe("workflow client", () => { }); }); + test("should cancel with exact workflowUrl match", async () => { + const workflowUrl = "https://workflow-endpoint.com/specific-path"; + await mockQStashServer({ + execute: async () => { + const result = await client.cancel({ workflowUrl }); + expect(result).toEqual({ cancelled: 3 }); + }, + responseFields: { + status: 200, + body: { cancelled: 3 }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + token, + body: { workflowUrl, workflowUrlExactMatch: true }, + }, + }); + }); + + test("should cancel with exact workflowUrl and additional filters", async () => { + const workflowUrl = "https://workflow-endpoint.com/specific-path"; + const label = "my-label"; + await mockQStashServer({ + execute: async () => { + await client.cancel({ workflowUrl, label }); + }, + responseFields: { + status: 200, + body: { cancelled: 1 }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + token, + body: { label, workflowUrl, workflowUrlExactMatch: true }, + }, + }); + }); + test("should cancel all", async () => { await mockQStashServer({ execute: async () => { @@ -118,7 +189,7 @@ describe("workflow client", () => { await expect(async () => { await client.cancel({}); }).toThrow(TypeError); - + await expect(async () => { await client.cancel({}); }).toThrow("The `cancel` method cannot be called without any options."); @@ -634,6 +705,70 @@ describe("workflow client", () => { }); }); + test("should send logs request with label filter", async () => { + const label = "my-workflow-label"; + + await mockQStashServer({ + execute: async () => { + await client.logs({ label }); + }, + responseFields: { + status: 200, + body: "msgId", + }, + receivesRequest: { + method: "GET", + url: + `${MOCK_QSTASH_SERVER_URL}/v2/workflows/events?groupBy=workflowRunId` + + `&label=${label}`, + token, + body: "", + }, + }); + }); + + test("should send logs request with all parameters including label", async () => { + const count = 5; + const cursor = "cursor-abc"; + const state = "RUN_SUCCESS"; + const workflowCreatedAt = 456; + const workflowRunId = "wfr-456"; + const workflowUrl = "https://workflow-url.com"; + const label = "my-workflow-label"; + + await mockQStashServer({ + execute: async () => { + await client.logs({ + count, + cursor, + state, + workflowCreatedAt, + workflowRunId, + workflowUrl, + label, + }); + }, + responseFields: { + status: 200, + body: "msgId", + }, + receivesRequest: { + method: "GET", + url: + `${MOCK_QSTASH_SERVER_URL}/v2/workflows/events?groupBy=workflowRunId` + + `&workflowRunId=${workflowRunId}` + + `&cursor=${cursor}` + + `&count=${count}` + + `&state=${state}` + + `&workflowUrl=${encodeURIComponent(workflowUrl)}` + + `&workflowCreatedAt=${workflowCreatedAt}` + + `&label=${label}`, + token, + body: "", + }, + }); + }); + test.skip( "should get logs - live", async () => { diff --git a/src/client/index.ts b/src/client/index.ts index 2c3d82e9..d066dd9d 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -109,8 +109,7 @@ export class Client { label?: string; all?: true; }) { - let body: Record = - { + let body: Record = { ...(fromDate ? { fromDate: Number(fromDate) } : {}), ...(toDate ? { toDate: Number(toDate) } : {}), ...(label ? { label } : {}), @@ -121,7 +120,7 @@ export class Client { body = { ...body, workflowRunIds: runIdArray }; } else if (workflowUrl) { - body = { ...body, workflowUrl }; + body = { ...body, workflowUrl, workflowUrlExactMatch: true }; } else if (urlStartingWith) { body = { ...body, workflowUrl: urlStartingWith }; } else if (all) { diff --git a/src/client/types.ts b/src/client/types.ts index 75115ccb..ec76fc94 100644 --- a/src/client/types.ts +++ b/src/client/types.ts @@ -167,50 +167,50 @@ export type StepError = { type StepLogGroup = | { - /** - * Log which belongs to a single step - */ - steps: [StepLog]; - /** - * Log which belongs to a single step - */ - type: "sequential"; - } + /** + * Log which belongs to a single step + */ + steps: [StepLog]; + /** + * Log which belongs to a single step + */ + type: "sequential"; + } | { + /** + * Log which belongs to parallel steps + */ + steps: StepLog[]; + /** + * Log which belongs to parallel steps + */ + type: "parallel"; + } + | { + /** + * Log which belongs to the next step + */ + steps: { + messageId: string; + state: "STEP_PROGRESS" | "STEP_RETRY" | "STEP_FAILED" | "STEP_CANCELED"; /** - * Log which belongs to parallel steps - */ - steps: StepLog[]; - /** - * Log which belongs to parallel steps + * retries */ - type: "parallel"; - } - | { + retries: number; /** - * Log which belongs to the next step + * retry delay parameter for the step if it was set */ - steps: { - messageId: string; - state: "STEP_PROGRESS" | "STEP_RETRY" | "STEP_FAILED" | "STEP_CANCELED"; - /** - * retries - */ - retries: number; - /** - * retry delay parameter for the step if it was set - */ - retryDelay?: string; - /** - * errors which occured in the step - */ - errors?: StepError[]; - }[]; + retryDelay?: string; /** - * Log which belongs to the next step + * errors which occured in the step */ - type: "next"; - }; + errors?: StepError[]; + }[]; + /** + * Log which belongs to the next step + */ + type: "next"; + }; type FailureFunctionLog = { /** @@ -454,4 +454,7 @@ export type WorkflowBulkFilters = { fromDate?: string; toDate?: string; label?: string; -}; + all?: never; +} | +{ all: true; label?: never; workflowRunId?: never; workflowUrl?: never; fromDate?: never; toDate?: never; } + ; From aeed19d96772ac0ffc36f5ac54fe3a55729efc6e Mon Sep 17 00:00:00 2001 From: alitariksahin Date: Fri, 20 Feb 2026 13:36:31 +0300 Subject: [PATCH 08/29] fix: lint --- src/client/dlq.ts | 38 ++++++++++------- src/client/index.ts | 12 +++--- src/client/types.ts | 101 +++++++++++++++++++++++--------------------- 3 files changed, 82 insertions(+), 69 deletions(-) diff --git a/src/client/dlq.ts b/src/client/dlq.ts index 3dc04d36..5a689658 100644 --- a/src/client/dlq.ts +++ b/src/client/dlq.ts @@ -78,7 +78,7 @@ type PublicDLQMessage = Pick< >; export class DLQ { - constructor(private client: QStashClient) { } + constructor(private client: QStashClient) {} /** * list the items in the DLQ @@ -166,11 +166,13 @@ export class DLQ { }>({ path: ["v2", "workflows", "dlq", "resume"], headers: { "Content-Type": "application/json" }, - body: request.all ? JSON.stringify({}) : JSON.stringify({ - ...request, - ...(request.fromDate ? { fromDate: Number(request.fromDate) } : {}), - ...(request.toDate ? { toDate: Number(request.toDate) } : {}), - }), + body: request.all + ? JSON.stringify({}) + : JSON.stringify({ + ...request, + ...(request.fromDate ? { fromDate: Number(request.fromDate) } : {}), + ...(request.toDate ? { toDate: Number(request.toDate) } : {}), + }), method: "POST", }); return workflowRuns; @@ -246,11 +248,13 @@ export class DLQ { }>({ path: ["v2", "workflows", "dlq", "restart"], headers: { "Content-Type": "application/json" }, - body: request.all ? JSON.stringify({}) : JSON.stringify({ - ...request, - ...(request.fromDate ? { fromDate: Number(request.fromDate) } : {}), - ...(request.toDate ? { toDate: Number(request.toDate) } : {}), - }), + body: request.all + ? JSON.stringify({}) + : JSON.stringify({ + ...request, + ...(request.fromDate ? { fromDate: Number(request.fromDate) } : {}), + ...(request.toDate ? { toDate: Number(request.toDate) } : {}), + }), method: "POST", }); return workflowRuns; @@ -326,11 +330,13 @@ export class DLQ { path: ["v2", "workflows", "dlq"], method: "DELETE", headers: { "Content-Type": "application/json" }, - body: request.all ? JSON.stringify({}) : JSON.stringify({ - ...request, - ...(request.fromDate ? { fromDate: Number(request.fromDate) } : {}), - ...(request.toDate ? { toDate: Number(request.toDate) } : {}), - }), + body: request.all + ? JSON.stringify({}) + : JSON.stringify({ + ...request, + ...(request.fromDate ? { fromDate: Number(request.fromDate) } : {}), + ...(request.toDate ? { toDate: Number(request.toDate) } : {}), + }), }); } diff --git a/src/client/index.ts b/src/client/index.ts index d066dd9d..1c8ec2c0 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -26,12 +26,12 @@ export class Client { if (!clientConfig?.token) { console.error( "QStash token is required for Upstash Workflow!\n\n" + - "To fix this:\n" + - "1. Get your token from the Upstash Console (https://console.upstash.com/qstash)\n" + - "2. Initialize the workflow client with:\n\n" + - " const client = new Client({\n" + - " token: ''\n" + - " });" + "To fix this:\n" + + "1. Get your token from the Upstash Console (https://console.upstash.com/qstash)\n" + + "2. Initialize the workflow client with:\n\n" + + " const client = new Client({\n" + + " token: ''\n" + + " });" ); } this.client = new QStashClient(clientConfig); diff --git a/src/client/types.ts b/src/client/types.ts index ec76fc94..30e5f0fd 100644 --- a/src/client/types.ts +++ b/src/client/types.ts @@ -167,50 +167,50 @@ export type StepError = { type StepLogGroup = | { - /** - * Log which belongs to a single step - */ - steps: [StepLog]; - /** - * Log which belongs to a single step - */ - type: "sequential"; - } - | { - /** - * Log which belongs to parallel steps - */ - steps: StepLog[]; - /** - * Log which belongs to parallel steps - */ - type: "parallel"; - } + /** + * Log which belongs to a single step + */ + steps: [StepLog]; + /** + * Log which belongs to a single step + */ + type: "sequential"; + } | { - /** - * Log which belongs to the next step - */ - steps: { - messageId: string; - state: "STEP_PROGRESS" | "STEP_RETRY" | "STEP_FAILED" | "STEP_CANCELED"; /** - * retries + * Log which belongs to parallel steps */ - retries: number; + steps: StepLog[]; /** - * retry delay parameter for the step if it was set + * Log which belongs to parallel steps */ - retryDelay?: string; + type: "parallel"; + } + | { /** - * errors which occured in the step + * Log which belongs to the next step */ - errors?: StepError[]; - }[]; - /** - * Log which belongs to the next step - */ - type: "next"; - }; + steps: { + messageId: string; + state: "STEP_PROGRESS" | "STEP_RETRY" | "STEP_FAILED" | "STEP_CANCELED"; + /** + * retries + */ + retries: number; + /** + * retry delay parameter for the step if it was set + */ + retryDelay?: string; + /** + * errors which occured in the step + */ + errors?: StepError[]; + }[]; + /** + * Log which belongs to the next step + */ + type: "next"; + }; type FailureFunctionLog = { /** @@ -448,13 +448,20 @@ export type DLQResumeRestartResponse = { workflowCreatedAt: string; }; -export type WorkflowBulkFilters = { - workflowRunId?: string; - workflowUrl?: string; - fromDate?: string; - toDate?: string; - label?: string; - all?: never; -} | -{ all: true; label?: never; workflowRunId?: never; workflowUrl?: never; fromDate?: never; toDate?: never; } - ; +export type WorkflowBulkFilters = + | { + workflowRunId?: string; + workflowUrl?: string; + fromDate?: string; + toDate?: string; + label?: string; + all?: never; + } + | { + all: true; + label?: never; + workflowRunId?: never; + workflowUrl?: never; + fromDate?: never; + toDate?: never; + }; From d4a5f3659a3848e756cd89c8c883e5e8b7a400f2 Mon Sep 17 00:00:00 2001 From: alitariksahin Date: Thu, 26 Feb 2026 16:48:46 +0300 Subject: [PATCH 09/29] fix: reviews --- src/client/dlq.test.ts | 10 ++++++++++ src/client/dlq.ts | 28 +++++++++++++++++----------- src/client/index.test.ts | 31 ------------------------------- src/client/index.ts | 32 +++++++++++--------------------- src/client/types.ts | 25 ++++++++----------------- src/client/utils.ts | 6 ++++++ 6 files changed, 52 insertions(+), 80 deletions(-) diff --git a/src/client/dlq.test.ts b/src/client/dlq.test.ts index 7113dee9..bfa2e6bf 100644 --- a/src/client/dlq.test.ts +++ b/src/client/dlq.test.ts @@ -379,6 +379,11 @@ describe("DLQ", () => { }); }); + test("should return empty array when dlqId is an empty array", async () => { + const result = await client.dlq.resume({ dlqId: [] }); + expect(result).toEqual([]); + }); + test("should resume DLQ messages with filters", async () => { const responses = [ { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, @@ -665,6 +670,11 @@ describe("DLQ", () => { }); }); + test("should return empty array when dlqId is an empty array", async () => { + const result = await client.dlq.restart({ dlqId: [] }); + expect(result).toEqual([]); + }); + test("should restart DLQ messages with filters", async () => { const responses = [ { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, diff --git a/src/client/dlq.ts b/src/client/dlq.ts index 5a689658..da9f8bc2 100644 --- a/src/client/dlq.ts +++ b/src/client/dlq.ts @@ -1,6 +1,7 @@ import { Client as QStashClient } from "@upstash/qstash"; import { DLQResumeRestartOptions, DLQResumeRestartResponse, WorkflowBulkFilters } from "./types"; import { prepareFlowControl } from "../qstash/headers"; +import { toMs } from "./utils"; type QStashDLQFilterOptions = NonNullable< Required[0]> @@ -170,8 +171,8 @@ export class DLQ { ? JSON.stringify({}) : JSON.stringify({ ...request, - ...(request.fromDate ? { fromDate: Number(request.fromDate) } : {}), - ...(request.toDate ? { toDate: Number(request.toDate) } : {}), + ...(request.fromDate !== undefined ? { fromDate: toMs(request.fromDate) } : {}), + ...(request.toDate !== undefined ? { toDate: toMs(request.toDate) } : {}), }), method: "POST", }); @@ -180,11 +181,13 @@ export class DLQ { // DLQ ID-based resume const { headers, queryParams } = DLQ.handleDLQOptions(request); - const path = queryParams ? `resume?${queryParams}` : "resume"; + if (!queryParams) { + return []; + } const { workflowRuns } = await this.client.http.request<{ workflowRuns: DLQResumeRestartResponse[]; }>({ - path: ["v2", "workflows", "dlq", path], + path: ["v2", "workflows", "dlq", `resume?${queryParams}`], headers, method: "POST", }); @@ -252,8 +255,8 @@ export class DLQ { ? JSON.stringify({}) : JSON.stringify({ ...request, - ...(request.fromDate ? { fromDate: Number(request.fromDate) } : {}), - ...(request.toDate ? { toDate: Number(request.toDate) } : {}), + ...(request.fromDate !== undefined ? { fromDate: toMs(request.fromDate) } : {}), + ...(request.toDate !== undefined ? { toDate: toMs(request.toDate) } : {}), }), method: "POST", }); @@ -262,11 +265,13 @@ export class DLQ { // DLQ ID-based restart const { headers, queryParams } = DLQ.handleDLQOptions(request); - const path = queryParams ? `restart?${queryParams}` : "restart"; + if (!queryParams) { + return []; + } const { workflowRuns } = await this.client.http.request<{ workflowRuns: DLQResumeRestartResponse[]; }>({ - path: ["v2", "workflows", "dlq", path], + path: ["v2", "workflows", "dlq", `restart?${queryParams}`], headers, method: "POST", }); @@ -300,7 +305,8 @@ export class DLQ { * - A single dlqId: `delete("id")` * - An array of dlqIds: `delete(["id1", "id2"])` * - An object with dlqIds: `delete({ dlqIds: ["id1", "id2"] })` - * - A filter object: `delete({ label: "my-label", fromDate: "..." })` + * - A filter object: `delete({ label: "my-label", fromDate: 1640995200000 })` + * - To delete all entries: `delete({ all: true })` */ async delete( request: string | string[] | { dlqIds: string | string[] } | WorkflowBulkFilters @@ -334,8 +340,8 @@ export class DLQ { ? JSON.stringify({}) : JSON.stringify({ ...request, - ...(request.fromDate ? { fromDate: Number(request.fromDate) } : {}), - ...(request.toDate ? { toDate: Number(request.toDate) } : {}), + ...(request.fromDate !== undefined ? { fromDate: toMs(request.fromDate) } : {}), + ...(request.toDate !== undefined ? { toDate: toMs(request.toDate) } : {}), }), }); } diff --git a/src/client/index.test.ts b/src/client/index.test.ts index 4321174d..4e94477a 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -15,37 +15,6 @@ describe("workflow client", () => { const token = nanoid(); const client = new Client({ baseUrl: MOCK_QSTASH_SERVER_URL, token }); - describe("constructor", () => { - test("should log an error when token is missing", () => { - const errors: unknown[] = []; - const originalConsoleError = console.error; - console.error = (...args: unknown[]) => { - errors.push(...args); - }; - - new Client({ token: "" }); - - console.error = originalConsoleError; - - expect(errors.length).toBeGreaterThan(0); - expect(String(errors[0])).toContain("QStash token is required"); - }); - - test("should not log an error when token is provided", () => { - const errors: unknown[] = []; - const originalConsoleError = console.error; - console.error = (...args: unknown[]) => { - errors.push(...args); - }; - - new Client({ token: nanoid() }); - - console.error = originalConsoleError; - - expect(errors.length).toBe(0); - }); - }); - describe("cancel - mocked", () => { test("should cancel single workflow run id", async () => { const ids = `wfr-${nanoid()}`; diff --git a/src/client/index.ts b/src/client/index.ts index 1c8ec2c0..d618f7a9 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -1,6 +1,6 @@ import { NotifyResponse, Waiter } from "../types"; import { Client as QStashClient } from "@upstash/qstash"; -import { makeGetWaitersRequest, makeNotifyRequest } from "./utils"; +import { makeGetWaitersRequest, makeNotifyRequest, toMs } from "./utils"; import { getWorkflowRunId } from "../utils"; import { triggerFirstInvocation } from "../workflow-requests"; import { WorkflowContext } from "../context"; @@ -23,17 +23,6 @@ export class Client { private client: QStashClient; constructor(clientConfig: ClientConfig) { - if (!clientConfig?.token) { - console.error( - "QStash token is required for Upstash Workflow!\n\n" + - "To fix this:\n" + - "1. Get your token from the Upstash Console (https://console.upstash.com/qstash)\n" + - "2. Initialize the workflow client with:\n\n" + - " const client = new Client({\n" + - " token: ''\n" + - " });" - ); - } this.client = new QStashClient(clientConfig); } @@ -102,16 +91,17 @@ export class Client { all, }: { ids?: string | string[]; - urlStartingWith?: string; - workflowUrl?: string; - fromDate?: string; - toDate?: string; + fromDate?: Date | number | string; + toDate?: Date | number | string; label?: string; - all?: true; - }) { + all?: boolean; + } & ( + | { urlStartingWith?: string; workflowUrl?: never } + | { workflowUrl?: string; urlStartingWith?: never } + )) { let body: Record = { - ...(fromDate ? { fromDate: Number(fromDate) } : {}), - ...(toDate ? { toDate: Number(toDate) } : {}), + ...(fromDate !== undefined ? { fromDate: toMs(fromDate) } : {}), + ...(toDate !== undefined ? { toDate: toMs(toDate) } : {}), ...(label ? { label } : {}), }; @@ -124,7 +114,7 @@ export class Client { } else if (urlStartingWith) { body = { ...body, workflowUrl: urlStartingWith }; } else if (all) { - body = { ...body }; + body = {}; } else if (Object.keys(body).length === 0) { throw new TypeError("The `cancel` method cannot be called without any options."); } diff --git a/src/client/types.ts b/src/client/types.ts index 30e5f0fd..0ebcd4c6 100644 --- a/src/client/types.ts +++ b/src/client/types.ts @@ -448,20 +448,11 @@ export type DLQResumeRestartResponse = { workflowCreatedAt: string; }; -export type WorkflowBulkFilters = - | { - workflowRunId?: string; - workflowUrl?: string; - fromDate?: string; - toDate?: string; - label?: string; - all?: never; - } - | { - all: true; - label?: never; - workflowRunId?: never; - workflowUrl?: never; - fromDate?: never; - toDate?: never; - }; +export type WorkflowBulkFilters = { + workflowRunId?: string; + workflowUrl?: string; + fromDate?: Date | number | string; + toDate?: Date | number | string; + label?: string; + all?: boolean; +}; diff --git a/src/client/utils.ts b/src/client/utils.ts index aa744d35..9f4b6c2c 100644 --- a/src/client/utils.ts +++ b/src/client/utils.ts @@ -3,6 +3,12 @@ import { NotifyResponse, RawStep, Waiter } from "../types"; import { isInstanceOf } from "../error"; import { DispatchDebug } from "../middleware/types"; +/** + * Converts a `Date` object, Unix timestamp in milliseconds, or numeric string to a number. + */ +export const toMs = (d: Date | number | string): number => + d instanceof Date ? d.getTime() : Number(d); + /** * Makes a request to notify waiting workflows. * From 8c7d1d47f86667247b8e4e7c76cb0bc628759ebc Mon Sep 17 00:00:00 2001 From: ytkimirti Date: Wed, 18 Mar 2026 14:56:50 +0300 Subject: [PATCH 10/29] feat: bump qstash to 2.9.1-rc.1 --- bun.lock | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 8ccc6d9b..fcc261a8 100644 --- a/bun.lock +++ b/bun.lock @@ -4,7 +4,7 @@ "": { "name": "@upstash/workflow", "dependencies": { - "@upstash/qstash": "2.9.0-rc", + "@upstash/qstash": "2.9.1-rc.1", }, "devDependencies": { "@commitlint/cli": "^19.5.0", @@ -536,7 +536,7 @@ "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], - "@upstash/qstash": ["@upstash/qstash@2.9.0-rc", "", { "dependencies": { "crypto-js": ">=4.2.0", "jose": "^5.2.3", "neverthrow": "^7.0.1" } }, "sha512-T2VGOuK/XOFe+kppsANdiaXxpqPvnXl8XWmZzAtqZKsHWkBXPYqAvr/Pek8TZEKeOLAgc7wrl4Rm0KNqec9Fww=="], + "@upstash/qstash": ["@upstash/qstash@2.9.1-rc.1", "", { "dependencies": { "crypto-js": ">=4.2.0", "jose": "^5.2.3", "neverthrow": "^7.0.1" } }, "sha512-saCby1wib+XNtfxkr9tFYqWmSp5FbYxnEz9twGmgAdSzWQpHEAu97XiDdj4ipzBlF3ID0iQ9tvfRTYkETpv7kw=="], "@vercel/nft": ["@vercel/nft@0.30.3", "", { "dependencies": { "@mapbox/node-pre-gyp": "^2.0.0", "@rollup/pluginutils": "^5.1.3", "acorn": "^8.6.0", "acorn-import-attributes": "^1.9.5", "async-sema": "^3.1.1", "bindings": "^1.4.0", "estree-walker": "2.0.2", "glob": "^10.4.5", "graceful-fs": "^4.2.9", "node-gyp-build": "^4.2.2", "picomatch": "^4.0.2", "resolve-from": "^5.0.0" }, "bin": { "nft": "out/cli.js" } }, "sha512-UEq+eF0ocEf9WQCV1gktxKhha36KDs7jln5qii6UpPf5clMqDc0p3E7d9l2Smx0i9Pm1qpq4S4lLfNl97bbv6w=="], diff --git a/package.json b/package.json index e1023924..93232fca 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "typescript-eslint": "^8.18.0" }, "dependencies": { - "@upstash/qstash": "2.9.0-rc" + "@upstash/qstash": "2.9.1-rc.1" }, "directories": { "example": "examples" From 0f753813d80f4c2aa0ac939f7ad6a657aad6ede0 Mon Sep 17 00:00:00 2001 From: ytkimirti Date: Wed, 18 Mar 2026 14:57:33 +0300 Subject: [PATCH 11/29] feat: update filters and tests while keeping backwards compat --- src/client/dlq.test.ts | 480 ++++++++++------------------------ src/client/dlq.ts | 360 ++++++++++--------------- src/client/filter-types.ts | 80 ++++++ src/client/index.test.ts | 249 +++++++++++------- src/client/index.ts | 178 ++++--------- src/client/types.ts | 5 +- src/client/utils.ts | 15 +- src/serve/serve.test.ts | 4 +- src/workflow-requests.test.ts | 8 +- 9 files changed, 582 insertions(+), 797 deletions(-) create mode 100644 src/client/filter-types.ts diff --git a/src/client/dlq.test.ts b/src/client/dlq.test.ts index bfa2e6bf..a8f3f0bd 100644 --- a/src/client/dlq.test.ts +++ b/src/client/dlq.test.ts @@ -102,8 +102,7 @@ describe("DLQ", () => { const filter = { fromDate: 1640995200000, // 2022-01-01 toDate: 1672531200000, // 2023-01-01 - url: "https://example.com", - responseStatus: 500, + workflowUrl: "https://example.com", }; await mockQStashServer({ @@ -118,7 +117,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "GET", - url: `${MOCK_QSTASH_SERVER_URL}/v2/dlq?fromDate=${filter.fromDate}&toDate=${filter.toDate}&url=${encodeURIComponent(filter.url)}&responseStatus=${filter.responseStatus}&source=workflow`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/dlq?fromDate=${filter.fromDate}&toDate=${filter.toDate}&workflowUrl=${encodeURIComponent(filter.workflowUrl)}&source=workflow`, token, }, }); @@ -130,7 +129,7 @@ describe("DLQ", () => { const nextCursor = `next-${cursor}`; const filter = { fromDate: 1640995200000, - url: "https://example.com", + workflowUrl: "https://example.com", }; await mockQStashServer({ @@ -145,7 +144,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "GET", - url: `${MOCK_QSTASH_SERVER_URL}/v2/dlq?cursor=${cursor}&count=${count}&fromDate=${filter.fromDate}&url=${encodeURIComponent(filter.url)}&source=workflow`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/dlq?cursor=${cursor}&count=${count}&fromDate=${filter.fromDate}&workflowUrl=${encodeURIComponent(filter.workflowUrl)}&source=workflow`, token, }, }); @@ -160,9 +159,11 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { - const result = await client.dlq.resume({ dlqId }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); + const result = await client.dlq.resume(dlqId); + expect(result).toEqual({ + cursor: undefined, + workflowRuns: [{ workflowRunId, workflowCreatedAt }], + }); }, responseFields: { status: 200, @@ -172,7 +173,6 @@ describe("DLQ", () => { method: "POST", url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?dlqIds=${dlqId}`, token, - headers: {}, }, }); }); @@ -186,9 +186,8 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { - const result = await client.dlq.resume({ dlqId: dlqIds }); - expect(Array.isArray(result)).toBe(true); - expect(result).toEqual(responses); + const result = await client.dlq.resume(dlqIds); + expect(result).toEqual({ cursor: undefined, workflowRuns: responses }); }, responseFields: { status: 200, @@ -198,99 +197,16 @@ describe("DLQ", () => { method: "POST", url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, token, - headers: {}, - }, - }); - }); - - test("should resume DLQ message with flow control", async () => { - const dlqId = `dlq-${nanoid()}`; - const workflowRunId = `wfr-${nanoid()}`; - const workflowCreatedAt = "2023-01-01T00:00:00Z"; - const flowControl = { key: "test-key", rate: 10, parallelism: 5 }; - - await mockQStashServer({ - execute: async () => { - const result = await client.dlq.resume({ dlqId, flowControl }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); - }, - responseFields: { - status: 200, - body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, - }, - receivesRequest: { - method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?dlqIds=${dlqId}`, - token, - headers: { - "Upstash-Flow-Control-Key": "test-key", - "Upstash-Flow-Control-Value": "parallelism=5, rate=10", - }, }, }); }); - test("should resume DLQ message with retries", async () => { - const dlqId = `dlq-${nanoid()}`; - const workflowRunId = `wfr-${nanoid()}`; - const workflowCreatedAt = "2023-01-01T00:00:00Z"; - const retries = 5; - - await mockQStashServer({ - execute: async () => { - const result = await client.dlq.resume({ dlqId, retries }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); - }, - responseFields: { - status: 200, - body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, - }, - receivesRequest: { - method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?dlqIds=${dlqId}`, - token, - headers: { - "Upstash-Retries": "5", - }, - }, - }); + test("should return empty array when dlqIds is an empty array", async () => { + const result = await client.dlq.resume([]); + expect(result).toEqual({ workflowRuns: [] }); }); - test("should resume DLQ message with all parameters", async () => { - const dlqId = `dlq-${nanoid()}`; - const workflowRunId = `wfr-${nanoid()}`; - const workflowCreatedAt = "2023-01-01T00:00:00Z"; - const flowControl = { key: "test-key", rate: 10, parallelism: 5 }; - const retries = 3; - - await mockQStashServer({ - execute: async () => { - const result = await client.dlq.resume({ dlqId, flowControl, retries }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); - }, - responseFields: { - status: 200, - body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, - }, - receivesRequest: { - method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?dlqIds=${dlqId}`, - token, - headers: { - "Upstash-Flow-Control-Key": "test-key", - "Upstash-Flow-Control-Value": "parallelism=5, rate=10", - "Upstash-Retries": "3", - }, - }, - }); - }); - - test("should resume multiple DLQ messages with flow control", async () => { - const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; - const flowControl = { key: "test-key", rate: 10, parallelism: 5 }; + test("should resume DLQ messages with filters", async () => { const responses = [ { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, @@ -298,9 +214,8 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { - const result = await client.dlq.resume({ dlqId: dlqIds, flowControl }); - expect(Array.isArray(result)).toBe(true); - expect(result).toEqual(responses); + const result = await client.dlq.resume({ filter: { label: "my-label" } }); + expect(result).toEqual({ cursor: undefined, workflowRuns: responses }); }, responseFields: { status: 200, @@ -308,29 +223,23 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?label=my-label`, token, - headers: { - "Upstash-Flow-Control-Key": "test-key", - "Upstash-Flow-Control-Value": "parallelism=5, rate=10", - }, }, }); }); - test("should resume multiple DLQ messages with retries", async () => { - const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; - const retries = 5; + test("should resume DLQ messages with multiple filters", async () => { const responses = [ { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, - { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, ]; await mockQStashServer({ execute: async () => { - const result = await client.dlq.resume({ dlqId: dlqIds, retries }); - expect(Array.isArray(result)).toBe(true); - expect(result).toEqual(responses); + const result = await client.dlq.resume({ + filter: { label: "my-label", workflowUrl: "https://example.com/workflow" }, + }); + expect(result).toEqual({ cursor: undefined, workflowRuns: responses }); }, responseFields: { status: 200, @@ -338,29 +247,21 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?label=my-label&workflowUrl=${encodeURIComponent("https://example.com/workflow")}`, token, - headers: { - "Upstash-Retries": "5", - }, }, }); }); - test("should resume multiple DLQ messages with all parameters", async () => { - const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; - const flowControl = { key: "test-key", rate: 10, parallelism: 5 }; - const retries = 3; + test("should resume all DLQ messages", async () => { const responses = [ { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, - { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, ]; await mockQStashServer({ execute: async () => { - const result = await client.dlq.resume({ dlqId: dlqIds, flowControl, retries }); - expect(Array.isArray(result)).toBe(true); - expect(result).toEqual(responses); + const result = await client.dlq.resume({ all: true }); + expect(result).toEqual({ cursor: undefined, workflowRuns: responses }); }, responseFields: { status: 200, @@ -368,33 +269,25 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?all=true`, token, - headers: { - "Upstash-Flow-Control-Key": "test-key", - "Upstash-Flow-Control-Value": "parallelism=5, rate=10", - "Upstash-Retries": "3", - }, }, }); }); - test("should return empty array when dlqId is an empty array", async () => { - const result = await client.dlq.resume({ dlqId: [] }); - expect(result).toEqual([]); - }); - - test("should resume DLQ messages with filters", async () => { + test("should resume with flowControl and retries options", async () => { + const dlqId = `dlq-${nanoid()}`; const responses = [ { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, - { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, ]; await mockQStashServer({ execute: async () => { - const result = await client.dlq.resume({ label: "my-label" }); - expect(Array.isArray(result)).toBe(true); - expect(result).toEqual(responses); + const result = await client.dlq.resume(dlqId, { + flowControl: { key: "my-key", rate: 10, parallelism: 3, period: "1m" }, + retries: 5, + }); + expect(result).toEqual({ cursor: undefined, workflowRuns: responses }); }, responseFields: { status: 200, @@ -402,29 +295,26 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?dlqIds=${dlqId}`, token, headers: { - "Content-Type": "application/json", + "upstash-flow-control-key": "my-key", + "upstash-flow-control-value": "parallelism=3, rate=10, period=1m", + "upstash-retries": "5", }, - body: { label: "my-label" }, }, }); }); - test("should resume DLQ messages with multiple filters", async () => { + test("should resume with filter and flowControl options", async () => { const responses = [ { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, ]; await mockQStashServer({ execute: async () => { - const result = await client.dlq.resume({ - label: "my-label", - workflowUrl: "https://example.com/workflow", - }); - expect(Array.isArray(result)).toBe(true); - expect(result).toEqual(responses); + const result = await client.dlq.resume({ filter: { label: "my-label" } }, { retries: 2 }); + expect(result).toEqual({ cursor: undefined, workflowRuns: responses }); }, responseFields: { status: 200, @@ -432,43 +322,38 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?label=my-label`, token, headers: { - "Content-Type": "application/json", + "upstash-retries": "2", }, - body: { label: "my-label", workflowUrl: "https://example.com/workflow" }, }, }); }); - }); - describe("restart", () => { - test("should restart single DLQ message", async () => { + test("should resume single DLQ message with legacy { dlqId } format", async () => { const dlqId = `dlq-${nanoid()}`; const workflowRunId = `wfr-${nanoid()}`; const workflowCreatedAt = "2023-01-01T00:00:00Z"; await mockQStashServer({ execute: async () => { - const result = await client.dlq.restart({ dlqId }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); + const result = await client.dlq.resume({ dlqId }); + expect(result).toEqual({ workflowRunId, workflowCreatedAt }); }, responseFields: { status: 200, - body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, + body: { workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?dlqIds=${dlqId}`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?dlqIds=${dlqId}`, token, - headers: {}, }, }); }); - test("should restart multiple DLQ messages", async () => { + test("should resume multiple DLQ messages with legacy { dlqId } format", async () => { const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; const responses = [ { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, @@ -477,34 +362,35 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { - const result = await client.dlq.restart({ dlqId: dlqIds }); - expect(Array.isArray(result)).toBe(true); + const result = await client.dlq.resume({ dlqId: dlqIds }); expect(result).toEqual(responses); }, responseFields: { status: 200, - body: { cursor: "", workflowRuns: responses }, + body: { workflowRuns: responses }, }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, token, - headers: {}, }, }); }); + }); - test("should restart DLQ message with flow control", async () => { + describe("restart", () => { + test("should restart single DLQ message", async () => { const dlqId = `dlq-${nanoid()}`; const workflowRunId = `wfr-${nanoid()}`; const workflowCreatedAt = "2023-01-01T00:00:00Z"; - const flowControl = { key: "test-key", rate: 10, parallelism: 5 }; await mockQStashServer({ execute: async () => { - const result = await client.dlq.restart({ dlqId, flowControl }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); + const result = await client.dlq.restart(dlqId); + expect(result).toEqual({ + cursor: undefined, + workflowRuns: [{ workflowRunId, workflowCreatedAt }], + }); }, responseFields: { status: 200, @@ -514,84 +400,73 @@ describe("DLQ", () => { method: "POST", url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?dlqIds=${dlqId}`, token, - headers: { - "Upstash-Flow-Control-Key": "test-key", - "Upstash-Flow-Control-Value": "parallelism=5, rate=10", - }, }, }); }); - test("should restart DLQ message with retries", async () => { - const dlqId = `dlq-${nanoid()}`; - const workflowRunId = `wfr-${nanoid()}`; - const workflowCreatedAt = "2023-01-01T00:00:00Z"; - const retries = 5; + test("should restart multiple DLQ messages", async () => { + const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; + const responses = [ + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, + ]; await mockQStashServer({ execute: async () => { - const result = await client.dlq.restart({ dlqId, retries }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); + const result = await client.dlq.restart(dlqIds); + expect(result).toEqual({ cursor: undefined, workflowRuns: responses }); }, responseFields: { status: 200, - body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, + body: { cursor: "", workflowRuns: responses }, }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?dlqIds=${dlqId}`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, token, - headers: { - "Upstash-Retries": "5", - }, }, }); }); - test("should restart DLQ message with all parameters", async () => { - const dlqId = `dlq-${nanoid()}`; - const workflowRunId = `wfr-${nanoid()}`; - const workflowCreatedAt = "2023-01-01T00:00:00Z"; - const flowControl = { key: "test-key", rate: 10, parallelism: 5 }; - const retries = 3; + test("should return empty array when dlqIds is an empty array", async () => { + const result = await client.dlq.restart([]); + expect(result).toEqual({ workflowRuns: [] }); + }); + + test("should restart DLQ messages with filters", async () => { + const responses = [ + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, + ]; await mockQStashServer({ execute: async () => { - const result = await client.dlq.restart({ dlqId, flowControl, retries }); - expect(result.workflowRunId).toBe(workflowRunId); - expect(result.workflowCreatedAt).toBe(workflowCreatedAt); + const result = await client.dlq.restart({ filter: { label: "my-label" } }); + expect(result).toEqual({ cursor: undefined, workflowRuns: responses }); }, responseFields: { status: 200, - body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, + body: { cursor: "", workflowRuns: responses }, }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?dlqIds=${dlqId}`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?label=my-label`, token, - headers: { - "Upstash-Flow-Control-Key": "test-key", - "Upstash-Flow-Control-Value": "parallelism=5, rate=10", - "Upstash-Retries": "3", - }, }, }); }); - test("should restart multiple DLQ messages with flow control", async () => { - const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; - const flowControl = { key: "test-key", rate: 10, parallelism: 5 }; + test("should restart DLQ messages with multiple filters", async () => { const responses = [ { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, - { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, ]; await mockQStashServer({ execute: async () => { - const result = await client.dlq.restart({ dlqId: dlqIds, flowControl }); - expect(Array.isArray(result)).toBe(true); - expect(result).toEqual(responses); + const result = await client.dlq.restart({ + filter: { label: "my-label", workflowUrl: "https://example.com/workflow" }, + }); + expect(result).toEqual({ cursor: undefined, workflowRuns: responses }); }, responseFields: { status: 200, @@ -599,29 +474,21 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?label=my-label&workflowUrl=${encodeURIComponent("https://example.com/workflow")}`, token, - headers: { - "Upstash-Flow-Control-Key": "test-key", - "Upstash-Flow-Control-Value": "parallelism=5, rate=10", - }, }, }); }); - test("should restart multiple DLQ messages with retries", async () => { - const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; - const retries = 5; + test("should restart all DLQ messages", async () => { const responses = [ { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, - { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, ]; await mockQStashServer({ execute: async () => { - const result = await client.dlq.restart({ dlqId: dlqIds, retries }); - expect(Array.isArray(result)).toBe(true); - expect(result).toEqual(responses); + const result = await client.dlq.restart({ all: true }); + expect(result).toEqual({ cursor: undefined, workflowRuns: responses }); }, responseFields: { status: 200, @@ -629,29 +496,25 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?all=true`, token, - headers: { - "Upstash-Retries": "5", - }, }, }); }); - test("should restart multiple DLQ messages with all parameters", async () => { - const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; - const flowControl = { key: "test-key", rate: 10, parallelism: 5 }; - const retries = 3; + test("should restart with flowControl and retries options", async () => { + const dlqId = `dlq-${nanoid()}`; const responses = [ { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, - { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, ]; await mockQStashServer({ execute: async () => { - const result = await client.dlq.restart({ dlqId: dlqIds, flowControl, retries }); - expect(Array.isArray(result)).toBe(true); - expect(result).toEqual(responses); + const result = await client.dlq.restart(dlqId, { + flowControl: { key: "my-key", rate: 10, parallelism: 3, period: "1m" }, + retries: 5, + }); + expect(result).toEqual({ cursor: undefined, workflowRuns: responses }); }, responseFields: { status: 200, @@ -659,76 +522,59 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?dlqIds=${dlqId}`, token, headers: { - "Upstash-Flow-Control-Key": "test-key", - "Upstash-Flow-Control-Value": "parallelism=5, rate=10", - "Upstash-Retries": "3", + "upstash-flow-control-key": "my-key", + "upstash-flow-control-value": "parallelism=3, rate=10, period=1m", + "upstash-retries": "5", }, }, }); }); - test("should return empty array when dlqId is an empty array", async () => { - const result = await client.dlq.restart({ dlqId: [] }); - expect(result).toEqual([]); - }); - - test("should restart DLQ messages with filters", async () => { - const responses = [ - { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, - { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, - ]; + test("should restart single DLQ message with legacy { dlqId } format", async () => { + const dlqId = `dlq-${nanoid()}`; + const workflowRunId = `wfr-${nanoid()}`; + const workflowCreatedAt = "2023-01-01T00:00:00Z"; await mockQStashServer({ execute: async () => { - const result = await client.dlq.restart({ label: "my-label" }); - expect(Array.isArray(result)).toBe(true); - expect(result).toEqual(responses); + const result = await client.dlq.restart({ dlqId }); + expect(result).toEqual({ workflowRunId, workflowCreatedAt }); }, responseFields: { status: 200, - body: { cursor: "", workflowRuns: responses }, + body: { workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?dlqIds=${dlqId}`, token, - headers: { - "Content-Type": "application/json", - }, - body: { label: "my-label" }, }, }); }); - test("should restart DLQ messages with multiple filters", async () => { + test("should restart multiple DLQ messages with legacy { dlqId } format", async () => { + const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; const responses = [ { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, + { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T01:00:00Z" }, ]; await mockQStashServer({ execute: async () => { - const result = await client.dlq.restart({ - label: "my-label", - workflowUrl: "https://example.com/workflow", - }); - expect(Array.isArray(result)).toBe(true); + const result = await client.dlq.restart({ dlqId: dlqIds }); expect(result).toEqual(responses); }, responseFields: { status: 200, - body: { cursor: "", workflowRuns: responses }, + body: { workflowRuns: responses }, }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?dlqIds=${dlqIds[0]}&dlqIds=${dlqIds[1]}`, token, - headers: { - "Content-Type": "application/json", - }, - body: { label: "my-label", workflowUrl: "https://example.com/workflow" }, }, }); }); @@ -766,7 +612,7 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { - const result = await client.dlq.delete({ dlqIds: [dlqId] }); + const result = await client.dlq.delete(dlqId); expect(result.deleted).toBe(deleted); }, responseFields: { @@ -787,7 +633,7 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { - const result = await client.dlq.delete({ dlqIds }); + const result = await client.dlq.delete(dlqIds); expect(result.deleted).toBe(deleted); }, responseFields: { @@ -803,53 +649,17 @@ describe("DLQ", () => { }); test("should handle empty array of DLQ IDs", async () => { - const deleted = 0; - - await mockQStashServer({ - execute: async () => { - const result = await client.dlq.delete({ dlqIds: [] }); - expect(result.deleted).toBe(deleted); - }, - responseFields: { - status: 200, - body: { deleted }, - }, - receivesRequest: { - method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq`, - token, - }, - }); + const result = await client.dlq.delete([]); + expect(result.deleted).toBe(0); }); - test("should delete a single DLQ message passed as a plain string", async () => { - const dlqId = `dlq-${nanoid()}`; - const deleted = 1; - - await mockQStashServer({ - execute: async () => { - const result = await client.dlq.delete(dlqId); - expect(result.deleted).toBe(deleted); - }, - responseFields: { - status: 200, - body: { deleted }, - }, - receivesRequest: { - method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?dlqIds=${dlqId}`, - token, - }, - }); - }); - - test("should delete multiple DLQ messages passed as a plain string array", async () => { + test("should delete DLQ messages with dlqIds filter", async () => { const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; const deleted = 2; await mockQStashServer({ execute: async () => { - const result = await client.dlq.delete(dlqIds); + const result = await client.dlq.delete({ dlqIds }); expect(result.deleted).toBe(deleted); }, responseFields: { @@ -869,7 +679,7 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { - const result = await client.dlq.delete({ label: "my-label" }); + const result = await client.dlq.delete({ filter: { label: "my-label" } }); expect(result.deleted).toBe(deleted); }, responseFields: { @@ -878,9 +688,8 @@ describe("DLQ", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?label=my-label`, token, - body: { label: "my-label" }, }, }); }); @@ -890,7 +699,9 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { - const result = await client.dlq.delete({ workflowUrl: "https://example.com/workflow" }); + const result = await client.dlq.delete({ + filter: { workflowUrl: "https://example.com/workflow" }, + }); expect(result.deleted).toBe(deleted); }, responseFields: { @@ -899,21 +710,19 @@ describe("DLQ", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?workflowUrl=${encodeURIComponent("https://example.com/workflow")}`, token, - body: { workflowUrl: "https://example.com/workflow" }, }, }); }); - test("should delete DLQ messages with fromDate and toDate filters (converted to numbers)", async () => { + test("should delete DLQ messages with fromDate and toDate filters", async () => { const deleted = 3; await mockQStashServer({ execute: async () => { const result = await client.dlq.delete({ - fromDate: "1640995200000", - toDate: "1672531200000", + filter: { fromDate: 1640995200000, toDate: 1672531200000 }, }); expect(result.deleted).toBe(deleted); }, @@ -923,9 +732,8 @@ describe("DLQ", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?fromDate=1640995200000&toDate=1672531200000`, token, - body: { fromDate: 1640995200000, toDate: 1672531200000 }, }, }); }); @@ -936,9 +744,11 @@ describe("DLQ", () => { await mockQStashServer({ execute: async () => { const result = await client.dlq.delete({ - label: "my-label", - workflowUrl: "https://example.com/workflow", - fromDate: "1640995200000", + filter: { + label: "my-label", + workflowUrl: "https://example.com/workflow", + fromDate: 1640995200000, + }, }); expect(result.deleted).toBe(deleted); }, @@ -948,13 +758,8 @@ describe("DLQ", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?label=my-label&workflowUrl=${encodeURIComponent("https://example.com/workflow")}&fromDate=1640995200000`, token, - body: { - label: "my-label", - workflowUrl: "https://example.com/workflow", - fromDate: 1640995200000, - }, }, }); }); @@ -973,9 +778,8 @@ describe("DLQ", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?all=true`, token, - body: {}, }, }); }); diff --git a/src/client/dlq.ts b/src/client/dlq.ts index da9f8bc2..9ba3ca59 100644 --- a/src/client/dlq.ts +++ b/src/client/dlq.ts @@ -1,20 +1,12 @@ -import { Client as QStashClient } from "@upstash/qstash"; -import { DLQResumeRestartOptions, DLQResumeRestartResponse, WorkflowBulkFilters } from "./types"; +import { Client as QStashClient, FlowControl } from "@upstash/qstash"; +import { DLQResumeRestartOptions, DLQResumeRestartResponse } from "./types"; +import { normalizeCursor } from "./utils"; +import { WorkflowDLQActionFilters, WorkflowDLQListFilters } from "./filter-types"; import { prepareFlowControl } from "../qstash/headers"; -import { toMs } from "./utils"; -type QStashDLQFilterOptions = NonNullable< - Required[0]> ->["filter"]; - -type DLQFilterOptions = Pick< - QStashDLQFilterOptions, - "fromDate" | "toDate" | "url" | "responseStatus" -> & { - workflowRunId?: string; - workflowCreatedAt?: string; - failureFunctionState?: FailureCallbackInfo["state"]; - label?: string; +type ResumeRestartOptions = { + flowControl?: FlowControl; + retries?: number; }; type FailureCallbackInfo = { @@ -78,6 +70,29 @@ type PublicDLQMessage = Pick< | "label" >; +function buildResumeRestartHeaders(options?: ResumeRestartOptions): Record { + const headers: Record = {}; + if (options?.flowControl) { + const { flowControlKey, flowControlValue } = prepareFlowControl(options.flowControl); + headers["Upstash-Flow-Control-Key"] = flowControlKey; + headers["Upstash-Flow-Control-Value"] = flowControlValue; + } + if (options?.retries !== undefined) { + headers["Upstash-Retries"] = options.retries.toString(); + } + return headers; +} + +function flattenDLQFilters(filters: WorkflowDLQActionFilters) { + if ("filter" in filters) { + return { ...filters.filter, cursor: filters.cursor }; + } + if ("all" in filters) { + return { all: filters.all, cursor: filters.cursor }; + } + return { dlqIds: filters.dlqIds }; +} + export class DLQ { constructor(private client: QStashClient) {} @@ -98,18 +113,20 @@ export class DLQ { * - `failureFunctionState`: Filter items by failure callback state. * - `label`: Filter items by label. */ - async list(parameters?: { cursor?: string; count?: number; filter?: DLQFilterOptions }) { + async list(parameters?: { cursor?: string; count?: number; filter?: WorkflowDLQListFilters }) { const { cursor, count, filter } = parameters || {}; - return (await this.client.http.request({ - path: ["v2", "dlq"], - method: "GET", - query: { - cursor, - count, - ...filter, - source: "workflow", - }, - })) as { messages: PublicDLQMessage[]; cursor?: string }; + return normalizeCursor( + (await this.client.http.request({ + path: ["v2", "dlq"], + method: "GET", + query: { + cursor, + count, + ...filter, + source: "workflow", + }, + })) as { messages: PublicDLQMessage[]; cursor?: string } + ); } /** @@ -121,79 +138,63 @@ export class DLQ { * If you want to restart the workflow run from the beginning, use * `restart` method instead. * - * Example with a single DLQ ID: - * ```ts - * const response = await client.dlq.resume({ - * dlqId: "dlq-12345", - * flowControl: { - * key: "my-flow-control-key", - * value: "my-flow-control-value", - * }, - * retries: 3, - * }); - * - * console.log(response.workflowRunId); // ID of the new workflow run - * ``` - * - * Example with multiple DLQ IDs: - * ```ts - * const response = await client.dlq.resume({ - * dlqId: ["dlq-12345", "dlq-67890"], - * }); - * console.log(response[0].workflowRunId); // ID of the first workflow run - * console.log(response[1].workflowRunId); // ID of the second workflow run - * ``` - * - * if the dlqId is not found, throws an error. - * - * @param dlqId - The ID(s) of the DLQ message(s) to resume. - * @param flowControl - Optional flow control parameters. If not passed, flow - * control of the failing workflow will be used - * @param retries - Optional number of retries to perform if the request fails. - * If not passed, retries settings of the failing workflow will be used. - * @returns run id and creation time of the new workflow run(s). + * Can be called with: + * - A single dlqId: `resume("id")` + * - An array of dlqIds: `resume(["id1", "id2"])` + * - A filter object: `resume({ label: "my-label", fromDate: 1640995200000 })` + * - To resume all entries: `resume({ all: true })` */ + async resume( + request: string | string[] | WorkflowDLQActionFilters, + options?: ResumeRestartOptions + ): Promise<{ cursor?: string; workflowRuns: DLQResumeRestartResponse[] }>; + /** @deprecated Use `resume(dlqId)` instead */ async resume(request: DLQResumeRestartOptions): Promise; + /** @deprecated Use `resume([dlqId1, dlqId2])` instead */ async resume(request: DLQResumeRestartOptions): Promise; - async resume(request: WorkflowBulkFilters): Promise; - async resume( - request: DLQResumeRestartOptions | WorkflowBulkFilters - ): Promise { - // Filter-based resume - if (!("dlqId" in request)) { + request: string | string[] | WorkflowDLQActionFilters | DLQResumeRestartOptions, + options?: ResumeRestartOptions + ): Promise< + | { cursor?: string; workflowRuns: DLQResumeRestartResponse[] } + | DLQResumeRestartResponse + | DLQResumeRestartResponse[] + > { + // Legacy format: { dlqId, flowControl?, retries? } + if (typeof request === "object" && !Array.isArray(request) && "dlqId" in request) { + const { dlqId, flowControl, retries } = request as DLQResumeRestartOptions; + + const dlqIds = Array.isArray(dlqId) ? dlqId : [dlqId]; const { workflowRuns } = await this.client.http.request<{ workflowRuns: DLQResumeRestartResponse[]; }>({ path: ["v2", "workflows", "dlq", "resume"], - headers: { "Content-Type": "application/json" }, - body: request.all - ? JSON.stringify({}) - : JSON.stringify({ - ...request, - ...(request.fromDate !== undefined ? { fromDate: toMs(request.fromDate) } : {}), - ...(request.toDate !== undefined ? { toDate: toMs(request.toDate) } : {}), - }), + query: { dlqIds }, method: "POST", + headers: buildResumeRestartHeaders({ flowControl, retries }), }); - return workflowRuns; - } - // DLQ ID-based resume - const { headers, queryParams } = DLQ.handleDLQOptions(request); - if (!queryParams) { - return []; + return Array.isArray(dlqId) ? workflowRuns : workflowRuns[0]; } - const { workflowRuns } = await this.client.http.request<{ - workflowRuns: DLQResumeRestartResponse[]; - }>({ - path: ["v2", "workflows", "dlq", `resume?${queryParams}`], - headers, - method: "POST", - }); - // Return single response for string dlqId, array for array dlqId - return typeof request.dlqId === "string" ? workflowRuns[0] : workflowRuns; + // New format + if (typeof request === "string") request = [request]; + if (Array.isArray(request) && request.length === 0) return { workflowRuns: [] }; + const filters: WorkflowDLQActionFilters = Array.isArray(request) + ? { dlqIds: request } + : request; + + return normalizeCursor( + await this.client.http.request<{ + cursor?: string; + workflowRuns: DLQResumeRestartResponse[]; + }>({ + path: ["v2", "workflows", "dlq", "resume"], + query: flattenDLQFilters(filters), + method: "POST", + headers: buildResumeRestartHeaders(options), + }) + ); } /** @@ -205,79 +206,63 @@ export class DLQ { * If you want to resume the workflow run from where it failed, use * `resume` method instead. * - * Example with a single DLQ ID: - * ```ts - * const response = await client.dlq.restart({ - * dlqId: "dlq-12345", - * flowControl: { - * key: "my-flow-control-key", - * value: "my-flow-control-value", - * }, - * retries: 3, - * }); - * - * console.log(response.workflowRunId); // ID of the new workflow run - * ``` - * - * Example with multiple DLQ IDs: - * ```ts - * const response = await client.dlq.restart({ - * dlqId: ["dlq-12345", "dlq-67890"], - * }); - * console.log(response[0].workflowRunId); // ID of the first workflow run - * console.log(response[1].workflowRunId); // ID of the second workflow run - * ``` - * - * if the dlqId is not found, throws an error. - * - * @param dlqId - The ID(s) of the DLQ message(s) to restart. - * @param flowControl - Optional flow control parameters. If not passed, flow - * control of the failing workflow will be used - * @param retries - Optional number of retries to perform if the request fails. - * If not passed, retries settings of the failing workflow will be used. - * @returns run id and creation time of the new workflow run(s). + * Can be called with: + * - A single dlqId: `restart("id")` + * - An array of dlqIds: `restart(["id1", "id2"])` + * - A filter object: `restart({ label: "my-label", fromDate: 1640995200000 })` + * - To restart all entries: `restart({ all: true })` */ + async restart( + request: string | string[] | WorkflowDLQActionFilters, + options?: ResumeRestartOptions + ): Promise<{ cursor?: string; workflowRuns: DLQResumeRestartResponse[] }>; + /** @deprecated Use `restart(dlqId)` instead */ async restart(request: DLQResumeRestartOptions): Promise; + /** @deprecated Use `restart([dlqId1, dlqId2])` instead */ async restart(request: DLQResumeRestartOptions): Promise; - async restart(request: WorkflowBulkFilters): Promise; - async restart( - request: DLQResumeRestartOptions | WorkflowBulkFilters - ): Promise { - // Filter-based restart - if (!("dlqId" in request)) { + request: string | string[] | WorkflowDLQActionFilters | DLQResumeRestartOptions, + options?: ResumeRestartOptions + ): Promise< + | { cursor?: string; workflowRuns: DLQResumeRestartResponse[] } + | DLQResumeRestartResponse + | DLQResumeRestartResponse[] + > { + // Legacy format: { dlqId, flowControl?, retries? } + if (typeof request === "object" && !Array.isArray(request) && "dlqId" in request) { + const { dlqId, flowControl, retries } = request as DLQResumeRestartOptions; + + const dlqIds = Array.isArray(dlqId) ? dlqId : [dlqId]; const { workflowRuns } = await this.client.http.request<{ workflowRuns: DLQResumeRestartResponse[]; }>({ path: ["v2", "workflows", "dlq", "restart"], - headers: { "Content-Type": "application/json" }, - body: request.all - ? JSON.stringify({}) - : JSON.stringify({ - ...request, - ...(request.fromDate !== undefined ? { fromDate: toMs(request.fromDate) } : {}), - ...(request.toDate !== undefined ? { toDate: toMs(request.toDate) } : {}), - }), + query: { dlqIds }, method: "POST", + headers: buildResumeRestartHeaders({ flowControl, retries }), }); - return workflowRuns; - } - // DLQ ID-based restart - const { headers, queryParams } = DLQ.handleDLQOptions(request); - if (!queryParams) { - return []; + return Array.isArray(dlqId) ? workflowRuns : workflowRuns[0]; } - const { workflowRuns } = await this.client.http.request<{ - workflowRuns: DLQResumeRestartResponse[]; - }>({ - path: ["v2", "workflows", "dlq", `restart?${queryParams}`], - headers, - method: "POST", - }); - // Return single response for string dlqId, array for array dlqId - return typeof request.dlqId === "string" ? workflowRuns[0] : workflowRuns; + // New format + if (typeof request === "string") request = [request]; + if (Array.isArray(request) && request.length === 0) return { workflowRuns: [] }; + const filters: WorkflowDLQActionFilters = Array.isArray(request) + ? { dlqIds: request } + : request; + + return normalizeCursor( + await this.client.http.request<{ + cursor?: string; + workflowRuns: DLQResumeRestartResponse[]; + }>({ + path: ["v2", "workflows", "dlq", "restart"], + query: flattenDLQFilters(filters), + method: "POST", + headers: buildResumeRestartHeaders(options), + }) + ); } /** @@ -304,81 +289,22 @@ export class DLQ { * Can be called with: * - A single dlqId: `delete("id")` * - An array of dlqIds: `delete(["id1", "id2"])` - * - An object with dlqIds: `delete({ dlqIds: ["id1", "id2"] })` * - A filter object: `delete({ label: "my-label", fromDate: 1640995200000 })` * - To delete all entries: `delete({ all: true })` */ - async delete( - request: string | string[] | { dlqIds: string | string[] } | WorkflowBulkFilters - ): Promise<{ deleted: number }> { - // Handle string or string[] - direct dlqIds - if (typeof request === "string" || Array.isArray(request)) { - const queryParams = DLQ.getDlqIdQueryParameter(request); - const path = queryParams ? `dlq?${queryParams}` : "dlq"; - return await this.client.http.request<{ deleted: number }>({ - path: ["v2", "workflows", path], - method: "DELETE", - }); - } + async delete(request: string | string[] | WorkflowDLQActionFilters) { + if (typeof request === "string") request = [request]; + if (Array.isArray(request) && request.length === 0) return { deleted: 0 }; + const filters: WorkflowDLQActionFilters = Array.isArray(request) + ? { dlqIds: request } + : request; - // Handle object with dlqIds - if ("dlqIds" in request) { - const queryParams = DLQ.getDlqIdQueryParameter(request.dlqIds); - const path = queryParams ? `dlq?${queryParams}` : "dlq"; - return await this.client.http.request<{ deleted: number }>({ - path: ["v2", "workflows", path], + return normalizeCursor( + await this.client.http.request<{ cursor?: string; deleted: number }>({ + path: ["v2", "workflows", "dlq"], method: "DELETE", - }); - } - - // Handle filters (WorkflowBulkFilters) - return await this.client.http.request<{ deleted: number }>({ - path: ["v2", "workflows", "dlq"], - method: "DELETE", - headers: { "Content-Type": "application/json" }, - body: request.all - ? JSON.stringify({}) - : JSON.stringify({ - ...request, - ...(request.fromDate !== undefined ? { fromDate: toMs(request.fromDate) } : {}), - ...(request.toDate !== undefined ? { toDate: toMs(request.toDate) } : {}), - }), - }); - } - - /** - * Handles DLQ options and prepares headers and query parameters. - * - * @param options - DLQ resume/restart options - */ - private static handleDLQOptions(options: DLQResumeRestartOptions) { - const { dlqId, flowControl, retries } = options; - - const headers: Record = {}; - if (flowControl) { - const { flowControlKey, flowControlValue } = prepareFlowControl(flowControl); - headers["Upstash-Flow-Control-Key"] = flowControlKey; - headers["Upstash-Flow-Control-Value"] = flowControlValue; - } - - if (retries !== undefined) { - headers["Upstash-Retries"] = retries.toString(); - } - - return { - queryParams: DLQ.getDlqIdQueryParameter(dlqId), - headers, - }; - } - - /** - * Converts DLQ ID(s) to query parameter string. - * - * @param dlqId - Single DLQ ID or array of DLQ IDs - */ - private static getDlqIdQueryParameter(dlqId: string | string[]): string { - const dlqIds = Array.isArray(dlqId) ? dlqId : [dlqId]; - const paramsArray: [string, string][] = dlqIds.map((id) => ["dlqIds", id]); - return new URLSearchParams(paramsArray).toString(); + query: flattenDLQFilters(filters), + }) + ); } } diff --git a/src/client/filter-types.ts b/src/client/filter-types.ts new file mode 100644 index 00000000..3f55eed4 --- /dev/null +++ b/src/client/filter-types.ts @@ -0,0 +1,80 @@ +// ── Filter Utility Types ────────────────────────────────────── + +import { WorkflowRunLog } from "./types"; + +type RequireAtLeastOne = { [K in keyof T]-?: Required> }[keyof T]; + +type NeverKeys = { [K in keyof T]?: never }; + +/** Three-branch exclusive union: exactly one of A, B, or C. */ +type Exclusive3 = + | (A & NeverKeys & NeverKeys) + | (B & NeverKeys & NeverKeys) + | (C & NeverKeys & NeverKeys); + +// ── Filter Field Groups ─────────────────────────────────────── + +/** Shared filter fields accepted by every qstash & workflow endpoint. */ +type UniversalFilterFields = { + fromDate?: Date | number; + toDate?: Date | number; + callerIp?: string; + label?: string; + flowControlKey?: string; +}; + +/** Workflow-specific filter fields for DLQ and bulk endpoints. */ +type WorkflowFilterFields = { + workflowUrl?: string; + workflowRunId?: string; + workflowCreatedAt?: number; + failureFunctionState?: string; +}; + +type WorkflowLogsFilterFields = { + state?: WorkflowRunLog["workflowState"]; + messageId?: string; +}; + +// ── Composed Filter Field Types ─────────────────────────────── + +type DLQActionFilterFields = UniversalFilterFields & WorkflowFilterFields; + +type CancelFilterFields = UniversalFilterFields & + Pick & { + workflowUrlExactMatch?: boolean; + }; + +// ── Composed Endpoint Filter Types ──────────────────────────── + +/** + * DLQ bulk actions (resume, restart, delete) support three modes: + * - By dlqIds (no cursor) + * - By filter fields (with optional cursor) + * - All (with optional cursor) + */ +export type WorkflowDLQActionFilters = Exclusive3< + { dlqIds: string | string[] }, + { filter: RequireAtLeastOne; cursor?: string }, + { all: true; cursor?: string } +>; + +export type WorkflowDLQListFilters = UniversalFilterFields & WorkflowFilterFields; + +/** + * We don't accept a single workflowRunId or workflowCreatedAt because there + * could only be one running workflow with a single wfrid at the same time. + * So using these do not make sense. + * + * Also failureFunctionState is not available. + * Cancel does not support cursor. + */ +export type WorkflowRunCancelFilters = Exclusive3< + { workflowRunIds: string[] }, + { filter: RequireAtLeastOne }, + { all: true } +>; + +export type WorkflowLogsListFilters = UniversalFilterFields & + Pick & + WorkflowLogsFilterFields; diff --git a/src/client/index.test.ts b/src/client/index.test.ts index 4e94477a..05ac9dde 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -17,10 +17,10 @@ describe("workflow client", () => { describe("cancel - mocked", () => { test("should cancel single workflow run id", async () => { - const ids = `wfr-${nanoid()}`; + const id = `wfr-${nanoid()}`; await mockQStashServer({ execute: async () => { - const result = await client.cancel({ ids }); + const result = await client.cancel(id); expect(result).toEqual({ cancelled: 1 }); }, responseFields: { @@ -29,9 +29,8 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowRunIds=${id}`, token, - body: { workflowRunIds: [ids] }, }, }); }); @@ -40,7 +39,7 @@ describe("workflow client", () => { const ids = [`wfr-${nanoid()}`, `wfr-${nanoid()}`]; await mockQStashServer({ execute: async () => { - const result = await client.cancel({ ids }); + const result = await client.cancel(ids); expect(result).toEqual({ cancelled: 2 }); }, responseFields: { @@ -49,9 +48,8 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowRunIds=${ids[0]}&workflowRunIds=${ids[1]}`, token, - body: { workflowRunIds: ids }, }, }); }); @@ -60,7 +58,7 @@ describe("workflow client", () => { const ids = [`wfr-${nanoid()}`]; await mockQStashServer({ execute: async () => { - await client.cancel({ ids }); + await client.cancel(ids); }, responseFields: { status: 200, @@ -68,18 +66,17 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowRunIds=${ids[0]}`, token, - body: { workflowRunIds: ids }, }, }); }); test("should cancel workflowUrl", async () => { - const urlStartingWith = "http://workflow-endpoint.com"; + const workflowUrl = "http://workflow-endpoint.com"; await mockQStashServer({ execute: async () => { - const result = await client.cancel({ urlStartingWith }); + const result = await client.cancel({ filter: { workflowUrl } }); expect(result).toEqual({ cancelled: 5 }); }, responseFields: { @@ -88,9 +85,8 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowUrl=${encodeURIComponent(workflowUrl)}`, token, - body: { workflowUrl: urlStartingWith }, }, }); }); @@ -99,7 +95,9 @@ describe("workflow client", () => { const workflowUrl = "https://workflow-endpoint.com/specific-path"; await mockQStashServer({ execute: async () => { - const result = await client.cancel({ workflowUrl }); + const result = await client.cancel({ + filter: { workflowUrl, workflowUrlExactMatch: true }, + }); expect(result).toEqual({ cancelled: 3 }); }, responseFields: { @@ -108,19 +106,18 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowUrl=${encodeURIComponent(workflowUrl)}&workflowUrlExactMatch=true`, token, - body: { workflowUrl, workflowUrlExactMatch: true }, }, }); }); - test("should cancel with exact workflowUrl and additional filters", async () => { + test("should cancel with workflowUrl and additional filters", async () => { const workflowUrl = "https://workflow-endpoint.com/specific-path"; const label = "my-label"; await mockQStashServer({ execute: async () => { - await client.cancel({ workflowUrl, label }); + await client.cancel({ filter: { workflowUrl, label } }); }, responseFields: { status: 200, @@ -128,9 +125,8 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowUrl=${encodeURIComponent(workflowUrl)}&label=${label}`, token, - body: { label, workflowUrl, workflowUrlExactMatch: true }, }, }); }); @@ -147,28 +143,21 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?all=true`, token, - body: {}, }, }); }); - test("should throw error when called without any options", async () => { - await expect(async () => { - await client.cancel({}); - }).toThrow(TypeError); - - await expect(async () => { - await client.cancel({}); - }).toThrow("The `cancel` method cannot be called without any options."); + test("should return early when called with empty array", async () => { + const result = await client.cancel([]); + expect(result).toEqual({ cancelled: 0 }); }); test("should cancel with label filter", async () => { - const filters = { label: "test-label" }; await mockQStashServer({ execute: async () => { - await client.cancel({ ...filters }); + await client.cancel({ filter: { label: "test-label" } }); }, responseFields: { status: 200, @@ -176,21 +165,16 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?label=test-label`, token, - body: { label: "test-label" }, }, }); }); - test("should cancel with fromDate and toDate filters (converted to numbers)", async () => { - const filters = { - fromDate: "1640995200000", - toDate: "1672531200000", - }; + test("should cancel with fromDate and toDate filters", async () => { await mockQStashServer({ execute: async () => { - await client.cancel({ ...filters }); + await client.cancel({ filter: { fromDate: 1640995200000, toDate: 1672531200000 } }); }, responseFields: { status: 200, @@ -198,25 +182,22 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?fromDate=1640995200000&toDate=1672531200000`, token, - body: { - fromDate: 1640995200000, - toDate: 1672531200000, - }, }, }); }); test("should cancel with all filter fields", async () => { - const filters = { - label: "my-workflow-label", - fromDate: "1640995200000", - toDate: "1672531200000", - }; await mockQStashServer({ execute: async () => { - await client.cancel({ ...filters }); + await client.cancel({ + filter: { + label: "my-workflow-label", + fromDate: 1640995200000, + toDate: 1672531200000, + }, + }); }, responseFields: { status: 200, @@ -224,24 +205,16 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?label=my-workflow-label&fromDate=1640995200000&toDate=1672531200000`, token, - body: { - label: "my-workflow-label", - fromDate: 1640995200000, - toDate: 1672531200000, - }, }, }); }); test("should cancel with filters when only fromDate is provided", async () => { - const filters = { - fromDate: "1640995200000", - }; await mockQStashServer({ execute: async () => { - await client.cancel({ ...filters }); + await client.cancel({ filter: { fromDate: 1640995200000 } }); }, responseFields: { status: 200, @@ -249,22 +222,16 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?fromDate=1640995200000`, token, - body: { - fromDate: 1640995200000, - }, }, }); }); test("should cancel with filters when only toDate is provided", async () => { - const filters = { - toDate: "1672531200000", - }; await mockQStashServer({ execute: async () => { - await client.cancel({ ...filters }); + await client.cancel({ filter: { toDate: 1672531200000 } }); }, responseFields: { status: 200, @@ -272,11 +239,8 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?toDate=1672531200000`, token, - body: { - toDate: 1672531200000, - }, }, }); }); @@ -295,12 +259,10 @@ describe("workflow client", () => { url: "http://requestcatcher.com", }); - const cancel = await liveClient.cancel({ - ids: workflowRunId, - }); + const cancel = await liveClient.cancel(workflowRunId); expect(cancel).toEqual({ cancelled: 1 }); - const secondCancel = await liveClient.cancel({ ids: workflowRunId }); + const secondCancel = await liveClient.cancel(workflowRunId); expect(secondCancel).toEqual({ cancelled: 0 }); }, { @@ -318,17 +280,19 @@ describe("workflow client", () => { url: "http://requestcatcher.com", }); - const firstCancel = await liveClient.cancel({ - ids: [workflowRunIdOne, workflowRunIdTwo, "non-existent"], - }); + const firstCancel = await liveClient.cancel([ + workflowRunIdOne, + workflowRunIdTwo, + "non-existent", + ]); expect(firstCancel).toEqual({ cancelled: 2 }); // trying to cancel the workflows one by one gives error, as they were canceled above - const secondCancel = await liveClient.cancel({ ids: workflowRunIdOne }); + const secondCancel = await liveClient.cancel(workflowRunIdOne); expect(secondCancel).toEqual({ cancelled: 0 }); // trying to cancel the workflows one by one gives error, as they were canceled above - const thirdCancel = await liveClient.cancel({ ids: workflowRunIdTwo }); + const thirdCancel = await liveClient.cancel(workflowRunIdTwo); expect(thirdCancel).toEqual({ cancelled: 0 }); }, { @@ -347,7 +311,7 @@ describe("workflow client", () => { }); const cancel = await liveClient.cancel({ - urlStartingWith: "http://requestcatcher.com", + filter: { workflowUrl: "http://requestcatcher.com" }, }); expect(cancel).toEqual({ cancelled: 2 }); @@ -357,6 +321,97 @@ describe("workflow client", () => { } ); + test( + "should cancel with label filter", + async () => { + const label = `test-label-${nanoid()}`; + + await liveClient.trigger({ + url: "http://requestcatcher.com/label-test", + label, + }); + await liveClient.trigger({ + url: "http://requestcatcher.com/label-test", + label, + }); + // different label, should not be cancelled + const { workflowRunId: id3 } = await liveClient.trigger({ + url: "http://requestcatcher.com/label-test", + label: `other-label-${nanoid()}`, + }); + + const cancel = await liveClient.cancel({ filter: { label } }); + expect(cancel).toEqual({ cancelled: 2 }); + + // clean up the remaining workflow + await liveClient.cancel(id3); + }, + { + timeout: 15000, + } + ); + + test( + "should cancel with workflowUrlExactMatch", + async () => { + await liveClient.trigger({ + url: "http://requestcatcher.com/exact-match-test", + }); + await liveClient.trigger({ + url: "http://requestcatcher.com/exact-match-test/sub-path", + }); + + // exact match should only cancel the exact URL + const cancel = await liveClient.cancel({ + filter: { + workflowUrl: "http://requestcatcher.com/exact-match-test", + workflowUrlExactMatch: true, + }, + }); + expect(cancel).toEqual({ cancelled: 1 }); + + // clean up the remaining workflow (prefix match) + const cleanup = await liveClient.cancel({ + filter: { workflowUrl: "http://requestcatcher.com/exact-match-test" }, + }); + expect(cleanup).toEqual({ cancelled: 1 }); + }, + { + timeout: 15000, + } + ); + + test( + "should cancel with combined filters (label + workflowUrl)", + async () => { + const label = `combined-label-${nanoid()}`; + + await liveClient.trigger({ + url: "http://requestcatcher.com/combined-test", + label, + }); + // same URL, different label — should NOT be cancelled + const { workflowRunId: otherId } = await liveClient.trigger({ + url: "http://requestcatcher.com/combined-test", + label: `other-${nanoid()}`, + }); + + const cancel = await liveClient.cancel({ + filter: { + workflowUrl: "http://requestcatcher.com/combined-test", + label, + }, + }); + expect(cancel).toEqual({ cancelled: 1 }); + + // clean up + await liveClient.cancel(otherId); + }, + { + timeout: 15000, + } + ); + test.skip("should cancel all", async () => { // intentionally didn't write a test for cancel.all, // because it may break apps running on the same QStash user. @@ -662,12 +717,12 @@ describe("workflow client", () => { method: "GET", url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/events?groupBy=workflowRunId` + - `&workflowRunId=${workflowRunId}` + - `&cursor=${cursor}` + - `&count=${count}` + `&state=${state}` + + `&workflowCreatedAt=${workflowCreatedAt}` + + `&workflowRunId=${workflowRunId}` + `&workflowUrl=${encodeURIComponent(workflowUrl)}` + - `&workflowCreatedAt=${workflowCreatedAt}`, + `&cursor=${cursor}` + + `&count=${count}`, token, body: "", }, @@ -725,13 +780,13 @@ describe("workflow client", () => { method: "GET", url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/events?groupBy=workflowRunId` + - `&workflowRunId=${workflowRunId}` + - `&cursor=${cursor}` + - `&count=${count}` + `&state=${state}` + - `&workflowUrl=${encodeURIComponent(workflowUrl)}` + `&workflowCreatedAt=${workflowCreatedAt}` + - `&label=${label}`, + `&workflowRunId=${workflowRunId}` + + `&workflowUrl=${encodeURIComponent(workflowUrl)}` + + `&label=${label}` + + `&cursor=${cursor}` + + `&count=${count}`, token, body: "", }, @@ -772,7 +827,7 @@ describe("workflow client", () => { workflowRunId, }); - expect(logs.cursor).toBe(""); + expect(logs.cursor).toBeUndefined(); expect(logs.runs.length).toBe(1); expect(logs.runs[0]).toEqual({ workflowRunId, @@ -819,7 +874,7 @@ describe("workflow client", () => { { timeout: 1000, interval: 100 } ); - await liveClient.cancel({ ids: workflowRunId }); + await liveClient.cancel(workflowRunId); await eventually( async () => { @@ -827,7 +882,7 @@ describe("workflow client", () => { workflowRunId, }); - expect(postCancelLogs.cursor).toBe(""); + expect(postCancelLogs.cursor).toBeUndefined(); expect(postCancelLogs.runs.length).toBe(1); expect(postCancelLogs.runs[0]).toEqual({ workflowRunId, @@ -917,7 +972,7 @@ describe("workflow client", () => { workflowRunId, }); - expect(logs.cursor).toBe(""); + expect(logs.cursor).toBeUndefined(); expect(logs.runs.length).toBe(1); expect(logs.runs[0]).toEqual({ workflowRunId, diff --git a/src/client/index.ts b/src/client/index.ts index d618f7a9..9a55bb41 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -1,12 +1,13 @@ import { NotifyResponse, Waiter } from "../types"; import { Client as QStashClient } from "@upstash/qstash"; -import { makeGetWaitersRequest, makeNotifyRequest, toMs } from "./utils"; +import { makeGetWaitersRequest, makeNotifyRequest, normalizeCursor } from "./utils"; import { getWorkflowRunId } from "../utils"; import { triggerFirstInvocation } from "../workflow-requests"; import { WorkflowContext } from "../context"; import { DLQ } from "./dlq"; -import { TriggerOptions, WorkflowRunLog, WorkflowRunLogs } from "./types"; +import { TriggerOptions, WorkflowRunLogs } from "./types"; import { SDK_TELEMETRY, WORKFLOW_LABEL_HEADER } from "../constants"; +import { WorkflowLogsListFilters, WorkflowRunCancelFilters } from "./filter-types"; type ClientConfig = ConstructorParameters[0]; @@ -27,108 +28,33 @@ export class Client { } /** - * Cancel an ongoing workflow + * Cancel an ongoing workflow. * - * Returns true if workflow is canceled succesfully. Otherwise, throws error. - * - * There are multiple ways you can cancel workflows: - * - pass one or more workflow run ids to cancel them - * - pass a workflow url to cancel all runs starting with this url - * - cancel all pending or active workflow runs - * - * ### Cancel a set of workflow runs - * - * ```ts - * // cancel a single workflow - * await client.cancel({ ids: "" }) - * - * // cancel a set of workflow runs - * await client.cancel({ ids: [ - * "", - * "", - * ]}) - * ``` - * - * ### Cancel workflows starting with a url - * - * If you have an endpoint called `https://your-endpoint.com` and you - * want to cancel all workflow runs on it, you can use `urlStartingWith`. - * - * Note that this will cancel workflows in all endpoints under - * `https://your-endpoint.com`. - * - * ```ts - * await client.cancel({ urlStartingWith: "https://your-endpoint.com" }) - * ``` - * - * ### Cancel *all* workflows - * - * To cancel all pending and currently running workflows, you can - * do it like this: - * - * ```ts - * await client.cancel({ all: true }) - * ``` - * - * @param ids run id of the workflow to delete - * @param urlStartingWith cancel workflows starting with this url. Will be ignored - * if `ids` parameter is set. - * @param workflowUrl cancel workflows with this url. - * @param fromDate cancel workflows created after this date. - * @param toDate cancel workflows created before this date. - * @param label cancel workflows with this label. - * @param all set to true in order to cancel all workflows. Will be ignored - * if `ids` or `urlStartingWith` parameters are set. - * @returns true if workflow is succesfully deleted. Otherwise throws QStashError + * Can be called with: + * - A single workflow run id: `cancel("wfr_123")` + * - An array of workflow run ids: `cancel(["wfr_123", "wfr_456"])` + * - A filter object: `cancel({ workflowUrl: "https://...", label: "my-label" })` + * - To cancel all: `cancel({ all: true })` */ - public async cancel({ - ids, - urlStartingWith, - workflowUrl, - fromDate, - toDate, - label, - all, - }: { - ids?: string | string[]; - fromDate?: Date | number | string; - toDate?: Date | number | string; - label?: string; - all?: boolean; - } & ( - | { urlStartingWith?: string; workflowUrl?: never } - | { workflowUrl?: string; urlStartingWith?: never } - )) { - let body: Record = { - ...(fromDate !== undefined ? { fromDate: toMs(fromDate) } : {}), - ...(toDate !== undefined ? { toDate: toMs(toDate) } : {}), - ...(label ? { label } : {}), - }; + public async cancel( + request: string | string[] | WorkflowRunCancelFilters + ): Promise<{ cancelled: number }> { + if (typeof request === "string") request = [request]; + if (Array.isArray(request) && request.length === 0) return { cancelled: 0 }; + const filters = Array.isArray(request) ? { workflowRunIds: request } : request; - if (ids) { - const runIdArray = typeof ids === "string" ? [ids] : ids; + const query = + "filter" in filters + ? filters.filter + : "all" in filters + ? { all: filters.all } + : { workflowRunIds: filters.workflowRunIds }; - body = { ...body, workflowRunIds: runIdArray }; - } else if (workflowUrl) { - body = { ...body, workflowUrl, workflowUrlExactMatch: true }; - } else if (urlStartingWith) { - body = { ...body, workflowUrl: urlStartingWith }; - } else if (all) { - body = {}; - } else if (Object.keys(body).length === 0) { - throw new TypeError("The `cancel` method cannot be called without any options."); - } - - const result = await this.client.http.request<{ cancelled: number }>({ + return await this.client.http.request<{ cancelled: number }>({ path: ["v2", "workflows", "runs"], method: "DELETE", - body: JSON.stringify(body), - headers: { - "Content-Type": "application/json", - }, + query, }); - - return result; } /** @@ -320,44 +246,34 @@ export class Client { * ``` */ public async logs(params?: { - workflowRunId?: WorkflowRunLog["workflowRunId"]; cursor?: string; count?: number; - state?: WorkflowRunLog["workflowState"]; - workflowUrl?: WorkflowRunLog["workflowUrl"]; - workflowCreatedAt?: WorkflowRunLog["workflowRunCreatedAt"]; - label?: WorkflowRunLog["label"]; + filter?: WorkflowLogsListFilters; + /** @deprecated Use `filter.workflowRunId` instead. */ + workflowRunId?: string; + /** @deprecated Use `filter.state` instead. */ + state?: string; + /** @deprecated Use `filter.workflowUrl` instead. */ + workflowUrl?: string; + /** @deprecated Use `filter.label` instead. */ + label?: string; + /** @deprecated No longer supported. */ + workflowCreatedAt?: number; }): Promise { - const { workflowRunId, cursor, count, state, workflowUrl, workflowCreatedAt } = params ?? {}; + const { cursor, count, filter, ...legacyFilter } = params ?? {}; - const urlParams = new URLSearchParams({ groupBy: "workflowRunId" }); - if (workflowRunId) { - urlParams.append("workflowRunId", workflowRunId); - } - if (cursor) { - urlParams.append("cursor", cursor); - } - if (count) { - urlParams.append("count", count.toString()); - } - if (state) { - urlParams.append("state", state); - } - if (workflowUrl) { - urlParams.append("workflowUrl", workflowUrl); - } - if (workflowCreatedAt) { - urlParams.append("workflowCreatedAt", workflowCreatedAt.toString()); - } - if (params?.label) { - urlParams.append("label", params.label); - } - - const result = await this.client.http.request({ - path: ["v2", "workflows", `events?${urlParams.toString()}`], - }); - - return result; + return normalizeCursor( + await this.client.http.request({ + path: ["v2", "workflows", "events"], + query: { + groupBy: "workflowRunId", + ...legacyFilter, + cursor, + count, + ...filter, + }, + }) + ); } get dlq() { diff --git a/src/client/types.ts b/src/client/types.ts index 0ebcd4c6..cb191f94 100644 --- a/src/client/types.ts +++ b/src/client/types.ts @@ -334,7 +334,7 @@ export type WorkflowRunLog = { }; export type WorkflowRunLogs = { - cursor: string; + cursor?: string; runs: WorkflowRunLog[]; }; @@ -433,6 +433,7 @@ export type TriggerOptions = { failureUrl?: string; }; +/** @deprecated Use `resume(dlqId)` or `resume([dlqId1, dlqId2])` instead of `resume({ dlqId })` */ export type DLQResumeRestartOptions = { dlqId: TDLQId; } & Pick; @@ -454,5 +455,5 @@ export type WorkflowBulkFilters = { fromDate?: Date | number | string; toDate?: Date | number | string; label?: string; - all?: boolean; + all?: true; }; diff --git a/src/client/utils.ts b/src/client/utils.ts index 9f4b6c2c..47ba9152 100644 --- a/src/client/utils.ts +++ b/src/client/utils.ts @@ -3,12 +3,6 @@ import { NotifyResponse, RawStep, Waiter } from "../types"; import { isInstanceOf } from "../error"; import { DispatchDebug } from "../middleware/types"; -/** - * Converts a `Date` object, Unix timestamp in milliseconds, or numeric string to a number. - */ -export const toMs = (d: Date | number | string): number => - d instanceof Date ? d.getTime() : Number(d); - /** * Makes a request to notify waiting workflows. * @@ -136,3 +130,12 @@ export const getSteps = async ( } } }; + +/** + * Normalizes a response cursor: converts empty string to `undefined` + * so that callers can reliably use `cursor` as a boolean presence check. + */ +export function normalizeCursor(response: T): T { + const cursor = (response as { cursor?: string }).cursor; + return { ...response, cursor: cursor || undefined }; +} diff --git a/src/serve/serve.test.ts b/src/serve/serve.test.ts index 51fdc1d3..9bf914ba 100644 --- a/src/serve/serve.test.ts +++ b/src/serve/serve.test.ts @@ -1111,7 +1111,7 @@ describe("serve", () => { const { workflowRunId } = (await response.json()) as { workflowRunId: string }; expect(workflowRunId).toBeString(); - await client.cancel({ ids: workflowRunId }); + await client.cancel(workflowRunId); }); test("allow https://", async () => { @@ -1133,7 +1133,7 @@ describe("serve", () => { const { workflowRunId } = (await response.json()) as { workflowRunId: string }; expect(workflowRunId).toBeString(); - await client.cancel({ ids: workflowRunId }); + await client.cancel(workflowRunId); }); test("should not allow when not http:// or https://", async () => { diff --git a/src/workflow-requests.test.ts b/src/workflow-requests.test.ts index 5a127ca9..f6643701 100644 --- a/src/workflow-requests.test.ts +++ b/src/workflow-requests.test.ts @@ -782,7 +782,7 @@ describe("Workflow Requests", () => { const workflowClient = new WorkflowClient({ token: process.env.QSTASH_TOKEN! }); afterAll(async () => { - await workflowClient.cancel({ urlStartingWith: WORKFLOW_ENDPOINT }); + await workflowClient.cancel({ filter: { workflowUrl: WORKFLOW_ENDPOINT } }); }); test( @@ -828,7 +828,7 @@ describe("Workflow Requests", () => { const warnSpy = spyOn(console, "warn"); - await workflowClient.cancel({ ids: [workflowRunId] }); + await workflowClient.cancel([workflowRunId]); const result = await triggerRouteFunction({ onStep: async () => { @@ -877,7 +877,7 @@ describe("Workflow Requests", () => { useJSONContent: false, }); - await workflowClient.cancel({ ids: [workflowRunId] }); + await workflowClient.cancel([workflowRunId]); const result = await triggerRouteFunction({ onStep: async () => { @@ -930,7 +930,7 @@ describe("Workflow Requests", () => { await triggerFirstInvocation({ workflowContext: context, useJSONContent: false }); - await workflowClient.cancel({ ids: [workflowRunId] }); + await workflowClient.cancel([workflowRunId]); const warnSpy = spyOn(console, "warn"); From 206920ec0a8c757e598b9840828eb937243e74dc Mon Sep 17 00:00:00 2001 From: ytkimirti Date: Wed, 18 Mar 2026 16:11:37 +0300 Subject: [PATCH 12/29] feat: add buildBulkActionQueryParameters with empty array validation and default count --- src/client/dlq.test.ts | 24 ++++++------- src/client/dlq.ts | 63 ++++++++++++++++++++++----------- src/client/filter-types.ts | 65 +++++++++++++++++++++++----------- src/client/index.test.ts | 18 +++++----- src/client/index.ts | 30 +++++++++------- src/client/utils.ts | 71 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 198 insertions(+), 73 deletions(-) diff --git a/src/client/dlq.test.ts b/src/client/dlq.test.ts index a8f3f0bd..19396f72 100644 --- a/src/client/dlq.test.ts +++ b/src/client/dlq.test.ts @@ -223,7 +223,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?label=my-label`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?label=my-label&count=100`, token, }, }); @@ -247,7 +247,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?label=my-label&workflowUrl=${encodeURIComponent("https://example.com/workflow")}`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?label=my-label&workflowUrl=${encodeURIComponent("https://example.com/workflow")}&count=100`, token, }, }); @@ -269,7 +269,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?all=true`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?all=true&count=100`, token, }, }); @@ -322,7 +322,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?label=my-label`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?label=my-label&count=100`, token, headers: { "upstash-retries": "2", @@ -450,7 +450,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?label=my-label`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?label=my-label&count=100`, token, }, }); @@ -474,7 +474,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?label=my-label&workflowUrl=${encodeURIComponent("https://example.com/workflow")}`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?label=my-label&workflowUrl=${encodeURIComponent("https://example.com/workflow")}&count=100`, token, }, }); @@ -496,7 +496,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?all=true`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?all=true&count=100`, token, }, }); @@ -688,7 +688,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?label=my-label`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?label=my-label&count=100`, token, }, }); @@ -710,7 +710,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?workflowUrl=${encodeURIComponent("https://example.com/workflow")}`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?workflowUrl=${encodeURIComponent("https://example.com/workflow")}&count=100`, token, }, }); @@ -732,7 +732,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?fromDate=1640995200000&toDate=1672531200000`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?fromDate=1640995200000&toDate=1672531200000&count=100`, token, }, }); @@ -758,7 +758,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?label=my-label&workflowUrl=${encodeURIComponent("https://example.com/workflow")}&fromDate=1640995200000`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?label=my-label&workflowUrl=${encodeURIComponent("https://example.com/workflow")}&fromDate=1640995200000&count=100`, token, }, }); @@ -778,7 +778,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?all=true`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?all=true&count=100`, token, }, }); diff --git a/src/client/dlq.ts b/src/client/dlq.ts index 9ba3ca59..d262d0e6 100644 --- a/src/client/dlq.ts +++ b/src/client/dlq.ts @@ -1,6 +1,6 @@ import { Client as QStashClient, FlowControl } from "@upstash/qstash"; import { DLQResumeRestartOptions, DLQResumeRestartResponse } from "./types"; -import { normalizeCursor } from "./utils"; +import { buildBulkActionQueryParameters, normalizeCursor } from "./utils"; import { WorkflowDLQActionFilters, WorkflowDLQListFilters } from "./filter-types"; import { prepareFlowControl } from "../qstash/headers"; @@ -83,16 +83,6 @@ function buildResumeRestartHeaders(options?: ResumeRestartOptions): Record({ path: ["v2", "workflows", "dlq", "resume"], - query: flattenDLQFilters(filters), + query: buildBulkActionQueryParameters(filters), method: "POST", headers: buildResumeRestartHeaders(options), }) @@ -209,8 +210,19 @@ export class DLQ { * Can be called with: * - A single dlqId: `restart("id")` * - An array of dlqIds: `restart(["id1", "id2"])` - * - A filter object: `restart({ label: "my-label", fromDate: 1640995200000 })` - * - To restart all entries: `restart({ all: true })` + * - A filter object: `restart({ filter: { label: "my-label", fromDate: 1640995200000 } })` + * - To target all entries: `restart({ all: true })` + * + * Processes up to `count` messages per call (defaults to 100). + * Call in a loop until cursor is undefined to process all: + * + * ```ts + * let cursor: string | undefined; + * do { + * const result = await client.dlq.restart({ all: true, count: 100, cursor }); + * cursor = result.cursor; + * } while (cursor); + * ``` */ async restart( request: string | string[] | WorkflowDLQActionFilters, @@ -258,7 +270,7 @@ export class DLQ { workflowRuns: DLQResumeRestartResponse[]; }>({ path: ["v2", "workflows", "dlq", "restart"], - query: flattenDLQFilters(filters), + query: buildBulkActionQueryParameters(filters), method: "POST", headers: buildResumeRestartHeaders(options), }) @@ -289,8 +301,19 @@ export class DLQ { * Can be called with: * - A single dlqId: `delete("id")` * - An array of dlqIds: `delete(["id1", "id2"])` - * - A filter object: `delete({ label: "my-label", fromDate: 1640995200000 })` - * - To delete all entries: `delete({ all: true })` + * - A filter object: `delete({ filter: { label: "my-label", fromDate: 1640995200000 } })` + * - To target all entries: `delete({ all: true })` + * + * Processes up to `count` messages per call (defaults to 100). + * Call in a loop until cursor is undefined to process all: + * + * ```ts + * let cursor: string | undefined; + * do { + * const result = await client.dlq.delete({ all: true, count: 100, cursor }); + * cursor = result.cursor; + * } while (cursor); + * ``` */ async delete(request: string | string[] | WorkflowDLQActionFilters) { if (typeof request === "string") request = [request]; @@ -303,7 +326,7 @@ export class DLQ { await this.client.http.request<{ cursor?: string; deleted: number }>({ path: ["v2", "workflows", "dlq"], method: "DELETE", - query: flattenDLQFilters(filters), + query: buildBulkActionQueryParameters(filters), }) ); } diff --git a/src/client/filter-types.ts b/src/client/filter-types.ts index 3f55eed4..b15c6872 100644 --- a/src/client/filter-types.ts +++ b/src/client/filter-types.ts @@ -4,14 +4,6 @@ import { WorkflowRunLog } from "./types"; type RequireAtLeastOne = { [K in keyof T]-?: Required> }[keyof T]; -type NeverKeys = { [K in keyof T]?: never }; - -/** Three-branch exclusive union: exactly one of A, B, or C. */ -type Exclusive3 = - | (A & NeverKeys & NeverKeys) - | (B & NeverKeys & NeverKeys) - | (C & NeverKeys & NeverKeys); - // ── Filter Field Groups ─────────────────────────────────────── /** Shared filter fields accepted by every qstash & workflow endpoint. */ @@ -47,20 +39,46 @@ type CancelFilterFields = UniversalFilterFields & // ── Composed Endpoint Filter Types ──────────────────────────── +type WorkflowDLQBulkCount = { + cursor?: string; + /** + * Maximum number of messages to process per call. + * + * @default 100 + */ + count?: number; +}; + /** * DLQ bulk actions (resume, restart, delete) support three modes: * - By dlqIds (no cursor) - * - By filter fields (with optional cursor) - * - All (with optional cursor) + * - By filter fields (with optional cursor and count) + * - All (with optional cursor and count) */ -export type WorkflowDLQActionFilters = Exclusive3< - { dlqIds: string | string[] }, - { filter: RequireAtLeastOne; cursor?: string }, - { all: true; cursor?: string } ->; +export type WorkflowDLQActionFilters = + | { dlqIds: string | string[]; filter?: never; all?: never; count?: never; cursor?: never } + | ({ + filter: RequireAtLeastOne; + dlqIds?: never; + all?: never; + } & WorkflowDLQBulkCount) + | ({ + all: true; + dlqIds?: never; + filter?: never; + } & WorkflowDLQBulkCount); export type WorkflowDLQListFilters = UniversalFilterFields & WorkflowFilterFields; +type WorkflowCancelCount = { + /** + * Maximum number of workflow runs to cancel per call. + * + * @default 100 + */ + count?: number; +}; + /** * We don't accept a single workflowRunId or workflowCreatedAt because there * could only be one running workflow with a single wfrid at the same time. @@ -69,11 +87,18 @@ export type WorkflowDLQListFilters = UniversalFilterFields & WorkflowFilterField * Also failureFunctionState is not available. * Cancel does not support cursor. */ -export type WorkflowRunCancelFilters = Exclusive3< - { workflowRunIds: string[] }, - { filter: RequireAtLeastOne }, - { all: true } ->; +export type WorkflowRunCancelFilters = + | { workflowRunIds: string[]; filter?: never; all?: never; count?: never } + | ({ + filter: RequireAtLeastOne; + workflowRunIds?: never; + all?: never; + } & WorkflowCancelCount) + | ({ + all: true; + workflowRunIds?: never; + filter?: never; + } & WorkflowCancelCount); export type WorkflowLogsListFilters = UniversalFilterFields & Pick & diff --git a/src/client/index.test.ts b/src/client/index.test.ts index 05ac9dde..aff658a0 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -85,7 +85,7 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowUrl=${encodeURIComponent(workflowUrl)}`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowUrl=${encodeURIComponent(workflowUrl)}&count=100`, token, }, }); @@ -106,7 +106,7 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowUrl=${encodeURIComponent(workflowUrl)}&workflowUrlExactMatch=true`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowUrl=${encodeURIComponent(workflowUrl)}&workflowUrlExactMatch=true&count=100`, token, }, }); @@ -125,7 +125,7 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowUrl=${encodeURIComponent(workflowUrl)}&label=${label}`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowUrl=${encodeURIComponent(workflowUrl)}&label=${label}&count=100`, token, }, }); @@ -143,7 +143,7 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?all=true`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?all=true&count=100`, token, }, }); @@ -165,7 +165,7 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?label=test-label`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?label=test-label&count=100`, token, }, }); @@ -182,7 +182,7 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?fromDate=1640995200000&toDate=1672531200000`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?fromDate=1640995200000&toDate=1672531200000&count=100`, token, }, }); @@ -205,7 +205,7 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?label=my-workflow-label&fromDate=1640995200000&toDate=1672531200000`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?label=my-workflow-label&fromDate=1640995200000&toDate=1672531200000&count=100`, token, }, }); @@ -222,7 +222,7 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?fromDate=1640995200000`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?fromDate=1640995200000&count=100`, token, }, }); @@ -239,7 +239,7 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?toDate=1672531200000`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?toDate=1672531200000&count=100`, token, }, }); diff --git a/src/client/index.ts b/src/client/index.ts index 9a55bb41..0a623262 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -1,6 +1,11 @@ import { NotifyResponse, Waiter } from "../types"; import { Client as QStashClient } from "@upstash/qstash"; -import { makeGetWaitersRequest, makeNotifyRequest, normalizeCursor } from "./utils"; +import { + buildBulkActionQueryParameters, + makeGetWaitersRequest, + makeNotifyRequest, + normalizeCursor, +} from "./utils"; import { getWorkflowRunId } from "../utils"; import { triggerFirstInvocation } from "../workflow-requests"; import { WorkflowContext } from "../context"; @@ -33,27 +38,28 @@ export class Client { * Can be called with: * - A single workflow run id: `cancel("wfr_123")` * - An array of workflow run ids: `cancel(["wfr_123", "wfr_456"])` - * - A filter object: `cancel({ workflowUrl: "https://...", label: "my-label" })` - * - To cancel all: `cancel({ all: true })` + * - A filter object: `cancel({ filter: { workflowUrl: "https://...", label: "my-label" } })` + * - To target all: `cancel({ all: true })` + * + * Cancels up to `count` workflow runs per call (defaults to 100). + * + * ```ts + * const result = await client.cancel({ all: true, count: 50 }); + * ``` */ public async cancel( request: string | string[] | WorkflowRunCancelFilters ): Promise<{ cancelled: number }> { if (typeof request === "string") request = [request]; if (Array.isArray(request) && request.length === 0) return { cancelled: 0 }; - const filters = Array.isArray(request) ? { workflowRunIds: request } : request; - - const query = - "filter" in filters - ? filters.filter - : "all" in filters - ? { all: filters.all } - : { workflowRunIds: filters.workflowRunIds }; + const filters: WorkflowRunCancelFilters = Array.isArray(request) + ? { workflowRunIds: request } + : request; return await this.client.http.request<{ cancelled: number }>({ path: ["v2", "workflows", "runs"], method: "DELETE", - query, + query: buildBulkActionQueryParameters(filters), }); } diff --git a/src/client/utils.ts b/src/client/utils.ts index 47ba9152..0a42f51b 100644 --- a/src/client/utils.ts +++ b/src/client/utils.ts @@ -2,6 +2,7 @@ import { Client, QstashError } from "@upstash/qstash"; import { NotifyResponse, RawStep, Waiter } from "../types"; import { isInstanceOf } from "../error"; import { DispatchDebug } from "../middleware/types"; +import { WorkflowDLQActionFilters, WorkflowRunCancelFilters } from "./filter-types"; /** * Makes a request to notify waiting workflows. @@ -139,3 +140,73 @@ export function normalizeCursor(response: T): T { const cursor = (response as { cursor?: string }).cursor; return { ...response, cursor: cursor || undefined }; } + +const DEFAULT_BULK_COUNT = 100; + +/** + * Builds query parameters for bulk actions (DLQ resume/restart/delete and workflow cancel). + * + * Validates that ID arrays are not empty and applies a default `count` of 100 + * for filter-based and `{ all: true }` operations. + * + * @example DLQ action with dlqIds + * ```ts + * buildBulkActionQueryParameters({ dlqIds: ["dlq_1", "dlq_2"] }) + * // => { dlqIds: ["dlq_1", "dlq_2"] } + * ``` + * + * @example DLQ action targeting all with custom count + * ```ts + * buildBulkActionQueryParameters({ all: true, count: 50 }) + * // => { all: true, count: 50 } + * ``` + * + * @example Cancel with workflowRunIds + * ```ts + * buildBulkActionQueryParameters({ workflowRunIds: ["wfr_1", "wfr_2"] }) + * // => { workflowRunIds: ["wfr_1", "wfr_2"] } + * ``` + * + * @example Cancel targeting all (uses default count of 100) + * ```ts + * buildBulkActionQueryParameters({ all: true }) + * // => { all: true, count: 100 } + * ``` + * + * @throws {QstashError} If an empty `dlqIds` or `workflowRunIds` array is provided + */ +export function buildBulkActionQueryParameters( + request: WorkflowDLQActionFilters | WorkflowRunCancelFilters +) { + const cursor = "cursor" in request ? request.cursor : undefined; + + if ("all" in request) { + return { all: true as const, count: request.count ?? DEFAULT_BULK_COUNT, cursor }; + } + + if ("dlqIds" in request) { + const ids = request.dlqIds; + if (Array.isArray(ids) && ids.length === 0) { + throw new QstashError( + "Empty dlqIds array provided. If you intend to target all DLQ messages, use { all: true } explicitly." + ); + } + return { dlqIds: ids, cursor }; + } + + if ("workflowRunIds" in request && request.workflowRunIds) { + if (request.workflowRunIds.length === 0) { + throw new QstashError( + "Empty workflowRunIds array provided. If you intend to target all workflow runs, use { all: true } explicitly." + ); + } + return { workflowRunIds: request.workflowRunIds }; + } + + // Filter branch + return { + ...request.filter, + count: request.count ?? DEFAULT_BULK_COUNT, + cursor, + }; +} From 80627f5d60727bcd6678451ea7f86f80b94bc679 Mon Sep 17 00:00:00 2001 From: ytkimirti Date: Wed, 18 Mar 2026 16:32:25 +0300 Subject: [PATCH 13/29] fix: add backwards compat for cancel() and dlq.list() filter signatures - Add legacy overload for cancel({ ids, urlStartingWith, all }) so existing callers are not broken by the new signature - Restore deprecated url and responseStatus fields on WorkflowDLQListFilters --- src/client/filter-types.ts | 8 +++++++- src/client/index.ts | 31 ++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/client/filter-types.ts b/src/client/filter-types.ts index b15c6872..f417c57e 100644 --- a/src/client/filter-types.ts +++ b/src/client/filter-types.ts @@ -68,7 +68,13 @@ export type WorkflowDLQActionFilters = filter?: never; } & WorkflowDLQBulkCount); -export type WorkflowDLQListFilters = UniversalFilterFields & WorkflowFilterFields; +export type WorkflowDLQListFilters = UniversalFilterFields & + WorkflowFilterFields & { + /** @deprecated Use `workflowUrl` instead. */ + url?: string; + /** @deprecated No longer supported in the new API. */ + responseStatus?: number; + }; type WorkflowCancelCount = { /** diff --git a/src/client/index.ts b/src/client/index.ts index 0a623262..02813b27 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -49,12 +49,41 @@ export class Client { */ public async cancel( request: string | string[] | WorkflowRunCancelFilters + ): Promise<{ cancelled: number }>; + /** @deprecated Use `cancel(id)`, `cancel([id1, id2])`, `cancel({ filter: { workflowUrl } })` or `cancel({ all: true })` instead. */ + public async cancel(request: { + ids?: string | string[]; + urlStartingWith?: string; + all?: true; + }): Promise<{ cancelled: number }>; + public async cancel( + request: + | string + | string[] + | WorkflowRunCancelFilters + | { ids?: string | string[]; urlStartingWith?: string; all?: true } ): Promise<{ cancelled: number }> { + // Legacy format: { ids?, urlStartingWith?, all? } + if ( + typeof request === "object" && + !Array.isArray(request) && + ("ids" in request || "urlStartingWith" in request) + ) { + const legacy = request as { ids?: string | string[]; urlStartingWith?: string; all?: true }; + if (legacy.ids) { + const ids = typeof legacy.ids === "string" ? [legacy.ids] : legacy.ids; + return this.cancel(ids); + } + if (legacy.urlStartingWith) { + return this.cancel({ filter: { workflowUrl: legacy.urlStartingWith } }); + } + } + if (typeof request === "string") request = [request]; if (Array.isArray(request) && request.length === 0) return { cancelled: 0 }; const filters: WorkflowRunCancelFilters = Array.isArray(request) ? { workflowRunIds: request } - : request; + : (request as WorkflowRunCancelFilters); return await this.client.http.request<{ cancelled: number }>({ path: ["v2", "workflows", "runs"], From 5156beea0d3872573e93c5a7287fc6ad1d68971d Mon Sep 17 00:00:00 2001 From: ytkimirti Date: Wed, 18 Mar 2026 16:59:57 +0300 Subject: [PATCH 14/29] feat: replace workflowUrlExactMatch with workflowUrlStartingWith for cancel filters Make workflowUrl mean exact match by default in cancel filters and add workflowUrlStartingWith for prefix-match behavior. This is consistent with how DLQ endpoints already treat workflowUrl. --- src/client/filter-types.ts | 10 ++++++---- src/client/index.test.ts | 21 ++++++++++----------- src/client/index.ts | 8 +++++--- src/client/utils.ts | 30 ++++++++++++++++++++++++++++-- 4 files changed, 49 insertions(+), 20 deletions(-) diff --git a/src/client/filter-types.ts b/src/client/filter-types.ts index f417c57e..1ff1649b 100644 --- a/src/client/filter-types.ts +++ b/src/client/filter-types.ts @@ -32,10 +32,12 @@ type WorkflowLogsFilterFields = { type DLQActionFilterFields = UniversalFilterFields & WorkflowFilterFields; -type CancelFilterFields = UniversalFilterFields & - Pick & { - workflowUrlExactMatch?: boolean; - }; +type CancelFilterFields = UniversalFilterFields & { + /** Cancel workflows with this exact URL. */ + workflowUrl?: string; + /** Cancel workflows whose URL starts with this prefix. */ + workflowUrlStartingWith?: string; +}; // ── Composed Endpoint Filter Types ──────────────────────────── diff --git a/src/client/index.test.ts b/src/client/index.test.ts index aff658a0..b4e17d20 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -72,7 +72,7 @@ describe("workflow client", () => { }); }); - test("should cancel workflowUrl", async () => { + test("should cancel with workflowUrl (exact match)", async () => { const workflowUrl = "http://workflow-endpoint.com"; await mockQStashServer({ execute: async () => { @@ -85,18 +85,18 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowUrl=${encodeURIComponent(workflowUrl)}&count=100`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowUrl=${encodeURIComponent(workflowUrl)}&workflowUrlExactMatch=true&count=100`, token, }, }); }); - test("should cancel with exact workflowUrl match", async () => { + test("should cancel with workflowUrlStartingWith (prefix match)", async () => { const workflowUrl = "https://workflow-endpoint.com/specific-path"; await mockQStashServer({ execute: async () => { const result = await client.cancel({ - filter: { workflowUrl, workflowUrlExactMatch: true }, + filter: { workflowUrlStartingWith: workflowUrl }, }); expect(result).toEqual({ cancelled: 3 }); }, @@ -106,7 +106,7 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowUrl=${encodeURIComponent(workflowUrl)}&workflowUrlExactMatch=true&count=100`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowUrl=${encodeURIComponent(workflowUrl)}&count=100`, token, }, }); @@ -125,7 +125,7 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowUrl=${encodeURIComponent(workflowUrl)}&label=${label}&count=100`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?label=${label}&workflowUrl=${encodeURIComponent(workflowUrl)}&workflowUrlExactMatch=true&count=100`, token, }, }); @@ -301,7 +301,7 @@ describe("workflow client", () => { ); test( - "should cancel workflowUrl", + "should cancel with workflowUrlStartingWith (prefix match)", async () => { await liveClient.trigger({ url: "http://requestcatcher.com/first", @@ -311,7 +311,7 @@ describe("workflow client", () => { }); const cancel = await liveClient.cancel({ - filter: { workflowUrl: "http://requestcatcher.com" }, + filter: { workflowUrlStartingWith: "http://requestcatcher.com" }, }); expect(cancel).toEqual({ cancelled: 2 }); @@ -352,7 +352,7 @@ describe("workflow client", () => { ); test( - "should cancel with workflowUrlExactMatch", + "should cancel with workflowUrl (exact match)", async () => { await liveClient.trigger({ url: "http://requestcatcher.com/exact-match-test", @@ -365,14 +365,13 @@ describe("workflow client", () => { const cancel = await liveClient.cancel({ filter: { workflowUrl: "http://requestcatcher.com/exact-match-test", - workflowUrlExactMatch: true, }, }); expect(cancel).toEqual({ cancelled: 1 }); // clean up the remaining workflow (prefix match) const cleanup = await liveClient.cancel({ - filter: { workflowUrl: "http://requestcatcher.com/exact-match-test" }, + filter: { workflowUrlStartingWith: "http://requestcatcher.com/exact-match-test" }, }); expect(cleanup).toEqual({ cancelled: 1 }); }, diff --git a/src/client/index.ts b/src/client/index.ts index 02813b27..fc56b260 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -38,7 +38,9 @@ export class Client { * Can be called with: * - A single workflow run id: `cancel("wfr_123")` * - An array of workflow run ids: `cancel(["wfr_123", "wfr_456"])` - * - A filter object: `cancel({ filter: { workflowUrl: "https://...", label: "my-label" } })` + * - By exact URL: `cancel({ filter: { workflowUrl: "https://..." } })` + * - By URL prefix: `cancel({ filter: { workflowUrlStartingWith: "https://..." } })` + * - With other filters: `cancel({ filter: { label: "my-label" } })` * - To target all: `cancel({ all: true })` * * Cancels up to `count` workflow runs per call (defaults to 100). @@ -75,7 +77,7 @@ export class Client { return this.cancel(ids); } if (legacy.urlStartingWith) { - return this.cancel({ filter: { workflowUrl: legacy.urlStartingWith } }); + return this.cancel({ filter: { workflowUrlStartingWith: legacy.urlStartingWith } }); } } @@ -88,7 +90,7 @@ export class Client { return await this.client.http.request<{ cancelled: number }>({ path: ["v2", "workflows", "runs"], method: "DELETE", - query: buildBulkActionQueryParameters(filters), + query: buildBulkActionQueryParameters(filters, { translateWorkflowUrl: true }), }); } diff --git a/src/client/utils.ts b/src/client/utils.ts index 0a42f51b..1277f561 100644 --- a/src/client/utils.ts +++ b/src/client/utils.ts @@ -176,7 +176,8 @@ const DEFAULT_BULK_COUNT = 100; * @throws {QstashError} If an empty `dlqIds` or `workflowRunIds` array is provided */ export function buildBulkActionQueryParameters( - request: WorkflowDLQActionFilters | WorkflowRunCancelFilters + request: WorkflowDLQActionFilters | WorkflowRunCancelFilters, + options?: { translateWorkflowUrl?: boolean } ) { const cursor = "cursor" in request ? request.cursor : undefined; @@ -204,8 +205,33 @@ export function buildBulkActionQueryParameters( } // Filter branch + const filter = request.filter as Record; + + // When translateWorkflowUrl is set (cancel filters), translate + // workflowUrl/workflowUrlStartingWith into the server's query params: + // - workflowUrl → workflowUrl + workflowUrlExactMatch=true (exact match) + // - workflowUrlStartingWith → workflowUrl (prefix match, server default) + if (options?.translateWorkflowUrl) { + const { workflowUrlStartingWith, workflowUrl, ...rest } = filter; + + const urlParams: Record = {}; + if (workflowUrlStartingWith) { + urlParams.workflowUrl = workflowUrlStartingWith as string; + } else if (workflowUrl) { + urlParams.workflowUrl = workflowUrl as string; + urlParams.workflowUrlExactMatch = true; + } + + return { + ...rest, + ...urlParams, + count: request.count ?? DEFAULT_BULK_COUNT, + cursor, + }; + } + return { - ...request.filter, + ...filter, count: request.count ?? DEFAULT_BULK_COUNT, cursor, }; From 523147475dcd14e482b59e084431a59c7d319518 Mon Sep 17 00:00:00 2001 From: ytkimirti Date: Wed, 18 Mar 2026 17:01:50 +0300 Subject: [PATCH 15/29] test: add legacy cancel() format tests for backwards compat --- src/client/index.test.ts | 57 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/src/client/index.test.ts b/src/client/index.test.ts index b4e17d20..2b87a44a 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -154,6 +154,63 @@ describe("workflow client", () => { expect(result).toEqual({ cancelled: 0 }); }); + test("should cancel with legacy { ids: string } format", async () => { + const id = `wfr-${nanoid()}`; + await mockQStashServer({ + execute: async () => { + const result = await client.cancel({ ids: id }); + expect(result).toEqual({ cancelled: 1 }); + }, + responseFields: { + status: 200, + body: { cancelled: 1 }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowRunIds=${id}`, + token, + }, + }); + }); + + test("should cancel with legacy { ids: string[] } format", async () => { + const ids = [`wfr-${nanoid()}`, `wfr-${nanoid()}`]; + await mockQStashServer({ + execute: async () => { + const result = await client.cancel({ ids }); + expect(result).toEqual({ cancelled: 2 }); + }, + responseFields: { + status: 200, + body: { cancelled: 2 }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowRunIds=${ids[0]}&workflowRunIds=${ids[1]}`, + token, + }, + }); + }); + + test("should cancel with legacy { urlStartingWith } format", async () => { + const urlStartingWith = "http://workflow-endpoint.com"; + await mockQStashServer({ + execute: async () => { + const result = await client.cancel({ urlStartingWith }); + expect(result).toEqual({ cancelled: 3 }); + }, + responseFields: { + status: 200, + body: { cancelled: 3 }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?workflowUrl=${encodeURIComponent(urlStartingWith)}&count=100`, + token, + }, + }); + }); + test("should cancel with label filter", async () => { await mockQStashServer({ execute: async () => { From d5f69a7369823f4b1ea142404f6fe9dfc44e9e9f Mon Sep 17 00:00:00 2001 From: CahidArda Date: Mon, 23 Mar 2026 14:20:11 +0300 Subject: [PATCH 16/29] test: refactor DLQ and cancel tests to use mockQStashServer for consistency --- src/client/dlq.test.ts | 30 ++++++++++++++++++++++++------ src/client/index.test.ts | 10 ++++++++-- src/client/utils.ts | 4 +--- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/client/dlq.test.ts b/src/client/dlq.test.ts index 19396f72..fcc51b04 100644 --- a/src/client/dlq.test.ts +++ b/src/client/dlq.test.ts @@ -202,8 +202,14 @@ describe("DLQ", () => { }); test("should return empty array when dlqIds is an empty array", async () => { - const result = await client.dlq.resume([]); - expect(result).toEqual({ workflowRuns: [] }); + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.resume([]); + expect(result).toEqual({ workflowRuns: [] }); + }, + responseFields: { status: 200, body: {} }, + receivesRequest: false, + }); }); test("should resume DLQ messages with filters", async () => { @@ -429,8 +435,14 @@ describe("DLQ", () => { }); test("should return empty array when dlqIds is an empty array", async () => { - const result = await client.dlq.restart([]); - expect(result).toEqual({ workflowRuns: [] }); + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.restart([]); + expect(result).toEqual({ workflowRuns: [] }); + }, + responseFields: { status: 200, body: {} }, + receivesRequest: false, + }); }); test("should restart DLQ messages with filters", async () => { @@ -649,8 +661,14 @@ describe("DLQ", () => { }); test("should handle empty array of DLQ IDs", async () => { - const result = await client.dlq.delete([]); - expect(result.deleted).toBe(0); + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.delete([]); + expect(result.deleted).toBe(0); + }, + responseFields: { status: 200, body: {} }, + receivesRequest: false, + }); }); test("should delete DLQ messages with dlqIds filter", async () => { diff --git a/src/client/index.test.ts b/src/client/index.test.ts index b693579d..f75a395c 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -150,8 +150,14 @@ describe("workflow client", () => { }); test("should return early when called with empty array", async () => { - const result = await client.cancel([]); - expect(result).toEqual({ cancelled: 0 }); + await mockQStashServer({ + execute: async () => { + const result = await client.cancel([]); + expect(result).toEqual({ cancelled: 0 }); + }, + responseFields: { status: 200, body: {} }, + receivesRequest: false, + }); }); test("should cancel with legacy { ids: string } format", async () => { diff --git a/src/client/utils.ts b/src/client/utils.ts index 5d70db76..e91ad538 100644 --- a/src/client/utils.ts +++ b/src/client/utils.ts @@ -18,9 +18,7 @@ export const makeNotifyRequest = async ( eventData?: unknown, workflowRunId?: string ): Promise => { - const path = workflowRunId - ? ["v2", "notify", workflowRunId, eventId] - : ["v2", "notify", eventId]; + const path = workflowRunId ? ["v2", "notify", workflowRunId, eventId] : ["v2", "notify", eventId]; const result = (await requester.request({ path, From 0d880191c9527afd2b2469b02b9324e75bc8acc0 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Mon, 23 Mar 2026 14:48:22 +0300 Subject: [PATCH 17/29] test: add empty dlqIds and live { all: true } tests, drop all= query param - Add tests for resume/restart/delete with { dlqIds: [] } to verify runtime guard throws instead of sending unscoped bulk requests - Add live tests (skipped) for cancel/resume/restart/delete with { all: true } - Remove `all=true` from query parameters in buildBulkActionQueryParameters; only count param remains for bulk operations Co-Authored-By: Claude Opus 4.6 (1M context) --- src/client/dlq.test.ts | 116 +++++++++++++++++++++++++++++++++++++-- src/client/index.test.ts | 17 ++++-- src/client/utils.ts | 2 +- 3 files changed, 125 insertions(+), 10 deletions(-) diff --git a/src/client/dlq.test.ts b/src/client/dlq.test.ts index fcc51b04..01bcf588 100644 --- a/src/client/dlq.test.ts +++ b/src/client/dlq.test.ts @@ -1,5 +1,5 @@ import { describe, test, expect } from "bun:test"; -import { MOCK_QSTASH_SERVER_URL, mockQStashServer } from "../test-utils"; +import { MOCK_QSTASH_SERVER_URL, mockQStashServer, eventually } from "../test-utils"; import { Client } from "."; import { nanoid } from "../utils"; @@ -212,6 +212,18 @@ describe("DLQ", () => { }); }); + test("should throw when dlqIds is empty in filter format", async () => { + await mockQStashServer({ + execute: async () => { + await expect(client.dlq.resume({ dlqIds: [] })).rejects.toThrow( + "Empty dlqIds array provided" + ); + }, + responseFields: { status: 200, body: {} }, + receivesRequest: false, + }); + }); + test("should resume DLQ messages with filters", async () => { const responses = [ { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, @@ -275,7 +287,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?all=true&count=100`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/resume?count=100`, token, }, }); @@ -445,6 +457,18 @@ describe("DLQ", () => { }); }); + test("should throw when dlqIds is empty in filter format", async () => { + await mockQStashServer({ + execute: async () => { + await expect(client.dlq.restart({ dlqIds: [] })).rejects.toThrow( + "Empty dlqIds array provided" + ); + }, + responseFields: { status: 200, body: {} }, + receivesRequest: false, + }); + }); + test("should restart DLQ messages with filters", async () => { const responses = [ { workflowRunId: `wfr-${nanoid()}`, workflowCreatedAt: "2023-01-01T00:00:00Z" }, @@ -508,7 +532,7 @@ describe("DLQ", () => { }, receivesRequest: { method: "POST", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?all=true&count=100`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq/restart?count=100`, token, }, }); @@ -671,6 +695,18 @@ describe("DLQ", () => { }); }); + test("should throw when dlqIds is empty in filter format", async () => { + await mockQStashServer({ + execute: async () => { + await expect(client.dlq.delete({ dlqIds: [] })).rejects.toThrow( + "Empty dlqIds array provided" + ); + }, + responseFields: { status: 200, body: {} }, + receivesRequest: false, + }); + }); + test("should delete DLQ messages with dlqIds filter", async () => { const dlqIds = [`dlq-${nanoid()}`, `dlq-${nanoid()}`]; const deleted = 2; @@ -796,10 +832,82 @@ describe("DLQ", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?all=true&count=100`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?count=100`, token, }, }); }); }); + + /** + * tests skipped to avoid breaking live apps + */ + describe.skip("DLQ - live", () => { + const liveClient = new Client({ + baseUrl: process.env.QSTASH_URL, + token: process.env.QSTASH_TOKEN!, + }); + + test( + "should resume all DLQ messages", + async () => { + // trigger workflows that will fail and end up in DLQ + await liveClient.trigger({ url: "https://mock.httpstatus.io/500", retries: 0 }); + await liveClient.trigger({ url: "https://mock.httpstatus.io/500", retries: 0 }); + + // wait for messages to land in DLQ + await eventually( + async () => { + const { messages } = await liveClient.dlq.list(); + expect(messages.length).toBeGreaterThanOrEqual(2); + }, + { timeout: 30000, interval: 2000 } + ); + + const result = await liveClient.dlq.resume({ all: true }); + expect(result.workflowRuns.length).toBeGreaterThanOrEqual(2); + }, + { timeout: 60000 } + ); + + test( + "should restart all DLQ messages", + async () => { + await liveClient.trigger({ url: "https://mock.httpstatus.io/500", retries: 0 }); + await liveClient.trigger({ url: "https://mock.httpstatus.io/500", retries: 0 }); + + await eventually( + async () => { + const { messages } = await liveClient.dlq.list(); + expect(messages.length).toBeGreaterThanOrEqual(2); + }, + { timeout: 30000, interval: 2000 } + ); + + const result = await liveClient.dlq.restart({ all: true }); + expect(result.workflowRuns.length).toBeGreaterThanOrEqual(2); + }, + { timeout: 60000 } + ); + + test( + "should delete all DLQ messages", + async () => { + await liveClient.trigger({ url: "https://mock.httpstatus.io/500", retries: 0 }); + await liveClient.trigger({ url: "https://mock.httpstatus.io/500", retries: 0 }); + + await eventually( + async () => { + const { messages } = await liveClient.dlq.list(); + expect(messages.length).toBeGreaterThanOrEqual(2); + }, + { timeout: 30000, interval: 2000 } + ); + + const result = await liveClient.dlq.delete({ all: true }); + expect(result.deleted).toBeGreaterThanOrEqual(2); + }, + { timeout: 60000 } + ); + }); }); diff --git a/src/client/index.test.ts b/src/client/index.test.ts index f75a395c..64d69e1d 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -143,7 +143,7 @@ describe("workflow client", () => { }, receivesRequest: { method: "DELETE", - url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?all=true&count=100`, + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?count=100`, token, }, }); @@ -476,10 +476,17 @@ describe("workflow client", () => { } ); - test.skip("should cancel all", async () => { - // intentionally didn't write a test for cancel.all, - // because it may break apps running on the same QStash user. - }); + test.skip( + "should cancel all", + async () => { + await liveClient.trigger({ url: "http://requestcatcher.com/cancel-all-1" }); + await liveClient.trigger({ url: "http://requestcatcher.com/cancel-all-2" }); + + const cancel = await liveClient.cancel({ all: true }); + expect(cancel.cancelled).toBeGreaterThanOrEqual(2); + }, + { timeout: 15000 } + ); }); test("should send notify", async () => { diff --git a/src/client/utils.ts b/src/client/utils.ts index e91ad538..e3effc8b 100644 --- a/src/client/utils.ts +++ b/src/client/utils.ts @@ -186,7 +186,7 @@ export function buildBulkActionQueryParameters( const cursor = "cursor" in request ? request.cursor : undefined; if ("all" in request) { - return { all: true as const, count: request.count ?? DEFAULT_BULK_COUNT, cursor }; + return { count: request.count ?? DEFAULT_BULK_COUNT, cursor }; } if ("dlqIds" in request) { From 3a4a86038e904dc0b460979cb9316e4ef33e6077 Mon Sep 17 00:00:00 2001 From: ytkimirti Date: Wed, 25 Mar 2026 08:17:03 +0300 Subject: [PATCH 18/29] fix: address PR review comments for backwards compat and safety - Enforce workflowUrl/workflowUrlStartingWith mutual exclusivity at type level (CancelFilter union with never) and runtime (QstashError) - Add explicit error in buildBulkActionQueryParameters when no filter is provided (catches cancel({}) with a clear message) - Remove unused WorkflowBulkFilters type from types.ts - Remove normalizeCursor from logs() to preserve cursor: string contract (server always returns "" for this endpoint, not undefined) --- src/client/filter-types.ts | 25 +++++++++++++++++++------ src/client/index.ts | 29 +++++++++++------------------ src/client/types.ts | 11 +---------- src/client/utils.ts | 15 ++++++++++++++- 4 files changed, 45 insertions(+), 35 deletions(-) diff --git a/src/client/filter-types.ts b/src/client/filter-types.ts index 1ff1649b..720b7ae1 100644 --- a/src/client/filter-types.ts +++ b/src/client/filter-types.ts @@ -32,13 +32,26 @@ type WorkflowLogsFilterFields = { type DLQActionFilterFields = UniversalFilterFields & WorkflowFilterFields; -type CancelFilterFields = UniversalFilterFields & { - /** Cancel workflows with this exact URL. */ - workflowUrl?: string; - /** Cancel workflows whose URL starts with this prefix. */ - workflowUrlStartingWith?: string; +/** Cancel filter: exact URL match. Cannot combine with `workflowUrlStartingWith`. */ +type CancelFilterWithExactUrl = UniversalFilterFields & { + workflowUrl: string; + workflowUrlStartingWith?: never; +}; + +/** Cancel filter: URL prefix match. Cannot combine with `workflowUrl`. */ +type CancelFilterWithPrefixUrl = UniversalFilterFields & { + workflowUrlStartingWith: string; + workflowUrl?: never; }; +/** Cancel filter: no URL. Requires at least one other filter field. */ +type CancelFilterWithoutUrl = RequireAtLeastOne & { + workflowUrl?: never; + workflowUrlStartingWith?: never; +}; + +type CancelFilter = CancelFilterWithExactUrl | CancelFilterWithPrefixUrl | CancelFilterWithoutUrl; + // ── Composed Endpoint Filter Types ──────────────────────────── type WorkflowDLQBulkCount = { @@ -98,7 +111,7 @@ type WorkflowCancelCount = { export type WorkflowRunCancelFilters = | { workflowRunIds: string[]; filter?: never; all?: never; count?: never } | ({ - filter: RequireAtLeastOne; + filter: CancelFilter; workflowRunIds?: never; all?: never; } & WorkflowCancelCount) diff --git a/src/client/index.ts b/src/client/index.ts index 5e7ac5c6..239fe134 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -1,11 +1,6 @@ import { NotifyResponse, Waiter } from "../types"; import { Client as QStashClient } from "@upstash/qstash"; -import { - buildBulkActionQueryParameters, - makeGetWaitersRequest, - makeNotifyRequest, - normalizeCursor, -} from "./utils"; +import { buildBulkActionQueryParameters, makeGetWaitersRequest, makeNotifyRequest } from "./utils"; import { getWorkflowRunId } from "../utils"; import { triggerFirstInvocation } from "../workflow-requests"; import { WorkflowContext } from "../context"; @@ -314,18 +309,16 @@ export class Client { }): Promise { const { cursor, count, filter, ...legacyFilter } = params ?? {}; - return normalizeCursor( - await this.client.http.request({ - path: ["v2", "workflows", "events"], - query: { - groupBy: "workflowRunId", - ...legacyFilter, - cursor, - count, - ...filter, - }, - }) - ); + return await this.client.http.request({ + path: ["v2", "workflows", "events"], + query: { + groupBy: "workflowRunId", + ...legacyFilter, + cursor, + count, + ...filter, + }, + }); } get dlq() { diff --git a/src/client/types.ts b/src/client/types.ts index 1d06a94a..1496c7fd 100644 --- a/src/client/types.ts +++ b/src/client/types.ts @@ -334,7 +334,7 @@ export type WorkflowRunLog = { }; export type WorkflowRunLogs = { - cursor?: string; + cursor: string; runs: WorkflowRunLog[]; }; @@ -461,12 +461,3 @@ export type DLQResumeRestartResponse = { */ workflowCreatedAt: string; }; - -export type WorkflowBulkFilters = { - workflowRunId?: string; - workflowUrl?: string; - fromDate?: Date | number | string; - toDate?: Date | number | string; - label?: string; - all?: true; -}; diff --git a/src/client/utils.ts b/src/client/utils.ts index e3effc8b..6a6d2958 100644 --- a/src/client/utils.ts +++ b/src/client/utils.ts @@ -209,7 +209,13 @@ export function buildBulkActionQueryParameters( } // Filter branch - const filter = request.filter as Record; + const filter = request.filter as Record | undefined; + + if (!filter) { + throw new QstashError( + "No filter provided. Use { filter: { ... } } with at least one filter field, or { all: true }." + ); + } // When translateWorkflowUrl is set (cancel filters), translate // workflowUrl/workflowUrlStartingWith into the server's query params: @@ -218,6 +224,13 @@ export function buildBulkActionQueryParameters( if (options?.translateWorkflowUrl) { const { workflowUrlStartingWith, workflowUrl, ...rest } = filter; + if (workflowUrlStartingWith && workflowUrl) { + throw new QstashError( + "workflowUrl and workflowUrlStartingWith are mutually exclusive. " + + "Use workflowUrl for exact match or workflowUrlStartingWith for prefix match." + ); + } + const urlParams: Record = {}; if (workflowUrlStartingWith) { urlParams.workflowUrl = workflowUrlStartingWith as string; From 20808428e1f916e3163a9450553872ed0c4cdd51 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Wed, 25 Mar 2026 10:58:41 +0300 Subject: [PATCH 19/29] test: add cancellation tests with fromDate and toDate as Date objects --- src/client/dlq.test.ts | 78 +++++++++++++++++++++++++++++++++++ src/client/index.test.ts | 89 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+) diff --git a/src/client/dlq.test.ts b/src/client/dlq.test.ts index 01bcf588..b9a6d21c 100644 --- a/src/client/dlq.test.ts +++ b/src/client/dlq.test.ts @@ -123,6 +123,33 @@ describe("DLQ", () => { }); }); + test("should list DLQ messages with fromDate and toDate as Date objects", async () => { + const fromDateMs = 1640995200000; // 2022-01-01 + const toDateMs = 1672531200000; // 2023-01-01 + const filter = { + fromDate: new Date(fromDateMs), + toDate: new Date(toDateMs), + workflowUrl: "https://example.com", + }; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.list({ filter }); + expect(result.messages).toEqual([MOCK_DLQ_MESSAGES[0]]); + expect(result.cursor).toBeUndefined(); + }, + responseFields: { + status: 200, + body: { messages: [MOCK_DLQ_MESSAGES[0]], cursor: undefined }, + }, + receivesRequest: { + method: "GET", + url: `${MOCK_QSTASH_SERVER_URL}/v2/dlq?fromDate=${fromDateMs}&toDate=${toDateMs}&workflowUrl=${encodeURIComponent(filter.workflowUrl)}&source=workflow`, + token, + }, + }); + }); + test("should list DLQ messages with all parameters", async () => { const cursor = `cursor-${nanoid()}`; const count = 5; @@ -792,6 +819,57 @@ describe("DLQ", () => { }); }); + test("should delete DLQ messages with fromDate and toDate as Date objects", async () => { + const fromDateMs = 1640995200000; // 2022-01-01 + const toDateMs = 1672531200000; // 2023-01-01 + const deleted = 3; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.delete({ + filter: { fromDate: new Date(fromDateMs), toDate: new Date(toDateMs) }, + }); + expect(result.deleted).toBe(deleted); + }, + responseFields: { + status: 200, + body: { deleted }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?fromDate=${fromDateMs}&toDate=${toDateMs}&count=100`, + token, + }, + }); + }); + + test("should delete DLQ messages with mixed Date and number filters", async () => { + const fromDateMs = 1640995200000; // 2022-01-01 + const deleted = 1; + + await mockQStashServer({ + execute: async () => { + const result = await client.dlq.delete({ + filter: { + label: "my-label", + workflowUrl: "https://example.com/workflow", + fromDate: new Date(fromDateMs), + }, + }); + expect(result.deleted).toBe(deleted); + }, + responseFields: { + status: 200, + body: { deleted }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/dlq?label=my-label&workflowUrl=${encodeURIComponent("https://example.com/workflow")}&fromDate=${fromDateMs}&count=100`, + token, + }, + }); + }); + test("should delete DLQ messages with multiple filters", async () => { const deleted = 1; diff --git a/src/client/index.test.ts b/src/client/index.test.ts index 64d69e1d..0fd78e7a 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -307,6 +307,95 @@ describe("workflow client", () => { }, }); }); + + test("should cancel with fromDate and toDate as Date objects", async () => { + const fromDateMs = 1640995200000; // 2022-01-01 + const toDateMs = 1672531200000; // 2023-01-01 + + await mockQStashServer({ + execute: async () => { + await client.cancel({ + filter: { + fromDate: new Date(fromDateMs), + toDate: new Date(toDateMs), + }, + }); + }, + responseFields: { + status: 200, + body: { cancelled: 2 }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?fromDate=${fromDateMs}&toDate=${toDateMs}&count=100`, + token, + }, + }); + }); + + test("should cancel with only fromDate as Date object", async () => { + const fromDateMs = 1640995200000; // 2022-01-01 + + await mockQStashServer({ + execute: async () => { + await client.cancel({ filter: { fromDate: new Date(fromDateMs) } }); + }, + responseFields: { + status: 200, + body: { cancelled: 1 }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?fromDate=${fromDateMs}&count=100`, + token, + }, + }); + }); + + test("should cancel with only toDate as Date object", async () => { + const toDateMs = 1672531200000; // 2023-01-01 + + await mockQStashServer({ + execute: async () => { + await client.cancel({ filter: { toDate: new Date(toDateMs) } }); + }, + responseFields: { + status: 200, + body: { cancelled: 1 }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?toDate=${toDateMs}&count=100`, + token, + }, + }); + }); + + test("should cancel with mixed Date and number filters", async () => { + const fromDateMs = 1640995200000; // 2022-01-01 + const toDateMs = 1672531200000; // 2023-01-01 + + await mockQStashServer({ + execute: async () => { + await client.cancel({ + filter: { + label: "my-label", + fromDate: new Date(fromDateMs), + toDate: toDateMs, + }, + }); + }, + responseFields: { + status: 200, + body: { cancelled: 3 }, + }, + receivesRequest: { + method: "DELETE", + url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/runs?label=my-label&fromDate=${fromDateMs}&toDate=${toDateMs}&count=100`, + token, + }, + }); + }); }); describe("cancel - live", () => { From b8644a952943d65b80549e81a1a4ed07e5e33fea Mon Sep 17 00:00:00 2001 From: CahidArda Date: Wed, 25 Mar 2026 13:19:02 +0300 Subject: [PATCH 20/29] test: fix retry failure function response and add a live test for retry failure function --- src/client/dlq.test.ts | 38 ++++++++++++++++++++++++++++++++++---- src/client/dlq.ts | 6 ++---- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/client/dlq.test.ts b/src/client/dlq.test.ts index b9a6d21c..003ec7c9 100644 --- a/src/client/dlq.test.ts +++ b/src/client/dlq.test.ts @@ -920,13 +920,13 @@ describe("DLQ", () => { /** * tests skipped to avoid breaking live apps */ - describe.skip("DLQ - live", () => { + describe("DLQ - live", () => { const liveClient = new Client({ baseUrl: process.env.QSTASH_URL, token: process.env.QSTASH_TOKEN!, }); - test( + test.skip( "should resume all DLQ messages", async () => { // trigger workflows that will fail and end up in DLQ @@ -948,7 +948,7 @@ describe("DLQ", () => { { timeout: 60000 } ); - test( + test.skip( "should restart all DLQ messages", async () => { await liveClient.trigger({ url: "https://mock.httpstatus.io/500", retries: 0 }); @@ -968,7 +968,7 @@ describe("DLQ", () => { { timeout: 60000 } ); - test( + test.skip( "should delete all DLQ messages", async () => { await liveClient.trigger({ url: "https://mock.httpstatus.io/500", retries: 0 }); @@ -987,5 +987,35 @@ describe("DLQ", () => { }, { timeout: 60000 } ); + + test( + "should retry failure function of a DLQ message", + async () => { + // trigger a workflow with a failureUrl that also returns 500 + // so the failure callback itself fails and lands in DLQ + await liveClient.trigger({ + url: "https://mock.httpstatus.io/500", + failureUrl: "https://mock.httpstatus.io/500", + retries: 0, + }); + + // wait for the message (with failureCallbackInfo) to land in DLQ + let dlqId: string | undefined; + await eventually( + async () => { + const { messages } = await liveClient.dlq.list(); + const match = messages.find((m) => m.failureCallbackInfo); + expect(match).toBeDefined(); + dlqId = match!.dlqId; + }, + { timeout: 30000, interval: 2000 } + ); + + const result = await liveClient.dlq.retryFailureFunction({ dlqId: dlqId! }); + expect(result.workflowRunId).toBeDefined(); + expect(result.workflowCreatedAt).toBeDefined(); + }, + { timeout: 60000 } + ); }); }); diff --git a/src/client/dlq.ts b/src/client/dlq.ts index d262d0e6..c605d66b 100644 --- a/src/client/dlq.ts +++ b/src/client/dlq.ts @@ -285,14 +285,12 @@ export class DLQ { * @returns response with workflow run information */ async retryFailureFunction({ dlqId }: Pick, "dlqId">) { - const { workflowRuns } = await this.client.http.request<{ - workflowRuns: DLQResumeRestartResponse[]; - }>({ + const response = await this.client.http.request({ path: ["v2", "workflows", "dlq", "callback", dlqId], method: "POST", }); - return workflowRuns[0]; + return response; } /** From 7092e5652dca6f0ca900fbf88206dcd32e3824b4 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Wed, 25 Mar 2026 15:17:15 +0300 Subject: [PATCH 21/29] fix: update deprecation message and replace QstashError with WorkflowError in utils --- src/client/index.ts | 2 +- src/client/utils.ts | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/client/index.ts b/src/client/index.ts index 239fe134..26ce44fc 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -47,7 +47,7 @@ export class Client { public async cancel( request: string | string[] | WorkflowRunCancelFilters ): Promise<{ cancelled: number }>; - /** @deprecated Use `cancel(id)`, `cancel([id1, id2])`, `cancel({ filter: { workflowUrl } })` or `cancel({ all: true })` instead. */ + /** @deprecated Use `cancel(id)`, `cancel([id1, id2])`, `cancel({ filter: { workflowUrlStartingWith } })` instead. */ public async cancel(request: { ids?: string | string[]; urlStartingWith?: string; diff --git a/src/client/utils.ts b/src/client/utils.ts index 6a6d2958..e58bc511 100644 --- a/src/client/utils.ts +++ b/src/client/utils.ts @@ -1,6 +1,6 @@ -import { Client, QstashError } from "@upstash/qstash"; +import { Client } from "@upstash/qstash"; import { NotifyResponse, RawStep, Waiter } from "../types"; -import { isInstanceOf } from "../error"; +import { isInstanceOf, WorkflowError } from "../error"; import { DispatchDebug } from "../middleware/types"; import { WorkflowDLQActionFilters, WorkflowRunCancelFilters } from "./filter-types"; @@ -124,7 +124,7 @@ export const getSteps = async ( return { steps: filteredSteps, workflowRunEnded: false }; } } catch (error) { - if (isInstanceOf(error, QstashError) && error.status === 404) { + if (isInstanceOf(error, WorkflowError) && error.status === 404) { await dispatchDebug?.("onWarning", { warning: "Couldn't fetch workflow run steps. This can happen if the workflow run succesfully ends before some callback is executed.", @@ -177,7 +177,7 @@ const DEFAULT_BULK_COUNT = 100; * // => { all: true, count: 100 } * ``` * - * @throws {QstashError} If an empty `dlqIds` or `workflowRunIds` array is provided + * @throws {WorkflowError} If an empty `dlqIds` or `workflowRunIds` array is provided */ export function buildBulkActionQueryParameters( request: WorkflowDLQActionFilters | WorkflowRunCancelFilters, @@ -192,7 +192,7 @@ export function buildBulkActionQueryParameters( if ("dlqIds" in request) { const ids = request.dlqIds; if (Array.isArray(ids) && ids.length === 0) { - throw new QstashError( + throw new WorkflowError( "Empty dlqIds array provided. If you intend to target all DLQ messages, use { all: true } explicitly." ); } @@ -201,7 +201,7 @@ export function buildBulkActionQueryParameters( if ("workflowRunIds" in request && request.workflowRunIds) { if (request.workflowRunIds.length === 0) { - throw new QstashError( + throw new WorkflowError( "Empty workflowRunIds array provided. If you intend to target all workflow runs, use { all: true } explicitly." ); } @@ -212,7 +212,7 @@ export function buildBulkActionQueryParameters( const filter = request.filter as Record | undefined; if (!filter) { - throw new QstashError( + throw new WorkflowError( "No filter provided. Use { filter: { ... } } with at least one filter field, or { all: true }." ); } @@ -225,7 +225,7 @@ export function buildBulkActionQueryParameters( const { workflowUrlStartingWith, workflowUrl, ...rest } = filter; if (workflowUrlStartingWith && workflowUrl) { - throw new QstashError( + throw new WorkflowError( "workflowUrl and workflowUrlStartingWith are mutually exclusive. " + "Use workflowUrl for exact match or workflowUrlStartingWith for prefix match." ); From a399699e5271af9df1d1ab9ea4a525bf3e518301 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Wed, 25 Mar 2026 16:01:11 +0300 Subject: [PATCH 22/29] Revert "fix: update deprecation message and replace QstashError with WorkflowError in utils" This reverts commit 7092e5652dca6f0ca900fbf88206dcd32e3824b4. --- src/client/index.ts | 2 +- src/client/utils.ts | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/client/index.ts b/src/client/index.ts index 26ce44fc..239fe134 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -47,7 +47,7 @@ export class Client { public async cancel( request: string | string[] | WorkflowRunCancelFilters ): Promise<{ cancelled: number }>; - /** @deprecated Use `cancel(id)`, `cancel([id1, id2])`, `cancel({ filter: { workflowUrlStartingWith } })` instead. */ + /** @deprecated Use `cancel(id)`, `cancel([id1, id2])`, `cancel({ filter: { workflowUrl } })` or `cancel({ all: true })` instead. */ public async cancel(request: { ids?: string | string[]; urlStartingWith?: string; diff --git a/src/client/utils.ts b/src/client/utils.ts index e58bc511..6a6d2958 100644 --- a/src/client/utils.ts +++ b/src/client/utils.ts @@ -1,6 +1,6 @@ -import { Client } from "@upstash/qstash"; +import { Client, QstashError } from "@upstash/qstash"; import { NotifyResponse, RawStep, Waiter } from "../types"; -import { isInstanceOf, WorkflowError } from "../error"; +import { isInstanceOf } from "../error"; import { DispatchDebug } from "../middleware/types"; import { WorkflowDLQActionFilters, WorkflowRunCancelFilters } from "./filter-types"; @@ -124,7 +124,7 @@ export const getSteps = async ( return { steps: filteredSteps, workflowRunEnded: false }; } } catch (error) { - if (isInstanceOf(error, WorkflowError) && error.status === 404) { + if (isInstanceOf(error, QstashError) && error.status === 404) { await dispatchDebug?.("onWarning", { warning: "Couldn't fetch workflow run steps. This can happen if the workflow run succesfully ends before some callback is executed.", @@ -177,7 +177,7 @@ const DEFAULT_BULK_COUNT = 100; * // => { all: true, count: 100 } * ``` * - * @throws {WorkflowError} If an empty `dlqIds` or `workflowRunIds` array is provided + * @throws {QstashError} If an empty `dlqIds` or `workflowRunIds` array is provided */ export function buildBulkActionQueryParameters( request: WorkflowDLQActionFilters | WorkflowRunCancelFilters, @@ -192,7 +192,7 @@ export function buildBulkActionQueryParameters( if ("dlqIds" in request) { const ids = request.dlqIds; if (Array.isArray(ids) && ids.length === 0) { - throw new WorkflowError( + throw new QstashError( "Empty dlqIds array provided. If you intend to target all DLQ messages, use { all: true } explicitly." ); } @@ -201,7 +201,7 @@ export function buildBulkActionQueryParameters( if ("workflowRunIds" in request && request.workflowRunIds) { if (request.workflowRunIds.length === 0) { - throw new WorkflowError( + throw new QstashError( "Empty workflowRunIds array provided. If you intend to target all workflow runs, use { all: true } explicitly." ); } @@ -212,7 +212,7 @@ export function buildBulkActionQueryParameters( const filter = request.filter as Record | undefined; if (!filter) { - throw new WorkflowError( + throw new QstashError( "No filter provided. Use { filter: { ... } } with at least one filter field, or { all: true }." ); } @@ -225,7 +225,7 @@ export function buildBulkActionQueryParameters( const { workflowUrlStartingWith, workflowUrl, ...rest } = filter; if (workflowUrlStartingWith && workflowUrl) { - throw new WorkflowError( + throw new QstashError( "workflowUrl and workflowUrlStartingWith are mutually exclusive. " + "Use workflowUrl for exact match or workflowUrlStartingWith for prefix match." ); From 4d96328808d192689c58b9b51ec4d459d3521659 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Mon, 30 Mar 2026 11:04:01 +0300 Subject: [PATCH 23/29] fix: tests and deprecated warning --- src/client/dlq.test.ts | 2 +- src/client/index.test.ts | 11 +++++------ src/client/index.ts | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/client/dlq.test.ts b/src/client/dlq.test.ts index 003ec7c9..966d5fa1 100644 --- a/src/client/dlq.test.ts +++ b/src/client/dlq.test.ts @@ -657,7 +657,7 @@ describe("DLQ", () => { }, responseFields: { status: 200, - body: { cursor: "", workflowRuns: [{ workflowRunId, workflowCreatedAt }] }, + body: { workflowRunId, workflowCreatedAt }, }, receivesRequest: { method: "POST", diff --git a/src/client/index.test.ts b/src/client/index.test.ts index 0fd78e7a..328b4ca3 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -510,9 +510,11 @@ describe("workflow client", () => { async () => { await liveClient.trigger({ url: "http://requestcatcher.com/exact-match-test", + delay: "1d", }); await liveClient.trigger({ url: "http://requestcatcher.com/exact-match-test/sub-path", + delay: "1d", }); // exact match should only cancel the exact URL @@ -949,12 +951,9 @@ describe("workflow client", () => { await mockQStashServer({ execute: async () => { await client.logs({ - count, - cursor, - state, - workflowCreatedAt, - workflowRunId, - workflowUrl, + filter: { + + } }); }, responseFields: { diff --git a/src/client/index.ts b/src/client/index.ts index 239fe134..26ce44fc 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -47,7 +47,7 @@ export class Client { public async cancel( request: string | string[] | WorkflowRunCancelFilters ): Promise<{ cancelled: number }>; - /** @deprecated Use `cancel(id)`, `cancel([id1, id2])`, `cancel({ filter: { workflowUrl } })` or `cancel({ all: true })` instead. */ + /** @deprecated Use `cancel(id)`, `cancel([id1, id2])`, `cancel({ filter: { workflowUrlStartingWith } })` instead. */ public async cancel(request: { ids?: string | string[]; urlStartingWith?: string; From 6ab76c31e1d9d00a00326f598d1644a15199fcbd Mon Sep 17 00:00:00 2001 From: CahidArda Date: Mon, 30 Mar 2026 11:04:12 +0300 Subject: [PATCH 24/29] fix: fmt --- src/client/index.test.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/client/index.test.ts b/src/client/index.test.ts index 328b4ca3..d81eec7a 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -951,9 +951,7 @@ describe("workflow client", () => { await mockQStashServer({ execute: async () => { await client.logs({ - filter: { - - } + filter: {}, }); }, responseFields: { From 543124cf9db715fd2d393f60d35e58be86a93c56 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Mon, 30 Mar 2026 11:47:48 +0300 Subject: [PATCH 25/29] fix: update deprecation message for workflowCreatedAt and add workflowCreatedAt to WorkflowLogsListFilters --- src/client/filter-types.ts | 2 +- src/client/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/filter-types.ts b/src/client/filter-types.ts index 720b7ae1..9a977af0 100644 --- a/src/client/filter-types.ts +++ b/src/client/filter-types.ts @@ -122,5 +122,5 @@ export type WorkflowRunCancelFilters = } & WorkflowCancelCount); export type WorkflowLogsListFilters = UniversalFilterFields & - Pick & + Pick & WorkflowLogsFilterFields; diff --git a/src/client/index.ts b/src/client/index.ts index 26ce44fc..a17e31fa 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -304,7 +304,7 @@ export class Client { workflowUrl?: string; /** @deprecated Use `filter.label` instead. */ label?: string; - /** @deprecated No longer supported. */ + /** @deprecated Use `filter.workflowCreatedAt` instead. */ workflowCreatedAt?: number; }): Promise { const { cursor, count, filter, ...legacyFilter } = params ?? {}; From 419ec7daec096941db768f8e52b8216cc6fa9c1f Mon Sep 17 00:00:00 2001 From: CahidArda Date: Mon, 30 Mar 2026 11:51:10 +0300 Subject: [PATCH 26/29] fix: test --- src/client/index.test.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/client/index.test.ts b/src/client/index.test.ts index d81eec7a..a5c6f977 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -951,7 +951,14 @@ describe("workflow client", () => { await mockQStashServer({ execute: async () => { await client.logs({ - filter: {}, + filter: { + state, + workflowCreatedAt, + workflowRunId, + workflowUrl, + }, + count, + cursor, }); }, responseFields: { @@ -962,12 +969,12 @@ describe("workflow client", () => { method: "GET", url: `${MOCK_QSTASH_SERVER_URL}/v2/workflows/events?groupBy=workflowRunId` + + `&cursor=${cursor}` + + `&count=${count}` + `&state=${state}` + `&workflowCreatedAt=${workflowCreatedAt}` + `&workflowRunId=${workflowRunId}` + - `&workflowUrl=${encodeURIComponent(workflowUrl)}` + - `&cursor=${cursor}` + - `&count=${count}`, + `&workflowUrl=${encodeURIComponent(workflowUrl)}`, token, body: "", }, From a6e9e5c5c52bc137072037e38fcf2865d1c7766b Mon Sep 17 00:00:00 2001 From: CahidArda Date: Mon, 30 Mar 2026 12:10:37 +0300 Subject: [PATCH 27/29] fix: update DLQ test to filter messages by workflowRunId and check callback state --- src/client/dlq.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/dlq.test.ts b/src/client/dlq.test.ts index 966d5fa1..d087c74f 100644 --- a/src/client/dlq.test.ts +++ b/src/client/dlq.test.ts @@ -993,7 +993,7 @@ describe("DLQ", () => { async () => { // trigger a workflow with a failureUrl that also returns 500 // so the failure callback itself fails and lands in DLQ - await liveClient.trigger({ + const { workflowRunId } = await liveClient.trigger({ url: "https://mock.httpstatus.io/500", failureUrl: "https://mock.httpstatus.io/500", retries: 0, @@ -1003,8 +1003,8 @@ describe("DLQ", () => { let dlqId: string | undefined; await eventually( async () => { - const { messages } = await liveClient.dlq.list(); - const match = messages.find((m) => m.failureCallbackInfo); + const { messages } = await liveClient.dlq.list({ filter: { workflowRunId } }); + const match = messages.find((m) => m.failureCallbackInfo?.state === "CALLBACK_FAIL"); expect(match).toBeDefined(); dlqId = match!.dlqId; }, From fa598ae6fabee152b48e984ab543c22ad302c31c Mon Sep 17 00:00:00 2001 From: CahidArda Date: Mon, 30 Mar 2026 13:00:30 +0300 Subject: [PATCH 28/29] fix: correct expected call count in quota error workflow --- .../ci/app/test-routes/quota-error/workflows/[...]/route.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/ci/app/test-routes/quota-error/workflows/[...]/route.ts b/examples/ci/app/test-routes/quota-error/workflows/[...]/route.ts index 66de4ce2..cef23a1d 100644 --- a/examples/ci/app/test-routes/quota-error/workflows/[...]/route.ts +++ b/examples/ci/app/test-routes/quota-error/workflows/[...]/route.ts @@ -182,7 +182,7 @@ export const { POST, GET } = testServe( } } ), { - expectedCallCount: 16, + expectedCallCount: 15, expectedResult, payload, headers: { From 459782736792fc4ebb5ff6e2646bdfbfd2c61dc4 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Mon, 30 Mar 2026 16:03:02 +0300 Subject: [PATCH 29/29] fix: update lock file --- bun.lock | 780 +++++++++++++++++++++++++++---------------------------- 1 file changed, 379 insertions(+), 401 deletions(-) diff --git a/bun.lock b/bun.lock index 5a20168b..9bc64639 100644 --- a/bun.lock +++ b/bun.lock @@ -1,6 +1,6 @@ { "lockfileVersion": 1, - "configVersion": 0, + "configVersion": 1, "workspaces": { "": { "name": "@upstash/workflow", @@ -35,7 +35,7 @@ }, }, "packages": { - "@astrojs/compiler": ["@astrojs/compiler@2.13.0", "", {}, "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw=="], + "@astrojs/compiler": ["@astrojs/compiler@2.13.1", "", {}, "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="], "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.4.1", "", {}, "sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g=="], @@ -47,33 +47,23 @@ "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], - "@babel/compat-data": ["@babel/compat-data@7.28.5", "", {}, "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA=="], + "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="], - "@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], + "@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="], - "@babel/generator": ["@babel/generator@7.28.5", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ=="], + "@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="], "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], - - "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ=="], + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], - "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="], - - "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], - - "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw=="], - - "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="], - "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="], - "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.27.1", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA=="], - - "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="], "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], @@ -81,29 +71,23 @@ "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - "@babel/helpers": ["@babel/helpers@7.28.4", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.4" } }, "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w=="], - - "@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="], - - "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w=="], + "@babel/helpers": ["@babel/helpers@7.29.2", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.29.0" } }, "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw=="], - "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ=="], + "@babel/parser": ["@babel/parser@7.29.2", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA=="], - "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="], + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="], - "@babel/plugin-transform-react-jsx": ["@babel/plugin-transform-react-jsx@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/types": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw=="], + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A=="], - "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA=="], + "@babel/plugin-transform-react-jsx": ["@babel/plugin-transform-react-jsx@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-module-imports": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/plugin-syntax-jsx": "^7.28.6", "@babel/types": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow=="], - "@babel/preset-typescript": ["@babel/preset-typescript@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g=="], + "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], - "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], + "@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], - "@babel/traverse": ["@babel/traverse@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "debug": "^4.3.1" } }, "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="], + "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], - "@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], - - "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.0", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA=="], + "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.2", "", {}, "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ=="], "@commitlint/cli": ["@commitlint/cli@19.8.1", "", { "dependencies": { "@commitlint/format": "^19.8.1", "@commitlint/lint": "^19.8.1", "@commitlint/load": "^19.8.1", "@commitlint/read": "^19.8.1", "@commitlint/types": "^19.8.1", "tinyexec": "^1.0.0", "yargs": "^17.0.0" }, "bin": { "commitlint": "./cli.js" } }, "sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA=="], @@ -143,7 +127,7 @@ "@deno/shim-deno-test": ["@deno/shim-deno-test@0.5.0", "", {}, "sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w=="], - "@emnapi/runtime": ["@emnapi/runtime@1.7.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q=="], + "@emnapi/runtime": ["@emnapi/runtime@1.9.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA=="], "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], @@ -179,15 +163,15 @@ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.4", "", { "os": "none", "cpu": "arm64" }, "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q=="], "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow=="], "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.4", "", { "os": "none", "cpu": "arm64" }, "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg=="], "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], @@ -197,19 +181,19 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="], + "@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/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/js": ["@eslint/js@9.39.1", "", {}, "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], @@ -261,7 +245,7 @@ "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], - "@ioredis/commands": ["@ioredis/commands@1.4.0", "", {}, "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ=="], + "@ioredis/commands": ["@ioredis/commands@1.5.1", "", {}, "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw=="], "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], @@ -279,9 +263,9 @@ "@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=="], - "@mapbox/node-pre-gyp": ["@mapbox/node-pre-gyp@2.0.0", "", { "dependencies": { "consola": "^3.2.3", "detect-libc": "^2.0.0", "https-proxy-agent": "^7.0.5", "node-fetch": "^2.6.7", "nopt": "^8.0.0", "semver": "^7.5.3", "tar": "^7.4.0" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" } }, "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg=="], + "@mapbox/node-pre-gyp": ["@mapbox/node-pre-gyp@2.0.3", "", { "dependencies": { "consola": "^3.2.3", "detect-libc": "^2.0.0", "https-proxy-agent": "^7.0.5", "node-fetch": "^2.6.7", "nopt": "^8.0.0", "semver": "^7.5.3", "tar": "^7.4.0" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" } }, "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg=="], - "@next/env": ["@next/env@14.2.33", "", {}, "sha512-CgVHNZ1fRIlxkLhIX22flAZI/HmpDaZ8vwyJ/B0SDPTBuLZ1PJ+DWMjCHhqnExfmSQzA/PbZi8OAc7PAq2w9IA=="], + "@next/env": ["@next/env@14.2.35", "", {}, "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ=="], "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@14.2.33", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA=="], @@ -307,53 +291,51 @@ "@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=="], - "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], - "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="], - "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], + "@parcel/watcher": ["@parcel/watcher@2.5.6", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.3" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.6", "@parcel/watcher-darwin-arm64": "2.5.6", "@parcel/watcher-darwin-x64": "2.5.6", "@parcel/watcher-freebsd-x64": "2.5.6", "@parcel/watcher-linux-arm-glibc": "2.5.6", "@parcel/watcher-linux-arm-musl": "2.5.6", "@parcel/watcher-linux-arm64-glibc": "2.5.6", "@parcel/watcher-linux-arm64-musl": "2.5.6", "@parcel/watcher-linux-x64-glibc": "2.5.6", "@parcel/watcher-linux-x64-musl": "2.5.6", "@parcel/watcher-win32-arm64": "2.5.6", "@parcel/watcher-win32-ia32": "2.5.6", "@parcel/watcher-win32-x64": "2.5.6" } }, "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ=="], - "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="], + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.6", "", { "os": "android", "cpu": "arm64" }, "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A=="], - "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw=="], + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA=="], - "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg=="], + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg=="], - "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ=="], + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.6", "", { "os": "freebsd", "cpu": "x64" }, "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng=="], - "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA=="], + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.6", "", { "os": "linux", "cpu": "arm" }, "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ=="], - "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q=="], + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.6", "", { "os": "linux", "cpu": "arm" }, "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg=="], - "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w=="], + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA=="], - "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg=="], + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA=="], - "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A=="], + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ=="], - "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg=="], + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg=="], "@parcel/watcher-wasm": ["@parcel/watcher-wasm@2.3.0", "", { "dependencies": { "is-glob": "^4.0.3", "micromatch": "^4.0.5", "napi-wasm": "^1.1.0" } }, "sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA=="], - "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw=="], + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q=="], - "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ=="], + "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.6", "", { "os": "win32", "cpu": "ia32" }, "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g=="], - "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="], + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.6", "", { "os": "win32", "cpu": "x64" }, "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw=="], "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], - "@poppinss/colors": ["@poppinss/colors@4.1.5", "", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw=="], + "@poppinss/colors": ["@poppinss/colors@4.1.6", "", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg=="], - "@poppinss/dumper": ["@poppinss/dumper@0.6.5", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@sindresorhus/is": "^7.0.2", "supports-color": "^10.0.0" } }, "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw=="], + "@poppinss/dumper": ["@poppinss/dumper@0.7.0", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@sindresorhus/is": "^7.0.2", "supports-color": "^10.0.0" } }, "sha512-0UTYalzk2t6S4rA2uHOz5bSSW2CHdv4vggJI6Alg90yvl0UgXs6XSXpH96OH+bRkX4J/06djv29pqXJ0lq5Kag=="], - "@poppinss/exception": ["@poppinss/exception@1.2.2", "", {}, "sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg=="], + "@poppinss/exception": ["@poppinss/exception@1.2.3", "", {}, "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw=="], - "@rollup/plugin-alias": ["@rollup/plugin-alias@5.1.1", "", { "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ=="], + "@rollup/plugin-alias": ["@rollup/plugin-alias@6.0.0", "", { "peerDependencies": { "rollup": ">=4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g=="], - "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@28.0.9", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA=="], + "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@29.0.2", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg=="], "@rollup/plugin-inject": ["@rollup/plugin-inject@5.0.5", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "estree-walker": "^2.0.2", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg=="], @@ -363,53 +345,59 @@ "@rollup/plugin-replace": ["@rollup/plugin-replace@6.0.3", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA=="], - "@rollup/plugin-terser": ["@rollup/plugin-terser@0.4.4", "", { "dependencies": { "serialize-javascript": "^6.0.1", "smob": "^1.0.0", "terser": "^5.17.4" }, "peerDependencies": { "rollup": "^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A=="], + "@rollup/plugin-terser": ["@rollup/plugin-terser@1.0.0", "", { "dependencies": { "serialize-javascript": "^7.0.3", "smob": "^1.0.0", "terser": "^5.17.4" }, "peerDependencies": { "rollup": "^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ=="], "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.52.5", "", { "os": "android", "cpu": "arm" }, "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.1", "", { "os": "android", "cpu": "arm" }, "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.60.1", "", { "os": "android", "cpu": "arm64" }, "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.52.5", "", { "os": "android", "cpu": "arm64" }, "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.60.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.52.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.60.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.52.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.60.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.52.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.60.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.52.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.60.1", "", { "os": "linux", "cpu": "arm" }, "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.52.5", "", { "os": "linux", "cpu": "arm" }, "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.60.1", "", { "os": "linux", "cpu": "arm" }, "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.52.5", "", { "os": "linux", "cpu": "arm" }, "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.60.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.52.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.60.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.52.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q=="], + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ=="], - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.52.5", "", { "os": "linux", "cpu": "none" }, "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA=="], + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw=="], - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.52.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw=="], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.60.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.52.5", "", { "os": "linux", "cpu": "none" }, "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw=="], + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.60.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.52.5", "", { "os": "linux", "cpu": "none" }, "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.52.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.52.5", "", { "os": "linux", "cpu": "x64" }, "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.60.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.52.5", "", { "os": "linux", "cpu": "x64" }, "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.60.1", "", { "os": "linux", "cpu": "x64" }, "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg=="], - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.52.5", "", { "os": "none", "cpu": "arm64" }, "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.60.1", "", { "os": "linux", "cpu": "x64" }, "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.52.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w=="], + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.60.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.52.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg=="], + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.60.1", "", { "os": "none", "cpu": "arm64" }, "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA=="], - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.52.5", "", { "os": "win32", "cpu": "x64" }, "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.60.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.52.5", "", { "os": "win32", "cpu": "x64" }, "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.60.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.60.1", "", { "os": "win32", "cpu": "x64" }, "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.60.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ=="], "@shikijs/core": ["@shikijs/core@1.29.2", "", { "dependencies": { "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ=="], @@ -425,23 +413,21 @@ "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], - "@sindresorhus/is": ["@sindresorhus/is@7.1.1", "", {}, "sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ=="], + "@sindresorhus/is": ["@sindresorhus/is@7.2.0", "", {}, "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw=="], "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], - "@solidjs/start": ["@solidjs/start@1.2.0", "", { "dependencies": { "@tanstack/server-functions-plugin": "1.121.21", "@vinxi/plugin-directives": "^0.5.0", "@vinxi/server-components": "^0.5.0", "cookie-es": "^2.0.0", "defu": "^6.1.2", "error-stack-parser": "^2.1.4", "html-to-image": "^1.11.11", "radix3": "^1.1.0", "seroval": "^1.0.2", "seroval-plugins": "^1.0.2", "shiki": "^1.26.1", "source-map-js": "^1.0.2", "terracotta": "^1.0.4", "tinyglobby": "^0.2.2", "vite-plugin-solid": "^2.11.1" }, "peerDependencies": { "vinxi": "^0.5.7" } }, "sha512-SRv1g3R+4sxZnxCBPK1IedtLKsPhPJ7W/Yv4xEHjM4jJGPWi3ed35/yd0D5zhRK0C7zJIkZKbhnR/S3g8JUD5w=="], - - "@speed-highlight/core": ["@speed-highlight/core@1.2.12", "", {}, "sha512-uilwrK0Ygyri5dToHYdZSjcvpS2ZwX0w5aSt3GCEN9hrjxWCoeV4Z2DTXuxjwbntaLQIEEAlCeNQss5SoHvAEA=="], + "@solidjs/start": ["@solidjs/start@1.3.2", "", { "dependencies": { "@tanstack/server-functions-plugin": "1.121.21", "@vinxi/plugin-directives": "^0.5.0", "@vinxi/server-components": "^0.5.0", "cookie-es": "^2.0.0", "defu": "^6.1.2", "error-stack-parser": "^2.1.4", "html-to-image": "^1.11.11", "radix3": "^1.1.0", "seroval": "^1.5.0", "seroval-plugins": "^1.5.0", "shiki": "^1.26.1", "source-map-js": "^1.0.2", "terracotta": "^1.0.4", "tinyglobby": "^0.2.2", "vite-plugin-solid": "^2.11.10" }, "peerDependencies": { "vinxi": "^0.5.7" } }, "sha512-tasDl3utVbtP0rr4InB3ntBIFV2upvEiFrOOCkRrAA3yBfjx9elpxnc94sJQXo65PNYdAAAkPIC6h93vLrtwHg=="], - "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], + "@speed-highlight/core": ["@speed-highlight/core@1.2.15", "", {}, "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw=="], - "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.6", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ=="], + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - "@sveltejs/kit": ["@sveltejs/kit@2.48.4", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.3.2", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["@opentelemetry/api"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-TGFX1pZUt9qqY20Cv5NyYvy0iLWHf2jXi8s+eCGsig7jQMdwZWKUFMR6TbvFNhfDSUpc1sH/Y5EHv20g3HHA3g=="], + "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.9", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA=="], - "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@6.2.1", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", "debug": "^4.4.1", "deepmerge": "^4.3.1", "magic-string": "^0.30.17", "vitefu": "^1.1.1" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ=="], + "@sveltejs/kit": ["@sveltejs/kit@2.55.0", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.6.4", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "set-cookie-parser": "^3.0.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.3.3", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" }, "optionalPeers": ["@opentelemetry/api", "typescript"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-MdFRjevVxmAknf2NbaUkDF16jSIzXMWd4Nfah0Qp8TtQVoSp3bV4jKt8mX7z7qTUTWvgSaxtR0EG5WJf53gcuA=="], - "@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@5.0.1", "", { "dependencies": { "debug": "^4.4.1" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA=="], + "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@7.0.0", "", { "dependencies": { "deepmerge": "^4.3.1", "magic-string": "^0.30.21", "obug": "^2.1.0", "vitefu": "^1.1.2" }, "peerDependencies": { "svelte": "^5.46.4", "vite": "^8.0.0-beta.7 || ^8.0.0" } }, "sha512-ILXmxC7HAsnkK2eslgPetrqqW1BKSL7LktsFgqzNj83MaivMGZzluWq32m25j2mDOjmSKX7GGWahePhuEs7P/g=="], "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], @@ -449,7 +435,7 @@ "@tanstack/directive-functions-plugin": ["@tanstack/directive-functions-plugin@1.121.21", "", { "dependencies": { "@babel/code-frame": "7.26.2", "@babel/core": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-utils": "^1.121.21", "babel-dead-code-elimination": "^1.0.10", "tiny-invariant": "^1.3.3" }, "peerDependencies": { "vite": ">=6.0.0" } }, "sha512-B9z/HbF7gJBaRHieyX7f2uQ4LpLLAVAEutBZipH6w+CYD6RHRJvSVPzECGHF7icFhNWTiJQL2QR6K07s59yzEw=="], - "@tanstack/router-utils": ["@tanstack/router-utils@1.133.19", "", { "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", "@babel/parser": "^7.27.5", "@babel/preset-typescript": "^7.27.1", "ansis": "^4.1.0", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-WEp5D2gPxvlLDRXwD/fV7RXjYtqaqJNXKB/L6OyZEbT+9BG/Ib2d7oG9GSUZNNMGPGYAlhBUOi3xutySsk6rxA=="], + "@tanstack/router-utils": ["@tanstack/router-utils@1.161.6", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/generator": "^7.28.5", "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "ansis": "^4.1.0", "babel-dead-code-elimination": "^1.0.12", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-nRcYw+w2OEgK6VfjirYvGyPLOK+tZQz1jkYcmH5AjMamQ9PycnlxZF2aEZtPpNoUsaceX2bHptn6Ub5hGXqNvw=="], "@tanstack/server-functions-plugin": ["@tanstack/server-functions-plugin@1.121.21", "", { "dependencies": { "@babel/code-frame": "7.26.2", "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/directive-functions-plugin": "1.121.21", "babel-dead-code-elimination": "^1.0.9", "tiny-invariant": "^1.3.3" } }, "sha512-a05fzK+jBGacsSAc1vE8an7lpBh4H0PyIEcivtEyHLomgSeElAJxm9E2It/0nYRZ5Lh23m0okbhzJNaYWZpAOg=="], @@ -465,7 +451,7 @@ "@types/braces": ["@types/braces@3.0.5", "", {}, "sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w=="], - "@types/bun": ["@types/bun@1.3.1", "", { "dependencies": { "bun-types": "1.3.1" } }, "sha512-4jNMk2/K9YJtfqwoAa28c8wK+T7nvJFOjxI4h/7sORWcypRNxBpr+TPNaCfVWq70tLCJsqoFwcf0oI0JU/fvMQ=="], + "@types/bun": ["@types/bun@1.3.11", "", { "dependencies": { "bun-types": "1.3.11" } }, "sha512-5vPne5QvtpjGpsGYXiFyycfpDF2ECyPcTSsFBMa0fraoxiQyMJ3SmuQIGhzPg2WJuWxVBoxWJ2kClYTcw/4fAg=="], "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], @@ -473,13 +459,13 @@ "@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="], - "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], + "@types/debug": ["@types/debug@4.1.13", "", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="], "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], "@types/express": ["@types/express@5.0.6", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", "@types/serve-static": "^2" } }, "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA=="], - "@types/express-serve-static-core": ["@types/express-serve-static-core@5.1.0", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA=="], + "@types/express-serve-static-core": ["@types/express-serve-static-core@5.1.1", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A=="], "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], @@ -491,55 +477,53 @@ "@types/micromatch": ["@types/micromatch@4.0.10", "", { "dependencies": { "@types/braces": "*" } }, "sha512-5jOhFDElqr4DKTrTEbnW8DZ4Hz5LRUEmyrGpCMrD/NphYv3nUnaF08xmSLx1rGGnyEs/kFnhiw6dCgcDqMr5PQ=="], - "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="], - "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="], - "@types/node": ["@types/node@24.10.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A=="], + "@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="], "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="], - "@types/qs": ["@types/qs@6.14.0", "", {}, "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="], + "@types/qs": ["@types/qs@6.15.0", "", {}, "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow=="], "@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="], - "@types/react": ["@types/react@19.2.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="], - "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], - "@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="], + "@types/send": ["@types/send@1.2.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ=="], "@types/serve-static": ["@types/serve-static@2.2.0", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*" } }, "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ=="], + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.46.3", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/type-utils": "8.46.3", "@typescript-eslint/utils": "8.46.3", "@typescript-eslint/visitor-keys": "8.46.3", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.46.3", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.57.2", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.57.2", "@typescript-eslint/type-utils": "8.57.2", "@typescript-eslint/utils": "8.57.2", "@typescript-eslint/visitor-keys": "8.57.2", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.57.2", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.46.3", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/types": "8.46.3", "@typescript-eslint/typescript-estree": "8.46.3", "@typescript-eslint/visitor-keys": "8.46.3", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.57.2", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.57.2", "@typescript-eslint/types": "8.57.2", "@typescript-eslint/typescript-estree": "8.57.2", "@typescript-eslint/visitor-keys": "8.57.2", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.46.3", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.46.3", "@typescript-eslint/types": "^8.46.3", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.57.2", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.57.2", "@typescript-eslint/types": "^8.57.2", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.46.3", "", { "dependencies": { "@typescript-eslint/types": "8.46.3", "@typescript-eslint/visitor-keys": "8.46.3" } }, "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.57.2", "", { "dependencies": { "@typescript-eslint/types": "8.57.2", "@typescript-eslint/visitor-keys": "8.57.2" } }, "sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.46.3", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.57.2", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.46.3", "", { "dependencies": { "@typescript-eslint/types": "8.46.3", "@typescript-eslint/typescript-estree": "8.46.3", "@typescript-eslint/utils": "8.46.3", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.57.2", "", { "dependencies": { "@typescript-eslint/types": "8.57.2", "@typescript-eslint/typescript-estree": "8.57.2", "@typescript-eslint/utils": "8.57.2", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.46.3", "", {}, "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.57.2", "", {}, "sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.46.3", "", { "dependencies": { "@typescript-eslint/project-service": "8.46.3", "@typescript-eslint/tsconfig-utils": "8.46.3", "@typescript-eslint/types": "8.46.3", "@typescript-eslint/visitor-keys": "8.46.3", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.57.2", "", { "dependencies": { "@typescript-eslint/project-service": "8.57.2", "@typescript-eslint/tsconfig-utils": "8.57.2", "@typescript-eslint/types": "8.57.2", "@typescript-eslint/visitor-keys": "8.57.2", "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-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.46.3", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/types": "8.46.3", "@typescript-eslint/typescript-estree": "8.46.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.57.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.57.2", "@typescript-eslint/types": "8.57.2", "@typescript-eslint/typescript-estree": "8.57.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.46.3", "", { "dependencies": { "@typescript-eslint/types": "8.46.3", "eslint-visitor-keys": "^4.2.1" } }, "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.57.2", "", { "dependencies": { "@typescript-eslint/types": "8.57.2", "eslint-visitor-keys": "^5.0.0" } }, "sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw=="], "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], "@upstash/qstash": ["@upstash/qstash@2.10.1", "", { "dependencies": { "crypto-js": ">=4.2.0", "jose": "^5.2.3", "neverthrow": "^7.0.1" } }, "sha512-LsTAPxPk0dFvhlEnRqwObRS94b8mmDHYaBlF3IaONUL+Scq6i9cZraA6936KSUVe+Vq3eNQle3CjOZkStPUFTw=="], - "@vercel/nft": ["@vercel/nft@0.30.3", "", { "dependencies": { "@mapbox/node-pre-gyp": "^2.0.0", "@rollup/pluginutils": "^5.1.3", "acorn": "^8.6.0", "acorn-import-attributes": "^1.9.5", "async-sema": "^3.1.1", "bindings": "^1.4.0", "estree-walker": "2.0.2", "glob": "^10.4.5", "graceful-fs": "^4.2.9", "node-gyp-build": "^4.2.2", "picomatch": "^4.0.2", "resolve-from": "^5.0.0" }, "bin": { "nft": "out/cli.js" } }, "sha512-UEq+eF0ocEf9WQCV1gktxKhha36KDs7jln5qii6UpPf5clMqDc0p3E7d9l2Smx0i9Pm1qpq4S4lLfNl97bbv6w=="], + "@vercel/nft": ["@vercel/nft@1.5.0", "", { "dependencies": { "@mapbox/node-pre-gyp": "^2.0.0", "@rollup/pluginutils": "^5.1.3", "acorn": "^8.6.0", "acorn-import-attributes": "^1.9.5", "async-sema": "^3.1.1", "bindings": "^1.4.0", "estree-walker": "2.0.2", "glob": "^13.0.0", "graceful-fs": "^4.2.9", "node-gyp-build": "^4.2.2", "picomatch": "^4.0.2", "resolve-from": "^5.0.0" }, "bin": { "nft": "out/cli.js" } }, "sha512-IWTDeIoWhQ7ZtRO/JRKH+jhmeQvZYhtGPmzw/QGDY+wDCQqfm25P9yIdoAFagu4fWsK4IwZXDFIjrmp5rRm/sA=="], "@vinxi/listhen": ["@vinxi/listhen@1.5.6", "", { "dependencies": { "@parcel/watcher": "^2.3.0", "@parcel/watcher-wasm": "2.3.0", "citty": "^0.1.5", "clipboardy": "^4.0.0", "consola": "^3.2.3", "defu": "^6.1.4", "get-port-please": "^3.1.2", "h3": "^1.10.0", "http-shutdown": "^1.2.2", "jiti": "^1.21.0", "mlly": "^1.5.0", "node-forge": "^1.3.1", "pathe": "^1.1.2", "std-env": "^3.7.0", "ufo": "^1.3.2", "untun": "^0.1.3", "uqr": "^0.1.2" }, "bin": { "listen": "bin/listhen.mjs", "listhen": "bin/listhen.mjs" } }, "sha512-WSN1z931BtasZJlgPp704zJFnQFRg7yzSjkm3MzAWQYe4uXFXlFr1hc5Ac2zae5/HDOz5x1/zDM5Cb54vTCnWw=="], @@ -555,7 +539,7 @@ "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], - "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], @@ -567,7 +551,7 @@ "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], @@ -605,37 +589,47 @@ "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], - "b4a": ["b4a@1.7.3", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q=="], + "b4a": ["b4a@1.8.0", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg=="], - "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.10", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA=="], + "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="], - "babel-plugin-jsx-dom-expressions": ["babel-plugin-jsx-dom-expressions@0.40.3", "", { "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", "parse5": "^7.1.2" }, "peerDependencies": { "@babel/core": "^7.20.12" } }, "sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w=="], + "babel-plugin-jsx-dom-expressions": ["babel-plugin-jsx-dom-expressions@0.40.6", "", { "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", "parse5": "^7.1.2" }, "peerDependencies": { "@babel/core": "^7.20.12" } }, "sha512-v3P1MW46Lm7VMpAkq0QfyzLWWkC8fh+0aE5Km4msIgDx5kjenHU0pF2s+4/NH8CQn/kla6+Hvws+2AF7bfV5qQ=="], - "babel-preset-solid": ["babel-preset-solid@1.9.10", "", { "dependencies": { "babel-plugin-jsx-dom-expressions": "^0.40.3" }, "peerDependencies": { "@babel/core": "^7.0.0", "solid-js": "^1.9.10" }, "optionalPeers": ["solid-js"] }, "sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ=="], + "babel-preset-solid": ["babel-preset-solid@1.9.12", "", { "dependencies": { "babel-plugin-jsx-dom-expressions": "^0.40.6" }, "peerDependencies": { "@babel/core": "^7.0.0", "solid-js": "^1.9.12" }, "optionalPeers": ["solid-js"] }, "sha512-LLqnuKVDlKpyBlMPcH6qEvs/wmS9a+NczppxJ3ryS/c0O5IiSFOIBQi9GzyiGDSbcJpx4Gr87jyFTos1MyEuWg=="], "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "bare-events": ["bare-events@2.8.1", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ=="], + "bare-events": ["bare-events@2.8.2", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ=="], + + "bare-fs": ["bare-fs@4.5.6", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-1QovqDrR80Pmt5HPAsMsXTCFcDYr+NSUKW6nd6WO5v0JBmnItc/irNRzm2KOQ5oZ69P37y+AMujNyNtG+1Rggw=="], + + "bare-os": ["bare-os@3.8.6", "", {}, "sha512-l8xaNWWb/bXuzgsrlF5jaa5QYDJ9S0ddd54cP6CH+081+5iPrbJiCfBWQqrWYzmUhCbsH+WR6qxo9MeHVCr0MQ=="], + + "bare-path": ["bare-path@3.0.0", "", { "dependencies": { "bare-os": "^3.0.1" } }, "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw=="], + + "bare-stream": ["bare-stream@2.11.0", "", { "dependencies": { "streamx": "^2.25.0", "teex": "^1.0.1" }, "peerDependencies": { "bare-abort-controller": "*", "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-abort-controller", "bare-buffer", "bare-events"] }, "sha512-Y/+iQ49fL3rIn6w/AVxI/2+BRrpmzJvdWt5Jv8Za6Ngqc6V227c+pYjYYgLdpR3MwQ9ObVXD0ZrqoBztakM0rw=="], + + "bare-url": ["bare-url@2.4.0", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA=="], "base-64": ["base-64@1.0.0", "", {}, "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="], "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.8.23", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.12", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-qyq26DxfY4awP2gIRXhhLWfwzwI+N5Nxk6iQi8EFizIaWIjqicQTE4sLnZZVdeKPRcVNoJOkkpfzoIYuvCKaIQ=="], "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], - "body-parser": ["body-parser@2.2.0", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.0", "http-errors": "^2.0.0", "iconv-lite": "^0.6.3", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.0", "type-is": "^2.0.0" } }, "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg=="], + "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], "boxen": ["boxen@8.0.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", "chalk": "^5.3.0", "cli-boxes": "^3.0.0", "string-width": "^7.2.0", "type-fest": "^4.21.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0" } }, "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw=="], - "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - "browserslist": ["browserslist@4.27.0", "", { "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", "electron-to-chromium": "^1.5.238", "node-releases": "^2.0.26", "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" } }, "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw=="], + "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], @@ -645,7 +639,9 @@ "builtin-modules": ["builtin-modules@3.3.0", "", {}, "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw=="], - "bun-types": ["bun-types@1.3.1", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-NMrcy7smratanWJ2mMXdpatalovtxVggkj11bScuWuiOoXTiKIu2eVS1/7qbyI/4yHedtsn175n4Sm4JcdHLXw=="], + "bun-types": ["bun-types@1.3.11", "", { "dependencies": { "@types/node": "*" } }, "sha512-1KGPpoxQWl9f6wcZh57LvrPIInQMn2TQ7jsgxqpRzg+l0QPOFvJVH7HmvHo/AiPgwXy+/Thf6Ov3EdVn1vOabg=="], + + "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="], @@ -653,7 +649,7 @@ "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], - "c12": ["c12@3.3.1", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^17.2.3", "exsolve": "^1.0.7", "giget": "^2.0.0", "jiti": "^2.6.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.0.0", "pkg-types": "^2.3.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-LcWQ01LT9tkoUINHgpIOv3mMs+Abv7oVCrtpMRi1PaapVEpWoMga5WuT7/DqFTu7URP9ftbOmimNw1KNIGh9DQ=="], + "c12": ["c12@3.3.3", "", { "dependencies": { "chokidar": "^5.0.0", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^17.2.3", "exsolve": "^1.0.8", "giget": "^2.0.0", "jiti": "^2.6.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.0.0", "pkg-types": "^2.3.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "*" }, "optionalPeers": ["magicast"] }, "sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q=="], "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], @@ -665,7 +661,7 @@ "camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="], - "caniuse-lite": ["caniuse-lite@1.0.30001753", "", {}, "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001782", "", {}, "sha512-dZcaJLJeDMh4rELYFw1tvSn1bhZWYFOt468FcbHHxx/Z/dFidd1I6ciyFdi3iwfQCyOjqo9upF6lGQYtMiJWxw=="], "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], @@ -681,7 +677,7 @@ "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], - "ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="], + "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="], "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], @@ -727,11 +723,11 @@ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], + "confbox": ["confbox@0.2.4", "", {}, "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ=="], "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], - "content-disposition": ["content-disposition@1.0.0", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg=="], + "content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="], "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], @@ -749,11 +745,11 @@ "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], - "core-js-compat": ["core-js-compat@3.46.0", "", { "dependencies": { "browserslist": "^4.26.3" } }, "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law=="], + "core-js-compat": ["core-js-compat@3.49.0", "", { "dependencies": { "browserslist": "^4.28.1" } }, "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA=="], "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], - "cosmiconfig": ["cosmiconfig@9.0.0", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg=="], + "cosmiconfig": ["cosmiconfig@9.0.1", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ=="], "cosmiconfig-typescript-loader": ["cosmiconfig-typescript-loader@6.2.0", "", { "dependencies": { "jiti": "^2.6.1" }, "peerDependencies": { "@types/node": "*", "cosmiconfig": ">=9", "typescript": ">=5" } }, "sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ=="], @@ -761,7 +757,7 @@ "crc32-stream": ["crc32-stream@6.0.0", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="], - "croner": ["croner@9.1.0", "", {}, "sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g=="], + "croner": ["croner@10.0.1", "", {}, "sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], @@ -771,7 +767,7 @@ "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], - "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], "dargs": ["dargs@8.1.0", "", {}, "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw=="], @@ -781,13 +777,17 @@ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="], + "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], - "define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], + "default-browser": ["default-browser@5.5.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="], + + "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="], + + "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], @@ -805,17 +805,17 @@ "deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="], - "devalue": ["devalue@5.4.2", "", {}, "sha512-MwPZTKEPK2k8Qgfmqrd48ZKVvzSQjgW0lXLxiIBA8dQjtf/6mw6pggHNLcyDKyf+fI6eXxlQwPsfaCMTU5U+Bw=="], + "devalue": ["devalue@5.6.4", "", {}, "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA=="], "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], - "diff": ["diff@5.2.0", "", {}, "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A=="], + "diff": ["diff@5.2.2", "", {}, "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A=="], "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], "dot-prop": ["dot-prop@5.3.0", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q=="], - "dotenv": ["dotenv@17.2.3", "", {}, "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w=="], + "dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="], "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="], @@ -827,7 +827,7 @@ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - "electron-to-chromium": ["electron-to-chromium@1.5.244", "", {}, "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw=="], + "electron-to-chromium": ["electron-to-chromium@1.5.328", "", {}, "sha512-QNQ5l45DzYytThO21403XN3FvK0hOkWDG8viNf6jqS42msJ8I4tGDSpBCgvDRRPnkffafiwAym2X2eHeGD2V0w=="], "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], @@ -861,7 +861,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.1", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "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", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@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", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "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", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-plugin-unicorn": ["eslint-plugin-unicorn@55.0.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.24.5", "@eslint-community/eslint-utils": "^4.4.0", "ci-info": "^4.0.0", "clean-regexp": "^1.0.0", "core-js-compat": "^3.37.0", "esquery": "^1.5.0", "globals": "^15.7.0", "indent-string": "^4.0.0", "is-builtin-module": "^3.2.1", "jsesc": "^3.0.2", "pluralize": "^8.0.0", "read-pkg-up": "^7.0.1", "regexp-tree": "^0.1.27", "regjsparser": "^0.10.0", "semver": "^7.6.1", "strip-indent": "^3.0.0" }, "peerDependencies": { "eslint": ">=8.56.0" } }, "sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA=="], @@ -875,9 +875,9 @@ "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], - "esrap": ["esrap@2.1.2", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-DgvlIQeowRNyvLPWW4PT7Gu13WznY288Du086E751mwwbsgr29ytBiYeLzAGIo0qk3Ujob0SDk8TiSaM5WQzNg=="], + "esrap": ["esrap@2.2.4", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@typescript-eslint/types": "^8.2.0" } }, "sha512-suICpxAmZ9A8bzJjEl/+rLJiDKC0X4gYWUxT6URAWBLvlXmtbZd5ySMu/N2ZGEtMCAmflUDPSehrP9BQcsGcSg=="], "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], @@ -891,7 +891,7 @@ "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], - "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], @@ -899,9 +899,9 @@ "execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], - "express": ["express@5.1.0", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA=="], + "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], - "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="], + "exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="], "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], @@ -919,7 +919,7 @@ "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], - "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], @@ -929,7 +929,7 @@ "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], - "finalhandler": ["finalhandler@2.1.0", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q=="], + "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], @@ -941,7 +941,7 @@ "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], - "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="], "flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="], @@ -961,7 +961,7 @@ "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], - "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], + "get-east-asian-width": ["get-east-asian-width@1.5.0", "", {}, "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA=="], "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], @@ -971,15 +971,13 @@ "get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], - "get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="], - "giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="], "git-raw-commits": ["git-raw-commits@4.0.0", "", { "dependencies": { "dargs": "^8.0.0", "meow": "^12.0.1", "split2": "^4.0.0" }, "bin": { "git-raw-commits": "cli.mjs" } }, "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ=="], "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], - "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], @@ -987,19 +985,17 @@ "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], - "globby": ["globby@15.0.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "fast-glob": "^3.3.3", "ignore": "^7.0.5", "path-type": "^6.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.3.0" } }, "sha512-oB4vkQGqlMl682wL1IlWd02tXCbquGWM4voPEI85QmNKCaw8zGTm1f1rubFgkg3Eli2PtKlFgrnmUqasbQWlkw=="], + "globby": ["globby@16.2.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "fast-glob": "^3.3.3", "ignore": "^7.0.5", "is-path-inside": "^4.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.4.0" } }, "sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q=="], "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], - "gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="], "gzip-size": ["gzip-size@7.0.0", "", { "dependencies": { "duplexer": "^0.1.2" } }, "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA=="], - "h3": ["h3@1.15.4", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.5", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.2", "radix3": "^1.1.2", "ufo": "^1.6.1", "uncrypto": "^0.1.3" } }, "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ=="], + "h3": ["h3@1.15.10", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.5", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-YzJeWSkDZxAhvmp8dexjRK5hxziRO7I9m0N53WhvYL5NiWfkUkzssVzY9jvGu0HBoLFW6+duYmNSn6MaZBCCtg=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -1019,7 +1015,7 @@ "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], - "hast-util-to-parse5": ["hast-util-to-parse5@8.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw=="], + "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="], "hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="], @@ -1027,7 +1023,7 @@ "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], - "hono": ["hono@4.10.4", "", {}, "sha512-YG/fo7zlU3KwrBL5vDpWKisLYiM+nVstBQqfr7gCPbSYURnNEP9BDxEMz8KfsDR9JX0lJWDRNc6nXX31v7ZEyg=="], + "hono": ["hono@4.12.9", "", {}, "sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA=="], "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], @@ -1043,7 +1039,7 @@ "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], - "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], "http-proxy": ["http-proxy@1.18.1", "", { "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } }, "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ=="], @@ -1051,13 +1047,13 @@ "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - "httpxy": ["httpxy@0.1.7", "", {}, "sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ=="], + "httpxy": ["httpxy@0.3.1", "", {}, "sha512-XjG/CEoofEisMrnFr0D6U6xOZ4mRfnwcYQ9qvvnT4lvnX8BoeA3x3WofB75D+vZwpaobFVkBIHrZzoK40w8XSw=="], "human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], "husky": ["husky@9.1.7", "", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="], - "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], @@ -1075,7 +1071,7 @@ "ini": ["ini@4.1.1", "", {}, "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g=="], - "ioredis": ["ioredis@5.8.2", "", { "dependencies": { "@ioredis/commands": "1.4.0", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", "redis-parser": "^3.0.0", "standard-as-callback": "^2.1.0" } }, "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q=="], + "ioredis": ["ioredis@5.10.1", "", { "dependencies": { "@ioredis/commands": "1.5.1", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", "redis-parser": "^3.0.0", "standard-as-callback": "^2.1.0" } }, "sha512-HuEDBTI70aYdx1v6U97SbNx9F1+svQKBDo30o0b9fw055LMepzpOOd0Ccg9Q6tbqmBSJaMuY0fB7yw9/vjBYCA=="], "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], @@ -1097,6 +1093,8 @@ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + "is-in-ssh": ["is-in-ssh@1.0.0", "", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="], + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="], @@ -1107,6 +1105,8 @@ "is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], + "is-path-inside": ["is-path-inside@4.0.0", "", {}, "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="], + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], @@ -1121,7 +1121,7 @@ "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], - "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], + "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], "is64bit": ["is64bit@2.0.0", "", { "dependencies": { "system-architecture": "^0.1.0" } }, "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw=="], @@ -1139,7 +1139,7 @@ "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], @@ -1163,7 +1163,7 @@ "klona": ["klona@2.0.6", "", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="], - "knitwork": ["knitwork@1.2.0", "", {}, "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg=="], + "knitwork": ["knitwork@1.3.0", "", {}, "sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw=="], "lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="], @@ -1185,7 +1185,7 @@ "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], - "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], @@ -1203,8 +1203,6 @@ "lodash.snakecase": ["lodash.snakecase@4.1.1", "", {}, "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw=="], - "lodash.sortby": ["lodash.sortby@4.7.0", "", {}, "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="], - "lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="], "lodash.uniq": ["lodash.uniq@4.5.0", "", {}, "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="], @@ -1215,7 +1213,9 @@ "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], - "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lru-cache": ["lru-cache@11.2.7", "", {}, "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA=="], "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], @@ -1229,7 +1229,7 @@ "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], - "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="], + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], @@ -1245,7 +1245,7 @@ "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], - "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="], + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], @@ -1325,7 +1325,7 @@ "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], - "mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], @@ -1333,17 +1333,15 @@ "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], - "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], - "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], - "mlly": ["mlly@1.8.0", "", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="], - - "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], + "mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="], "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], @@ -1361,9 +1359,9 @@ "neverthrow": ["neverthrow@7.2.0", "", {}, "sha512-iGBUfFB7yPczHHtA8dksKTJ9E8TESNTAx1UQWW6TzMF280vo9jdPYpLUXrMN1BCkPdHFdNG3fxOt2CUad8KhAw=="], - "next": ["next@14.2.33", "", { "dependencies": { "@next/env": "14.2.33", "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "graceful-fs": "^4.2.11", "postcss": "8.4.31", "styled-jsx": "5.1.1" }, "optionalDependencies": { "@next/swc-darwin-arm64": "14.2.33", "@next/swc-darwin-x64": "14.2.33", "@next/swc-linux-arm64-gnu": "14.2.33", "@next/swc-linux-arm64-musl": "14.2.33", "@next/swc-linux-x64-gnu": "14.2.33", "@next/swc-linux-x64-musl": "14.2.33", "@next/swc-win32-arm64-msvc": "14.2.33", "@next/swc-win32-ia32-msvc": "14.2.33", "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-GiKHLsD00t4ACm1p00VgrI0rUFAC9cRDGReKyERlM57aeEZkOQGcZTpIbsGn0b562FTPJWmYfKwplfO9EaT6ng=="], + "next": ["next@14.2.35", "", { "dependencies": { "@next/env": "14.2.35", "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "graceful-fs": "^4.2.11", "postcss": "8.4.31", "styled-jsx": "5.1.1" }, "optionalDependencies": { "@next/swc-darwin-arm64": "14.2.33", "@next/swc-darwin-x64": "14.2.33", "@next/swc-linux-arm64-gnu": "14.2.33", "@next/swc-linux-arm64-musl": "14.2.33", "@next/swc-linux-x64-gnu": "14.2.33", "@next/swc-linux-x64-musl": "14.2.33", "@next/swc-win32-arm64-msvc": "14.2.33", "@next/swc-win32-ia32-msvc": "14.2.33", "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig=="], - "nitropack": ["nitropack@2.12.9", "", { "dependencies": { "@cloudflare/kv-asset-handler": "^0.4.0", "@rollup/plugin-alias": "^5.1.1", "@rollup/plugin-commonjs": "^28.0.9", "@rollup/plugin-inject": "^5.0.5", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-replace": "^6.0.2", "@rollup/plugin-terser": "^0.4.4", "@vercel/nft": "^0.30.3", "archiver": "^7.0.1", "c12": "^3.3.1", "chokidar": "^4.0.3", "citty": "^0.1.6", "compatx": "^0.2.0", "confbox": "^0.2.2", "consola": "^3.4.2", "cookie-es": "^2.0.0", "croner": "^9.1.0", "crossws": "^0.3.5", "db0": "^0.3.4", "defu": "^6.1.4", "destr": "^2.0.5", "dot-prop": "^10.1.0", "esbuild": "^0.25.11", "escape-string-regexp": "^5.0.0", "etag": "^1.8.1", "exsolve": "^1.0.7", "globby": "^15.0.0", "gzip-size": "^7.0.0", "h3": "^1.15.4", "hookable": "^5.5.3", "httpxy": "^0.1.7", "ioredis": "^5.8.2", "jiti": "^2.6.1", "klona": "^2.0.6", "knitwork": "^1.2.0", "listhen": "^1.9.0", "magic-string": "^0.30.21", "magicast": "^0.5.0", "mime": "^4.1.0", "mlly": "^1.8.0", "node-fetch-native": "^1.6.7", "node-mock-http": "^1.0.3", "ofetch": "^1.5.0", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.0.0", "pkg-types": "^2.3.0", "pretty-bytes": "^7.1.0", "radix3": "^1.1.2", "rollup": "^4.52.5", "rollup-plugin-visualizer": "^6.0.5", "scule": "^1.3.0", "semver": "^7.7.3", "serve-placeholder": "^2.0.2", "serve-static": "^2.2.0", "source-map": "^0.7.6", "std-env": "^3.10.0", "ufo": "^1.6.1", "ultrahtml": "^1.6.0", "uncrypto": "^0.1.3", "unctx": "^2.4.1", "unenv": "^2.0.0-rc.23", "unimport": "^5.5.0", "unplugin-utils": "^0.3.1", "unstorage": "^1.17.1", "untyped": "^2.0.0", "unwasm": "^0.3.11", "youch": "^4.1.0-beta.11", "youch-core": "^0.3.3" }, "peerDependencies": { "xml2js": "^0.6.2" }, "optionalPeers": ["xml2js"], "bin": { "nitro": "dist/cli/index.mjs", "nitropack": "dist/cli/index.mjs" } }, "sha512-t6qqNBn2UDGMWogQuORjbL2UPevB8PvIPsPHmqvWpeGOlPr4P8Oc5oA8t3wFwGmaolM2M/s2SwT23nx9yARmOg=="], + "nitropack": ["nitropack@2.13.2", "", { "dependencies": { "@cloudflare/kv-asset-handler": "^0.4.2", "@rollup/plugin-alias": "^6.0.0", "@rollup/plugin-commonjs": "^29.0.2", "@rollup/plugin-inject": "^5.0.5", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-replace": "^6.0.3", "@rollup/plugin-terser": "^1.0.0", "@vercel/nft": "^1.4.0", "archiver": "^7.0.1", "c12": "^3.3.3", "chokidar": "^5.0.0", "citty": "^0.2.1", "compatx": "^0.2.0", "confbox": "^0.2.4", "consola": "^3.4.2", "cookie-es": "^2.0.0", "croner": "^10.0.1", "crossws": "^0.3.5", "db0": "^0.3.4", "defu": "^6.1.4", "destr": "^2.0.5", "dot-prop": "^10.1.0", "esbuild": "^0.27.4", "escape-string-regexp": "^5.0.0", "etag": "^1.8.1", "exsolve": "^1.0.8", "globby": "^16.1.1", "gzip-size": "^7.0.0", "h3": "^1.15.9", "hookable": "^5.5.3", "httpxy": "^0.3.1", "ioredis": "^5.10.1", "jiti": "^2.6.1", "klona": "^2.0.6", "knitwork": "^1.3.0", "listhen": "^1.9.0", "magic-string": "^0.30.21", "magicast": "^0.5.2", "mime": "^4.1.0", "mlly": "^1.8.2", "node-fetch-native": "^1.6.7", "node-mock-http": "^1.0.4", "ofetch": "^1.5.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.1.0", "pkg-types": "^2.3.0", "pretty-bytes": "^7.1.0", "radix3": "^1.1.2", "rollup": "^4.59.0", "rollup-plugin-visualizer": "^7.0.1", "scule": "^1.3.0", "semver": "^7.7.4", "serve-placeholder": "^2.0.2", "serve-static": "^2.2.1", "source-map": "^0.7.6", "std-env": "^4.0.0", "ufo": "^1.6.3", "ultrahtml": "^1.6.0", "uncrypto": "^0.1.3", "unctx": "^2.5.0", "unenv": "^2.0.0-rc.24", "unimport": "^6.0.2", "unplugin-utils": "^0.3.1", "unstorage": "^1.17.4", "untyped": "^2.0.0", "unwasm": "^0.5.3", "youch": "^4.1.0", "youch-core": "^0.3.3" }, "peerDependencies": { "xml2js": "^0.6.2" }, "optionalPeers": ["xml2js"], "bin": { "nitro": "dist/cli/index.mjs", "nitropack": "dist/cli/index.mjs" } }, "sha512-R5TMzSBoTDG4gi6Y+pvvyCNnooShHePHsHxMLP9EXDGdrlR5RvNdSd4e5k8z0/EzP9Ske7ABRMDWg6O7Dm2OYw=="], "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="], @@ -1373,13 +1371,13 @@ "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], - "node-forge": ["node-forge@1.3.1", "", {}, "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA=="], + "node-forge": ["node-forge@1.4.0", "", {}, "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ=="], "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], - "node-mock-http": ["node-mock-http@1.0.3", "", {}, "sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog=="], + "node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="], - "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], + "node-releases": ["node-releases@2.0.36", "", {}, "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA=="], "nopt": ["nopt@8.1.0", "", { "dependencies": { "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A=="], @@ -1389,12 +1387,14 @@ "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], - "nypm": ["nypm@0.6.2", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.2", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "tinyexec": "^1.0.1" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g=="], + "nypm": ["nypm@0.6.5", "", { "dependencies": { "citty": "^0.2.0", "pathe": "^2.0.3", "tinyexec": "^1.0.2" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ=="], "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + "obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="], + "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], @@ -1407,7 +1407,7 @@ "oniguruma-to-es": ["oniguruma-to-es@2.3.0", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^5.1.1", "regex-recursion": "^5.1.1" } }, "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g=="], - "open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + "open": ["open@11.0.0", "", { "dependencies": { "default-browser": "^5.4.0", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", "powershell-utils": "^0.1.0", "wsl-utils": "^0.3.0" } }, "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw=="], "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], @@ -1441,19 +1441,17 @@ "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], - "path-type": ["path-type@6.0.0", "", {}, "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ=="], - "pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], - "perfect-debounce": ["perfect-debounce@2.0.0", "", {}, "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow=="], + "perfect-debounce": ["perfect-debounce@2.1.0", "", {}, "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g=="], "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], "pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], @@ -1469,6 +1467,8 @@ "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="], + "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="], + "preferred-pm": ["preferred-pm@4.1.1", "", { "dependencies": { "find-up-simple": "^1.0.0", "find-yarn-workspace-root2": "1.2.16", "which-pm": "^3.0.1" } }, "sha512-rU+ZAv1Ur9jAUZtGPebQVQPzdGhNzaEiQ7VL9+cjsAWPHFYOccNXPNiev1CCDSOg/2j7UujM7ojNhpkuILEVNQ=="], "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], @@ -1491,7 +1491,7 @@ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], + "qs": ["qs@6.15.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ=="], "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], @@ -1499,17 +1499,15 @@ "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], - "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], - "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], - "raw-body": ["raw-body@3.0.1", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.7.0", "unpipe": "1.0.0" } }, "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA=="], + "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], "rc9": ["rc9@2.1.2", "", { "dependencies": { "defu": "^6.1.4", "destr": "^2.0.3" } }, "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg=="], - "react": ["react@19.2.0", "", {}, "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ=="], + "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], - "react-dom": ["react-dom@19.2.0", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.0" } }, "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ=="], + "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], "read-pkg": ["read-pkg@5.2.0", "", { "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", "parse-json": "^5.0.0", "type-fest": "^0.6.0" } }, "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg=="], @@ -1565,8 +1563,6 @@ "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], "retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="], @@ -1579,41 +1575,41 @@ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - "rollup": ["rollup@4.52.5", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.52.5", "@rollup/rollup-android-arm64": "4.52.5", "@rollup/rollup-darwin-arm64": "4.52.5", "@rollup/rollup-darwin-x64": "4.52.5", "@rollup/rollup-freebsd-arm64": "4.52.5", "@rollup/rollup-freebsd-x64": "4.52.5", "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", "@rollup/rollup-linux-arm-musleabihf": "4.52.5", "@rollup/rollup-linux-arm64-gnu": "4.52.5", "@rollup/rollup-linux-arm64-musl": "4.52.5", "@rollup/rollup-linux-loong64-gnu": "4.52.5", "@rollup/rollup-linux-ppc64-gnu": "4.52.5", "@rollup/rollup-linux-riscv64-gnu": "4.52.5", "@rollup/rollup-linux-riscv64-musl": "4.52.5", "@rollup/rollup-linux-s390x-gnu": "4.52.5", "@rollup/rollup-linux-x64-gnu": "4.52.5", "@rollup/rollup-linux-x64-musl": "4.52.5", "@rollup/rollup-openharmony-arm64": "4.52.5", "@rollup/rollup-win32-arm64-msvc": "4.52.5", "@rollup/rollup-win32-ia32-msvc": "4.52.5", "@rollup/rollup-win32-x64-gnu": "4.52.5", "@rollup/rollup-win32-x64-msvc": "4.52.5", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw=="], + "rollup": ["rollup@4.60.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.60.1", "@rollup/rollup-android-arm64": "4.60.1", "@rollup/rollup-darwin-arm64": "4.60.1", "@rollup/rollup-darwin-x64": "4.60.1", "@rollup/rollup-freebsd-arm64": "4.60.1", "@rollup/rollup-freebsd-x64": "4.60.1", "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", "@rollup/rollup-linux-arm-musleabihf": "4.60.1", "@rollup/rollup-linux-arm64-gnu": "4.60.1", "@rollup/rollup-linux-arm64-musl": "4.60.1", "@rollup/rollup-linux-loong64-gnu": "4.60.1", "@rollup/rollup-linux-loong64-musl": "4.60.1", "@rollup/rollup-linux-ppc64-gnu": "4.60.1", "@rollup/rollup-linux-ppc64-musl": "4.60.1", "@rollup/rollup-linux-riscv64-gnu": "4.60.1", "@rollup/rollup-linux-riscv64-musl": "4.60.1", "@rollup/rollup-linux-s390x-gnu": "4.60.1", "@rollup/rollup-linux-x64-gnu": "4.60.1", "@rollup/rollup-linux-x64-musl": "4.60.1", "@rollup/rollup-openbsd-x64": "4.60.1", "@rollup/rollup-openharmony-arm64": "4.60.1", "@rollup/rollup-win32-arm64-msvc": "4.60.1", "@rollup/rollup-win32-ia32-msvc": "4.60.1", "@rollup/rollup-win32-x64-gnu": "4.60.1", "@rollup/rollup-win32-x64-msvc": "4.60.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w=="], - "rollup-plugin-visualizer": ["rollup-plugin-visualizer@6.0.5", "", { "dependencies": { "open": "^8.0.0", "picomatch": "^4.0.2", "source-map": "^0.7.4", "yargs": "^17.5.1" }, "peerDependencies": { "rolldown": "1.x || ^1.0.0-beta", "rollup": "2.x || 3.x || 4.x" }, "optionalPeers": ["rolldown", "rollup"], "bin": { "rollup-plugin-visualizer": "dist/bin/cli.js" } }, "sha512-9+HlNgKCVbJDs8tVtjQ43US12eqaiHyyiLMdBwQ7vSZPiHMysGNo2E88TAp1si5wx8NAoYriI2A5kuKfIakmJg=="], + "rollup-plugin-visualizer": ["rollup-plugin-visualizer@7.0.1", "", { "dependencies": { "open": "^11.0.0", "picomatch": "^4.0.2", "source-map": "^0.7.4", "yargs": "^18.0.0" }, "peerDependencies": { "rolldown": "1.x || ^1.0.0-beta || ^1.0.0-rc", "rollup": "2.x || 3.x || 4.x" }, "optionalPeers": ["rolldown", "rollup"], "bin": { "rollup-plugin-visualizer": "dist/bin/cli.js" } }, "sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg=="], "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], - "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], - "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], "scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="], "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="], - "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], - "send": ["send@1.2.0", "", { "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.0", "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw=="], + "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], - "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], + "serialize-javascript": ["serialize-javascript@7.0.5", "", {}, "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw=="], - "seroval": ["seroval@1.3.2", "", {}, "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ=="], + "seroval": ["seroval@1.5.1", "", {}, "sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA=="], - "seroval-plugins": ["seroval-plugins@1.3.3", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w=="], + "seroval-plugins": ["seroval-plugins@1.5.1", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-4FbuZ/TMl02sqv0RTFexu0SP6V+ywaIe5bAWCCEik0fk17BhALgwvUDVF7e3Uvf9pxmwCEJsRPmlkUE6HdzLAw=="], "serve-placeholder": ["serve-placeholder@2.0.2", "", { "dependencies": { "defu": "^6.1.4" } }, "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ=="], - "serve-static": ["serve-static@2.2.0", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ=="], + "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], - "set-cookie-parser": ["set-cookie-parser@2.7.2", "", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="], + "set-cookie-parser": ["set-cookie-parser@3.1.0", "", {}, "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw=="], "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], @@ -1643,15 +1639,15 @@ "slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="], - "smob": ["smob@1.5.0", "", {}, "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig=="], + "smob": ["smob@1.6.1", "", {}, "sha512-KAkBqZl3c2GvNgNhcoyJae1aKldDW0LO279wF9bk1PnluRTETKBq0WyzRXxEhoQLk56yHaOY4JCBEKDuJIET5g=="], - "solid-js": ["solid-js@1.9.10", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.3.0", "seroval-plugins": "~1.3.0" } }, "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew=="], + "solid-js": ["solid-js@1.9.12", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.0", "seroval-plugins": "~1.5.0" } }, "sha512-QzKaSJq2/iDrWR1As6MHZQ8fQkdOBf8GReYb7L5iKwMGceg7HxDcaOHk0at66tNgn9U2U7dXo8ZZpLIAmGMzgw=="], "solid-refresh": ["solid-refresh@0.6.3", "", { "dependencies": { "@babel/generator": "^7.23.6", "@babel/helper-module-imports": "^7.22.15", "@babel/types": "^7.23.6" }, "peerDependencies": { "solid-js": "^1.3" } }, "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA=="], "solid-use": ["solid-use@0.9.1", "", { "peerDependencies": { "solid-js": "^1.7" } }, "sha512-UwvXDVPlrrbj/9ewG9ys5uL2IO4jSiwys2KPzK4zsnAcmEl7iDafZWW1Mo4BSEWOmQCGK6IvpmGHo1aou8iOFw=="], - "source-map": ["source-map@0.8.0-beta.0", "", { "dependencies": { "whatwg-url": "^7.0.0" } }, "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA=="], + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], @@ -1665,7 +1661,7 @@ "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], - "spdx-license-ids": ["spdx-license-ids@3.0.22", "", {}, "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ=="], + "spdx-license-ids": ["spdx-license-ids@3.0.23", "", {}, "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw=="], "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], @@ -1683,7 +1679,7 @@ "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], - "streamx": ["streamx@2.23.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg=="], + "streamx": ["streamx@2.25.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg=="], "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1693,7 +1689,7 @@ "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], - "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -1711,27 +1707,29 @@ "styled-jsx": ["styled-jsx@5.1.1", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" } }, "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw=="], - "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], + "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="], "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - "svelte": ["svelte@5.43.3", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "esm-env": "^1.2.1", "esrap": "^2.1.0", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-kjkAjCk41mJfvJZG56XcJNOdJSke94JxtcX8zFzzz2vrt47E0LnoBzU6azIZ1aBxJgUep8qegAkguSf1GjxLXQ=="], + "svelte": ["svelte@5.55.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-QjvU7EFemf6mRzdMGlAFttMWtAAVXrax61SZYHdkD6yoVGQ89VeyKfZD4H1JrV1WLmJBxWhFch9H6ig/87VGjw=="], "system-architecture": ["system-architecture@0.1.0", "", {}, "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA=="], "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="], - "tar": ["tar@7.5.2", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg=="], + "tar": ["tar@7.5.13", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng=="], - "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], + "tar-stream": ["tar-stream@3.1.8", "", { "dependencies": { "b4a": "^1.6.4", "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ=="], - "terracotta": ["terracotta@1.0.6", "", { "dependencies": { "solid-use": "^0.9.0" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-yVrmT/Lg6a3tEbeYEJH8ksb1PYkR5FA9k5gr1TchaSNIiA2ZWs5a+koEbePXwlBP0poaV7xViZ/v50bQFcMgqw=="], + "teex": ["teex@1.0.1", "", { "dependencies": { "streamx": "^2.12.5" } }, "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg=="], - "terser": ["terser@5.44.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w=="], + "terracotta": ["terracotta@1.1.0", "", { "dependencies": { "solid-use": "^0.9.1" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-kfQciWUBUBgYkXu7gh3CK3FAJng/iqZslAaY08C+k1Hdx17aVEpcFFb/WPaysxAfcupNH3y53s/pc53xxZauww=="], - "text-decoder": ["text-decoder@1.2.3", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="], + "terser": ["terser@5.46.1", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ=="], + + "text-decoder": ["text-decoder@1.2.7", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ=="], "text-extensions": ["text-extensions@2.4.0", "", {}, "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g=="], @@ -1743,7 +1741,7 @@ "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], - "tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], + "tinyexec": ["tinyexec@1.0.4", "", {}, "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw=="], "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], @@ -1753,7 +1751,7 @@ "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], - "tr46": ["tr46@1.0.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA=="], + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], @@ -1761,7 +1759,7 @@ "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], - "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="], "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], @@ -1769,9 +1767,7 @@ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "tsup": ["tsup@8.5.0", "", { "dependencies": { "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "consola": "^3.4.0", "debug": "^4.4.0", "esbuild": "^0.25.0", "fix-dts-default-cjs-exports": "^1.0.0", "joycon": "^3.1.1", "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", "rollup": "^4.34.8", "source-map": "0.8.0-beta.0", "sucrase": "^3.35.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.11", "tree-kill": "^1.2.2" }, "peerDependencies": { "@microsoft/api-extractor": "^7.36.0", "@swc/core": "^1", "postcss": "^8.4.12", "typescript": ">=4.5.0" }, "optionalPeers": ["@microsoft/api-extractor", "@swc/core", "postcss", "typescript"], "bin": { "tsup": "dist/cli-default.js", "tsup-node": "dist/cli-node.js" } }, "sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ=="], - - "tsx": ["tsx@4.20.6", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg=="], + "tsup": ["tsup@8.5.1", "", { "dependencies": { "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "consola": "^3.4.0", "debug": "^4.4.0", "esbuild": "^0.27.0", "fix-dts-default-cjs-exports": "^1.0.0", "joycon": "^3.1.1", "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", "rollup": "^4.34.8", "source-map": "^0.7.6", "sucrase": "^3.35.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.11", "tree-kill": "^1.2.2" }, "peerDependencies": { "@microsoft/api-extractor": "^7.36.0", "@swc/core": "^1", "postcss": "^8.4.12", "typescript": ">=4.5.0" }, "optionalPeers": ["@microsoft/api-extractor", "@swc/core", "postcss", "typescript"], "bin": { "tsup": "dist/cli-default.js", "tsup-node": "dist/cli-node.js" } }, "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], @@ -1781,15 +1777,15 @@ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "typescript-eslint": ["typescript-eslint@8.46.3", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.46.3", "@typescript-eslint/parser": "8.46.3", "@typescript-eslint/typescript-estree": "8.46.3", "@typescript-eslint/utils": "8.46.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA=="], + "typescript-eslint": ["typescript-eslint@8.57.2", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.57.2", "@typescript-eslint/parser": "8.57.2", "@typescript-eslint/typescript-estree": "8.57.2", "@typescript-eslint/utils": "8.57.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-VEPQ0iPgWO/sBaZOU1xo4nuNdODVOajPnTIbog2GKYr31nIlZ0fWPoCQgGfF3ETyBl1vn63F/p50Um9Z4J8O8A=="], - "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], + "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="], "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="], "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], - "unctx": ["unctx@2.4.1", "", { "dependencies": { "acorn": "^8.14.0", "estree-walker": "^3.0.3", "magic-string": "^0.30.17", "unplugin": "^2.1.0" } }, "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg=="], + "unctx": ["unctx@2.5.0", "", { "dependencies": { "acorn": "^8.15.0", "estree-walker": "^3.0.3", "magic-string": "^0.30.21", "unplugin": "^2.3.11" } }, "sha512-p+Rz9x0R7X+CYDkT+Xg8/GhpcShTlU8n+cf9OtOEf7zEQsNcCZO1dPKNRDqvUTaq+P32PMMkxWHwfrxkqfqAYg=="], "undici-types": ["undici-types@5.28.4", "", {}, "sha512-3OeMF5Lyowe8VW0skf5qaIE7Or3yS9LS7fvMUI0gg4YxpIBVg0L8BxCmROw2CcYhSkpR68Epz7CGc8MPj94Uww=="], @@ -1799,7 +1795,7 @@ "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], - "unimport": ["unimport@5.5.0", "", { "dependencies": { "acorn": "^8.15.0", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "local-pkg": "^1.1.2", "magic-string": "^0.30.19", "mlly": "^1.8.0", "pathe": "^2.0.3", "picomatch": "^4.0.3", "pkg-types": "^2.3.0", "scule": "^1.3.0", "strip-literal": "^3.1.0", "tinyglobby": "^0.2.15", "unplugin": "^2.3.10", "unplugin-utils": "^0.3.0" } }, "sha512-/JpWMG9s1nBSlXJAQ8EREFTFy3oy6USFd8T6AoBaw1q2GGcF4R9yp3ofg32UODZlYEO5VD0EWE1RpI9XDWyPYg=="], + "unimport": ["unimport@6.0.2", "", { "dependencies": { "acorn": "^8.16.0", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "local-pkg": "^1.1.2", "magic-string": "^0.30.21", "mlly": "^1.8.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "pkg-types": "^2.3.0", "scule": "^1.3.0", "strip-literal": "^3.1.0", "tinyglobby": "^0.2.15", "unplugin": "^3.0.0", "unplugin-utils": "^0.3.1" } }, "sha512-ZSOkrDw380w+KIPniY3smyXh2h7H9v2MNr9zejDuh239o5sdea44DRAYrv+rfUi2QGT186P2h0GPGKvy8avQ5g=="], "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="], @@ -1813,7 +1809,7 @@ "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], - "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], "unist-util-visit-children": ["unist-util-visit-children@3.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="], @@ -1821,19 +1817,19 @@ "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], - "unplugin": ["unplugin@2.3.10", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw=="], + "unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], "unplugin-utils": ["unplugin-utils@0.3.1", "", { "dependencies": { "pathe": "^2.0.3", "picomatch": "^4.0.3" } }, "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog=="], - "unstorage": ["unstorage@1.17.2", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", "destr": "^2.0.5", "h3": "^1.15.4", "lru-cache": "^10.4.3", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.0", "ufo": "^1.6.1" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6.0.3 || ^7.0.0", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1.0.1", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-cKEsD6iBWJgOMJ6vW1ID/SYuqNf8oN4yqRk8OYqaVQ3nnkJXOT1PSpaMh2QfzLs78UN5kSNRD2c/mgjT8tX7+w=="], + "unstorage": ["unstorage@1.17.5", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.10", "lru-cache": "^11.2.7", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg=="], "untun": ["untun@0.1.3", "", { "dependencies": { "citty": "^0.1.5", "consola": "^3.2.3", "pathe": "^1.1.1" }, "bin": { "untun": "bin/untun.mjs" } }, "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ=="], "untyped": ["untyped@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "defu": "^6.1.4", "jiti": "^2.4.2", "knitwork": "^1.2.0", "scule": "^1.3.0" }, "bin": { "untyped": "dist/cli.mjs" } }, "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g=="], - "unwasm": ["unwasm@0.3.11", "", { "dependencies": { "knitwork": "^1.2.0", "magic-string": "^0.30.17", "mlly": "^1.7.4", "pathe": "^2.0.3", "pkg-types": "^2.2.0", "unplugin": "^2.3.6" } }, "sha512-Vhp5gb1tusSQw5of/g3Q697srYgMXvwMgXMjcG4ZNga02fDX9coxJ9fAb0Ci38hM2Hv/U1FXRPGgjP2BYqhNoQ=="], + "unwasm": ["unwasm@0.5.3", "", { "dependencies": { "exsolve": "^1.0.8", "knitwork": "^1.3.0", "magic-string": "^0.30.21", "mlly": "^1.8.0", "pathe": "^2.0.3", "pkg-types": "^2.3.0" } }, "sha512-keBgTSfp3r6+s9ZcSma+0chwxQdmLbB5+dAD9vjtB21UTMYuKAxHXCU1K2CbCtnP09EaWeRvACnXk0EJtUx+hw=="], - "update-browserslist-db": ["update-browserslist-db@1.1.4", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A=="], + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], "uqr": ["uqr@0.1.2", "", {}, "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA=="], @@ -1851,21 +1847,21 @@ "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], - "vinxi": ["vinxi@0.5.8", "", { "dependencies": { "@babel/core": "^7.22.11", "@babel/plugin-syntax-jsx": "^7.22.5", "@babel/plugin-syntax-typescript": "^7.22.5", "@types/micromatch": "^4.0.2", "@vinxi/listhen": "^1.5.6", "boxen": "^8.0.1", "chokidar": "^4.0.3", "citty": "^0.1.6", "consola": "^3.4.2", "crossws": "^0.3.4", "dax-sh": "^0.43.0", "defu": "^6.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.25.3", "get-port-please": "^3.1.2", "h3": "1.15.3", "hookable": "^5.5.3", "http-proxy": "^1.18.1", "micromatch": "^4.0.8", "nitropack": "^2.11.10", "node-fetch-native": "^1.6.6", "path-to-regexp": "^6.2.1", "pathe": "^1.1.1", "radix3": "^1.1.2", "resolve": "^1.22.10", "serve-placeholder": "^2.0.1", "serve-static": "^1.15.0", "tinyglobby": "^0.2.14", "ufo": "^1.6.1", "unctx": "^2.4.1", "unenv": "^1.10.0", "unstorage": "^1.16.0", "vite": "^6.3.3", "zod": "^3.24.3" }, "bin": { "vinxi": "bin/cli.mjs" } }, "sha512-1pGA+cU1G9feBQ1sd5FMftPuLUT8NSX880AvELhNWqoqWhe2jeSOQxjDPxlA3f1AC+Bbknl4UPKHyVXmfLZQjw=="], + "vinxi": ["vinxi@0.5.11", "", { "dependencies": { "@babel/core": "^7.22.11", "@babel/plugin-syntax-jsx": "^7.22.5", "@babel/plugin-syntax-typescript": "^7.22.5", "@types/micromatch": "^4.0.2", "@vinxi/listhen": "^1.5.6", "boxen": "^8.0.1", "chokidar": "^4.0.3", "citty": "^0.1.6", "consola": "^3.4.2", "crossws": "^0.3.4", "dax-sh": "^0.43.0", "defu": "^6.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.25.3", "get-port-please": "^3.1.2", "h3": "1.15.3", "hookable": "^5.5.3", "http-proxy": "^1.18.1", "micromatch": "^4.0.8", "nitropack": "^2.11.10", "node-fetch-native": "^1.6.6", "path-to-regexp": "^6.2.1", "pathe": "^1.1.1", "radix3": "^1.1.2", "resolve": "^1.22.10", "serve-placeholder": "^2.0.1", "serve-static": "^1.15.0", "tinyglobby": "^0.2.14", "ufo": "^1.6.1", "unctx": "^2.4.1", "unenv": "^1.10.0", "unstorage": "^1.16.0", "vite": "^6.4.1", "zod": "^4.0.0" }, "bin": { "vinxi": "bin/cli.mjs" } }, "sha512-82Qm+EG/b2PRFBvXBbz1lgWBGcd9totIL6SJhnrZYfakjloTVG9+5l6gfO6dbCCtztm5pqWFzLY0qpZ3H3ww/w=="], "vite": ["vite@5.4.21", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw=="], - "vite-plugin-solid": ["vite-plugin-solid@2.11.10", "", { "dependencies": { "@babel/core": "^7.23.3", "@types/babel__core": "^7.20.4", "babel-preset-solid": "^1.8.4", "merge-anything": "^5.1.7", "solid-refresh": "^0.6.3", "vitefu": "^1.0.4" }, "peerDependencies": { "@testing-library/jest-dom": "^5.16.6 || ^5.17.0 || ^6.*", "solid-js": "^1.7.2", "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" }, "optionalPeers": ["@testing-library/jest-dom"] }, "sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw=="], + "vite-plugin-solid": ["vite-plugin-solid@2.11.11", "", { "dependencies": { "@babel/core": "^7.23.3", "@types/babel__core": "^7.20.4", "babel-preset-solid": "^1.8.4", "merge-anything": "^5.1.7", "solid-refresh": "^0.6.3", "vitefu": "^1.0.4" }, "peerDependencies": { "@testing-library/jest-dom": "^5.16.6 || ^5.17.0 || ^6.*", "solid-js": "^1.7.2", "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["@testing-library/jest-dom"] }, "sha512-YMZCXsLw9kyuvQFEdwLP27fuTQJLmjNoHy90AOJnbRuJ6DwShUxKFo38gdFrWn9v11hnGicKCZEaeI/TFs6JKw=="], - "vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["vite"] }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="], + "vitefu": ["vitefu@1.1.2", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0" }, "optionalPeers": ["vite"] }, "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw=="], "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], - "webidl-conversions": ["webidl-conversions@4.0.2", "", {}, "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="], + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], - "whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="], + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], @@ -1883,6 +1879,8 @@ "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="], + "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="], "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], @@ -1893,9 +1891,9 @@ "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - "yocto-queue": ["yocto-queue@1.2.1", "", {}, "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg=="], + "yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="], - "youch": ["youch@4.1.0-beta.12", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@poppinss/dumper": "^0.6.5", "@speed-highlight/core": "^1.2.9", "cookie-es": "^2.0.0", "youch-core": "^0.3.3" } }, "sha512-X+AQ2EdigcZb2h1XQmBMm19TrrfKXxEXWpnf8ThbARwiiSf/pA7MvRTCj5VHCI9z3vjJBsDeqWWyvaI9Bfp9Pg=="], + "youch": ["youch@4.1.1", "", { "dependencies": { "@poppinss/colors": "^4.1.6", "@poppinss/dumper": "^0.7.0", "@speed-highlight/core": "^1.2.14", "cookie-es": "^3.0.1", "youch-core": "^0.3.3" } }, "sha512-mxW3qiSnl+GRxXsaUMzv2Mbada1Y8CDltET9UxejDQe6DBYlSekghl5U5K0ReAikcHDi0G1vKZEmmo/NWAGKLA=="], "youch-core": ["youch-core@0.3.3", "", { "dependencies": { "@poppinss/exception": "^1.2.2", "error-stack-parser-es": "^1.0.5" } }, "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA=="], @@ -1905,13 +1903,13 @@ "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "zod-to-json-schema": ["zod-to-json-schema@3.24.6", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg=="], + "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], "zod-to-ts": ["zod-to-ts@1.2.0", "", { "peerDependencies": { "typescript": "^4.9.4 || ^5.0.2", "zod": "^3" } }, "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA=="], "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@babel/core/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + "@babel/core/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], @@ -1919,15 +1917,11 @@ "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@babel/template/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], - "@babel/template/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + "@babel/traverse/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], - "@babel/traverse/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@cloudflare/kv-asset-handler/mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], - - "@commitlint/config-validator/ajv": ["ajv@8.17.1", "", { "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-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "@commitlint/config-validator/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=="], "@commitlint/format/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], @@ -1947,8 +1941,6 @@ "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - "@parcel/watcher/detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], - "@parcel/watcher-wasm/napi-wasm": ["napi-wasm@1.1.3", "", { "bundled": true }, "sha512-h/4nMGsHjZDCYmQVNODIrYACVJ+I9KItbG+0si6W/jSjdA9JbWDoU4LLeMXVcEQGHjttI2tuXqDrbGF7qkUHHg=="], "@poppinss/dumper/supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="], @@ -1961,15 +1953,17 @@ "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], - "@tanstack/router-utils/diff": ["diff@8.0.2", "", {}, "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg=="], + "@tanstack/router-utils/diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], "@tanstack/router-utils/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + "@types/node/undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], + + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "@vercel/nft/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], @@ -1979,7 +1973,9 @@ "@vinxi/server-components/magicast": ["magicast@0.2.11", "", { "dependencies": { "@babel/parser": "^7.22.16", "@babel/types": "^7.22.17", "recast": "^0.23.4" } }, "sha512-6saXbRDA1HMkqbsvHOU6HBjCVgZT460qheRkLhJQHWAbhXoWESI3Kn/dGGXyKs15FFKR85jsUqFx2sMK0wy/5g=="], - "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], + + "archiver-utils/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], "archiver-utils/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], @@ -1993,6 +1989,8 @@ "boxen/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "c12/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], + "c12/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], "clean-regexp/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], @@ -2011,29 +2009,25 @@ "giget/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "glob/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], "globby/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "globby/unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], + "globby/unicorn-magic": ["unicorn-magic@0.4.0", "", {}, "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw=="], - "gray-matter/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + "gray-matter/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], "h3/cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="], - "hast-util-to-parse5/property-information": ["property-information@6.5.0", "", {}, "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="], - - "http-errors/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], - "http-proxy/eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], "lazystream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], - "listhen/@parcel/watcher-wasm": ["@parcel/watcher-wasm@2.5.1", "", { "dependencies": { "is-glob": "^4.0.3", "micromatch": "^4.0.5", "napi-wasm": "^1.1.0" } }, "sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw=="], + "listhen/@parcel/watcher-wasm": ["@parcel/watcher-wasm@2.5.6", "", { "dependencies": { "is-glob": "^4.0.3", "napi-wasm": "^1.1.0", "picomatch": "^4.0.3" } }, "sha512-byAiBZ1t3tXQvc8dMD/eoyE7lTXYorhn+6uVW5AC+JGI1KtJC/LvDche5cfUE+qiefH+Ybq0bUCJU0aB1cSHUA=="], - "load-yaml-file/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + "load-yaml-file/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], "log-symbols/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], @@ -2041,37 +2035,37 @@ "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], - "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], "mlly/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + "nitropack/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], + + "nitropack/citty": ["citty@0.2.1", "", {}, "sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg=="], + "nitropack/dot-prop": ["dot-prop@10.1.0", "", { "dependencies": { "type-fest": "^5.0.0" } }, "sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q=="], - "nitropack/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + "nitropack/esbuild": ["esbuild@0.27.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.4", "@esbuild/android-arm": "0.27.4", "@esbuild/android-arm64": "0.27.4", "@esbuild/android-x64": "0.27.4", "@esbuild/darwin-arm64": "0.27.4", "@esbuild/darwin-x64": "0.27.4", "@esbuild/freebsd-arm64": "0.27.4", "@esbuild/freebsd-x64": "0.27.4", "@esbuild/linux-arm": "0.27.4", "@esbuild/linux-arm64": "0.27.4", "@esbuild/linux-ia32": "0.27.4", "@esbuild/linux-loong64": "0.27.4", "@esbuild/linux-mips64el": "0.27.4", "@esbuild/linux-ppc64": "0.27.4", "@esbuild/linux-riscv64": "0.27.4", "@esbuild/linux-s390x": "0.27.4", "@esbuild/linux-x64": "0.27.4", "@esbuild/netbsd-arm64": "0.27.4", "@esbuild/netbsd-x64": "0.27.4", "@esbuild/openbsd-arm64": "0.27.4", "@esbuild/openbsd-x64": "0.27.4", "@esbuild/openharmony-arm64": "0.27.4", "@esbuild/sunos-x64": "0.27.4", "@esbuild/win32-arm64": "0.27.4", "@esbuild/win32-ia32": "0.27.4", "@esbuild/win32-x64": "0.27.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ=="], "nitropack/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], - "nitropack/magicast": ["magicast@0.5.1", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "source-map-js": "^1.2.1" } }, "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw=="], + "nitropack/magicast": ["magicast@0.5.2", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ=="], "nitropack/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "nitropack/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + "nitropack/std-env": ["std-env@4.0.0", "", {}, "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ=="], "nitropack/unenv": ["unenv@2.0.0-rc.24", "", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="], - "node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], - "normalize-package-data/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], - "nypm/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - - "open/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + "nypm/citty": ["citty@0.2.1", "", {}, "sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg=="], - "open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "nypm/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], "ora/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], @@ -2079,7 +2073,7 @@ "p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - "parse-json/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + "parse-json/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], "pkg-dir/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], @@ -2087,23 +2081,21 @@ "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], - "raw-body/iconv-lite": ["iconv-lite@0.7.0", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ=="], - "read-pkg/type-fest": ["type-fest@0.6.0", "", {}, "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="], "read-pkg-up/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], "read-pkg-up/type-fest": ["type-fest@0.8.1", "", {}, "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="], - "readdir-glob/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + "readdir-glob/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], "recast/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "regjsparser/jsesc": ["jsesc@0.5.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA=="], - "rollup-plugin-visualizer/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + "rollup-plugin-visualizer/yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="], - "router/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], + "router/path-to-regexp": ["path-to-regexp@8.4.0", "", {}, "sha512-PuseHIvAnz3bjrM2rGJtSgo1zjgxapTLZ7x2pjhzWwlp4SJQgK3f3iZIQwkpEnBaKz6seKBADpM4B4ySkuYypg=="], "simple-swizzle/is-arrayish": ["is-arrayish@0.3.4", "", {}, "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA=="], @@ -2117,35 +2109,41 @@ "strip-literal/js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + "svelte/aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="], + "tar/yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], - "tsup/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + "tsup/esbuild": ["esbuild@0.27.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.4", "@esbuild/android-arm": "0.27.4", "@esbuild/android-arm64": "0.27.4", "@esbuild/android-x64": "0.27.4", "@esbuild/darwin-arm64": "0.27.4", "@esbuild/darwin-x64": "0.27.4", "@esbuild/freebsd-arm64": "0.27.4", "@esbuild/freebsd-x64": "0.27.4", "@esbuild/linux-arm": "0.27.4", "@esbuild/linux-arm64": "0.27.4", "@esbuild/linux-ia32": "0.27.4", "@esbuild/linux-loong64": "0.27.4", "@esbuild/linux-mips64el": "0.27.4", "@esbuild/linux-ppc64": "0.27.4", "@esbuild/linux-riscv64": "0.27.4", "@esbuild/linux-s390x": "0.27.4", "@esbuild/linux-x64": "0.27.4", "@esbuild/netbsd-arm64": "0.27.4", "@esbuild/netbsd-x64": "0.27.4", "@esbuild/openbsd-arm64": "0.27.4", "@esbuild/openbsd-x64": "0.27.4", "@esbuild/openharmony-arm64": "0.27.4", "@esbuild/sunos-x64": "0.27.4", "@esbuild/win32-arm64": "0.27.4", "@esbuild/win32-ia32": "0.27.4", "@esbuild/win32-x64": "0.27.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ=="], "tsup/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], - "tsx/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], - "unenv/mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], "unimport/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], "unimport/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "unimport/unplugin": ["unplugin@3.0.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg=="], + "unplugin-utils/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "unstorage/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], + "unwasm/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], "vinxi/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], "vinxi/h3": ["h3@1.15.3", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.4", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.0", "radix3": "^1.1.2", "ufo": "^1.6.1", "uncrypto": "^0.1.3" } }, "sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ=="], - "vinxi/serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], + "vinxi/serve-static": ["serve-static@1.16.3", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "~0.19.1" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="], "vinxi/vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], - "vite/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + "vinxi/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + + "vite/postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="], "widest-line/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], @@ -2155,25 +2153,33 @@ "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "youch/cookie-es": ["cookie-es@3.1.1", "", {}, "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg=="], + "@commitlint/config-validator/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "@commitlint/top-level/find-up/locate-path": ["locate-path@7.2.0", "", { "dependencies": { "p-locate": "^6.0.0" } }, "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA=="], "@commitlint/top-level/find-up/path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="], - "@deno/shim-deno/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + "@deno/shim-deno/which/isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], + + "archiver-utils/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "archiver-utils/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], "boxen/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + "c12/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "glob/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], @@ -2187,57 +2193,55 @@ "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], - "nitropack/dot-prop/type-fest": ["type-fest@5.2.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA=="], - - "nitropack/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], + "nitropack/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], - "nitropack/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + "nitropack/dot-prop/type-fest": ["type-fest@5.5.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g=="], - "nitropack/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + "nitropack/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q=="], - "nitropack/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + "nitropack/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.4", "", { "os": "android", "cpu": "arm" }, "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ=="], - "nitropack/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + "nitropack/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.4", "", { "os": "android", "cpu": "arm64" }, "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw=="], - "nitropack/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + "nitropack/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.4", "", { "os": "android", "cpu": "x64" }, "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw=="], - "nitropack/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + "nitropack/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ=="], - "nitropack/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + "nitropack/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw=="], - "nitropack/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + "nitropack/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw=="], - "nitropack/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + "nitropack/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ=="], - "nitropack/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + "nitropack/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.4", "", { "os": "linux", "cpu": "arm" }, "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg=="], - "nitropack/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + "nitropack/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA=="], - "nitropack/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + "nitropack/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA=="], - "nitropack/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + "nitropack/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA=="], - "nitropack/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + "nitropack/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw=="], - "nitropack/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + "nitropack/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA=="], - "nitropack/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + "nitropack/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw=="], - "nitropack/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + "nitropack/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA=="], - "nitropack/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + "nitropack/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.4", "", { "os": "linux", "cpu": "x64" }, "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA=="], - "nitropack/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + "nitropack/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.4", "", { "os": "none", "cpu": "x64" }, "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg=="], - "nitropack/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + "nitropack/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ=="], - "nitropack/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + "nitropack/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g=="], - "nitropack/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + "nitropack/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg=="], - "node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + "nitropack/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw=="], - "node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + "nitropack/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.4", "", { "os": "win32", "cpu": "x64" }, "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg=="], "ora/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], @@ -2247,103 +2251,65 @@ "read-pkg-up/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], - "readdir-glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "tsup/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], - - "tsup/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], - - "tsup/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], - - "tsup/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], - - "tsup/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + "readdir-glob/minimatch/brace-expansion": ["brace-expansion@2.0.3", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA=="], - "tsup/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + "rollup-plugin-visualizer/yargs/cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], - "tsup/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + "rollup-plugin-visualizer/yargs/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - "tsup/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + "rollup-plugin-visualizer/yargs/yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], - "tsup/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], - - "tsup/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], - - "tsup/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], - - "tsup/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], - - "tsup/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], - - "tsup/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], - - "tsup/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], - - "tsup/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], - - "tsup/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], - - "tsup/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], - - "tsup/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], - - "tsup/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], - - "tsup/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "tsup/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + "string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "tsup/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + "tsup/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q=="], - "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], + "tsup/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.4", "", { "os": "android", "cpu": "arm" }, "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ=="], - "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + "tsup/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.4", "", { "os": "android", "cpu": "arm64" }, "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw=="], - "tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + "tsup/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.4", "", { "os": "android", "cpu": "x64" }, "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw=="], - "tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + "tsup/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ=="], - "tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + "tsup/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw=="], - "tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + "tsup/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw=="], - "tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + "tsup/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ=="], - "tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + "tsup/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.4", "", { "os": "linux", "cpu": "arm" }, "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg=="], - "tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + "tsup/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA=="], - "tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + "tsup/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA=="], - "tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + "tsup/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA=="], - "tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + "tsup/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw=="], - "tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + "tsup/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA=="], - "tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + "tsup/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw=="], - "tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + "tsup/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA=="], - "tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + "tsup/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.4", "", { "os": "linux", "cpu": "x64" }, "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA=="], - "tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + "tsup/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.4", "", { "os": "none", "cpu": "x64" }, "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg=="], - "tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + "tsup/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ=="], - "tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + "tsup/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g=="], - "tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + "tsup/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg=="], - "tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + "tsup/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw=="], - "tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + "tsup/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.4", "", { "os": "win32", "cpu": "x64" }, "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg=="], - "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + "unstorage/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], "vinxi/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], @@ -2379,10 +2345,16 @@ "vinxi/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + "vinxi/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + "vinxi/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + "vinxi/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], + "vinxi/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + "vinxi/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], + "vinxi/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], "vinxi/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], @@ -2393,9 +2365,9 @@ "vinxi/h3/cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="], - "vinxi/serve-static/send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], + "vinxi/serve-static/send": ["send@0.19.2", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "~0.5.2", "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "~2.4.1", "range-parser": "~1.2.1", "statuses": "~2.0.2" } }, "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg=="], - "vinxi/vite/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + "vinxi/vite/postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="], "widest-line/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], @@ -2405,20 +2377,26 @@ "@commitlint/top-level/find-up/locate-path/p-locate": ["p-locate@6.0.0", "", { "dependencies": { "p-limit": "^4.0.0" } }, "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw=="], + "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "archiver-utils/glob/minimatch/brace-expansion": ["brace-expansion@2.0.3", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA=="], + + "archiver-utils/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], "read-pkg-up/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], - "vinxi/serve-static/send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + "rollup-plugin-visualizer/yargs/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], - "vinxi/serve-static/send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + "vinxi/serve-static/send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "vinxi/serve-static/send/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], "vinxi/serve-static/send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], - "vinxi/serve-static/send/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], - "@commitlint/top-level/find-up/locate-path/p-locate/p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="], "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],