diff --git a/.changeset/v1-assetsignore-runtime.md b/.changeset/v1-assetsignore-runtime.md new file mode 100644 index 00000000000..5ff81cde91e --- /dev/null +++ b/.changeset/v1-assetsignore-runtime.md @@ -0,0 +1,9 @@ +--- +"@cloudflare/vite-plugin": minor +--- + +Validate asset ignore files and update local Flagship support + +Upgrade Miniflare to 5.20261023.2-beta and Wrangler to 4.155.0. Builds and asset manifest generation now reject `.assetsignore` files with invalid UTF-8 or null characters instead of silently ignoring their patterns. The Local Explorer also supports Flagship management by app ID, and local flag evaluations retain metadata. + +Miniflare also waits for temporary file cleanup before disposal completes, so closing or restarting a Vite dev server finishes cleanup before returning. diff --git a/fixtures/dev-registry/package.json b/fixtures/dev-registry/package.json index 351dbae36c0..ba2d254fb16 100644 --- a/fixtures/dev-registry/package.json +++ b/fixtures/dev-registry/package.json @@ -16,6 +16,6 @@ "typescript": "catalog:default", "vite": "catalog:default", "vitest": "catalog:default", - "wrangler": "4.154.0" + "wrangler": "4.155.0" } } diff --git a/fixtures/shared/package.json b/fixtures/shared/package.json index 6923bcf5961..09da8c39861 100644 --- a/fixtures/shared/package.json +++ b/fixtures/shared/package.json @@ -3,7 +3,7 @@ "private": true, "description": "Shared fixtures for testing", "devDependencies": { - "@cloudflare/workers-utils": "0.49.0", - "wrangler": "4.154.0" + "@cloudflare/workers-utils": "0.50.0", + "wrangler": "4.155.0" } } diff --git a/packages/mock-npm-registry/package.json b/packages/mock-npm-registry/package.json index 71ff683c255..cafd3c3632e 100644 --- a/packages/mock-npm-registry/package.json +++ b/packages/mock-npm-registry/package.json @@ -19,7 +19,7 @@ "test:ci": "vitest run" }, "devDependencies": { - "@cloudflare/workers-utils": "0.49.0", + "@cloudflare/workers-utils": "0.50.0", "@types/node": "catalog:default", "@verdaccio/types": "^10.8.0", "get-port": "^7.0.0", diff --git a/packages/remote-bindings/package.json b/packages/remote-bindings/package.json index 61ac6e6bf01..16c05763c73 100644 --- a/packages/remote-bindings/package.json +++ b/packages/remote-bindings/package.json @@ -31,12 +31,12 @@ "test:watch": "vitest" }, "dependencies": { - "@cloudflare/cli-shared-helpers": "0.2.7", - "@cloudflare/deploy-helpers": "0.24.1", + "@cloudflare/cli-shared-helpers": "0.2.10", + "@cloudflare/deploy-helpers": "0.24.2", "@cloudflare/workers-auth": "0.15.1", - "@cloudflare/workers-utils": "0.49.0", + "@cloudflare/workers-utils": "0.50.0", "chalk": "catalog:default", - "miniflare": "5.20261023.1-beta", + "miniflare": "5.20261023.2-beta", "undici": "catalog:default", "ws": "catalog:default" }, diff --git a/packages/vite-plugin-cloudflare/e2e/fixtures/remote-bindings-config-account-id/package.json b/packages/vite-plugin-cloudflare/e2e/fixtures/remote-bindings-config-account-id/package.json index 63d04d6227e..37a39acab47 100644 --- a/packages/vite-plugin-cloudflare/e2e/fixtures/remote-bindings-config-account-id/package.json +++ b/packages/vite-plugin-cloudflare/e2e/fixtures/remote-bindings-config-account-id/package.json @@ -14,7 +14,7 @@ "@cloudflare/vite-plugin": "*", "@cloudflare/workers-types": "^5.20260706.1", "globals": "^15.14.0", - "miniflare": "5.20261023.1-beta", + "miniflare": "5.20261023.2-beta", "typescript": "~5.7.2", "vite": "^8.0.0", "wrangler": "*" diff --git a/packages/vite-plugin-cloudflare/package.json b/packages/vite-plugin-cloudflare/package.json index 715d8f1042e..37cc9cfbd13 100644 --- a/packages/vite-plugin-cloudflare/package.json +++ b/packages/vite-plugin-cloudflare/package.json @@ -46,19 +46,19 @@ }, "dependencies": { "@cloudflare/unenv-preset": "2.16.2", - "miniflare": "5.20261023.1-beta", + "miniflare": "5.20261023.2-beta", "unenv": "2.0.0-rc.24", - "wrangler": "4.154.0", + "wrangler": "4.155.0", "ws": "8.22.0" }, "devDependencies": { - "@cloudflare/containers-shared": "0.23.3", + "@cloudflare/containers-shared": "0.23.4", "@cloudflare/mock-npm-registry": "workspace:*", "@cloudflare/remote-bindings": "workspace:*", "@cloudflare/workers-shared": "workspace:*", "@cloudflare/workers-tsconfig": "workspace:*", "@cloudflare/workers-types": "5.20261023.1", - "@cloudflare/workers-utils": "0.49.0", + "@cloudflare/workers-utils": "0.50.0", "@remix-run/node-fetch-server": "1.0.0", "@types/node": "22.15.17", "@types/semver": "7.8.0", @@ -82,7 +82,7 @@ }, "peerDependencies": { "vite": "^6.1.0 || ^7.0.0 || ^8.0.0", - "wrangler": "^4.154.0" + "wrangler": "^4.155.0" }, "workers-sdk": { "prerelease": true diff --git a/packages/vite-plugin-cloudflare/playground/prisma/package.json b/packages/vite-plugin-cloudflare/playground/prisma/package.json index 9fe8acb965f..5df0498cb1d 100644 --- a/packages/vite-plugin-cloudflare/playground/prisma/package.json +++ b/packages/vite-plugin-cloudflare/playground/prisma/package.json @@ -16,7 +16,7 @@ "@cloudflare/vite-plugin": "workspace:*", "@cloudflare/workers-tsconfig": "workspace:*", "@cloudflare/workers-types": "catalog:default", - "@cloudflare/workers-utils": "0.49.0", + "@cloudflare/workers-utils": "0.50.0", "@prisma/adapter-d1": "^7.0.0", "@prisma/client": "^7.0.0", "prisma": "^7.0.0", diff --git a/packages/vite-plugin-cloudflare/src/__tests__/output-config.spec.ts b/packages/vite-plugin-cloudflare/src/__tests__/output-config.spec.ts index 89fc42ca97f..d0df89a8f30 100644 --- a/packages/vite-plugin-cloudflare/src/__tests__/output-config.spec.ts +++ b/packages/vite-plugin-cloudflare/src/__tests__/output-config.spec.ts @@ -2,10 +2,11 @@ import * as fs from "node:fs"; import * as os from "node:os"; import * as path from "node:path"; import { removeDirSync } from "@cloudflare/workers-utils"; +import * as vite from "vite"; import { describe, onTestFinished, test } from "vitest"; +import { cloudflare } from "../index"; import { getOutputConfig } from "../plugins/output-config"; import type { ResolvedWorkerConfig } from "../plugin-config"; -import type * as vite from "vite"; describe("getWorkerOutputConfig", () => { function createRoot() { @@ -16,6 +17,42 @@ describe("getWorkerOutputConfig", () => { return tempRoot; } + test.for([ + ["invalid UTF-8", Buffer.from([0xff, 0xfe])], + ["null characters", Buffer.from("ignored\0.txt")], + ] as const)( + "rejects source .assetsignore with %s before emitting it", + async ([, contents], { expect }) => { + const root = createRoot(); + fs.mkdirSync(path.join(root, "public")); + fs.writeFileSync(path.join(root, "public/index.html"), "

Assets

"); + fs.writeFileSync(path.join(root, "public/.assetsignore"), contents); + fs.writeFileSync( + path.join(root, "worker.js"), + 'export default { fetch() { return new Response("ready"); } };' + ); + fs.writeFileSync( + path.join(root, "wrangler.json"), + JSON.stringify({ + name: "ignore-validation", + main: "worker.js", + compatibility_date: "2026-10-23", + assets: { binding: "ASSETS" }, + }) + ); + const builder = await vite.createBuilder({ + root, + configFile: false, + logLevel: "silent", + plugins: [cloudflare({ inspectorPort: false, persistState: false })], + }); + + await expect(builder.buildApp()).rejects.toThrow( + /must be UTF-8 encoded and must not contain null characters/ + ); + } + ); + function resolvedViteConfig(root: string): vite.ResolvedConfig { return { root, diff --git a/packages/vite-plugin-cloudflare/src/plugins/output-config.ts b/packages/vite-plugin-cloudflare/src/plugins/output-config.ts index 672c1a230f1..a9132cedde5 100644 --- a/packages/vite-plugin-cloudflare/src/plugins/output-config.ts +++ b/packages/vite-plugin-cloudflare/src/plugins/output-config.ts @@ -1,6 +1,6 @@ import assert from "node:assert"; -import * as fs from "node:fs"; import * as path from "node:path"; +import { readAssetsIgnoreFile as readAssetsIgnorePatterns } from "@cloudflare/workers-shared/utils/helpers"; import * as vite from "vite"; import { MAIN_ENTRY_NAME } from "../cloudflare-environment"; import { assertIsNotPreview } from "../context"; @@ -263,9 +263,7 @@ function rewriteMigrationsPattern( } function readAssetsIgnoreFile(assetsIgnorePath: string): string { - const content = fs.existsSync(assetsIgnorePath) - ? fs.readFileSync(assetsIgnorePath, "utf-8") - : ""; + const content = readAssetsIgnorePatterns(assetsIgnorePath) ?? ""; if (content.length === 0) { return ""; } diff --git a/packages/workers-shared/utils/helpers.ts b/packages/workers-shared/utils/helpers.ts index 648c5d96e45..a23dce345be 100644 --- a/packages/workers-shared/utils/helpers.ts +++ b/packages/workers-shared/utils/helpers.ts @@ -1,5 +1,6 @@ import { readFileSync } from "node:fs"; import { isAbsolute, resolve, sep } from "node:path"; +import { TextDecoder } from "node:util"; import ignore from "ignore"; import mime from "mime"; import { @@ -62,6 +63,44 @@ export function maybeGetFile(filePath: PathOrFileDescriptor) { } } +/** An ignore file whose encoding cannot be used to match asset paths. */ +export class InvalidAssetsIgnoreError extends Error { + constructor(filePath: string) { + super( + `The .assetsignore file at "${filePath}" must be UTF-8 encoded and must not contain null characters. Save the file as UTF-8 and try again.` + ); + this.name = "InvalidAssetsIgnoreError"; + } +} + +/** + * Read ignore patterns without silently replacing undecodable characters. + * @param filePath Path to the asset ignore file. + * @returns Valid UTF-8 patterns, or undefined when the file does not exist. + */ +export function readAssetsIgnoreFile(filePath: string): string | undefined { + let contents: Buffer; + try { + contents = readFileSync(filePath); + } catch (error) { + if (thrownIsDoesNotExistError(error)) { + return; + } + throw error; + } + + try { + const text = new TextDecoder("utf-8", { fatal: true }).decode(contents); + // BOM-less UTF-16 can be valid UTF-8 bytes but cannot form usable patterns. + if (text.includes("\0")) { + throw new Error("Ignore patterns contain a null character."); + } + return text; + } catch { + throw new InvalidAssetsIgnoreError(filePath); + } +} + /** * Create a function for filtering out ignored assets. * @@ -80,7 +119,7 @@ export async function createAssetsIgnoreFunction(dir: string) { ]; let assetsIgnoreFilePresent = false; - const assetsIgnore = maybeGetFile(cfAssetIgnorePath); + const assetsIgnore = readAssetsIgnoreFile(cfAssetIgnorePath); if (assetsIgnore !== undefined) { assetsIgnoreFilePresent = true; ignorePatterns.push(...assetsIgnore.split("\n")); diff --git a/packages/workers-shared/utils/tests/helpers.test.ts b/packages/workers-shared/utils/tests/helpers.test.ts index 827f1e83031..3407ddacecb 100644 --- a/packages/workers-shared/utils/tests/helpers.test.ts +++ b/packages/workers-shared/utils/tests/helpers.test.ts @@ -3,14 +3,21 @@ import { writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { describe, it } from "vitest"; -import { createAssetsIgnoreFunction, getContentType } from "../helpers"; +import { + createAssetsIgnoreFunction, + getContentType, + InvalidAssetsIgnoreError, +} from "../helpers"; describe("assets", () => { const tmpDir = mkdtempSync(join(tmpdir(), "wrangler-tests")); describe(".assetsignore", () => { it("should ignore metafiles by default", async ({ expect }) => { - const { assetsIgnoreFunction } = await createAssetsIgnoreFunction(tmpDir); + const { assetsIgnoreFunction, assetsIgnoreFilePresent } = + await createAssetsIgnoreFunction(tmpDir); + + expect(assetsIgnoreFilePresent).toBe(false); expect(assetsIgnoreFunction(".assetsignore")).toBeTruthy(); expect(assetsIgnoreFunction("_redirects")).toBeTruthy(); @@ -52,6 +59,53 @@ describe("assets", () => { ).toBeTruthy(); expect(assetsIgnoreFunction(join("child", "nope.svg"))).toBeFalsy(); }); + + it.for(["", "\ufeff"])( + "reads UTF-8 patterns with an optional BOM (%j)", + async (bom, { expect }) => { + await writeFile( + join(tmpDir, ".assetsignore"), + `${bom}café.txt\r\nchild/*.txt\r\n!child/keep.txt\r\n` + ); + const { assetsIgnoreFunction, assetsIgnoreFilePresent } = + await createAssetsIgnoreFunction(tmpDir); + + expect(assetsIgnoreFilePresent).toBe(true); + expect(assetsIgnoreFunction("café.txt")).toBe(true); + expect(assetsIgnoreFunction("child/ignore.txt")).toBe(true); + expect(assetsIgnoreFunction("child/keep.txt")).toBe(false); + } + ); + + it.for([ + ["UTF-16 LE", Buffer.from("\ufeffignored.txt", "utf16le")], + ["UTF-16 BE", Buffer.from("\ufeffignored.txt", "utf16le").swap16()], + ["UTF-16 without a BOM", Buffer.from("ignored.txt", "utf16le")], + ["invalid UTF-8", Buffer.from([0xff])], + ["null characters", Buffer.from("ignored\0.txt")], + ] as const)( + "rejects %s instead of ignoring its patterns", + async ([, contents], { expect }) => { + await writeFile(join(tmpDir, ".assetsignore"), contents); + + await expect(createAssetsIgnoreFunction(tmpDir)).rejects.toBeInstanceOf( + InvalidAssetsIgnoreError + ); + await expect(createAssetsIgnoreFunction(tmpDir)).rejects.toThrow( + "Save the file as UTF-8 and try again." + ); + } + ); + + it("preserves an intentionally empty ignore file", async ({ expect }) => { + await writeFile(join(tmpDir, ".assetsignore"), ""); + const { assetsIgnoreFunction, assetsIgnoreFilePresent } = + await createAssetsIgnoreFunction(tmpDir); + + expect(assetsIgnoreFilePresent).toBe(true); + expect(assetsIgnoreFunction("keep.txt")).toBe(false); + expect(assetsIgnoreFunction(".assetsignore")).toBe(true); + }); }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea4a0e6d3db..f68cb0e7c1a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -195,17 +195,17 @@ importers: specifier: catalog:default version: 5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) wrangler: - specifier: 4.154.0 - version: 4.154.0(@cloudflare/workers-types@5.20261023.1)(@types/node@22.15.17) + specifier: 4.155.0 + version: 4.155.0(@cloudflare/workers-types@5.20261023.1)(@types/node@22.15.17) fixtures/shared: devDependencies: '@cloudflare/workers-utils': - specifier: 0.49.0 - version: 0.49.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) + specifier: 0.50.0 + version: 0.50.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) wrangler: - specifier: 4.154.0 - version: 4.154.0(@cloudflare/workers-types@5.20261023.1)(@types/node@22.15.17) + specifier: 4.155.0 + version: 4.155.0(@cloudflare/workers-types@5.20261023.1)(@types/node@22.15.17) packages/lint-config-shared: devDependencies: @@ -219,8 +219,8 @@ importers: packages/mock-npm-registry: devDependencies: '@cloudflare/workers-utils': - specifier: 0.49.0 - version: 0.49.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) + specifier: 0.50.0 + version: 0.50.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) '@types/node': specifier: 22.15.17 version: 22.15.17 @@ -249,23 +249,23 @@ importers: packages/remote-bindings: dependencies: '@cloudflare/cli-shared-helpers': - specifier: 0.2.7 - version: 0.2.7(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) + specifier: 0.2.10 + version: 0.2.10(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) '@cloudflare/deploy-helpers': - specifier: 0.24.1 - version: 0.24.1(@types/node@22.15.17)(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) + specifier: 0.24.2 + version: 0.24.2(@types/node@22.15.17)(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) '@cloudflare/workers-auth': specifier: 0.15.1 version: 0.15.1(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) '@cloudflare/workers-utils': - specifier: 0.49.0 - version: 0.49.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) + specifier: 0.50.0 + version: 0.50.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) chalk: specifier: catalog:default version: 5.3.0 miniflare: - specifier: 5.20261023.1-beta - version: 5.20261023.1-beta(@types/node@22.15.17) + specifier: 5.20261023.2-beta + version: 5.20261023.2-beta(@types/node@22.15.17) undici: specifier: catalog:default version: 7.30.1 @@ -304,21 +304,21 @@ importers: specifier: 2.16.2 version: 2.16.2(unenv@2.0.0-rc.24)(workerd@1.20261023.1) miniflare: - specifier: 5.20261023.1-beta - version: 5.20261023.1-beta(@types/node@22.15.17) + specifier: 5.20261023.2-beta + version: 5.20261023.2-beta(@types/node@22.15.17) unenv: specifier: 2.0.0-rc.24 version: 2.0.0-rc.24 wrangler: - specifier: 4.154.0 - version: 4.154.0(@cloudflare/workers-types@5.20261023.1)(@types/node@22.15.17) + specifier: 4.155.0 + version: 4.155.0(@cloudflare/workers-types@5.20261023.1)(@types/node@22.15.17) ws: specifier: 8.22.0 version: 8.22.0 devDependencies: '@cloudflare/containers-shared': - specifier: 0.23.3 - version: 0.23.3(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) + specifier: 0.23.4 + version: 0.23.4(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) '@cloudflare/mock-npm-registry': specifier: workspace:* version: link:../mock-npm-registry @@ -335,8 +335,8 @@ importers: specifier: 5.20261023.1 version: 5.20261023.1 '@cloudflare/workers-utils': - specifier: 0.49.0 - version: 0.49.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) + specifier: 0.50.0 + version: 0.50.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) '@remix-run/node-fetch-server': specifier: 1.0.0 version: 1.0.0 @@ -1225,8 +1225,8 @@ importers: specifier: catalog:default version: 5.20261023.1 '@cloudflare/workers-utils': - specifier: 0.49.0 - version: 0.49.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) + specifier: 0.50.0 + version: 0.50.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) '@prisma/adapter-d1': specifier: ^7.0.0 version: 7.0.1 @@ -1924,24 +1924,21 @@ packages: '@clack/core@1.2.0': resolution: {integrity: sha512-qfxof/3T3t9DPU/Rj3OmcFyZInceqj/NVtO9rwIuJqCUgh32gwPjpFQQp/ben07qKlhpwq7GzfWpST4qdJ5Drg==} - '@cloudflare/build-output-utils@0.9.5': - resolution: {integrity: sha512-/OYHkTHFTqvImsY68psI+mhjNRE4Xcsm/oUqZzFY81KufBVfeYWZGYrhsDnwarKw7cEJO/htFF/dOZtoMgWajg==} + '@cloudflare/build-output-utils@0.9.6': + resolution: {integrity: sha512-JjNSJPctyGbQn4XDXzsqy1/M/xdNAh3XRPj0c/4KY1BYCUWA/ejcrnj3nuTHyoN8Zl+RmVIThIj+am29jTV+kQ==} - '@cloudflare/cli-shared-helpers@0.2.7': - resolution: {integrity: sha512-8wq3gzObQJfhUSJBIyi9FwFVoWg01FUbHTteuy8Ehm6b1+EQ2N/16SZCjJOBA7RcwVlzJNPwCSnUtCaFkq8fMw==} + '@cloudflare/cli-shared-helpers@0.2.10': + resolution: {integrity: sha512-glYLuQlNaXcu440+mSWofXBKKtvFwqNbUIrQqRfERDrCqlLA9Om3vRe+AAgdtGgLVbhbJTB6sIH5mjwceufAuA==} - '@cloudflare/cli-shared-helpers@0.2.9': - resolution: {integrity: sha512-I1Cidx1IlJqXUCvcF8naAy+F4Z81IvsPgr9nBZTremRXeroIuq+U9SkNWZdmasT4uI2lfwL74pIkp2B358Sm1A==} + '@cloudflare/config@0.29.0': + resolution: {integrity: sha512-0sD73G6xRdz6/9DXNcAuLv6VbnNiWA09zo7VwhPyaa3ysIGvLMXJR5G19r3+iG5ZIB9ErGMwqgprVOVaYKsIpw==} - '@cloudflare/config@0.28.1': - resolution: {integrity: sha512-pQS0jJmk2grEK2XdkvJxyk8y8W607D4daOrEdv+iyqSslSLTvH7lChF/3fpCQIy//3rBLUnzanZ8rgyekbh0/g==} - - '@cloudflare/containers-shared@0.23.3': - resolution: {integrity: sha512-dT5RpbmMjh3OOgoGKVWQxsOKJ9RDYVvae9Ut5ln5mvfUfRlzqw5e7WQSF4HtVFqna975LpFyWTzpid4lUQ+rWQ==} + '@cloudflare/containers-shared@0.23.4': + resolution: {integrity: sha512-/9WBTGwl7SbW5MVv3jcYVdV5wzudsh3qLxO/pSE9Y9ZkscJ69eR0l997ZjkgefecopfO/DeonXiuWz2UD5VvGg==} engines: {node: '>=22.0.0'} - '@cloudflare/deploy-helpers@0.24.1': - resolution: {integrity: sha512-6sUukvTnkxFZ6c47E3ofBNNWZbmuMM51dGwKERvhoZfexFd7O7pgVciDczl5mPz+zSModNVAp+atWK35ov3y0g==} + '@cloudflare/deploy-helpers@0.24.2': + resolution: {integrity: sha512-7B2Na/BA9ImJ7F2sFlZaf10QgJ0e53PJoHb0iyysIoy8MUlvIYrgSUc3t9rcQsyVVnQ/N3TrXVTCOUe/L5wFHA==} '@cloudflare/kv-asset-handler@0.1.3': resolution: {integrity: sha512-FNcunDuTmEfQTLRLtA6zz+buIXUHj1soPvSWzzQFBC+n2lsy+CGf/NIrR3SEPCmsVNQj70/Jx2lViCpq+09YpQ==} @@ -2041,16 +2038,16 @@ packages: '@cloudflare/workers-types@5.20261023.1': resolution: {integrity: sha512-jRaMsWUF/08dd0dWnX3zPGPOjakkkA2JPnK5vLsCQFmYC40kbMPZ02fvOPO8kqjqgljoMZrKsRiXpR1u1Lp0Qg==} - '@cloudflare/workers-utils@0.47.3': - resolution: {integrity: sha512-Eez8j60Iglt7Yyca+vsGy5HEX0+DynkW4mNG7YjLePezh+J9OOG18XZFeQsZh6R9R27/fL6jcNEzW5SZGEiHCQ==} + '@cloudflare/workers-utils@0.49.0': + resolution: {integrity: sha512-HLeFcpoph6oyioClJPxJ0qu+9FnjQ1cJG9HBRqijwAi1lrfFCGmYBR2CdMSiMv4/x9/6KSlFYXjhkonKDSWO1A==} peerDependencies: vitest: ^4.1.0 || ^5.0.0 peerDependenciesMeta: vitest: optional: true - '@cloudflare/workers-utils@0.49.0': - resolution: {integrity: sha512-HLeFcpoph6oyioClJPxJ0qu+9FnjQ1cJG9HBRqijwAi1lrfFCGmYBR2CdMSiMv4/x9/6KSlFYXjhkonKDSWO1A==} + '@cloudflare/workers-utils@0.50.0': + resolution: {integrity: sha512-XKTOcx61TjWFy/FOqywP18eLW+eN/ZyDZ73ETL1p1MSVBvBnwHpij9wP11ImeXYn4UBExydOaUnN7T6Tg6leLQ==} peerDependencies: vitest: ^4.1.0 || ^5.0.0 peerDependenciesMeta: @@ -5831,8 +5828,8 @@ packages: resolution: {integrity: sha512-Cjrs+vHHQ7krLO4HYELYpYBJBuMhcnNZD/Z5z/UcQSnFqWSQY3DhtTCFalXgI1/yO1iK+YrRKK8EYkumrEopxg==} engines: {node: '>=22.0.0'} - miniflare@5.20261023.1-beta: - resolution: {integrity: sha512-hgm1AJhwC6W+iaRhvMnfs7bPOsxjKa8LXTFR2WVPA5qA9KhpyBd2LddmT+9M9tm65VZ8YWkwQGvB+cKbqJoKeA==} + miniflare@5.20261023.2-beta: + resolution: {integrity: sha512-sXpZloQnIUe4raXXdwwqd2ioRHox9a/1B4nB2/p4JWKDwGuVgEK4DugCNgIeQf0iVuSgBItdYpodJe4iwY6SrQ==} engines: {node: '>=22.0.0'} minimatch@10.2.6: @@ -7271,8 +7268,8 @@ packages: '@cloudflare/workers-types': optional: true - wrangler@4.154.0: - resolution: {integrity: sha512-duA4dckBE/51ibAlGh2mUYcvGiu7sZFcn61I+KfNEeK5KQzKKEth9Xf5ROatoPBOebYPz0gfknXOCjBhwLOo8Q==} + wrangler@4.155.0: + resolution: {integrity: sha512-gBKtAg2e0abQDvXPRQu611YMTd/cfAaJTOLAs/89tTxFxEeUyC260MRJRK+m3gLmQjDYWFwJv+ErwuJ/GuALpA==} engines: {node: '>=22.0.0'} hasBin: true peerDependencies: @@ -8196,14 +8193,14 @@ snapshots: fast-wrap-ansi: 0.1.6 sisteransi: 1.0.5 - '@cloudflare/build-output-utils@0.9.5': + '@cloudflare/build-output-utils@0.9.6': dependencies: - '@cloudflare/config': 0.28.1 + '@cloudflare/config': 0.29.0 - '@cloudflare/cli-shared-helpers@0.2.7(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)))': + '@cloudflare/cli-shared-helpers@0.2.10(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: '@clack/core': 1.2.0 - '@cloudflare/workers-utils': 0.47.3(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) + '@cloudflare/workers-utils': 0.50.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) chalk: 5.3.0 ci-info: 4.4.0 cross-spawn: 7.0.6 @@ -8211,42 +8208,31 @@ snapshots: transitivePeerDependencies: - vitest - '@cloudflare/cli-shared-helpers@0.2.9(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)))': - dependencies: - '@clack/core': 1.2.0 - '@cloudflare/workers-utils': 0.49.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) - chalk: 5.3.0 - ci-info: 4.4.0 - cross-spawn: 7.0.6 - log-update: 5.0.1 - transitivePeerDependencies: - - vitest - - '@cloudflare/config@0.28.1': + '@cloudflare/config@0.29.0': dependencies: zod: 4.6.6 - '@cloudflare/containers-shared@0.23.3(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)))': + '@cloudflare/containers-shared@0.23.4(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: - '@cloudflare/build-output-utils': 0.9.5 - '@cloudflare/cli-shared-helpers': 0.2.9(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) - '@cloudflare/config': 0.28.1 - '@cloudflare/workers-utils': 0.49.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) + '@cloudflare/build-output-utils': 0.9.6 + '@cloudflare/cli-shared-helpers': 0.2.10(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) + '@cloudflare/config': 0.29.0 + '@cloudflare/workers-utils': 0.50.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) transitivePeerDependencies: - vitest - '@cloudflare/deploy-helpers@0.24.1(@types/node@22.15.17)(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)))': + '@cloudflare/deploy-helpers@0.24.2(@types/node@22.15.17)(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: - '@cloudflare/cli-shared-helpers': 0.2.9(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) - '@cloudflare/config': 0.28.1 - '@cloudflare/containers-shared': 0.23.3(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) - '@cloudflare/workers-utils': 0.49.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) + '@cloudflare/cli-shared-helpers': 0.2.10(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) + '@cloudflare/config': 0.29.0 + '@cloudflare/containers-shared': 0.23.4(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) + '@cloudflare/workers-utils': 0.50.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) blake3-wasm: 2.1.5 chalk: 5.3.0 command-exists: 1.2.9 devtools-protocol: 0.0.1182435 dotenv: 16.3.1 - miniflare: 5.20261023.1-beta(@types/node@22.15.17) + miniflare: 5.20261023.2-beta(@types/node@22.15.17) p-queue: 9.0.0 pretty-bytes: 6.1.1 undici: 7.30.1 @@ -8331,15 +8317,15 @@ snapshots: '@cloudflare/workers-types@5.20261023.1': {} - '@cloudflare/workers-utils@0.47.3(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)))': + '@cloudflare/workers-utils@0.49.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: chalk: 5.3.0 dotenv: 16.3.1 - undici: 7.29.1 + undici: 7.30.1 optionalDependencies: vitest: 5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) - '@cloudflare/workers-utils@0.49.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)))': + '@cloudflare/workers-utils@0.50.0(vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(msw@2.14.6(@types/node@22.15.17)(typescript@5.8.3))(vite@8.3.4(@types/node@22.15.17)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: chalk: 5.3.0 dotenv: 16.3.1 @@ -11768,7 +11754,7 @@ snapshots: - bufferutil - utf-8-validate - miniflare@5.20261023.1-beta(@types/node@22.15.17): + miniflare@5.20261023.2-beta(@types/node@22.15.17): dependencies: '@cspotcode/source-map-support': 0.8.1 sharp: 0.35.5(@types/node@22.15.17) @@ -13233,13 +13219,13 @@ snapshots: - bufferutil - utf-8-validate - wrangler@4.154.0(@cloudflare/workers-types@5.20261023.1)(@types/node@22.15.17): + wrangler@4.155.0(@cloudflare/workers-types@5.20261023.1)(@types/node@22.15.17): dependencies: '@cloudflare/kv-asset-handler': 0.5.0 '@cloudflare/unenv-preset': 2.16.2(unenv@2.0.0-rc.24)(workerd@1.20261023.1) blake3-wasm: 2.1.5 esbuild: 0.28.2 - miniflare: 5.20261023.1-beta(@types/node@22.15.17) + miniflare: 5.20261023.2-beta(@types/node@22.15.17) path-to-regexp: 6.3.0 unenv: 2.0.0-rc.24 workerd: 1.20261023.1