From 0ab24a47f2c0b1b4b3d6f0aaab5fb93a306cb344 Mon Sep 17 00:00:00 2001 From: Whit Waldo Date: Mon, 19 Oct 2026 02:03:18 -0500 Subject: [PATCH 1/3] Added binary store harness using in-memory component Signed-off-by: Whit Waldo --- README.md | 26 ++++ src/BinaryStoreHarness.test.ts | 212 +++++++++++++++++++++++++++++++++ src/BinaryStoreHarness.ts | 183 ++++++++++++++++++++++++++++ src/Constants.test.ts | 1 + src/Constants.ts | 1 + src/DaprContainer.ts | 29 +++++ src/index.ts | 1 + 7 files changed, 453 insertions(+) create mode 100644 src/BinaryStoreHarness.test.ts create mode 100644 src/BinaryStoreHarness.ts diff --git a/README.md b/README.md index a33babb..0128918 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,32 @@ const state = await client.state.get(storeName, "my-key"); await harness.stop(); ``` +## Dapr Binary Store Testing + +`BinaryStoreHarness` or `.withBinaryStore()` on `DaprContainer` configures a `binarystore.in-memory` component. +The Binary Store API requires Dapr 1.19 or a supporting prerelease (such as `1.19.0-rc.4`); the library's default +`1.18.4` runtime does not support it. Set `DAPR_RUNTIME_VERSION` to a supporting version or pass `daprRuntimeImage`: + +```typescript +import { BinaryStoreHarness } from "@dapr/testcontainer-node"; + +await using harness = await new BinaryStoreHarness({ + daprRuntimeImage: "daprio/daprd:1.19.0-rc.4", + binaryStoreName: "files", +}).start(); + +await harness.setBinaryFile("example.bin", Buffer.from([0, 128, 255])); +const data = await harness.getBinaryFile("example.bin"); // Buffer +await harness.deleteBinaryFile("example.bin"); +``` + +The helpers use the `v1.0-alpha1` HTTP API because the Node SDK does not yet expose Binary Store operations. +`setBinaryFile` overwrites existing files by default; pass `false` as its third argument to reject duplicates. +Missing files and failed requests throw errors containing the HTTP status and response body. +Optional `prefix`, `maxSize`, and `maxTotalSize` settings are passed to the in-memory component. +The store needs no external storage service; data is local to the sidecar and is lost when it stops. +See `src/BinaryStoreHarness.test.ts` for configuration and integration examples. + ## Dapr Workflow Testing You can use `WorkflowHarness` or `.withWorkflow()` on `DaprContainer` to test Dapr Workflows with an automated Redis actor state store, placement service, and scheduler service: diff --git a/src/BinaryStoreHarness.test.ts b/src/BinaryStoreHarness.test.ts new file mode 100644 index 0000000..764b81e --- /dev/null +++ b/src/BinaryStoreHarness.test.ts @@ -0,0 +1,212 @@ +/* +Copyright 2026 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { CommunicationProtocolEnum } from "@dapr/dapr"; +import { Network } from "testcontainers"; +import { BinaryStoreHarness, DaprComponentNames, DaprContainer, getDaprVersion } from "./index"; +import { DaprRuntimeVersionGate } from "./DaprRuntimeVersionGate"; +import { MetadataEntry } from "./MetadataEntry"; + +describe("BinaryStoreHarness", () => { + afterEach(() => jest.restoreAllMocks()); + + it("registers the default in-memory component without external storage", () => { + const harness = new BinaryStoreHarness(); + const dapr = harness.getDaprContainer(); + expect(harness.getBinaryStoreName()).toBe(DaprComponentNames.BinaryStoreComponentName); + expect(dapr.getAppName()).toBe("binarystore-app"); + expect(dapr.getRedisContainer()).toBeUndefined(); + expect(dapr.getComponents()).toEqual([ + expect.objectContaining({ name: "binarystore", type: "binarystore.in-memory", version: "v1" }), + ]); + expect(dapr.getComponents()[0].getMetadata()).toEqual([]); + }); + + it("forwards custom component and application options", () => { + const harness = new BinaryStoreHarness({ + appId: "binary-app", + appPort: 8080, + appChannelAddress: "host.testcontainers.internal", + daprLogLevel: "debug", + daprApiLoggingEnabled: true, + daprRuntimeImage: "daprio/daprd:1.19.0-rc.4", + binaryStoreName: "files", + prefix: "test-", + maxSize: "1Ki", + maxTotalSize: "8Mi", + }); + const dapr = harness.getDaprContainer(); + expect(dapr.getAppName()).toBe("binary-app"); + expect(dapr.getAppPort()).toBe(8080); + expect(dapr.getAppChannelAddress()).toBe("host.testcontainers.internal"); + expect(harness.getBinaryStoreName()).toBe("files"); + expect(dapr.getComponents()[0].getMetadata()).toEqual([ + new MetadataEntry("prefix", "test-"), + new MetadataEntry("maxSize", "1Ki"), + new MetadataEntry("maxTotalSize", "8Mi"), + ]); + }); + + it("supports direct component registration and rejects duplicate names", () => { + const dapr = new DaprContainer(); + expect(dapr.withBinaryStore()).toBe(dapr); + expect(() => dapr.withBinaryStore()).toThrow('A component named "binarystore" has already been registered'); + dapr.withBinaryStore({ binaryStoreName: "second-store" }); + expect(dapr.getComponents()).toHaveLength(2); + }); + + it.each(["", " ", ".", "..", "../files", "files\\data"])("rejects invalid store name %j", (binaryStoreName) => { + expect(() => new BinaryStoreHarness({ binaryStoreName })).toThrow("Binary store name must be"); + }); + + it("guards operations before start and permits stop before start", async () => { + const harness = new BinaryStoreHarness(); + for (const get of [ + () => harness.getStartedDaprContainer(), + () => harness.getHost(), + () => harness.getHttpPort(), + () => harness.getGrpcPort(), + () => harness.getHttpEndpoint(), + () => harness.getGrpcEndpoint(), + () => harness.createDaprClient(), + ]) { + expect(get).toThrow("BinaryStoreHarness has not been started."); + } + await expect(harness.setBinaryFile("file", Buffer.from("data"))).rejects.toThrow("has not been started"); + await expect(harness.getBinaryFile("file")).rejects.toThrow("has not been started"); + await expect(harness.deleteBinaryFile("file")).rejects.toThrow("has not been started"); + await harness.stop(); + await harness[Symbol.asyncDispose](); + }); + + it("uses raw bytes, encodes file names, and maps overwrite to PUT or POST", async () => { + const harness = new BinaryStoreHarness(); + jest.spyOn(harness, "getHttpEndpoint").mockReturnValue("http://localhost:3500"); + const fetchMock = jest.spyOn(globalThis, "fetch").mockResolvedValue(new Response(null, { status: 204 })); + const data = Buffer.from([0, 128, 255]); + await harness.setBinaryFile("folder/file 100%.bin", data); + expect(fetchMock).toHaveBeenLastCalledWith( + "http://localhost:3500/v1.0-alpha1/binarystore/binarystore/folder%2Ffile%20100%25.bin", + { method: "PUT", headers: { "Content-Type": "application/octet-stream" }, body: new Uint8Array(data) } + ); + await harness.setBinaryFile("file.bin", data, false); + expect(fetchMock).toHaveBeenLastCalledWith(expect.any(String), expect.objectContaining({ method: "POST" })); + fetchMock.mockResolvedValueOnce(new Response(data)); + expect(await harness.getBinaryFile("file.bin")).toEqual(data); + await harness.deleteBinaryFile("file.bin"); + expect(fetchMock).toHaveBeenLastCalledWith(expect.any(String), { method: "DELETE" }); + }); + + it.each(["", " ", ".", "..", "../file", "dir\\file", "/file", "dir/", "dir//file", "file?", "file#"])( + "rejects invalid file name %j", + async (fileName) => { + const harness = new BinaryStoreHarness(); + jest.spyOn(harness, "getHttpEndpoint").mockReturnValue("http://localhost:3500"); + const fetchMock = jest.spyOn(globalThis, "fetch"); + await expect(harness.getBinaryFile(fileName)).rejects.toThrow("Binary file name must be"); + expect(fetchMock).not.toHaveBeenCalled(); + } + ); + + it.each([404, 409, 413, 500])("surfaces runtime error %i with its response body", async (status) => { + const harness = new BinaryStoreHarness(); + jest.spyOn(harness, "getHttpEndpoint").mockReturnValue("http://localhost:3500"); + jest.spyOn(globalThis, "fetch").mockResolvedValue(new Response("runtime error", { status })); + await expect(harness.getBinaryFile("file")).rejects.toThrow( + `Binary store GET request failed (${status}): runtime error` + ); + }); +}); + +const itBinaryStore = DaprRuntimeVersionGate.isMinimumSatisfied("1.19.0", getDaprVersion()).isSatisfied ? it : it.skip; + +describe("Binary Store integration (requires Dapr 1.19+)", () => { + itBinaryStore( + "round-trips binary data, enforces limits, and disposes an owned network", + async () => { + const harness = new BinaryStoreHarness({ binaryStoreName: "files", maxSize: "1Ki", maxTotalSize: "4Ki" }); + try { + await harness.start(); + expect(await harness.start()).toBe(harness); + expect(harness.getHost()).toBeDefined(); + expect(harness.getHttpPort()).toBeGreaterThan(0); + expect(harness.getGrpcPort()).toBeGreaterThan(0); + expect(harness.getGrpcEndpoint()).toContain(harness.getGrpcPort().toString()); + const metadata = await fetch(`${harness.getHttpEndpoint()}/v1.0/metadata`); + expect((await metadata.json()).components).toEqual( + expect.arrayContaining([expect.objectContaining({ name: "files", type: "binarystore.in-memory" })]) + ); + const httpClient = harness.createDaprClient(); + const grpcClient = harness.createDaprClient({ communicationProtocol: CommunicationProtocolEnum.GRPC }); + await httpClient.start(); + await grpcClient.start(); + + const data = Buffer.from([0, 1, 127, 128, 254, 255]); + await harness.setBinaryFile("file.bin", data, false); + expect(await harness.getBinaryFile("file.bin")).toEqual(data); + await expect(harness.setBinaryFile("file.bin", Buffer.from("conflict"), false)).rejects.toThrow("(409)"); + expect(await harness.getBinaryFile("file.bin")).toEqual(data); + await harness.setBinaryFile("file.bin", Buffer.from("replacement")); + expect(await harness.getBinaryFile("file.bin")).toEqual(Buffer.from("replacement")); + await harness.setBinaryFile("empty.bin", Buffer.alloc(0)); + expect(await harness.getBinaryFile("empty.bin")).toEqual(Buffer.alloc(0)); + await harness.setBinaryFile("folder/file 100%.bin", data); + expect(await harness.getBinaryFile("folder/file 100%.bin")).toEqual(data); + await harness.deleteBinaryFile("folder/file 100%.bin"); + await harness.setBinaryFile("limit.bin", Buffer.alloc(1024, 255)); + expect(await harness.getBinaryFile("limit.bin")).toEqual(Buffer.alloc(1024, 255)); + await expect(harness.setBinaryFile("too-large.bin", Buffer.alloc(1025))).rejects.toThrow("(413)"); + await harness.deleteBinaryFile("file.bin"); + await expect(harness.getBinaryFile("file.bin")).rejects.toThrow("(404)"); + for (let i = 0; i < 3; i++) { + await harness.setBinaryFile(`capacity-${i}.bin`, Buffer.alloc(1024)); + } + await expect(harness.setBinaryFile("store-full.bin", Buffer.alloc(1))).rejects.toThrow("ERR_BINARY_STORE_FULL"); + await harness.deleteBinaryFile("capacity-0.bin"); + await harness.setBinaryFile("store-full.bin", Buffer.alloc(1)); + expect(await harness.getBinaryFile("store-full.bin")).toEqual(Buffer.alloc(1)); + } finally { + await harness[Symbol.asyncDispose](); + } + expect(() => harness.getStartedDaprContainer()).toThrow("has not been started"); + await harness.stop(); + }, + 120_000 + ); + + itBinaryStore( + "supports a caller-owned network and direct DaprContainer registration", + async () => { + await using network = await new Network().start(); + const stopNetwork = jest.spyOn(network, "stop"); + const harness = new BinaryStoreHarness({ network }); + try { + await harness.start(); + await harness.setBinaryFile("file", Buffer.from("test")); + } finally { + await harness.stop(); + } + expect(stopNetwork).not.toHaveBeenCalled(); + + const dapr = new DaprContainer().withNetwork(network).withBinaryStore(); + await using started = await dapr.start(); + const endpoint = `${started.getHttpEndpoint()}/v1.0-alpha1/binarystore/binarystore/direct.bin`; + const put = await fetch(endpoint, { method: "PUT", body: new Uint8Array([0, 255]) }); + expect(put.status).toBe(204); + const get = await fetch(endpoint); + expect(get.status).toBe(200); + expect(Buffer.from(await get.arrayBuffer())).toEqual(Buffer.from([0, 255])); + }, + 120_000 + ); +}); diff --git a/src/BinaryStoreHarness.ts b/src/BinaryStoreHarness.ts new file mode 100644 index 0000000..6cceb38 --- /dev/null +++ b/src/BinaryStoreHarness.ts @@ -0,0 +1,183 @@ +/* +Copyright 2026 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { CommunicationProtocolEnum, DaprClient, DaprClientOptions } from "@dapr/dapr"; +import { Network, StartedNetwork } from "testcontainers"; +import { DaprComponentNames } from "./Constants"; +import { BinaryStoreOptions, DaprContainer, StartedDaprContainer } from "./DaprContainer"; + +export type BinaryStoreHarnessOptions = BinaryStoreOptions & { + appId?: string; + appPort?: number; + appChannelAddress?: string; + daprLogLevel?: string; + daprApiLoggingEnabled?: boolean; + daprRuntimeImage?: string; + network?: StartedNetwork; +}; + +/** + * Tests Dapr's Binary Store building block using process-local, non-persistent storage. + */ +export class BinaryStoreHarness { + private network?: StartedNetwork; + private ownsNetwork = false; + private readonly daprContainer: DaprContainer; + private readonly binaryStoreName: string; + private startedDaprContainer?: StartedDaprContainer; + private daprClients: DaprClient[] = []; + + constructor(private readonly options: BinaryStoreHarnessOptions = {}) { + this.binaryStoreName = options.binaryStoreName ?? DaprComponentNames.BinaryStoreComponentName; + this.daprContainer = new DaprContainer(options.daprRuntimeImage) + .withAppName(options.appId ?? "binarystore-app") + .withDaprLogLevel(options.daprLogLevel ?? "info") + .withDaprApiLoggingEnabled(options.daprApiLoggingEnabled ?? false) + .withBinaryStore(options); + + if (options.appPort !== undefined) { + this.daprContainer.withAppPort(options.appPort); + } + if (options.appChannelAddress) { + this.daprContainer.withAppChannelAddress(options.appChannelAddress); + } + } + + public getDaprContainer(): DaprContainer { + return this.daprContainer; + } + + public getBinaryStoreName(): string { + return this.binaryStoreName; + } + + public getStartedDaprContainer(): StartedDaprContainer { + if (!this.startedDaprContainer) { + throw new Error("BinaryStoreHarness has not been started. Call start() first."); + } + return this.startedDaprContainer; + } + + public async start(): Promise { + if (this.startedDaprContainer) { + return this; + } + this.network = this.options.network ?? (await new Network().start()); + this.ownsNetwork = this.options.network === undefined; + this.daprContainer.withNetwork(this.network); + try { + this.startedDaprContainer = await this.daprContainer.start(); + } catch (error) { + await this.stop(); + throw error; + } + return this; + } + + public async stop(): Promise { + try { + try { + await Promise.all(this.daprClients.map((client) => client.stop())); + } finally { + this.daprClients = []; + if (this.startedDaprContainer) { + await this.startedDaprContainer.stop(); + this.startedDaprContainer = undefined; + } + } + } finally { + if (this.ownsNetwork && this.network) { + await this.network.stop(); + this.network = undefined; + } + } + } + + public getHost(): string { + return this.getStartedDaprContainer().getHost(); + } + + public getHttpPort(): number { + return this.getStartedDaprContainer().getHttpPort(); + } + + public getGrpcPort(): number { + return this.getStartedDaprContainer().getGrpcPort(); + } + + public getHttpEndpoint(): string { + return this.getStartedDaprContainer().getHttpEndpoint(); + } + + public getGrpcEndpoint(): string { + return this.getStartedDaprContainer().getGrpcEndpoint(); + } + + public createDaprClient(clientOptions?: Partial): DaprClient { + const started = this.getStartedDaprContainer(); + const protocol = clientOptions?.communicationProtocol ?? CommunicationProtocolEnum.HTTP; + const client = new DaprClient({ + daprHost: started.getHost(), + daprPort: (protocol === CommunicationProtocolEnum.GRPC + ? started.getGrpcPort() + : started.getHttpPort() + ).toString(), + communicationProtocol: protocol, + ...clientOptions, + }); + this.daprClients.push(client); + return client; + } + + /** Uses PUT to replace existing files, or POST to fail if a file already exists. */ + public async setBinaryFile(fileName: string, data: Uint8Array, overwrite = true): Promise { + await this.request(fileName, { + method: overwrite ? "PUT" : "POST", + headers: { "Content-Type": "application/octet-stream" }, + body: new Uint8Array(data), + }); + } + + public async getBinaryFile(fileName: string): Promise { + const response = await this.request(fileName, { method: "GET" }); + return Buffer.from(await response.arrayBuffer()); + } + + public async deleteBinaryFile(fileName: string): Promise { + await this.request(fileName, { method: "DELETE" }); + } + + public async [Symbol.asyncDispose](): Promise { + await this.stop(); + } + + private async request(fileName: string, init: RequestInit): Promise { + const endpoint = this.getHttpEndpoint(); + if ( + !fileName.trim() || + /[\\*?[\]#]/.test(fileName) || + fileName.split("/").some((segment) => !segment || segment === "." || segment === "..") + ) { + throw new Error("Binary file name must be non-empty and must not contain invalid characters or path segments."); + } + // The Node SDK does not yet expose the Binary Store API. + const response = await fetch( + `${endpoint}/v1.0-alpha1/binarystore/${encodeURIComponent(this.binaryStoreName)}/${encodeURIComponent(fileName)}`, + init + ); + if (!response.ok) { + throw new Error(`Binary store ${init.method} request failed (${response.status}): ${await response.text()}`); + } + return response; + } +} diff --git a/src/Constants.test.ts b/src/Constants.test.ts index 5c3b0f0..49d4e18 100644 --- a/src/Constants.test.ts +++ b/src/Constants.test.ts @@ -57,6 +57,7 @@ describe("Constants", () => { it("should define standard component names", () => { expect(DaprComponentNames.StateManagementComponentName).toBe("statestore"); + expect(DaprComponentNames.BinaryStoreComponentName).toBe("binarystore"); expect(DaprComponentNames.PubSubComponentName).toBe("pubsub"); expect(DaprComponentNames.ConversationComponentName).toBe("conversation"); expect(DaprComponentNames.CryptographyComponentName).toBe("cryptography"); diff --git a/src/Constants.ts b/src/Constants.ts index 0653ef3..e00dda9 100644 --- a/src/Constants.ts +++ b/src/Constants.ts @@ -68,6 +68,7 @@ export function getDaprSchedulerImage(version: string = getDaprVersion()): strin */ export const DaprComponentNames = { StateManagementComponentName: "statestore", + BinaryStoreComponentName: "binarystore", PubSubComponentName: "pubsub", ConversationComponentName: "conversation", CryptographyComponentName: "cryptography", diff --git a/src/DaprContainer.ts b/src/DaprContainer.ts index 7ca695c..a5c4068 100644 --- a/src/DaprContainer.ts +++ b/src/DaprContainer.ts @@ -38,6 +38,7 @@ import { import { DaprPlacementContainer } from "./DaprPlacementContainer"; import { DaprSchedulerContainer } from "./DaprSchedulerContainer"; import { HttpEndpoint } from "./HttpEndpoint"; +import { MetadataEntry } from "./MetadataEntry"; import { OLLAMA_DEFAULT_MODEL, OLLAMA_DEFAULT_PORT, OllamaContainer, StartedOllamaContainer } from "./OllamaContainer"; import { RABBITMQ_DEFAULT_PASSWORD, @@ -104,6 +105,13 @@ export type StateManagementOptions = { keyPrefix?: string; }; +export type BinaryStoreOptions = { + binaryStoreName?: string; + prefix?: string; + maxSize?: string; + maxTotalSize?: string; +}; + export type ActorOptions = { stateStoreName?: string; redisContainer?: RedisContainer; @@ -877,6 +885,27 @@ export class DaprContainer extends GenericContainer { return this; } + /** + * Adds an in-memory binary store. Requires a Dapr runtime supporting the Binary Store API (1.19+). + */ + withBinaryStore(options: BinaryStoreOptions = {}): this { + const name = options.binaryStoreName ?? DaprComponentNames.BinaryStoreComponentName; + if (!name.trim() || /[/\\]/.test(name) || name === "." || name === "..") { + throw new Error("Binary store name must be non-empty and must not contain path separators or dot segments."); + } + if (this.components.some((component) => component.name === name)) { + throw new Error(`A component named "${name}" has already been registered`); + } + const metadata: MetadataEntry[] = []; + for (const key of ["prefix", "maxSize", "maxTotalSize"] as const) { + const value = options[key]; + if (value !== undefined) { + metadata.push(new MetadataEntry(key, value)); + } + } + return this.withComponent(new Component(name, "binarystore.in-memory", "v1", metadata)); + } + /** * Adds a local file-based secret store to the container, writing both the * `secretstores.local.file` component and its backing JSON secrets file. diff --git a/src/index.ts b/src/index.ts index a0d58b1..22ac763 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,6 +12,7 @@ limitations under the License. */ export * from "./ActorHarness"; +export * from "./BinaryStoreHarness"; export * from "./Component"; export * from "./Configuration"; export * from "./ConversationHarness"; From 0a53e07f4ba102c0a01f7ef60334e7e514bd0cd0 Mon Sep 17 00:00:00 2001 From: Whit Waldo Date: Mon, 19 Oct 2026 02:08:56 -0500 Subject: [PATCH 2/3] Updating package for google-protobuf to address vulnerability Signed-off-by: Whit Waldo --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 6150dca..2eaaa7e 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "dependencies": { "@dapr/dapr": "^3.18.0", "testcontainers": "^11.11.0", - "yaml": "^2.9.1" + "yaml": "^2.9.1", + "google-protobuf": "^4.0.3" }, "devDependencies": { "@types/body-parser": "^1.19.6", From ace119062ffac0af050117283dc5c17126a89ffa Mon Sep 17 00:00:00 2001 From: Whit Waldo Date: Mon, 19 Oct 2026 02:11:26 -0500 Subject: [PATCH 3/3] Updating lock file with updated packages Signed-off-by: Whit Waldo --- package-lock.json | 408 +++++++++++++++++++++++++--------------------- 1 file changed, 220 insertions(+), 188 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5f8ac03..0d31849 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@dapr/dapr": "^3.18.0", + "google-protobuf": "^4.0.3", "testcontainers": "^11.11.0", "yaml": "^2.9.1" }, @@ -235,15 +236,15 @@ } }, "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.10.tgz", + "integrity": "sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" + "@babel/types": "^7.29.8" }, "engines": { "node": ">=6.9.0" @@ -539,9 +540,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.10.tgz", + "integrity": "sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==", "dev": true, "license": "MIT", "peer": true, @@ -549,7 +550,7 @@ "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", + "@babel/parser": "^7.29.9", "@babel/template": "^7.29.7", "@babel/types": "^7.29.8", "debug": "^4.3.1" @@ -588,9 +589,9 @@ "peer": true }, "node_modules/@bufbuild/protobuf": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.15.0.tgz", - "integrity": "sha512-DAheWUkVr/SJTWCc+lg9dhY0eN4SaWlf4+bG1KzHeXbnqt0AfB/NX0Z+VunGlM1ki1B4zVvye27MpKh/svySUA==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.16.0.tgz", + "integrity": "sha512-FWa0sPlqYGJgpTs6OxBRcL/AW4JT0OIO+W1ajerluoTVh8CV0B7XM1qsNCRgnkSCkRCgOICKHRQlY17jrsm0+Q==", "license": "(Apache-2.0 AND BSD-3-Clause)" }, "node_modules/@connectrpc/connect": { @@ -796,6 +797,12 @@ "node": ">= 0.6" } }, + "node_modules/@dapr/dapr/node_modules/google-protobuf": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.4.tgz", + "integrity": "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==", + "license": "(BSD-3-Clause AND Apache-2.0)" + }, "node_modules/@dapr/dapr/node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -960,6 +967,23 @@ "google-protobuf": "^3.21.2" } }, + "node_modules/@dapr/durabletask-js/node_modules/google-protobuf": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.4.tgz", + "integrity": "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==", + "license": "(BSD-3-Clause AND Apache-2.0)" + }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz", + "integrity": "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/JounQin" + } + }, "node_modules/@emnapi/core": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", @@ -1102,9 +1126,9 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.14.5", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.5.tgz", - "integrity": "sha512-7VZM+SVdEcUUqSQeNI3zM8Qs/BhQKZndPo2h5VkYkAM8Iz0wJIa8mKV5ekQGqG8UUsnkQ0NMxIxwkIHYvj0qOw==", + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.6.tgz", + "integrity": "sha512-SgC/B3/VZ8lTyOZ4Cwk6f1skWhmkNAaVfiX90qd5u1rRXGKk1//8FTUEN9GvOUq7rfWIqAYkA3CoyumYVpOS6g==", "license": "Apache-2.0", "dependencies": { "@grpc/proto-loader": "^0.8.0", @@ -1616,9 +1640,9 @@ }, "node_modules/@jest/react-is-19": { "name": "react-is", - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.3.0.tgz", - "integrity": "sha512-UpMYezM4v5/18F28aC66AEsjXIgE02kyEMH6yLdgLXu/UTfa1Ntwck/nNLrbqJsEXW7gPb0coNO9FQse9WTovA==", + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.3.1.tgz", + "integrity": "sha512-RRieF6IyxQBkcK6pP8xOHprLTPW6QjRkbGdImtqNme+/hYVwCZkLQLdlZGOhUqXwkS9IEynaGvPJtv6XB/cz0Q==", "dev": true, "license": "MIT" }, @@ -1881,9 +1905,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz", - "integrity": "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.5.tgz", + "integrity": "sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA==", "dev": true, "license": "MIT", "optional": true, @@ -2461,9 +2485,9 @@ } }, "node_modules/@types/dockerode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-4.0.1.tgz", - "integrity": "sha512-cmUpB+dPN955PxBEuXE3f6lKO1hHiIGYJA46IVF3BJpNsZGvtBDcRnlrHYHtOH/B6vtDOyl2kZ2ShAu3mgc27Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-4.0.2.tgz", + "integrity": "sha512-hA4myZ0XzwHG/p/eCLElYsQS3y1XZfvi6AfLFKVp1SNpPkO6J3xLatacAFVkReTxXRoIa3eHJmhJi9w6I3+zNA==", "license": "MIT", "dependencies": { "@types/docker-modem": "*", @@ -2548,9 +2572,9 @@ } }, "node_modules/@types/node": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.3.tgz", - "integrity": "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==", + "version": "26.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.5.tgz", + "integrity": "sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg==", "license": "MIT", "dependencies": { "undici-types": "~8.9.0" @@ -2659,17 +2683,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.70.1.tgz", - "integrity": "sha512-nDNrUQ/4ruSNYbu749TRY7cfrzPtoLHEXSNBI8aaNY32LlZCajixqRf3FqcKC4p5Cam4VOHYx/t+i5+nKXvrqA==", + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.71.2.tgz", + "integrity": "sha512-K72/pvT7qpm8q3k8G5u93NCSN1RcLxX5h7Gw0bQpbMXviBHeY6Nx1WEwmk9wP+eKTSQ8ecxvcgt/ZX/rB938xQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.70.1", - "@typescript-eslint/type-utils": "8.70.1", - "@typescript-eslint/utils": "8.70.1", - "@typescript-eslint/visitor-keys": "8.70.1", + "@typescript-eslint/scope-manager": "8.71.2", + "@typescript-eslint/type-utils": "8.71.2", + "@typescript-eslint/utils": "8.71.2", + "@typescript-eslint/visitor-keys": "8.71.2", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -2682,22 +2706,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.70.1", + "@typescript-eslint/parser": "^8.71.2", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.70.1.tgz", - "integrity": "sha512-nO974WLllwhSFWQXnMLj6nDGa8f0khKEz1JzpPJ1u7Vm/4X1X6ZHajpoknU4bb41vJyMB0HHVyS2GqdhWfIXZw==", + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.71.2.tgz", + "integrity": "sha512-aTtmZjp/x3gsGHkDs04/1I8kNogBJkpQaeGaN0PfiG43NzDEmW2n+OP5im9wfsvyX0yP1UZWBrAGtDBfH9jEVw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.70.1", - "@typescript-eslint/types": "8.70.1", - "@typescript-eslint/typescript-estree": "8.70.1", - "@typescript-eslint/visitor-keys": "8.70.1", + "@typescript-eslint/scope-manager": "8.71.2", + "@typescript-eslint/types": "8.71.2", + "@typescript-eslint/typescript-estree": "8.71.2", + "@typescript-eslint/visitor-keys": "8.71.2", "debug": "^4.4.3" }, "engines": { @@ -2713,14 +2737,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.70.1.tgz", - "integrity": "sha512-62xOgboPfwc3/IgPSX/W6oQR3ZbF04194FPGUGH8HL8iLFHbt/456/8Ph1wLNUgVF+s94FlHoipBsz+v7+LMnA==", + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.71.2.tgz", + "integrity": "sha512-Pd68GsLVh5ZXlcEccFPdhSOvtHZ/2WU0XsA8zmXOS3F158lVlcTLhfQ6qvtL1RzbMie0Kp8xtbVwAg4nejKPHw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.70.1", - "@typescript-eslint/types": "^8.70.1", + "@typescript-eslint/tsconfig-utils": "^8.71.2", + "@typescript-eslint/types": "^8.71.2", "debug": "^4.4.3" }, "engines": { @@ -2735,14 +2759,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.70.1.tgz", - "integrity": "sha512-Pa0EeSeAusQc1WbjQMac+YfenewYTBu0KjgYvkUKwhXaHUKbFog23Dm/rp0DX/6tyYOQ3Xl1a+3EcFNZynGHCw==", + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.71.2.tgz", + "integrity": "sha512-YF4wgg5iUX5Obywoac27B56FhozMNFhdJSbh11H5GBAwmBtfyRhmgTQqW9tRNNmHDvsZ2CX6UGzoz+YfYn2Leg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.70.1", - "@typescript-eslint/visitor-keys": "8.70.1" + "@typescript-eslint/types": "8.71.2", + "@typescript-eslint/visitor-keys": "8.71.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2753,9 +2777,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.70.1.tgz", - "integrity": "sha512-jumze1fPI+sDOaM2TWGQdn39PDxTr7TZGeuyLkAbNyx2vtMT3uRnVKChN0hfht5V2TugphJzF6bYXvBcE09qqg==", + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.71.2.tgz", + "integrity": "sha512-jz49TAWokm/7yWD9/o837nYax9DyALxIPOImdImvVzo6canBCZYzin8zJyqNR5k1j9K1DE0bVvr0XYB+99uAdg==", "dev": true, "license": "MIT", "engines": { @@ -2770,15 +2794,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.70.1.tgz", - "integrity": "sha512-7zKTnyvaVWqzLZHPFQtX1hVHqgkMC+WebPWakNCSyrQVbIP1AM0L0TlBZtACldIRb6PptI8Odk+jyZ5kP3B1VA==", + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.71.2.tgz", + "integrity": "sha512-cC8UaalCViJkb3rH/xLIvidEwoFRtMZMUqDjjJMGEKaTFwYRHYBcoczlEGHuvkHEO8svRDrgZ0yQgOArFmwang==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.70.1", - "@typescript-eslint/typescript-estree": "8.70.1", - "@typescript-eslint/utils": "8.70.1", + "@typescript-eslint/types": "8.71.2", + "@typescript-eslint/typescript-estree": "8.71.2", + "@typescript-eslint/utils": "8.71.2", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -2795,9 +2819,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.70.1.tgz", - "integrity": "sha512-Dm1ypdhhrGCTyyehxElhgJ6kgk8MVCv5qXdoOVqPr1uqk42jX8KjrZqhROvdShczA8qrDoYiOWn1ykWlx2k81Q==", + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.71.2.tgz", + "integrity": "sha512-y5Ukl3oVp7e/VGxqIoEXoeb/Roj71PAJ4WG/N/RGj+eeDvKRLM15kGr9MijLbN0i03S52zxu31Z98E5gWChJKw==", "dev": true, "license": "MIT", "engines": { @@ -2809,16 +2833,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.70.1.tgz", - "integrity": "sha512-TU8PwyGN0PQJUcE96mw8eCQ44SmxGdQlJmlWakHaHQ15eIuuvye5yNtmh/i6oS88jzXVQB71xdNkbkB/fMwL0g==", + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.71.2.tgz", + "integrity": "sha512-DgNOEsl4pdYzwSL+N/Cl33tX1Hlw3FvId73LnKXfq7jnrF2viOEn7X+P7RBkkSWCVm92gnWd28GIC5vJuLREeA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.70.1", - "@typescript-eslint/tsconfig-utils": "8.70.1", - "@typescript-eslint/types": "8.70.1", - "@typescript-eslint/visitor-keys": "8.70.1", + "@typescript-eslint/project-service": "8.71.2", + "@typescript-eslint/tsconfig-utils": "8.71.2", + "@typescript-eslint/types": "8.71.2", + "@typescript-eslint/visitor-keys": "8.71.2", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -2837,16 +2861,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.70.1.tgz", - "integrity": "sha512-Esgul8MsnKnRLdYU2Eb2cRV9bS5HJYtKj1ByJnOzzG2M58DGdSUQ1jUuILxipqcpB2h9WLrbD5GijIWUjX/Tqw==", + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.71.2.tgz", + "integrity": "sha512-RyKa1G1M9rKHDhrk+HJtiF1MvLD5Ux2JW3TSkzw+02pRALdpJb+QzG1Y5em+LvCgzGwgg8H7mBRFKljNz7ImPw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.70.1", - "@typescript-eslint/types": "8.70.1", - "@typescript-eslint/typescript-estree": "8.70.1" + "@typescript-eslint/scope-manager": "8.71.2", + "@typescript-eslint/types": "8.71.2", + "@typescript-eslint/typescript-estree": "8.71.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2861,13 +2885,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.70.1.tgz", - "integrity": "sha512-Vwj9lUIW5Xq3wQ9w6gv3R86g1hMK8f2zNOdGTAgeXUMMXFK78G9ruCjjqutHMNJc0+CH7LYRnHeUB9IT8wFmcw==", + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.71.2.tgz", + "integrity": "sha512-zozlN0UA32bSG2zkKAgQyRYSbEISVoyU6vvkKYo2aSny74D8Jh4e+POkJ6Lk0dlezZi5x7TtD+88Xb06IB8nhg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.70.1", + "@typescript-eslint/types": "8.71.2", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -3290,9 +3314,9 @@ } }, "node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.19.0.tgz", + "integrity": "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==", "dev": true, "license": "MIT", "bin": { @@ -3600,9 +3624,9 @@ } }, "node_modules/babel-plugin-istanbul": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-8.0.0.tgz", - "integrity": "sha512-18wCskrN3DgbuBmp1gr7LBGT8xdz5xhQQqFvFhVxbkl8VBCrMKQ2YtqBWtUal1Zrc1HTuX0011+Brjw78TCFkg==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-8.0.2.tgz", + "integrity": "sha512-bXWZeWQvvCZcD2uHLWVbitr4s1+YqILBbWB/szXKtHXt6crLlD6mqxHZ0qWy2X/Xx5RtQvqqW80JHAXMlp+y1Q==", "dev": true, "license": "BSD-3-Clause", "peer": true, @@ -3705,9 +3729,9 @@ } }, "node_modules/bare-fs": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.8.2.tgz", - "integrity": "sha512-+ZI68KHMUvosXfKbg/UOHK0tbCdRnegbvPEdEcZ3Nd6TetieQsJPRXBRXPdLyy8+3VSEbPXtsumTpEtt78xv9w==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.8.4.tgz", + "integrity": "sha512-MPC2eyrpbk3A873sK4y6rk+Iv4o2enxTjHZ8zH3HO0mjrpm5XjnguY2XmfidIsDV6vnjpbMBKUAJpV0ISD2SsQ==", "license": "Apache-2.0", "dependencies": { "bare-events": "^2.5.4", @@ -3762,9 +3786,9 @@ } }, "node_modules/bare-url": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.5.4.tgz", - "integrity": "sha512-Gxa7UVWBr0/edU1b+TJhn/AZvMQUj9OGspvYsaTYQrAbZA4BOTZGL3LiZxvD+CeMlDH4juwD84+eTAp/bLYW5g==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.5.5.tgz", + "integrity": "sha512-iM9qJCruvpt2rPaLsrumVDru9pogI7PHziHIa9kTNRFt8C8HuSa+kI9kFezK+NvHEFnnz71rKGZ1EAilq/3V/Q==", "license": "Apache-2.0", "dependencies": { "bare-path": "^3.0.0" @@ -3791,9 +3815,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.26", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.26.tgz", - "integrity": "sha512-GLQdD3y6UF8iVuMJl5fHgE4jdn/ua7n+toKfLgNlg3BqQtOZjpy68T8Tup8/wGWZCDlm7KMg7tPb4MPn7oN0TQ==", + "version": "2.11.29", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.29.tgz", + "integrity": "sha512-YeesxhUmR4h5y5V8KF8iBCqJb8YFrBJ++XBTeGcWIaQOYXGN19JM0FoiOjAhwuDoln8owMgXcWBmgHtYSkky2w==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -3910,9 +3934,9 @@ } }, "node_modules/browserslist": { - "version": "4.29.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.2.tgz", - "integrity": "sha512-/u9r8k8ue4ZhHCw9ovDtltpWdXeXzjhdxCGj6vm1RGLPXb8lu33EMdoCHF5Sx8oYBS+Q/FYYNmAqlHncxR3RmA==", + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.3.tgz", + "integrity": "sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==", "dev": true, "funding": [ { @@ -3932,7 +3956,7 @@ "peer": true, "dependencies": { "baseline-browser-mapping": "^2.11.26", - "caniuse-lite": "^1.0.30001812", + "caniuse-lite": "^1.0.30001813", "electron-to-chromium": "^1.5.439", "node-releases": "^2.0.57", "update-browserslist-db": "^1.3.3" @@ -3958,11 +3982,11 @@ } }, "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.2.tgz", + "integrity": "sha512-V2o8YS2EhrKMO9AumnkK0ynynfFlsajpYupwq7S46H5mhcanwxDkNTw3K67wPIcKTH1ffkA4vhMOtAc7gRmPZw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "peer": true, "dependencies": { "node-int64": "^0.4.0" @@ -4079,9 +4103,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001813", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001813.tgz", - "integrity": "sha512-zfjJo4rM0+fUomGDBW/xcDjhIwz/210DGvip2MAMDZ8KHcRPnOHmEgHPZP0UHlZoxr8fYKVJOqcORhYQcG4FKQ==", + "version": "1.0.30001816", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001816.tgz", + "integrity": "sha512-+8Yx7BXCoqk6IF8yTicjfUR6D/ldJzdlsodlEOiOSPmhK844WIgk67/zIQaGAOxNkZyyvBlrRFnLvqKIoqbAFw==", "dev": true, "funding": [ { @@ -4151,9 +4175,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.1.tgz", - "integrity": "sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.3.0.tgz", + "integrity": "sha512-lmNyBzi6iYiqyrExTctfmjd8tInx+dHu9PBomTfH5RXS53c27JMFJgzNv5TyAnm3PgGf+MLy0+Ws41/HlVxdKQ==", "dev": true, "license": "MIT", "peer": true @@ -4246,9 +4270,9 @@ "license": "MIT" }, "node_modules/content-disposition": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", - "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-2.0.1.tgz", + "integrity": "sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==", "dev": true, "license": "MIT", "engines": { @@ -4631,9 +4655,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.439", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.439.tgz", - "integrity": "sha512-qu6QIPXhsb+CRcAiTMNjR4A1y/7tCYKkKjr5CZXRVih6qkDf79peZ2BpEU3qoDBNCRrcy3Mra3X9nG5oruuA7Q==", + "version": "1.5.459", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.459.tgz", + "integrity": "sha512-4SC9HHSFjO/liAhifpdOL5hG9b4BP7/5G3y3UPZVO8trlAXr1CaUEEJL0gWK3kOcYcZrOA5rkwG45Gra/lTIgg==", "dev": true, "license": "ISC", "peer": true @@ -4852,14 +4876,14 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.5.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.6.tgz", - "integrity": "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==", + "version": "5.5.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.7.tgz", + "integrity": "sha512-WjHyn3GrFd+ZR0rzsLiM4zJZ35PZMOE0SUIxzGmnWNG0126yNfJKJzObmmkYDwHJfGlkz3PSlzyG9ez/LJntwg==", "dev": true, "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.1", - "synckit": "^0.11.13" + "synckit": "^0.12.3" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -5123,16 +5147,16 @@ } }, "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.3.0.tgz", + "integrity": "sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==", "dev": true, "license": "MIT", "dependencies": { "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", + "body-parser": "^2.3.0", + "content-disposition": "^2.0.1", + "content-type": "^2.0.0", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", @@ -5148,14 +5172,14 @@ "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", + "proxy-addr": "^2.0.8", + "qs": "^6.16.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", + "type-is": "^2.1.0", "vary": "^1.1.2" }, "engines": { @@ -5166,16 +5190,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/express/node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5230,14 +5244,14 @@ } }, "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.4.tgz", + "integrity": "sha512-tGQtaoYisPDriJBN0mT5yZSyNETnJGA1gTYxaVRAE5KUO3LI9kPUc9WIu8JXcxaIci+faIKlzXqXyPgrmubtBQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "peer": true, "dependencies": { - "bser": "2.1.1" + "bser": "2.1.2" } }, "node_modules/fdir": { @@ -5581,9 +5595,9 @@ } }, "node_modules/google-protobuf": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.4.tgz", - "integrity": "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-4.0.3.tgz", + "integrity": "sha512-DI6iiRmF8fE/EzvGK5F9b8RxZeumHC2AAhi3xwOEh+GT5eRhJeW1aOtkDxn0W7cVCFQAtwK+ZDwIO1BYz+9WMA==", "license": "(BSD-3-Clause AND Apache-2.0)" }, "node_modules/gopd": { @@ -5612,13 +5626,13 @@ "license": "MIT" }, "node_modules/handlebars": { - "version": "4.7.9", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", - "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "version": "4.7.10", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.10.tgz", + "integrity": "sha512-P5VJMVM7qgBn6vjXMw8WG9uVI+ncf2pi72j4de4yz5ZULLj2RGqLYaKOYGsgyrViQ0tePOVlN1tDCCXXtFqXKg==", "dev": true, "license": "MIT", "dependencies": { - "minimist": "^1.2.5", + "minimist": "^1.2.8", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" @@ -5786,9 +5800,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.10.tgz", - "integrity": "sha512-HpbUakT7xp5miBUywCHf36ZEuAJNklBJDDsGpUIjMzOSmM8ELSfA9Sa/QDPeNeqeoN31u+UTCkL4klCOVvRm4Q==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.12.tgz", + "integrity": "sha512-/8UvqAPU9DGTI9k4mxtf49U37Isfwr8Uts96+SBHIkFxPJnHS0Ew4f00sM4Scd8V8EjM0jUNtVDdv1kPdt35lg==", "dev": true, "license": "MIT", "engines": { @@ -6528,6 +6542,23 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/jest-snapshot/node_modules/synckit": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", + "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@pkgr/core": "^0.3.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, "node_modules/jest-util": { "version": "30.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.5.1.tgz", @@ -7055,9 +7086,9 @@ "license": "MIT" }, "node_modules/nan": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.29.0.tgz", - "integrity": "sha512-GlGk3HIvitbvs+LT3g6XUP1kpirKNvmDFwF/bmo6XNWSb/eYEs/O4bfgIEIXCZ+lIOTS5xNwDvSGMw6FJdAhtA==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.30.0.tgz", + "integrity": "sha512-P5mokDkSvCGBz6mZDD/2l+w9QoICRXdCyZ9ONGmTePr40oihJg3Kpn0YU3twKd6PJnwSlLBWNQeOT6yWEV2c4A==", "license": "MIT", "optional": true }, @@ -7146,9 +7177,9 @@ "peer": true }, "node_modules/node-releases": { - "version": "2.0.57", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.57.tgz", - "integrity": "sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==", + "version": "2.0.59", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.59.tgz", + "integrity": "sha512-5qr2okC4ItAI0hG5SaV0HoYMpnM/Y6+Oqr7AmPYy/2uEoGvS+GbSKLeRxSS1uAdu59yz0ouzcuXievSgg///WA==", "dev": true, "license": "MIT", "peer": true, @@ -7559,9 +7590,9 @@ } }, "node_modules/prettier": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.9.tgz", - "integrity": "sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.10.tgz", + "integrity": "sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==", "dev": true, "license": "MIT", "bin": { @@ -7738,9 +7769,9 @@ "peer": true }, "node_modules/qs": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.0.tgz", - "integrity": "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==", + "version": "6.16.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.1.tgz", + "integrity": "sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==", "license": "BSD-3-Clause", "dependencies": { "es-define-property": "^1.0.1", @@ -7805,9 +7836,9 @@ } }, "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.8.0.tgz", + "integrity": "sha512-2jhTTU3Eilp/2DMT71gbcoqC35eQHasMJH0RHkYxwlxIv3+FR6Y5xAFZIwEGLxKkjZYEFlsiMNIdwUqjK2lLHQ==", "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", @@ -8492,12 +8523,13 @@ } }, "node_modules/synckit": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", - "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.12.3.tgz", + "integrity": "sha512-U+/AXT6LWsxnj2vz9HeUuPWBNgdWxjyIEjEPdbJARC9txmgPzo2VEdqnFo4hHaNyMPtycyVJrSaQYeQv/PoyyA==", "dev": true, "license": "MIT", "dependencies": { + "@dual-bundle/import-meta-resolve": "^4.2.1", "@pkgr/core": "^0.3.6" }, "engines": { @@ -8522,15 +8554,15 @@ } }, "node_modules/tar-stream": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.1.tgz", - "integrity": "sha512-nqsEO8zLZJvrOMdEwkA0QdCLFbetHMn95Zqu4fKwX+hkaTWJPZZOrxx/PwtxoK0MMGQmBQNRW3CPs8IFYQz4cQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.2.tgz", + "integrity": "sha512-+8NeqHRjQWH9nYlwo2gamAMImZCVzI4UoEgDpWorBt9OEfppiZn+uSkskzQKPWIZyji/C8fpWO7u69G0DX0tbg==", "license": "MIT", "dependencies": { - "b4a": "^1.6.4", - "bare-fs": "^4.5.5", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "b4a": "^1.9.0", + "bare-fs": "^4.8.2", + "fast-fifo": "^1.3.2", + "streamx": "^2.28.1" } }, "node_modules/teex": { @@ -8737,15 +8769,15 @@ } }, "node_modules/ts-jest": { - "version": "29.4.14", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.14.tgz", - "integrity": "sha512-+943G6wCX5E3VpzTQhBGBFntCmdT+QAkTvUlp03edTONFBvqskuXPhpyX16xdUotO4P5HQKyppldSWjocoltLQ==", + "version": "29.4.15", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.15.tgz", + "integrity": "sha512-s2qmEUYFRqbjz1wv0EmccNPVOb45HOFpFuhzQJLKShYVisuTbCFPIIAIV2EuK5rIxb4BejLDbH7dnBZfYjybUQ==", "dev": true, "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.9", + "handlebars": "^4.7.10", "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", @@ -8899,9 +8931,9 @@ } }, "node_modules/undici": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.30.0.tgz", - "integrity": "sha512-dkrQXeHSaoamnItlYbmzG0wFYrM0ZwDxCIg0A7aKjTyyhh9svRzCNFEzV+Vm05/yehjCzjDZ31KXfGEjYSztDQ==", + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.30.1.tgz", + "integrity": "sha512-03KrMbjIFDWQR5RNPrSw3bd1r12JpyFQl9/yxjUbJtqkjmllqC5lFjZh6ujeuJCKr8EOQvRW872Oy/az+nLYxg==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -8962,9 +8994,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", - "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz", + "integrity": "sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==", "dev": true, "funding": [ {