From dcd116a522063bc4edd3d56bcb85d2292a19d55a Mon Sep 17 00:00:00 2001 From: Edmund Hung Date: Tue, 9 Jun 2026 10:50:30 +0100 Subject: [PATCH 1/7] feat(wrangler): improve createTestHarness() configuration setup (#14227) --- .../wrangler/e2e/createTestHarness.test.ts | 53 +++++++++++++++++++ packages/wrangler/src/api/test-harness.ts | 44 +++++++++++---- 2 files changed, 87 insertions(+), 10 deletions(-) diff --git a/packages/wrangler/e2e/createTestHarness.test.ts b/packages/wrangler/e2e/createTestHarness.test.ts index 1ae8f9d93e..b26eee2236 100644 --- a/packages/wrangler/e2e/createTestHarness.test.ts +++ b/packages/wrangler/e2e/createTestHarness.test.ts @@ -66,6 +66,59 @@ describe("createTestHarness", { sequential: true }, () => { ); }); + it("can be configured after creation", async ({ expect }) => { + await helper.seed({ + "wrangler.jsonc": dedent` + { + "name": "delayed-config-worker", + "main": "src/index.ts", + "compatibility_date": "2026-05-20", + "vars": { "GREETING": "initial" } + } + `, + "src/index.ts": dedent` + export default { + fetch(_request, env) { + return new Response(env.GREETING); + } + }; + `, + }); + + const server = createTestHarness(); + onTestFinished(server.close); + + await expect(server.listen()).rejects.toThrow( + "Test harness options have not been configured." + ); + + await server.update({ + root: helper.tmpPath, + workers: [{ configPath: "./wrangler.jsonc" }], + }); + await server.listen(); + + const initialResponse = await server.fetch("/"); + await expect(initialResponse.text()).resolves.toBe("initial"); + + await server.update((options) => ({ + ...options, + workers: options.workers.map((worker) => + "configPath" in worker + ? { ...worker, vars: { GREETING: "updated" } } + : worker + ), + })); + + const updatedResponse = await server.fetch("/"); + await expect(updatedResponse.text()).resolves.toBe("updated"); + + await server.reset(); + + const resetResponse = await server.fetch("/"); + await expect(resetResponse.text()).resolves.toBe("initial"); + }); + it("support fetching different workers from the same session", async ({ expect, }) => { diff --git a/packages/wrangler/src/api/test-harness.ts b/packages/wrangler/src/api/test-harness.ts index 4604b22dab..95b8a19ebe 100644 --- a/packages/wrangler/src/api/test-harness.ts +++ b/packages/wrangler/src/api/test-harness.ts @@ -68,6 +68,9 @@ export type TestHarness = { * Starts the server and returns its current URL. * Calling this more than once returns the same running server session until * the server is closed or reset. + * + * If no options were passed to `createTestHarness()`, call `update(options)` + * before starting the server. */ listen(): Promise<{ url: URL; @@ -110,6 +113,9 @@ export type TestHarness = { getWorker(name?: string): WorkerHandle; /** * Updates the server configuration and reloads the running Workers. + * + * If the server has not started yet, this configures the options that will be + * used by `listen()`. */ update( options: @@ -117,9 +123,8 @@ export type TestHarness = { | ((currentOptions: TestHarnessOptions) => TestHarnessOptions) ): Promise; /** - * Restores the server to its initial `createTestHarness()` options and restarts the - * active server session. Storage is recreated, and the server URL may change - * after reset. + * Restores the server to the options used when the current session first + * started. Storage is recreated, and the server URL may change after reset. */ reset(): Promise; /** @@ -178,8 +183,8 @@ type ServerSession = { * await server.close(); * ``` */ -export function createTestHarness(options: TestHarnessOptions): TestHarness { - const initialOptions = options; +export function createTestHarness(options?: TestHarnessOptions): TestHarness { + let initialOptions = options; let currentOptions = options; let serverSession: ServerSession | undefined; let startPromise: Promise | undefined; @@ -377,7 +382,14 @@ export function createTestHarness(options: TestHarnessOptions): TestHarness { async function startServerSession() { if (!startPromise) { - startPromise = createSession(currentOptions) + if (currentOptions === undefined) { + throw new Error( + "Test harness options have not been configured. Pass options to createTestHarness() or call server.update(options) before server.listen()." + ); + } + + initialOptions = currentOptions; + startPromise = createSession(initialOptions) .then((session) => { serverSession = session; return session; @@ -572,10 +584,17 @@ export function createTestHarness(options: TestHarnessOptions): TestHarness { }; }, async update(updateInput) { - const nextOptions = - typeof updateInput === "function" - ? updateInput(currentOptions) - : updateInput; + let nextOptions: TestHarnessOptions; + + if (typeof updateInput === "function") { + assert( + currentOptions, + "Cannot update test harness options with a function before options have been configured. Pass options to createTestHarness() or call server.update(options) first." + ); + nextOptions = updateInput(currentOptions); + } else { + nextOptions = updateInput; + } // If listen() is still starting, wait until serverSession is available so the update is applied to the running Workers. if (startPromise) { @@ -607,6 +626,11 @@ export function createTestHarness(options: TestHarnessOptions): TestHarness { async reset() { const session = await resolveSession(); + assert( + initialOptions, + "Server has not been started. Start it with server.listen() before calling this method." + ); + await teardownSession(session); currentOptions = initialOptions; From 4bb572f264089b2ec1ce3a4b0d2f48c226cb4431 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 10:50:50 +0100 Subject: [PATCH 2/7] Bump the workerd-and-workers-types group with 2 updates (#14231) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Wrangler automated PR updater --- .changeset/dependabot-update-14231.md | 12 + packages/miniflare/package.json | 2 +- packages/wrangler/package.json | 2 +- pnpm-lock.yaml | 378 +++++++++++++------------- pnpm-workspace.yaml | 4 +- 5 files changed, 205 insertions(+), 193 deletions(-) create mode 100644 .changeset/dependabot-update-14231.md diff --git a/.changeset/dependabot-update-14231.md b/.changeset/dependabot-update-14231.md new file mode 100644 index 0000000000..f239ab001a --- /dev/null +++ b/.changeset/dependabot-update-14231.md @@ -0,0 +1,12 @@ +--- +"miniflare": patch +"wrangler": patch +--- + +Update dependencies of "miniflare", "wrangler" + +The following dependency versions have been updated: + +| Dependency | From | To | +| ---------- | ------------ | ------------ | +| workerd | 1.20260608.1 | 1.20260609.1 | diff --git a/packages/miniflare/package.json b/packages/miniflare/package.json index 156558f62e..2c9fdb736d 100644 --- a/packages/miniflare/package.json +++ b/packages/miniflare/package.json @@ -52,7 +52,7 @@ "@cspotcode/source-map-support": "0.8.1", "sharp": "0.34.5", "undici": "catalog:default", - "workerd": "1.20260608.1", + "workerd": "1.20260609.1", "ws": "catalog:default", "youch": "4.1.0-beta.10" }, diff --git a/packages/wrangler/package.json b/packages/wrangler/package.json index 0902ab1170..7a852f369f 100644 --- a/packages/wrangler/package.json +++ b/packages/wrangler/package.json @@ -72,7 +72,7 @@ "miniflare": "workspace:*", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", - "workerd": "1.20260608.1" + "workerd": "1.20260609.1" }, "devDependencies": { "@aws-sdk/client-s3": "^3.721.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 06c1e437ad..b3e55a4084 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,8 +10,8 @@ catalogs: specifier: 0.13.3 version: 0.13.3 '@cloudflare/workers-types': - specifier: ^4.20260608.1 - version: 4.20260608.1 + specifier: ^4.20260609.1 + version: 4.20260609.1 '@hey-api/openapi-ts': specifier: 0.94.0 version: 0.94.0 @@ -173,7 +173,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@fixture/shared': specifier: workspace:* version: link:../shared @@ -221,7 +221,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 ts-dedent: specifier: ^2.2.0 version: 2.2.0 @@ -239,7 +239,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -260,7 +260,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -284,7 +284,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -320,7 +320,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 undici: specifier: catalog:default version: 7.24.8 @@ -335,7 +335,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/mimetext': specifier: ^2.0.4 version: 2.0.4 @@ -374,7 +374,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/jest-image-snapshot': specifier: ^6.4.0 version: 6.4.0 @@ -401,7 +401,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 miniflare: specifier: workspace:* version: link:../../packages/miniflare @@ -471,7 +471,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/is-even': specifier: ^1.0.2 version: 1.0.2 @@ -489,11 +489,11 @@ importers: dependencies: '@sentry/cloudflare': specifier: ^10 - version: 10.50.0(@cloudflare/workers-types@4.20260608.1) + version: 10.50.0(@cloudflare/workers-types@4.20260609.1) devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 vitest: specifier: catalog:default version: 4.1.0(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(@vitest/ui@4.1.0)(msw@2.12.4(@types/node@22.15.17)(typescript@5.9.3))(vite@8.0.13(@types/node@22.15.17)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.1)) @@ -524,7 +524,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -552,7 +552,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/node': specifier: 22.15.17 version: 22.15.17 @@ -582,7 +582,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 undici: specifier: catalog:default version: 7.24.8 @@ -600,7 +600,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/debug': specifier: 4.1.12 version: 4.1.12 @@ -633,7 +633,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -658,7 +658,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@fixture/pages-plugin': specifier: workspace:* version: link:../pages-plugin-example @@ -682,7 +682,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -721,7 +721,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -742,7 +742,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -763,7 +763,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -781,7 +781,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 is-odd: specifier: ^3.0.1 version: 3.0.1 @@ -800,7 +800,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@fixture/pages-plugin': specifier: workspace:* version: link:../pages-plugin-example @@ -860,7 +860,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -881,7 +881,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -1037,19 +1037,19 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 fixtures/rules-app: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 fixtures/secrets-store: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 wrangler: specifier: workspace:* version: link:../../packages/wrangler @@ -1076,7 +1076,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/is-even': specifier: ^1.0.2 version: 1.0.2 @@ -1100,7 +1100,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 vitest: specifier: catalog:default version: 4.1.0(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(@vitest/ui@4.1.0)(msw@2.12.4(@types/node@22.15.17)(typescript@5.9.3))(vite@8.0.13(@types/node@22.15.17)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.1)) @@ -1115,7 +1115,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 esbuild: specifier: catalog:default version: 0.27.3 @@ -1133,7 +1133,7 @@ importers: devDependencies: '@better-auth/stripe': specifier: ^1.4.6 - version: 1.5.4(aad7a1b4634f2ffd2b96be614c855837) + version: 1.5.4(f2036e13b752a6d2e3eb2711bd85dff9) '@cloudflare/containers': specifier: ^0.2.2 version: 0.2.2 @@ -1142,7 +1142,7 @@ importers: version: link:../../packages/vitest-pool-workers '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@microlabs/otel-cf-workers': specifier: 1.0.0-rc.45 version: 1.0.0-rc.45(@opentelemetry/api@1.9.1) @@ -1157,7 +1157,7 @@ importers: version: 3.2.6 better-auth: specifier: ^1.4.6 - version: 1.5.4(@cloudflare/workers-types@4.20260608.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260608.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)))(mongodb@7.1.0)(mysql2@3.15.3)(pg@8.16.3)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.1.0) + version: 1.5.4(@cloudflare/workers-types@4.20260609.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260609.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)))(mongodb@7.1.0)(mysql2@3.15.3)(pg@8.16.3)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.1.0) discord-api-types: specifier: 0.37.98 version: 0.37.98 @@ -1228,7 +1228,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@fixture/shared': specifier: workspace:* version: link:../shared @@ -1283,7 +1283,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 wrangler: specifier: workspace:* version: link:../../packages/wrangler @@ -1295,7 +1295,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 miniflare: specifier: workspace:* version: link:../../packages/miniflare @@ -1343,7 +1343,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 run-script-os: specifier: ^1.1.6 version: 1.1.6 @@ -1367,7 +1367,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -1388,7 +1388,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -1409,7 +1409,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -1430,7 +1430,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -1451,7 +1451,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/jest-image-snapshot': specifier: ^6.4.0 version: 6.4.0 @@ -1484,7 +1484,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/node': specifier: 22.15.17 version: 22.15.17 @@ -1511,7 +1511,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -1529,7 +1529,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -1620,7 +1620,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -1686,7 +1686,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -1855,7 +1855,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@octokit/types': specifier: ^13.8.0 version: 13.8.0 @@ -1876,7 +1876,7 @@ importers: version: link:../vitest-pool-workers '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -1900,7 +1900,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -1927,10 +1927,10 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: catalog:default - version: 0.13.3(@cloudflare/workers-types@4.20260608.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0) + version: 0.13.3(@cloudflare/workers-types@4.20260609.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0) '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/mime': specifier: ^3.0.4 version: 3.0.4 @@ -2080,8 +2080,8 @@ importers: specifier: catalog:default version: 7.24.8 workerd: - specifier: 1.20260608.1 - version: 1.20260608.1 + specifier: 1.20260609.1 + version: 1.20260609.1 ws: specifier: catalog:default version: 8.20.1 @@ -2106,7 +2106,7 @@ importers: version: link:../workers-shared '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -2272,7 +2272,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: catalog:default - version: 0.13.3(@cloudflare/workers-types@4.20260608.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0) + version: 0.13.3(@cloudflare/workers-types@4.20260609.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0) '@cloudflare/workers-shared': specifier: workspace:* version: link:../workers-shared @@ -2281,7 +2281,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 concurrently: specifier: ^8.2.2 version: 8.2.2 @@ -2309,7 +2309,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -2343,7 +2343,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/node': specifier: 22.15.17 version: 22.15.17 @@ -2367,7 +2367,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 esbuild: specifier: catalog:default version: 0.27.3 @@ -2450,7 +2450,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -2546,7 +2546,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2567,7 +2567,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2588,7 +2588,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2609,7 +2609,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2630,7 +2630,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2651,7 +2651,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2672,7 +2672,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2693,7 +2693,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2714,7 +2714,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2735,7 +2735,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2756,7 +2756,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2777,7 +2777,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2798,7 +2798,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2819,7 +2819,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2840,7 +2840,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2861,7 +2861,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2882,7 +2882,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/mimetext': specifier: ^2.0.4 version: 2.0.4 @@ -2915,7 +2915,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2936,7 +2936,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2957,7 +2957,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2978,7 +2978,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2999,7 +2999,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3020,7 +3020,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3041,7 +3041,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3062,7 +3062,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@playground/main-resolution-package': specifier: file:./package version: file:packages/vite-plugin-cloudflare/playground/main-resolution/package @@ -3086,7 +3086,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/express': specifier: ^5.0.1 version: 5.0.1 @@ -3113,7 +3113,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@playground/module-resolution-excludes': specifier: file:./packages/excludes version: file:packages/vite-plugin-cloudflare/playground/module-resolution/packages/excludes @@ -3125,7 +3125,7 @@ importers: version: file:packages/vite-plugin-cloudflare/playground/module-resolution/packages/requires '@remix-run/cloudflare': specifier: 2.12.0 - version: 2.12.0(@cloudflare/workers-types@4.20260608.1)(typescript@5.8.3) + version: 2.12.0(@cloudflare/workers-types@4.20260609.1)(typescript@5.8.3) '@types/react': specifier: ^18.3.11 version: 18.3.18 @@ -3158,7 +3158,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3179,7 +3179,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@fixture/shared': specifier: workspace:* version: link:../../../../fixtures/shared @@ -3231,7 +3231,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/react': specifier: 19.1.0 version: 19.1.0 @@ -3252,7 +3252,7 @@ importers: dependencies: partyserver: specifier: ^0.3.3 - version: 0.3.3(@cloudflare/workers-types@4.20260608.1) + version: 0.3.3(@cloudflare/workers-types@4.20260609.1) partysocket: specifier: ^1.1.16 version: 1.1.16(react@19.2.1) @@ -3271,7 +3271,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@tailwindcss/vite': specifier: ^4.2.1 version: 4.2.2(vite@8.0.13(@types/node@22.15.17)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.1)) @@ -3307,7 +3307,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3328,7 +3328,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../../../workers-utils @@ -3368,7 +3368,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/react': specifier: 19.1.0 version: 19.1.0 @@ -3398,7 +3398,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3419,7 +3419,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3447,7 +3447,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/react': specifier: 19.1.0 version: 19.1.0 @@ -3480,7 +3480,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3501,7 +3501,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3522,7 +3522,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3543,7 +3543,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@vitejs/plugin-basic-ssl': specifier: ^2.2.0 version: 2.2.0(vite@8.0.13(@types/node@22.15.17)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.1)) @@ -3567,7 +3567,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3588,7 +3588,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3609,7 +3609,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3630,7 +3630,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3667,7 +3667,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -3922,13 +3922,13 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: catalog:default - version: 0.13.3(@cloudflare/workers-types@4.20260608.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0) + version: 0.13.3(@cloudflare/workers-types@4.20260609.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0) '@cloudflare/workers-tsconfig': specifier: workspace:* version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@sentry/cli': specifier: ^2.37.0 version: 2.41.1(encoding@0.1.13) @@ -4046,13 +4046,13 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: catalog:default - version: 0.13.3(@cloudflare/workers-types@4.20260608.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0) + version: 0.13.3(@cloudflare/workers-types@4.20260609.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0) '@cloudflare/workers-tsconfig': specifier: workspace:* version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@types/mime': specifier: ^3.0.4 version: 3.0.4 @@ -4090,8 +4090,8 @@ importers: specifier: 2.0.0-rc.24 version: 2.0.0-rc.24 workerd: - specifier: 1.20260608.1 - version: 1.20260608.1 + specifier: 1.20260609.1 + version: 1.20260609.1 devDependencies: '@aws-sdk/client-s3': specifier: ^3.721.0 @@ -4128,7 +4128,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -4387,7 +4387,7 @@ importers: dependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260608.1 + version: 4.20260609.1 wrangler: specifier: workspace:* version: link:../wrangler @@ -5325,8 +5325,8 @@ packages: cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-64@1.20260608.1': - resolution: {integrity: sha512-0AgTweTtel2KEaKPBdEB4lDoi9vzRIms42ZSL/oY//hEl4ruhhSczoPxkI5GVWgQ3qfADr5oOm/IeNdcaHKarw==} + '@cloudflare/workerd-darwin-64@1.20260609.1': + resolution: {integrity: sha512-AK8tYLQm+8BqQMzjZ55ZfuhfIm1eCkj+Ykxz6kWXojdACwjjU03MrwdM9fBDdgzU3upXOs4e1scOFHySlfVQjA==} engines: {node: '>=16'} cpu: [x64] os: [darwin] @@ -5343,8 +5343,8 @@ packages: cpu: [arm64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20260608.1': - resolution: {integrity: sha512-qzMsWKSIzk9lon7IU5loaymsNOlPBMzU/wmakr1eFtQ0zcbOvOhvV1kg4kcDdnjXX598bNIRnpPppKnwA3m3ow==} + '@cloudflare/workerd-darwin-arm64@1.20260609.1': + resolution: {integrity: sha512-4kKXfr7ZHU6xQ/R9ShdSuj1A1bEouoRcHzUWdjnuMPBlRsAAVanlxAVYISotFUulLEinayOpRFbhpsfwzrpSSw==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] @@ -5361,8 +5361,8 @@ packages: cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-64@1.20260608.1': - resolution: {integrity: sha512-8TV5vCuZWmBDrxDX6mZvJCUgxxFgdAKuG7d8LFwB0m+olFeJPpi+iAe3ytw5BsIqpO5pznmnqZ1It/Ete4N+eA==} + '@cloudflare/workerd-linux-64@1.20260609.1': + resolution: {integrity: sha512-T2Ebir2OPHAvvZ0HUh5mi1lN8q30sVi4lf7LIpc28AHoWtoOmJ0jA5AJK4IYJm1MKEbBldq+QsckaHOCQFmRpQ==} engines: {node: '>=16'} cpu: [x64] os: [linux] @@ -5379,8 +5379,8 @@ packages: cpu: [arm64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20260608.1': - resolution: {integrity: sha512-/q4f1+ijKq3zVXfYn5aaOohMAItkKfZxn2geYdzPCCU09OK/WbyHG5wkRl7VpKp5Aq7rLjD44F0fwGiD6O4Clw==} + '@cloudflare/workerd-linux-arm64@1.20260609.1': + resolution: {integrity: sha512-INfcYoSsKqEIvPL69/3RkqYoP8WUR0VEN6loWN/3tekXLoJrVOj3E5NjIetsdS8MJN6zc3st/ae4bMuWRRzoDg==} engines: {node: '>=16'} cpu: [arm64] os: [linux] @@ -5397,8 +5397,8 @@ packages: cpu: [x64] os: [win32] - '@cloudflare/workerd-windows-64@1.20260608.1': - resolution: {integrity: sha512-gfSVY/F+vb03BT9KZWRwvvLcMszPOPEjnBDvZqeud66Lfl7tYiZ2DQyjf7ikXkqb3oaZXJdSC2hYVApI7mPAmQ==} + '@cloudflare/workerd-windows-64@1.20260609.1': + resolution: {integrity: sha512-EWhfxKI1aqUr7S8xuGxgmRCumEzB8iSsCIz6oEqJN+3pZuW3EWiKDGFW4EY1BmwNINLW1eO5VMGYb8Fj6FVYxA==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -5411,8 +5411,8 @@ packages: react: ^17.0.2 || ^18.2.21 react-dom: ^17.0.2 || ^18.2.21 - '@cloudflare/workers-types@4.20260608.1': - resolution: {integrity: sha512-Yz90KXPZBB9K/AhsnLaA321s5+i5ZpWZRFbcGx9dWjyknQJXPAS1pK5CJSFEedwY6zoEr1cf2SkpBATL1idsWA==} + '@cloudflare/workers-types@4.20260609.1': + resolution: {integrity: sha512-krGHtwSApCFBjTe1NTx/TFQ0P5i/bHGQOqCPnCLssb8rOKaAG4JkPFJZsossr0z/ZTMnpP2Tid5jWju+/i0hCA==} '@codemirror/autocomplete@6.20.0': resolution: {integrity: sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==} @@ -15086,8 +15086,8 @@ packages: engines: {node: '>=16'} hasBin: true - workerd@1.20260608.1: - resolution: {integrity: sha512-QWMdAT2duF68dJ4M+tmwL4D4uG/84XpgYM8+iOj0CexkiJNyVC5dpEb7NQNsJPpXq8sIzMsZN4MbuxjR4YU1SA==} + workerd@1.20260609.1: + resolution: {integrity: sha512-KF/Y/8f4VoXCk87NuU6RqmO0X5fdzcrxU3XzAgoPUpnH9t1ZyzRgX1O/9sJvjItxroCBTEBzKssda02Dz9i6BA==} engines: {node: '>=16'} hasBin: true @@ -16114,7 +16114,7 @@ snapshots: optionalDependencies: '@types/react': 19.2.13 - '@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1)': + '@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1)': dependencies: '@better-auth/utils': 0.3.1 '@better-fetch/fetch': 1.1.21 @@ -16125,9 +16125,9 @@ snapshots: nanostores: 1.1.1 zod: 4.4.3 optionalDependencies: - '@cloudflare/workers-types': 4.20260608.1 + '@cloudflare/workers-types': 4.20260609.1 - '@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.11)(nanostores@1.1.1)': + '@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.11)(nanostores@1.1.1)': dependencies: '@better-auth/utils': 0.3.1 '@better-fetch/fetch': 1.1.21 @@ -16138,50 +16138,50 @@ snapshots: nanostores: 1.1.1 zod: 4.4.3 optionalDependencies: - '@cloudflare/workers-types': 4.20260608.1 + '@cloudflare/workers-types': 4.20260609.1 - '@better-auth/drizzle-adapter@1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260608.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)))': + '@better-auth/drizzle-adapter@1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260609.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)))': dependencies: - '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1) + '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1) '@better-auth/utils': 0.3.1 - drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260608.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)) + drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260609.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)) - '@better-auth/kysely-adapter@1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(kysely@0.28.11)': + '@better-auth/kysely-adapter@1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(kysely@0.28.11)': dependencies: - '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1) + '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1) '@better-auth/utils': 0.3.1 kysely: 0.28.11 - '@better-auth/memory-adapter@1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)': + '@better-auth/memory-adapter@1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)': dependencies: - '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1) + '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1) '@better-auth/utils': 0.3.1 - '@better-auth/mongo-adapter@1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(mongodb@7.1.0)': + '@better-auth/mongo-adapter@1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(mongodb@7.1.0)': dependencies: - '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1) + '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1) '@better-auth/utils': 0.3.1 mongodb: 7.1.0 - '@better-auth/prisma-adapter@1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))': + '@better-auth/prisma-adapter@1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))': dependencies: - '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1) + '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1) '@better-auth/utils': 0.3.1 '@prisma/client': 7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3) prisma: 7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3) - '@better-auth/stripe@1.5.4(aad7a1b4634f2ffd2b96be614c855837)': + '@better-auth/stripe@1.5.4(f2036e13b752a6d2e3eb2711bd85dff9)': dependencies: - '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1) - better-auth: 1.5.4(@cloudflare/workers-types@4.20260608.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260608.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)))(mongodb@7.1.0)(mysql2@3.15.3)(pg@8.16.3)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.1.0) + '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1) + better-auth: 1.5.4(@cloudflare/workers-types@4.20260609.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260609.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)))(mongodb@7.1.0)(mysql2@3.15.3)(pg@8.16.3)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.1.0) better-call: 1.3.2(zod@4.3.6) defu: 6.1.4 stripe: 20.4.1(@types/node@22.15.17) zod: 4.3.6 - '@better-auth/telemetry@1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))': + '@better-auth/telemetry@1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))': dependencies: - '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1) + '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1) '@better-auth/utils': 0.3.1 '@better-fetch/fetch': 1.1.21 @@ -16746,7 +16746,7 @@ snapshots: lodash.memoize: 4.1.2 marked: 0.3.19 - '@cloudflare/vitest-pool-workers@0.13.3(@cloudflare/workers-types@4.20260608.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0)': + '@cloudflare/vitest-pool-workers@0.13.3(@cloudflare/workers-types@4.20260609.1)(@vitest/runner@4.1.0)(@vitest/snapshot@4.1.0)(vitest@4.1.0)': dependencies: '@vitest/runner': 4.1.0 '@vitest/snapshot': 4.1.0 @@ -16754,7 +16754,7 @@ snapshots: esbuild: 0.27.3 miniflare: 4.20260317.1 vitest: 4.1.0(@opentelemetry/api@1.9.1)(@types/node@22.15.17)(@vitest/ui@4.1.0)(msw@2.12.4(@types/node@22.15.17)(typescript@5.9.3))(vite@8.0.13(@types/node@22.15.17)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.1)) - wrangler: 4.76.0(@cloudflare/workers-types@4.20260608.1) + wrangler: 4.76.0(@cloudflare/workers-types@4.20260609.1) zod: 3.25.76 transitivePeerDependencies: - '@cloudflare/workers-types' @@ -16767,7 +16767,7 @@ snapshots: '@cloudflare/workerd-darwin-64@1.20260423.1': optional: true - '@cloudflare/workerd-darwin-64@1.20260608.1': + '@cloudflare/workerd-darwin-64@1.20260609.1': optional: true '@cloudflare/workerd-darwin-arm64@1.20260317.1': @@ -16776,7 +16776,7 @@ snapshots: '@cloudflare/workerd-darwin-arm64@1.20260423.1': optional: true - '@cloudflare/workerd-darwin-arm64@1.20260608.1': + '@cloudflare/workerd-darwin-arm64@1.20260609.1': optional: true '@cloudflare/workerd-linux-64@1.20260317.1': @@ -16785,7 +16785,7 @@ snapshots: '@cloudflare/workerd-linux-64@1.20260423.1': optional: true - '@cloudflare/workerd-linux-64@1.20260608.1': + '@cloudflare/workerd-linux-64@1.20260609.1': optional: true '@cloudflare/workerd-linux-arm64@1.20260317.1': @@ -16794,7 +16794,7 @@ snapshots: '@cloudflare/workerd-linux-arm64@1.20260423.1': optional: true - '@cloudflare/workerd-linux-arm64@1.20260608.1': + '@cloudflare/workerd-linux-arm64@1.20260609.1': optional: true '@cloudflare/workerd-windows-64@1.20260317.1': @@ -16803,7 +16803,7 @@ snapshots: '@cloudflare/workerd-windows-64@1.20260423.1': optional: true - '@cloudflare/workerd-windows-64@1.20260608.1': + '@cloudflare/workerd-windows-64@1.20260609.1': optional: true '@cloudflare/workers-editor-shared@0.1.1(@cloudflare/style-const@6.1.3(react@19.2.4))(@cloudflare/style-container@7.12.2(@cloudflare/style-const@6.1.3(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': @@ -16814,7 +16814,7 @@ snapshots: react-dom: 19.2.4(react@19.2.4) react-split-pane: 0.1.92(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@cloudflare/workers-types@4.20260608.1': {} + '@cloudflare/workers-types@4.20260609.1': {} '@codemirror/autocomplete@6.20.0': dependencies: @@ -18204,7 +18204,7 @@ snapshots: '@prisma/adapter-d1@7.0.1': dependencies: - '@cloudflare/workers-types': 4.20260608.1 + '@cloudflare/workers-types': 4.20260609.1 '@prisma/driver-adapter-utils': 7.0.1 ky: 1.7.5 @@ -18431,10 +18431,10 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@remix-run/cloudflare@2.12.0(@cloudflare/workers-types@4.20260608.1)(typescript@5.8.3)': + '@remix-run/cloudflare@2.12.0(@cloudflare/workers-types@4.20260609.1)(typescript@5.8.3)': dependencies: '@cloudflare/kv-asset-handler': 0.1.3 - '@cloudflare/workers-types': 4.20260608.1 + '@cloudflare/workers-types': 4.20260609.1 '@remix-run/server-runtime': 2.12.0(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 @@ -18967,12 +18967,12 @@ snapshots: - encoding - supports-color - '@sentry/cloudflare@10.50.0(@cloudflare/workers-types@4.20260608.1)': + '@sentry/cloudflare@10.50.0(@cloudflare/workers-types@4.20260609.1)': dependencies: '@opentelemetry/api': 1.9.1 '@sentry/core': 10.50.0 optionalDependencies: - '@cloudflare/workers-types': 4.20260608.1 + '@cloudflare/workers-types': 4.20260609.1 '@sentry/core@10.50.0': {} @@ -20610,15 +20610,15 @@ snapshots: before-after-hook@2.2.3: {} - better-auth@1.5.4(@cloudflare/workers-types@4.20260608.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260608.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)))(mongodb@7.1.0)(mysql2@3.15.3)(pg@8.16.3)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.1.0): + better-auth@1.5.4(@cloudflare/workers-types@4.20260609.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260609.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)))(mongodb@7.1.0)(mysql2@3.15.3)(pg@8.16.3)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.1.0): dependencies: - '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.11)(nanostores@1.1.1) - '@better-auth/drizzle-adapter': 1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260608.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))) - '@better-auth/kysely-adapter': 1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(kysely@0.28.11) - '@better-auth/memory-adapter': 1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1) - '@better-auth/mongo-adapter': 1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(mongodb@7.1.0) - '@better-auth/prisma-adapter': 1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)) - '@better-auth/telemetry': 1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260608.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1)) + '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.11)(nanostores@1.1.1) + '@better-auth/drizzle-adapter': 1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260609.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))) + '@better-auth/kysely-adapter': 1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(kysely@0.28.11) + '@better-auth/memory-adapter': 1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1) + '@better-auth/mongo-adapter': 1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(mongodb@7.1.0) + '@better-auth/prisma-adapter': 1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)) + '@better-auth/telemetry': 1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260609.1)(better-call@1.3.2(zod@4.3.6))(jose@5.9.3)(kysely@0.28.11)(nanostores@1.1.1)) '@better-auth/utils': 0.3.1 '@better-fetch/fetch': 1.1.21 '@noble/ciphers': 2.1.1 @@ -20631,7 +20631,7 @@ snapshots: zod: 4.3.6 optionalDependencies: '@prisma/client': 7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3) - drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260608.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)) + drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260609.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)) mongodb: 7.1.0 mysql2: 3.15.3 pg: 8.16.3 @@ -21442,9 +21442,9 @@ snapshots: dependencies: wordwrap: 1.0.0 - drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260608.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)): + drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260609.1)(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.1)(@prisma/client@7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3))(@types/pg@8.15.4)(kysely@0.28.11)(mysql2@3.15.3)(pg@8.16.3)(postgres@3.4.7)(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)): optionalDependencies: - '@cloudflare/workers-types': 4.20260608.1 + '@cloudflare/workers-types': 4.20260609.1 '@electric-sql/pglite': 0.3.2 '@opentelemetry/api': 1.9.1 '@prisma/client': 7.0.1(prisma@7.0.1(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3))(typescript@5.8.3) @@ -23894,9 +23894,9 @@ snapshots: parseurl@1.3.3: {} - partyserver@0.3.3(@cloudflare/workers-types@4.20260608.1): + partyserver@0.3.3(@cloudflare/workers-types@4.20260609.1): dependencies: - '@cloudflare/workers-types': 4.20260608.1 + '@cloudflare/workers-types': 4.20260609.1 nanoid: 5.1.7 partysocket@1.1.16(react@19.2.1): @@ -26699,15 +26699,15 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20260423.1 '@cloudflare/workerd-windows-64': 1.20260423.1 - workerd@1.20260608.1: + workerd@1.20260609.1: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20260608.1 - '@cloudflare/workerd-darwin-arm64': 1.20260608.1 - '@cloudflare/workerd-linux-64': 1.20260608.1 - '@cloudflare/workerd-linux-arm64': 1.20260608.1 - '@cloudflare/workerd-windows-64': 1.20260608.1 + '@cloudflare/workerd-darwin-64': 1.20260609.1 + '@cloudflare/workerd-darwin-arm64': 1.20260609.1 + '@cloudflare/workerd-linux-64': 1.20260609.1 + '@cloudflare/workerd-linux-arm64': 1.20260609.1 + '@cloudflare/workerd-windows-64': 1.20260609.1 - wrangler@4.76.0(@cloudflare/workers-types@4.20260608.1): + wrangler@4.76.0(@cloudflare/workers-types@4.20260609.1): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@cloudflare/unenv-preset': 2.16.0(unenv@2.0.0-rc.24)(workerd@1.20260317.1) @@ -26718,7 +26718,7 @@ snapshots: unenv: 2.0.0-rc.24 workerd: 1.20260317.1 optionalDependencies: - '@cloudflare/workers-types': 4.20260608.1 + '@cloudflare/workers-types': 4.20260609.1 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3acfce3233..079b8e21b4 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -115,8 +115,8 @@ catalog: "ws": "8.20.1" esbuild: "0.27.3" playwright-chromium: "1.60.0" - "@cloudflare/workers-types": "^4.20260608.1" - workerd: "1.20260608.1" + "@cloudflare/workers-types": "^4.20260609.1" + workerd: "1.20260609.1" jsonc-parser: "3.2.0" smol-toml: "1.5.2" msw: 2.12.4 From 258357b96c34e5e75f3481960ec3360ddd6de28b Mon Sep 17 00:00:00 2001 From: Ben <4991309+NuroDev@users.noreply.github.com> Date: Tue, 9 Jun 2026 11:02:40 +0100 Subject: [PATCH 3/7] fix: dependabot workerd PR skip description validation label (#14232) --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0d69c83584..4e5ecc6e9d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -42,7 +42,7 @@ updates: labels: - "miniflare" - "dependencies" - - "skip-pr-description-validation" + - "ci:skip-pr-description-validation" allow: - dependency-name: "workerd" - dependency-name: "@cloudflare/workers-types" From 075c1d64cb8d76c16663eea5b39ebdb8b6948452 Mon Sep 17 00:00:00 2001 From: Edmund Hung Date: Tue, 9 Jun 2026 11:03:05 +0100 Subject: [PATCH 4/7] chore: migrate fixture test to createTestHarness (#14229) --- .../tests/index.test.ts | 22 +++++------ .../import-example/tests/index.test.ts | 17 ++++----- .../packages/import-example/tsconfig.json | 2 +- fixtures/import-npm/turbo.json | 3 +- .../import-wasm-example/tests/index.test.ts | 17 ++++----- fixtures/import-wasm-example/tsconfig.json | 2 +- fixtures/no-bundle-import/src/index.test.ts | 38 +++++++++---------- fixtures/ratelimit-app/tests/index.test.ts | 30 +++++++-------- .../tests/index.test.ts | 22 +++++------ 9 files changed, 72 insertions(+), 81 deletions(-) diff --git a/fixtures/dynamic-worker-loading/tests/index.test.ts b/fixtures/dynamic-worker-loading/tests/index.test.ts index 2266754bee..0a70c43bdc 100644 --- a/fixtures/dynamic-worker-loading/tests/index.test.ts +++ b/fixtures/dynamic-worker-loading/tests/index.test.ts @@ -1,25 +1,23 @@ -import { readFileSync } from "node:fs"; -import { join, resolve } from "node:path"; -import { fetch } from "undici"; +import { resolve } from "node:path"; import { afterAll, beforeAll, describe, it } from "vitest"; -import { runWranglerDev } from "../../shared/src/run-wrangler-long-lived"; +import { createTestHarness } from "wrangler"; describe("dynamic worker loading", () => { - let ip: string, port: number, stop: (() => Promise) | undefined; + const server = createTestHarness({ + root: resolve(__dirname, ".."), + workers: [{ configPath: "wrangler.jsonc" }], + }); beforeAll(async () => { - ({ ip, port, stop } = await runWranglerDev(resolve(__dirname, ".."), [ - "--port=0", - "--inspector-port=0", - ])); + await server.listen(); }); afterAll(async () => { - await stop?.(); + await server.close(); }); it("should respond with response from dynamic worker", async ({ expect }) => { - let response = await fetch(`http://${ip}:${port}/my-worker`); + let response = await server.fetch("/my-worker"); let text = await response.text(); expect(response.status).toBe(200); expect(text).toMatchInlineSnapshot( @@ -28,7 +26,7 @@ describe("dynamic worker loading", () => { }); it("should load different worker if ID changes", async ({ expect }) => { - let response = await fetch(`http://${ip}:${port}/my-other-worker`); + let response = await server.fetch("/my-other-worker"); let text = await response.text(); expect(response.status).toBe(200); expect(text).toMatchInlineSnapshot( diff --git a/fixtures/import-npm/packages/import-example/tests/index.test.ts b/fixtures/import-npm/packages/import-example/tests/index.test.ts index d95e5578fc..2d4c1852df 100644 --- a/fixtures/import-npm/packages/import-example/tests/index.test.ts +++ b/fixtures/import-npm/packages/import-example/tests/index.test.ts @@ -1,25 +1,24 @@ import { resolve } from "path"; -import { fetch } from "undici"; import { afterAll, beforeAll, describe, it } from "vitest"; -import { runWranglerDev } from "../../../../shared/src/run-wrangler-long-lived"; +import { createTestHarness } from "wrangler"; describe("wrangler correctly imports wasm files with npm resolution", () => { - let ip: string, port: number, stop: (() => Promise) | undefined; + const server = createTestHarness({ + root: resolve(__dirname, ".."), + workers: [{ configPath: "wrangler.jsonc" }], + }); beforeAll(async () => { - ({ ip, port, stop } = await runWranglerDev(resolve(__dirname, ".."), [ - "--port=0", - "--inspector-port=0", - ])); + await server.listen(); }); afterAll(async () => { - await stop?.(); + await server.close(); }); // if the worker compiles, is running, and returns 21 (7 * 3) we can assume that the wasm module was imported correctly it("responds", async ({ expect }) => { - const response = await fetch(`http://${ip}:${port}/`); + const response = await server.fetch("/"); const text = await response.text(); expect(text).toBe("21, 21"); }); diff --git a/fixtures/import-npm/packages/import-example/tsconfig.json b/fixtures/import-npm/packages/import-example/tsconfig.json index 7e797b59a8..65a5ca7394 100644 --- a/fixtures/import-npm/packages/import-example/tsconfig.json +++ b/fixtures/import-npm/packages/import-example/tsconfig.json @@ -5,7 +5,7 @@ "module": "preserve", "lib": ["ES2020"], "types": ["node"], - "moduleResolution": "node", + "moduleResolution": "bundler", "noEmit": true, "skipLibCheck": true }, diff --git a/fixtures/import-npm/turbo.json b/fixtures/import-npm/turbo.json index 8b7b7af1c1..ea3755df62 100644 --- a/fixtures/import-npm/turbo.json +++ b/fixtures/import-npm/turbo.json @@ -2,6 +2,7 @@ "extends": ["//"], "tasks": { "_clean_install": { + "dependsOn": ["wrangler#build"], "outputs": ["node_modules"] }, "check:type": { @@ -14,7 +15,7 @@ "dependsOn": ["_clean_install"] }, "test:ci": { - "dependsOn": ["_clean_install", "wrangler#build"] + "dependsOn": ["_clean_install"] } } } diff --git a/fixtures/import-wasm-example/tests/index.test.ts b/fixtures/import-wasm-example/tests/index.test.ts index f6d840e869..2d4c1852df 100644 --- a/fixtures/import-wasm-example/tests/index.test.ts +++ b/fixtures/import-wasm-example/tests/index.test.ts @@ -1,25 +1,24 @@ import { resolve } from "path"; -import { fetch } from "undici"; import { afterAll, beforeAll, describe, it } from "vitest"; -import { runWranglerDev } from "../../shared/src/run-wrangler-long-lived"; +import { createTestHarness } from "wrangler"; describe("wrangler correctly imports wasm files with npm resolution", () => { - let ip: string, port: number, stop: (() => Promise) | undefined; + const server = createTestHarness({ + root: resolve(__dirname, ".."), + workers: [{ configPath: "wrangler.jsonc" }], + }); beforeAll(async () => { - ({ ip, port, stop } = await runWranglerDev(resolve(__dirname, ".."), [ - "--port=0", - "--inspector-port=0", - ])); + await server.listen(); }); afterAll(async () => { - await stop?.(); + await server.close(); }); // if the worker compiles, is running, and returns 21 (7 * 3) we can assume that the wasm module was imported correctly it("responds", async ({ expect }) => { - const response = await fetch(`http://${ip}:${port}/`); + const response = await server.fetch("/"); const text = await response.text(); expect(text).toBe("21, 21"); }); diff --git a/fixtures/import-wasm-example/tsconfig.json b/fixtures/import-wasm-example/tsconfig.json index 7e797b59a8..65a5ca7394 100644 --- a/fixtures/import-wasm-example/tsconfig.json +++ b/fixtures/import-wasm-example/tsconfig.json @@ -5,7 +5,7 @@ "module": "preserve", "lib": ["ES2020"], "types": ["node"], - "moduleResolution": "node", + "moduleResolution": "bundler", "noEmit": true, "skipLibCheck": true }, diff --git a/fixtures/no-bundle-import/src/index.test.ts b/fixtures/no-bundle-import/src/index.test.ts index 17a640f5ff..d1b6e8d4ba 100644 --- a/fixtures/no-bundle-import/src/index.test.ts +++ b/fixtures/no-bundle-import/src/index.test.ts @@ -1,25 +1,21 @@ import path from "path"; import { afterAll, beforeAll, describe, test } from "vitest"; -import { unstable_startWorker } from "wrangler"; +import { createTestHarness } from "wrangler"; describe("Worker", () => { - let worker: Awaited>; + const server = createTestHarness({ + root: path.resolve(__dirname, ".."), + workers: [{ configPath: "wrangler.jsonc" }], + }); beforeAll(async () => { - worker = await unstable_startWorker({ - entrypoint: path.resolve(__dirname, "index.js"), - dev: { - logLevel: "none", - server: { hostname: "127.0.0.1", port: 0 }, - inspector: false, - }, - }); + await server.listen(); }, 30_000); - afterAll(() => worker.dispose()); + afterAll(() => server.close()); test("module traversal results in correct response", async ({ expect }) => { - const resp = await worker.fetch("http://example.com/"); + const resp = await server.fetch("/"); const text = await resp.text(); expect(text).toMatchInlineSnapshot( `"Hello Jane Smith and Hello John Smith"` @@ -29,7 +25,7 @@ describe("Worker", () => { test("module traversal results in correct response for CommonJS", async ({ expect, }) => { - const resp = await worker.fetch("http://example.com/cjs"); + const resp = await server.fetch("/cjs"); const text = await resp.text(); expect(text).toMatchInlineSnapshot( `"CJS: Hello Jane Smith and Hello John Smith"` @@ -39,43 +35,43 @@ describe("Worker", () => { test("correct response for CommonJS which imports ESM", async ({ expect, }) => { - const resp = await worker.fetch("http://example.com/cjs-loop"); + const resp = await server.fetch("/cjs-loop"); const text = await resp.text(); expect(text).toMatchInlineSnapshot('"CJS: cjs-string"'); }); test("support for dynamic imports", async ({ expect }) => { - const resp = await worker.fetch("http://example.com/dynamic"); + const resp = await server.fetch("/dynamic"); const text = await resp.text(); expect(text).toMatchInlineSnapshot(`"dynamic"`); }); test("basic wasm support", async ({ expect }) => { - const resp = await worker.fetch("http://example.com/wasm"); + const resp = await server.fetch("/wasm"); const text = await resp.text(); expect(text).toMatchInlineSnapshot('"42"'); }); test("resolves wasm import paths relative to root", async ({ expect }) => { - const resp = await worker.fetch("http://example.com/wasm-nested"); + const resp = await server.fetch("/wasm-nested"); const text = await resp.text(); expect(text).toMatchInlineSnapshot('"nested42"'); }); test("wasm can be imported from a dynamic import", async ({ expect }) => { - const resp = await worker.fetch("http://example.com/wasm-dynamic"); + const resp = await server.fetch("/wasm-dynamic"); const text = await resp.text(); expect(text).toMatchInlineSnapshot('"sibling42subdirectory42"'); }); test("text data can be imported", async ({ expect }) => { - const resp = await worker.fetch("http://example.com/txt"); + const resp = await server.fetch("/txt"); const text = await resp.text(); expect(text).toMatchInlineSnapshot('"TEST DATA"'); }); test("binary data can be imported", async ({ expect }) => { - const resp = await worker.fetch("http://example.com/bin"); + const resp = await server.fetch("/bin"); const bin = await resp.arrayBuffer(); const expected = new Uint8Array(new ArrayBuffer(4)); expected.set([0, 1, 2, 10]); @@ -85,7 +81,7 @@ describe("Worker", () => { test("actual dynamic import (that cannot be inlined by an esbuild run)", async ({ expect, }) => { - const resp = await worker.fetch("http://example.com/lang/fr.json"); + const resp = await server.fetch("/lang/fr.json"); const text = await resp.text(); expect(text).toMatchInlineSnapshot('"Bonjour"'); }); diff --git a/fixtures/ratelimit-app/tests/index.test.ts b/fixtures/ratelimit-app/tests/index.test.ts index 61e6e58ef9..6a67353af7 100644 --- a/fixtures/ratelimit-app/tests/index.test.ts +++ b/fixtures/ratelimit-app/tests/index.test.ts @@ -1,50 +1,50 @@ -import path, { resolve } from "path"; +import { resolve } from "path"; import { afterAll, beforeAll, describe, it } from "vitest"; -import { unstable_startWorker } from "wrangler"; +import { createTestHarness } from "wrangler"; const basePath = resolve(__dirname, ".."); +const server = createTestHarness({ + root: basePath, + workers: [{ configPath: "wrangler.jsonc" }], +}); describe("Rate limiting bindings", () => { - let worker: Awaited>; - beforeAll(async () => { - worker = await unstable_startWorker({ - config: path.join(basePath, "wrangler.jsonc"), - }); + await server.listen(); }); afterAll(async () => { - await worker.dispose(); + await server.close(); }); it("ratelimit binding is defined ", async ({ expect }) => { - let response = await worker.fetch(`http://example.com`); + let response = await server.fetch("/"); let content = await response.text(); expect(content).toEqual("Success"); - response = await worker.fetch(`http://example.com`); + response = await server.fetch("/"); content = await response.text(); expect(content).toEqual("Success"); - response = await worker.fetch(`http://example.com`); + response = await server.fetch("/"); content = await response.text(); expect(content).toEqual("Success"); - response = await worker.fetch(`http://example.com`); + response = await server.fetch("/"); content = await response.text(); expect(content).toEqual("Slow down"); }); it("ratelimit unsafe binding is defined ", async ({ expect }) => { - let response = await worker.fetch(`http://example.com/unsafe`); + let response = await server.fetch("/unsafe"); let content = await response.text(); expect(content).toEqual("unsafe: Success"); - response = await worker.fetch(`http://example.com/unsafe`); + response = await server.fetch("/unsafe"); content = await response.text(); expect(content).toEqual("unsafe: Success"); - response = await worker.fetch(`http://example.com/unsafe`); + response = await server.fetch("/unsafe"); content = await response.text(); expect(content).toEqual("unsafe: Slow down"); }); diff --git a/fixtures/unbound-durable-object/tests/index.test.ts b/fixtures/unbound-durable-object/tests/index.test.ts index 9ee1910307..e47febd6b8 100644 --- a/fixtures/unbound-durable-object/tests/index.test.ts +++ b/fixtures/unbound-durable-object/tests/index.test.ts @@ -1,31 +1,29 @@ -import { join, resolve } from "path"; +import { resolve } from "path"; import { afterAll, beforeAll, describe, it } from "vitest"; -import { unstable_startWorker } from "wrangler"; +import { createTestHarness } from "wrangler"; const basePath = resolve(__dirname, ".."); +const server = createTestHarness({ + root: basePath, + workers: [{ configPath: "wrangler.jsonc" }], +}); describe("Unbound DO is available through `ctx.exports`", () => { - let worker: Awaited>; - beforeAll(async () => { - worker = await unstable_startWorker({ - config: join(basePath, "wrangler.jsonc"), - }); + await server.listen(); }); afterAll(async () => { - await worker.dispose(); + await server.close(); }); it("can execute storage operations", async ({ expect }) => { const doName = crypto.randomUUID(); - let response = await worker.fetch(`http://example.com?name=${doName}`); + let response = await server.fetch(`/?name=${doName}`); let content = await response.text(); expect(content).toMatchInlineSnapshot(`"count: 0"`); - response = await worker.fetch( - `http://example.com/increment?name=${doName}` - ); + response = await server.fetch(`/increment?name=${doName}`); content = await response.text(); expect(content).toMatchInlineSnapshot(`"count: 1"`); }); From f8d770048d3ec9d3d9ddf093513fc5a0dddcac47 Mon Sep 17 00:00:00 2001 From: Edmund Hung Date: Tue, 9 Jun 2026 11:44:23 +0100 Subject: [PATCH 5/7] feat(wrangler): capture runtime logs and print debug timelines with `createTestHarness()` (#14225) Co-authored-by: emily-shen <69125074+emily-shen@users.noreply.github.com> --- .changeset/gentle-cougars-build.md | 10 +- .../wrangler/e2e/createTestHarness.test.ts | 180 +++++++++++++++- .../api/startDevWorker/ConfigController.ts | 1 + .../startDevWorker/LocalRuntimeController.ts | 1 + .../wrangler/src/api/startDevWorker/types.ts | 9 +- packages/wrangler/src/api/test-harness.ts | 197 +++++++++++++++--- packages/wrangler/src/dev/miniflare/index.ts | 3 +- 7 files changed, 363 insertions(+), 38 deletions(-) diff --git a/.changeset/gentle-cougars-build.md b/.changeset/gentle-cougars-build.md index 230af2d0b7..ce24c2339c 100644 --- a/.changeset/gentle-cougars-build.md +++ b/.changeset/gentle-cougars-build.md @@ -6,7 +6,9 @@ Introduce `createTestHarness()` for integration testing Workers It runs Workers in a local preview environment using production build output and works with both Wrangler projects and Workers built by the Cloudflare Vite plugin. -Use it from any Node.js test runner to send requests to individual Workers, trigger scheduled events, reset the server between tests, and mock outbound requests with libraries that intercept `globalThis.fetch()`, such as MSW: +Use it from any Node.js test runner to send requests to individual Workers, trigger scheduled events, reset the server between tests, and mock outbound requests with libraries that intercept `globalThis.fetch()`, such as MSW. + +You can also capture structured logs from your Workers with `getLogs()`, or dump out a diagnostic timeline with `debug()` when tests fail: ```ts import { createTestHarness } from "wrangler"; @@ -25,6 +27,12 @@ const apiWorker = server.getWorker("api-worker"); await apiWorker.fetch("http://example.com/users/123"); await apiWorker.scheduled({ cron: "0 0 * * *" }); +server.getLogs(); + +if (testFailed) { + server.debug(); +} + await server.reset(); await server.close(); ``` diff --git a/packages/wrangler/e2e/createTestHarness.test.ts b/packages/wrangler/e2e/createTestHarness.test.ts index b26eee2236..32327c29cf 100644 --- a/packages/wrangler/e2e/createTestHarness.test.ts +++ b/packages/wrangler/e2e/createTestHarness.test.ts @@ -1,9 +1,17 @@ import path from "node:path"; import { setTimeout } from "node:timers/promises"; +import { mockConsoleMethods } from "@cloudflare/workers-utils/test-helpers"; import { http, HttpResponse } from "msw"; import { setupServer } from "msw/node"; import dedent from "ts-dedent"; -import { beforeEach, describe, it, onTestFinished } from "vitest"; +import { + afterEach, + beforeEach, + describe, + it, + onTestFinished, + vi, +} from "vitest"; import { importWrangler, WranglerE2ETestHelper, @@ -11,14 +19,26 @@ import { const { createTestHarness } = await importWrangler(); -describe("createTestHarness", { sequential: true }, () => { +describe("createTestHarness", () => { + const logs = mockConsoleMethods(); + let helper: WranglerE2ETestHelper; + function normalizeDebugOutput(output: string) { + return String(output) + .replace(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/gm, "") + .replace(/http:\/\/127\.0\.0\.1:\d+/g, "http://127.0.0.1:"); + } + beforeEach(() => { helper = new WranglerE2ETestHelper(); }); - it("starts with default server options", async ({ expect }) => { + afterEach(() => { + vi.resetAllMocks(); + }); + + it("starts with default server options", async ({ expect, onTestFailed }) => { await helper.seed({ "wrangler.jsonc": dedent` { @@ -45,6 +65,7 @@ describe("createTestHarness", { sequential: true }, () => { ], }); onTestFinished(server.close); + onTestFailed(server.debug); const { url } = await server.listen(); @@ -952,6 +973,19 @@ describe("createTestHarness", { sequential: true }, () => { const afterScheduled = await server.fetch("/"); await expect(afterScheduled.text()).resolves.toBe("* * * * *"); + + server.debug(); + expect(normalizeDebugOutput(logs.getAndClearOut())).toMatchInlineSnapshot(` + "--------------- debug logs --------------- + [server] startup - started + [server] startup - completed + [server] fetch - GET / - started + [server] fetch - GET / - 200 + [server] [scheduled-worker] scheduled - GET /cdn-cgi/handler/scheduled?format=json&cron=*+*+*+*+*&time=1700000100000 - started + [server] [scheduled-worker] scheduled - GET /cdn-cgi/handler/scheduled?format=json&cron=*+*+*+*+*&time=1700000100000 - 200 + [server] fetch - GET / - started + [server] fetch - GET / - 200" + `); }); it("does not reload on source changes by default", async ({ expect }) => { @@ -1014,4 +1048,144 @@ describe("createTestHarness", { sequential: true }, () => { const response3 = await server.fetch("/"); await expect(response3.text()).resolves.toBe("Hello World"); }); + + it("captures runtime logs and prints debug timelines", async ({ expect }) => { + await helper.seed({ + "wrangler.primary.jsonc": dedent` + { + "name": "primary-worker", + "main": "src/primary.ts", + "compatibility_date": "2026-05-20" + } + `, + "wrangler.auxiliary.jsonc": dedent` + { + "name": "auxiliary-worker", + "main": "src/auxiliary.ts", + "compatibility_date": "2026-05-20" + } + `, + "src/primary.ts": dedent` + export default { + fetch() { + console.info("primary log"); + return new Response("primary ok"); + } + }; + `, + "src/auxiliary.ts": dedent` + export default { + fetch() { + console.warn("auxiliary warning"); + throw new Error("auxiliary failed"); + } + }; + `, + }); + + const server = createTestHarness({ + root: helper.tmpPath, + workers: [ + { configPath: "./wrangler.primary.jsonc" }, + { configPath: "./wrangler.auxiliary.jsonc" }, + ], + }); + onTestFinished(server.close); + + server.debug(); + + expect(logs.getAndClearOut()).toMatchInlineSnapshot( + `"-------------- No debug log --------------"` + ); + + await server.listen(); + expect(server.getLogs()).toEqual([]); + + server.clearLogs(); + + const primaryResponse = await server.getWorker("primary-worker").fetch("/"); + + await expect(primaryResponse.text()).resolves.toBe("primary ok"); + await expect( + server + .getWorker("auxiliary-worker") + .fetch("https://example.com/greet", { method: "post" }) + ).rejects.toThrow("auxiliary failed"); + expect(server.getLogs()).toEqual([ + { timestamp: expect.any(Number), level: "info", message: "primary log" }, + { + timestamp: expect.any(Number), + level: "warn", + message: "auxiliary warning", + }, + ]); + + server.debug(); + expect(normalizeDebugOutput(logs.getAndClearOut())).toMatchInlineSnapshot(` + "--------------- debug logs --------------- + [server] startup - started + [server] startup - completed + [server] [primary-worker] fetch - GET / - started + [runtime] info: primary log + [server] [primary-worker] fetch - GET / - 200 + [server] [auxiliary-worker] fetch - POST https://example.com/greet - started + [runtime] warn: auxiliary warning + [server] [auxiliary-worker] fetch - POST https://example.com/greet - failed" + `); + + server.clearLogs(); + expect(server.getLogs()).toEqual([]); + + server.debug(); + expect(normalizeDebugOutput(logs.getAndClearOut())).toMatchInlineSnapshot(` + "--------------- debug logs --------------- + [server] startup - started + [server] startup - completed + [server] [primary-worker] fetch - GET / - started + [runtime] info: primary log + [server] [primary-worker] fetch - GET / - 200 + [server] [auxiliary-worker] fetch - POST https://example.com/greet - started + [runtime] warn: auxiliary warning + [server] [auxiliary-worker] fetch - POST https://example.com/greet - failed" + `); + + await server.reset(); + expect(server.getLogs()).toEqual([]); + + server.debug(); + expect(normalizeDebugOutput(logs.getAndClearOut())).toMatchInlineSnapshot(` + "--------------- debug logs --------------- + [server] startup - started + [server] startup - completed" + `); + + await server.update((options) => ({ + ...options, + workers: [...options.workers], + })); + expect(server.getLogs()).toEqual([]); + + server.debug(); + expect(normalizeDebugOutput(logs.getAndClearOut())).toMatchInlineSnapshot(` + "--------------- debug logs --------------- + [server] startup - started + [server] startup - completed + [server] update - started + [server] update - completed" + `); + + // Make sure debug logs are still visible after server is closed + await server.close(); + + server.debug(); + expect(normalizeDebugOutput(logs.getAndClearOut())).toMatchInlineSnapshot(` + "--------------- debug logs --------------- + [server] startup - started + [server] startup - completed + [server] update - started + [server] update - completed + [server] teardown - started + [server] teardown - completed" + `); + }); }); diff --git a/packages/wrangler/src/api/startDevWorker/ConfigController.ts b/packages/wrangler/src/api/startDevWorker/ConfigController.ts index 28371ac7c3..4501074ed0 100644 --- a/packages/wrangler/src/api/startDevWorker/ConfigController.ts +++ b/packages/wrangler/src/api/startDevWorker/ConfigController.ts @@ -159,6 +159,7 @@ async function resolveDevConfig( liveReload: input.dev?.liveReload || false, testScheduled: input.dev?.testScheduled, outboundService: input.dev?.outboundService, + structuredLogsHandler: input.dev?.structuredLogsHandler, // absolute resolved path persist: localPersistencePath, registry: input.dev?.registry, diff --git a/packages/wrangler/src/api/startDevWorker/LocalRuntimeController.ts b/packages/wrangler/src/api/startDevWorker/LocalRuntimeController.ts index f1d4bcb0d6..b4ef41004d 100644 --- a/packages/wrangler/src/api/startDevWorker/LocalRuntimeController.ts +++ b/packages/wrangler/src/api/startDevWorker/LocalRuntimeController.ts @@ -220,6 +220,7 @@ export async function convertToConfigBundle( secure: event.config.dev.server.secure, }) : undefined, + structuredLogsHandler: event.config.dev.structuredLogsHandler, }; } diff --git a/packages/wrangler/src/api/startDevWorker/types.ts b/packages/wrangler/src/api/startDevWorker/types.ts index d3a4725b28..e44bf976be 100644 --- a/packages/wrangler/src/api/startDevWorker/types.ts +++ b/packages/wrangler/src/api/startDevWorker/types.ts @@ -20,7 +20,12 @@ import type { ServiceFetch, Trigger, } from "@cloudflare/workers-utils"; -import type { DispatchFetch, Miniflare, NodeJSCompatMode } from "miniflare"; +import type { + DispatchFetch, + Miniflare, + NodeJSCompatMode, + WorkerdStructuredLog, +} from "miniflare"; import type * as undici from "undici"; type MiniflareWorker = Awaited>; @@ -166,6 +171,8 @@ export interface StartDevWorkerInput { origin?: { hostname?: string; secure?: boolean }; // hostname: --host (remote)/--local-upstream (local), port: doesn't make sense in remote/=== server.port in local, secure: --upstream-protocol /** A hook for outbound fetch calls from within the worker. */ outboundService?: ServiceFetch; + /** Handles structured runtime logs. */ + structuredLogsHandler?: (log: WorkerdStructuredLog) => void; /** An undici MockAgent to declaratively mock fetch calls to particular resources. */ mockFetch?: undici.MockAgent; diff --git a/packages/wrangler/src/api/test-harness.ts b/packages/wrangler/src/api/test-harness.ts index 95b8a19ebe..83c762ca24 100644 --- a/packages/wrangler/src/api/test-harness.ts +++ b/packages/wrangler/src/api/test-harness.ts @@ -7,7 +7,6 @@ import { } from "@cloudflare/workers-utils"; import { Headers, Request } from "miniflare"; import { validateNodeCompatMode } from "../deployment-bundle/node-compat"; -import { logger } from "../logger"; import { requireApiToken, requireAuth } from "../user"; import { DevEnv } from "./startDevWorker/DevEnv"; import { MultiworkerRuntimeController } from "./startDevWorker/MultiworkerRuntimeController"; @@ -21,7 +20,13 @@ import type { FetcherScheduledResult, } from "@cloudflare/workers-types/experimental"; import type { Config, RawConfig } from "@cloudflare/workers-utils"; -import type { DispatchFetch, Json, Miniflare, RequestInfo } from "miniflare"; +import type { + DispatchFetch, + Json, + Miniflare, + RequestInfo, + WorkerdStructuredLog, +} from "miniflare"; export type TestHarnessOptions = { /** @@ -111,6 +116,23 @@ export type TestHarness = { * Worker in the server's `workers` options. */ getWorker(name?: string): WorkerHandle; + /** + * Returns captured Workers runtime logs since the current server session + * started or `clearLogs()` was last called. + */ + getLogs(): WorkerdStructuredLog[]; + /** + * Clears captured Workers runtime logs. + */ + clearLogs(): void; + /** + * Prints a diagnostic timeline for this test server. + * + * Use this to trace the sequence of server events and Workers runtime logs + * leading up to a test failure. Call `server.debug()` from your test runner's + * failure or cleanup hook when the current test has failed. + */ + debug(): void; /** * Updates the server configuration and reloads the running Workers. * @@ -167,6 +189,14 @@ type ServerSession = { devEnvs: DevEnv[]; }; +type DebugLog = { + source: "server" | "runtime"; + worker?: string; + level?: string; + message: string; + timestamp: number; +}; + /** * Creates a local test server for running Workers. * @@ -188,6 +218,34 @@ export function createTestHarness(options?: TestHarnessOptions): TestHarness { let currentOptions = options; let serverSession: ServerSession | undefined; let startPromise: Promise | undefined; + let workerdLogs: WorkerdStructuredLog[] = []; + let debugLogs: DebugLog[] = []; + + function debugLog(message: string, worker?: string) { + debugLogs.push({ + source: "server", + worker, + message, + timestamp: Date.now(), + }); + } + + function captureStructuredLog(log: WorkerdStructuredLog) { + workerdLogs.push(log); + debugLogs.push({ + source: "runtime", + level: log.level, + message: log.message, + timestamp: log.timestamp, + }); + } + + function formatLocalTimestamp(timestamp: number) { + const date = new Date(timestamp); + const pad = (value: number) => String(value).padStart(2, "0"); + + return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`; + } function resolvePath(basePath: string, maybePath: string | URL): string { if (maybePath instanceof URL) { @@ -208,7 +266,7 @@ export function createTestHarness(options?: TestHarnessOptions): TestHarness { normalizeAndValidateConfig(config, configPath, configPath, {}); if (diagnostics.hasWarnings()) { - logger.warn(diagnostics.renderWarnings()); + debugLog(diagnostics.renderWarnings(), normalizedConfig.name); } if (diagnostics.hasErrors()) { @@ -251,11 +309,12 @@ export function createTestHarness(options?: TestHarnessOptions): TestHarness { dev: { auth: serverAuthHook, server: { hostname: "127.0.0.1", port: 0 }, - logLevel: "error", + logLevel: "none", watch: false, persist: false, inspector: false, registry: undefined, + structuredLogsHandler: (log) => captureStructuredLog(log), outboundService: (request) => { /** * Miniflare passes its own undici-based Request here. Pass the URL as @@ -304,12 +363,14 @@ export function createTestHarness(options?: TestHarnessOptions): TestHarness { primaryDevEnv, devEnvs: [primaryDevEnv, ...auxiliaryDevEnvs], }; - try { + debugLog("startup - started"); await updateConfig(session, inputs); await waitForProxyReady(session); + debugLog("startup - completed"); return session; } catch (error) { + debugLog("startup - failed"); await teardownSession(session); throw error; } @@ -325,11 +386,9 @@ export function createTestHarness(options?: TestHarnessOptions): TestHarness { } } - async function resolveSession(workerName?: string) { + async function resolveSession() { if (startPromise) { - const session = await startPromise; - assertWorkerExists(session, workerName); - return session; + return await startPromise; } assert( @@ -337,17 +396,20 @@ export function createTestHarness(options?: TestHarnessOptions): TestHarness { "Server has not been started. Start it with server.listen() before calling this method." ); - assertWorkerExists(serverSession, workerName); - return serverSession; } - function assertWorkerExists( + function resolveWorkerName( session: ServerSession, workerName: string | undefined ) { if (workerName === undefined) { - return; + const primaryWorkerName = session.primaryDevEnv.config.latestConfig?.name; + assert( + primaryWorkerName, + "Primary Worker name is not available. Add a Worker `name` or call server.getWorker(name)." + ); + return primaryWorkerName; } const workerExists = session.devEnvs.some((devEnv) => { @@ -359,6 +421,8 @@ export function createTestHarness(options?: TestHarnessOptions): TestHarness { `Worker ${JSON.stringify(workerName)} does not exist in this server.` ); } + + return workerName; } async function serverAuthHook( @@ -372,7 +436,12 @@ export function createTestHarness(options?: TestHarnessOptions): TestHarness { async function teardownSession(session: ServerSession) { try { + debugLog("teardown - started"); await Promise.all(session.devEnvs.map((devEnv) => devEnv.teardown())); + debugLog("teardown - completed"); + } catch (error) { + debugLog("teardown - failed"); + throw error; } finally { if (session === serverSession) { serverSession = undefined; @@ -388,6 +457,8 @@ export function createTestHarness(options?: TestHarnessOptions): TestHarness { ); } + workerdLogs = []; + debugLogs = []; initialOptions = currentOptions; startPromise = createSession(initialOptions) .then((session) => { @@ -496,13 +567,28 @@ export function createTestHarness(options?: TestHarnessOptions): TestHarness { return miniflare; } + function getInputUrl(input: RequestInfo) { + if (typeof input === "string") { + return input; + } + + if (input instanceof URL) { + return input.href; + } + + return input.url; + } + async function dispatchFetch( miniflare: Miniflare, input: RequestInfo, init?: RequestInit, - worker?: string + worker?: string, + event = "fetch" ) { - if (typeof input === "string") { + let resolvedInput = input; + + if (typeof input === "string" && !URL.canParse(input)) { const session = await resolveSession(); const { url } = await waitForProxyReady(session); const baseUrl = new URL(url); @@ -516,19 +602,26 @@ export function createTestHarness(options?: TestHarnessOptions): TestHarness { baseUrl.hostname = "localhost"; } - input = new URL(input, baseUrl); + resolvedInput = new URL(input, baseUrl); } - if (worker === undefined) { - return miniflare.dispatchFetch(input, init); - } - - const request = new Request(input, init); + const request = new Request(resolvedInput, init); const headers = new Headers(request.headers); + const context = `${event} - ${request.method} ${getInputUrl(input)}`; - headers.set("MF-Route-Override", worker); + if (worker) { + headers.set("MF-Route-Override", worker); + } - return miniflare.dispatchFetch(request, { headers }); + try { + debugLog(`${context} - started`, worker); + const response = await miniflare.dispatchFetch(request, { headers }); + debugLog(`${context} - ${response.status}`, worker); + return response; + } catch (error) { + debugLog(`${context} - failed`, worker); + throw error; + } } return { @@ -553,36 +646,73 @@ export function createTestHarness(options?: TestHarnessOptions): TestHarness { getWorker(name?: string) { return { async fetch(input, init) { - const session = await resolveSession(name); + const session = await resolveSession(); const miniflare = await getRuntimeMiniflare(session); + const workerName = resolveWorkerName(session, name); - return dispatchFetch(miniflare, input, init, name); + return dispatchFetch(miniflare, input, init, workerName); }, async scheduled(scheduledOptions) { - const session = await resolveSession(name); + const session = await resolveSession(); const miniflare = await getRuntimeMiniflare(session); - const url = new URL( - "http://localhost/cdn-cgi/handler/scheduled?format=json" - ); + const workerName = resolveWorkerName(session, name); + const searchParams = new URLSearchParams({ + format: "json", + }); if (scheduledOptions?.cron !== undefined) { - url.searchParams.set("cron", scheduledOptions.cron); + searchParams.set("cron", scheduledOptions.cron); } if (scheduledOptions?.scheduledTime !== undefined) { - url.searchParams.set( + searchParams.set( "time", String(scheduledOptions.scheduledTime.getTime()) ); } - const response = await dispatchFetch(miniflare, url, undefined, name); + const response = await dispatchFetch( + miniflare, + `/cdn-cgi/handler/scheduled?${searchParams.toString()}`, + undefined, + workerName, + "scheduled" + ); const result = await response.json(); return result as FetcherScheduledResult; }, }; }, + getLogs() { + return structuredClone(workerdLogs); + }, + clearLogs() { + workerdLogs = []; + }, + debug() { + let message = "-------------- No debug log --------------"; + + if (debugLogs.length > 0) { + const lines = debugLogs.map((log) => { + const tags = [log.source, log.worker] + .filter((tag) => tag !== undefined) + .map((tag) => `[${tag}]`) + .join(" "); + + const level = log.level === undefined ? "" : `${log.level}: `; + + return `${formatLocalTimestamp(log.timestamp)} ${tags} ${level}${log.message}`; + }); + + message = ["--------------- debug logs ---------------", ...lines].join( + "\n" + ); + } + + // oxlint-disable-next-line no-console -- Use console.log() directly as the logger is disabled + console.log(message); + }, async update(updateInput) { let nextOptions: TestHarnessOptions; @@ -602,6 +732,7 @@ export function createTestHarness(options?: TestHarnessOptions): TestHarness { } if (serverSession) { + debugLog("update - started"); const nextInputs = resolveWorkerInputs(nextOptions); if (nextInputs.length !== serverSession.devEnvs.length) { @@ -615,7 +746,9 @@ export function createTestHarness(options?: TestHarnessOptions): TestHarness { waitForReloadComplete(serverSession), updateConfig(serverSession, nextInputs), ]); + debugLog("update - completed"); } catch (error) { + debugLog("update - failed"); await teardownSession(serverSession); throw error; } diff --git a/packages/wrangler/src/dev/miniflare/index.ts b/packages/wrangler/src/dev/miniflare/index.ts index 53f845e887..939bd59b23 100644 --- a/packages/wrangler/src/dev/miniflare/index.ts +++ b/packages/wrangler/src/dev/miniflare/index.ts @@ -108,6 +108,7 @@ export interface ConfigBundle { // The stable, externally-reachable URL of the proxy server in front of // this Miniflare instance (e.g. Wrangler's ProxyWorker URL). publicUrl: string | undefined; + structuredLogsHandler: ((log: WorkerdStructuredLog) => void) | undefined; } export class WranglerLog extends Log { @@ -1130,7 +1131,7 @@ export async function buildMiniflareOptions( logRequests: false, log, verbose: logger.loggerLevel === "debug", - handleStructuredLogs, + handleStructuredLogs: config.structuredLogsHandler ?? handleStructuredLogs, defaultPersistRoot, workers: [ { From 8a4bfe530b14cf583d71b432f23d2e81e7e9baca Mon Sep 17 00:00:00 2001 From: ANT Bot <116369605+workers-devprod@users.noreply.github.com> Date: Tue, 9 Jun 2026 13:44:25 +0100 Subject: [PATCH 6/7] Version Packages (#14179) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/big-snails-shop.md | 7 -- .changeset/c3-frameworks-update-14205.md | 11 -- .changeset/c3-frameworks-update-14206.md | 11 -- .changeset/c3-frameworks-update-14207.md | 11 -- .changeset/c3-frameworks-update-14208.md | 11 -- .changeset/c3-frameworks-update-14209.md | 11 -- .changeset/c3-frameworks-update-14216.md | 11 -- .changeset/curly-ducks-ssh.md | 7 -- .changeset/dependabot-update-14192.md | 12 -- .changeset/dependabot-update-14217.md | 12 -- .changeset/dependabot-update-14231.md | 12 -- .../edge-preview-cloudflarepreviews-domain.md | 5 - .changeset/fix-remote-dev-auth-error-ux.md | 9 -- ...es-check-multi-worker-secondary-configs.md | 9 -- .changeset/gentle-cougars-build.md | 38 ------ .changeset/guard-delete-only-secret-bulk.md | 7 -- .changeset/kind-geese-nail.md | 7 -- ...al-explorer-workflows-restart-from-step.md | 5 - .changeset/pipelines-failure-reason.md | 9 -- ...preserve-all-deploy-flags-in-autoconfig.md | 7 -- .changeset/tall-secrets-sneeze.md | 7 -- .changeset/versions-deploy-by-tag.md | 11 -- packages/create-cloudflare/CHANGELOG.md | 52 ++++++++ packages/create-cloudflare/package.json | 2 +- .../CHANGELOG.md | 6 + .../package.json | 2 +- packages/local-explorer-ui/CHANGELOG.md | 6 + packages/local-explorer-ui/package.json | 2 +- packages/miniflare/CHANGELOG.md | 32 +++++ packages/miniflare/package.json | 2 +- packages/pages-shared/CHANGELOG.md | 7 ++ packages/pages-shared/package.json | 2 +- packages/vite-plugin-cloudflare/CHANGELOG.md | 8 ++ packages/vite-plugin-cloudflare/package.json | 2 +- packages/vitest-pool-workers/CHANGELOG.md | 8 ++ packages/vitest-pool-workers/package.json | 2 +- packages/wrangler-bundler/CHANGELOG.md | 7 ++ packages/wrangler-bundler/package.json | 2 +- packages/wrangler/CHANGELOG.md | 114 ++++++++++++++++++ packages/wrangler/package.json | 2 +- 40 files changed, 249 insertions(+), 239 deletions(-) delete mode 100644 .changeset/big-snails-shop.md delete mode 100644 .changeset/c3-frameworks-update-14205.md delete mode 100644 .changeset/c3-frameworks-update-14206.md delete mode 100644 .changeset/c3-frameworks-update-14207.md delete mode 100644 .changeset/c3-frameworks-update-14208.md delete mode 100644 .changeset/c3-frameworks-update-14209.md delete mode 100644 .changeset/c3-frameworks-update-14216.md delete mode 100644 .changeset/curly-ducks-ssh.md delete mode 100644 .changeset/dependabot-update-14192.md delete mode 100644 .changeset/dependabot-update-14217.md delete mode 100644 .changeset/dependabot-update-14231.md delete mode 100644 .changeset/edge-preview-cloudflarepreviews-domain.md delete mode 100644 .changeset/fix-remote-dev-auth-error-ux.md delete mode 100644 .changeset/fix-types-check-multi-worker-secondary-configs.md delete mode 100644 .changeset/gentle-cougars-build.md delete mode 100644 .changeset/guard-delete-only-secret-bulk.md delete mode 100644 .changeset/kind-geese-nail.md delete mode 100644 .changeset/local-explorer-workflows-restart-from-step.md delete mode 100644 .changeset/pipelines-failure-reason.md delete mode 100644 .changeset/preserve-all-deploy-flags-in-autoconfig.md delete mode 100644 .changeset/tall-secrets-sneeze.md delete mode 100644 .changeset/versions-deploy-by-tag.md diff --git a/.changeset/big-snails-shop.md b/.changeset/big-snails-shop.md deleted file mode 100644 index 2d1bb66764..0000000000 --- a/.changeset/big-snails-shop.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"wrangler": patch ---- - -Print deploy warnings even in non-interactive contexts when strict mode is off - -Currently, wrangler deploy checks whether the incoming deploy configuration has destructive conflicts with the current configuration. Previously, we only performed this check in interactive contexts, or if the `--strict` flag was passed in. Now this warning is always printed, and it remains non-blocking in non-interactive contexts. diff --git a/.changeset/c3-frameworks-update-14205.md b/.changeset/c3-frameworks-update-14205.md deleted file mode 100644 index 18b7709c5e..0000000000 --- a/.changeset/c3-frameworks-update-14205.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"create-cloudflare": patch ---- - -Update dependencies of "create-cloudflare" - -The following dependency versions have been updated: - -| Dependency | From | To | -| ------------------- | ------ | ------ | -| create-react-router | 7.16.0 | 7.17.0 | diff --git a/.changeset/c3-frameworks-update-14206.md b/.changeset/c3-frameworks-update-14206.md deleted file mode 100644 index dcae1b3b20..0000000000 --- a/.changeset/c3-frameworks-update-14206.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"create-cloudflare": patch ---- - -Update dependencies of "create-cloudflare" - -The following dependency versions have been updated: - -| Dependency | From | To | -| ---------- | ------ | ------ | -| sv | 0.15.3 | 0.15.4 | diff --git a/.changeset/c3-frameworks-update-14207.md b/.changeset/c3-frameworks-update-14207.md deleted file mode 100644 index fc09b62a85..0000000000 --- a/.changeset/c3-frameworks-update-14207.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"create-cloudflare": patch ---- - -Update dependencies of "create-cloudflare" - -The following dependency versions have been updated: - -| Dependency | From | To | -| ------------- | ----- | ----- | -| create-analog | 2.5.2 | 2.6.0 | diff --git a/.changeset/c3-frameworks-update-14208.md b/.changeset/c3-frameworks-update-14208.md deleted file mode 100644 index 5879ad344f..0000000000 --- a/.changeset/c3-frameworks-update-14208.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"create-cloudflare": patch ---- - -Update dependencies of "create-cloudflare" - -The following dependency versions have been updated: - -| Dependency | From | To | -| --------------- | ------ | ------ | -| create-next-app | 16.2.6 | 16.2.7 | diff --git a/.changeset/c3-frameworks-update-14209.md b/.changeset/c3-frameworks-update-14209.md deleted file mode 100644 index 58300fc864..0000000000 --- a/.changeset/c3-frameworks-update-14209.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"create-cloudflare": patch ---- - -Update dependencies of "create-cloudflare" - -The following dependency versions have been updated: - -| Dependency | From | To | -| --------------- | ------- | ------ | -| @angular/create | 21.2.13 | 22.0.0 | diff --git a/.changeset/c3-frameworks-update-14216.md b/.changeset/c3-frameworks-update-14216.md deleted file mode 100644 index 28fab5acde..0000000000 --- a/.changeset/c3-frameworks-update-14216.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"create-cloudflare": patch ---- - -Update dependencies of "create-cloudflare" - -The following dependency versions have been updated: - -| Dependency | From | To | -| ------------- | ------ | ------ | -| @tanstack/cli | 0.68.0 | 0.69.1 | diff --git a/.changeset/curly-ducks-ssh.md b/.changeset/curly-ducks-ssh.md deleted file mode 100644 index 0bb5b81e3e..0000000000 --- a/.changeset/curly-ducks-ssh.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"wrangler": patch ---- - -Handle API validation errors from `wrangler containers ssh` - -Wrangler now lets the Containers API validate SSH instance IDs and preserves raw API error bodies such as `INVALID_INSTANCE_ID` when reporting validation failures. diff --git a/.changeset/dependabot-update-14192.md b/.changeset/dependabot-update-14192.md deleted file mode 100644 index 440b7bd959..0000000000 --- a/.changeset/dependabot-update-14192.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"miniflare": patch -"wrangler": patch ---- - -Update dependencies of "miniflare", "wrangler" - -The following dependency versions have been updated: - -| Dependency | From | To | -| ---------- | ------------ | ------------ | -| workerd | 1.20260603.1 | 1.20260605.1 | diff --git a/.changeset/dependabot-update-14217.md b/.changeset/dependabot-update-14217.md deleted file mode 100644 index 7afb9cfa6b..0000000000 --- a/.changeset/dependabot-update-14217.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"miniflare": patch -"wrangler": patch ---- - -Update dependencies of "miniflare", "wrangler" - -The following dependency versions have been updated: - -| Dependency | From | To | -| ---------- | ------------ | ------------ | -| workerd | 1.20260605.1 | 1.20260608.1 | diff --git a/.changeset/dependabot-update-14231.md b/.changeset/dependabot-update-14231.md deleted file mode 100644 index f239ab001a..0000000000 --- a/.changeset/dependabot-update-14231.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"miniflare": patch -"wrangler": patch ---- - -Update dependencies of "miniflare", "wrangler" - -The following dependency versions have been updated: - -| Dependency | From | To | -| ---------- | ------------ | ------------ | -| workerd | 1.20260608.1 | 1.20260609.1 | diff --git a/.changeset/edge-preview-cloudflarepreviews-domain.md b/.changeset/edge-preview-cloudflarepreviews-domain.md deleted file mode 100644 index 09fd036ec1..0000000000 --- a/.changeset/edge-preview-cloudflarepreviews-domain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@cloudflare/edge-preview-authenticated-proxy": patch ---- - -Internal infrastructure changes diff --git a/.changeset/fix-remote-dev-auth-error-ux.md b/.changeset/fix-remote-dev-auth-error-ux.md deleted file mode 100644 index ba68d2d3c3..0000000000 --- a/.changeset/fix-remote-dev-auth-error-ux.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"wrangler": patch ---- - -Show actionable error message when authentication fails during remote dev - -When `wrangler dev` with remote bindings encountered an authentication error (expired token, revoked OAuth, or invalid API token), the user saw a generic "A request to the Cloudflare API failed" message with no indication that authentication was the problem. - -Now, authentication failures during remote dev display a clear error message with actionable steps. diff --git a/.changeset/fix-types-check-multi-worker-secondary-configs.md b/.changeset/fix-types-check-multi-worker-secondary-configs.md deleted file mode 100644 index d4ad4b724a..0000000000 --- a/.changeset/fix-types-check-multi-worker-secondary-configs.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"wrangler": patch ---- - -Fix `wrangler types --check` reporting types as out of date in multi-worker setups - -Previously, running `wrangler types --check -c primary/wrangler.jsonc` in a multi-worker project would incorrectly report types as out of date, even when they were current. This happened because the secondary worker config paths (passed via additional `-c` flags during generation) were not stored in the generated types file header, so `--check` had no way to resolve the secondary workers' service bindings when verifying the hash. - -The fix stores secondary config paths in the generated file's header comment so that `--check` can recover them automatically. Users no longer need to re-pass every `-c` flag when running `--check` — only the primary config is required. diff --git a/.changeset/gentle-cougars-build.md b/.changeset/gentle-cougars-build.md deleted file mode 100644 index ce24c2339c..0000000000 --- a/.changeset/gentle-cougars-build.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -"wrangler": minor ---- - -Introduce `createTestHarness()` for integration testing Workers - -It runs Workers in a local preview environment using production build output and works with both Wrangler projects and Workers built by the Cloudflare Vite plugin. - -Use it from any Node.js test runner to send requests to individual Workers, trigger scheduled events, reset the server between tests, and mock outbound requests with libraries that intercept `globalThis.fetch()`, such as MSW. - -You can also capture structured logs from your Workers with `getLogs()`, or dump out a diagnostic timeline with `debug()` when tests fail: - -```ts -import { createTestHarness } from "wrangler"; - -const server = createTestHarness({ - workers: [ - { configPath: "./dist/web_worker/wrangler.json" }, - { configPath: "./dist/api_worker/wrangler.json" }, - ], -}); - -await server.listen(); -await server.fetch("http://example.com"); - -const apiWorker = server.getWorker("api-worker"); -await apiWorker.fetch("http://example.com/users/123"); -await apiWorker.scheduled({ cron: "0 0 * * *" }); - -server.getLogs(); - -if (testFailed) { - server.debug(); -} - -await server.reset(); -await server.close(); -``` diff --git a/.changeset/guard-delete-only-secret-bulk.md b/.changeset/guard-delete-only-secret-bulk.md deleted file mode 100644 index 8a6b1b44ba..0000000000 --- a/.changeset/guard-delete-only-secret-bulk.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"wrangler": patch ---- - -Prevent delete-only `wrangler secret bulk` input from creating a new Worker - -Previously, `wrangler secret bulk` could create a draft Worker when the input only deleted secrets and the target Worker name did not exist. Delete-only bulk secret operations now leave Worker-not-found as an error instead of creating a new Worker. diff --git a/.changeset/kind-geese-nail.md b/.changeset/kind-geese-nail.md deleted file mode 100644 index 7d7918c4a6..0000000000 --- a/.changeset/kind-geese-nail.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"miniflare": patch ---- - -Enable local scheduled handler dispatch for Workers + Assets (#9882) - -It is now possible to trigger a scheduled handler on a Worker that has assets. diff --git a/.changeset/local-explorer-workflows-restart-from-step.md b/.changeset/local-explorer-workflows-restart-from-step.md deleted file mode 100644 index fe59388f4f..0000000000 --- a/.changeset/local-explorer-workflows-restart-from-step.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@cloudflare/local-explorer-ui": minor ---- - -Add a restart-from-step button to each row in the workflow instance step list diff --git a/.changeset/pipelines-failure-reason.md b/.changeset/pipelines-failure-reason.md deleted file mode 100644 index 53a5148587..0000000000 --- a/.changeset/pipelines-failure-reason.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"wrangler": minor ---- - -Surface pipeline status and failure reasons in `wrangler pipelines list` and `wrangler pipelines get` - -`wrangler pipelines list` now includes a `Status` column, and when any pipelines are in a `failed` state it prints a summary of each failing pipeline along with the reason reported by the API. - -`wrangler pipelines get` now shows the pipeline `Status` in the general details and, for failed pipelines, highlights the failure with the reason returned by the server so it is clear why a pipeline is not running. diff --git a/.changeset/preserve-all-deploy-flags-in-autoconfig.md b/.changeset/preserve-all-deploy-flags-in-autoconfig.md deleted file mode 100644 index 6d1514b7d7..0000000000 --- a/.changeset/preserve-all-deploy-flags-in-autoconfig.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"wrangler": patch ---- - -Preserve all deployment-affecting CLI flags in the interactive deploy config flow - -When running `wrangler deploy` without a config file and going through the interactive setup flow, CLI flags beyond `--compatibility-flags` (such as `--routes`/`--route`, `--domains`/`--domain`, `--triggers`, `--var`, `--define`, `--alias`, `--jsx-factory`, `--jsx-fragment`, `--tsconfig`, `--minify`, `--upload-source-maps`, `--no-bundle`, `--logpush`, `--keep-vars`, `--legacy-env`, and `--dispatch-namespace`) were silently dropped. These flags are now persisted to the generated `wrangler.jsonc` config file (where a config field equivalent exists) and included in the suggested CLI command when the user declines config file generation. diff --git a/.changeset/tall-secrets-sneeze.md b/.changeset/tall-secrets-sneeze.md deleted file mode 100644 index c50120f722..0000000000 --- a/.changeset/tall-secrets-sneeze.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"wrangler": patch ---- - -Validate JSON stdin values for `wrangler secret bulk` - -JSON input piped through stdin now validates that secret values are strings or null before sending them to the API, matching the existing behavior for file input. diff --git a/.changeset/versions-deploy-by-tag.md b/.changeset/versions-deploy-by-tag.md deleted file mode 100644 index 5d7bfac7ac..0000000000 --- a/.changeset/versions-deploy-by-tag.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"wrangler": minor ---- - -Add `--version-tag` support to `wrangler versions deploy` to deploy a version by its tag - -You can now roll out or roll back a version by the tag it was uploaded with (e.g. a commit SHA passed to `--tag` at upload time) instead of first looking up its Version ID: - -`wrangler versions deploy --version-tag @100%` - -The tag is resolved to a Version ID against the worker's deployable versions, and the `@` shorthand works just like the existing `@` notation, including splitting traffic across multiple `--version-tag` values. If a tag matches no deployable version, or matches more than one, the command errors and asks you to deploy by Version ID directly. Note that tags can only be resolved against recent (deployable) versions — older versions that have aged out of that window must still be deployed by Version ID. diff --git a/packages/create-cloudflare/CHANGELOG.md b/packages/create-cloudflare/CHANGELOG.md index b4b978d65c..59713e0085 100644 --- a/packages/create-cloudflare/CHANGELOG.md +++ b/packages/create-cloudflare/CHANGELOG.md @@ -1,5 +1,57 @@ # create-cloudflare +## 2.70.1 + +### Patch Changes + +- [#14205](https://github.com/cloudflare/workers-sdk/pull/14205) [`d6fd677`](https://github.com/cloudflare/workers-sdk/commit/d6fd6770943042bccc996af1ef7cab7b0363df16) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "create-cloudflare" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ------------------- | ------ | ------ | + | create-react-router | 7.16.0 | 7.17.0 | + +- [#14206](https://github.com/cloudflare/workers-sdk/pull/14206) [`9c07154`](https://github.com/cloudflare/workers-sdk/commit/9c071540314d42a57a03f5240e6fc68e7f6e20bd) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "create-cloudflare" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ---------- | ------ | ------ | + | sv | 0.15.3 | 0.15.4 | + +- [#14207](https://github.com/cloudflare/workers-sdk/pull/14207) [`33ab99b`](https://github.com/cloudflare/workers-sdk/commit/33ab99b387a2083c07d337709bbe36556feba881) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "create-cloudflare" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ------------- | ----- | ----- | + | create-analog | 2.5.2 | 2.6.0 | + +- [#14208](https://github.com/cloudflare/workers-sdk/pull/14208) [`82c4d93`](https://github.com/cloudflare/workers-sdk/commit/82c4d9343954d3dcee1bace4bca96ee50b58bc7b) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "create-cloudflare" + + The following dependency versions have been updated: + + | Dependency | From | To | + | --------------- | ------ | ------ | + | create-next-app | 16.2.6 | 16.2.7 | + +- [#14209](https://github.com/cloudflare/workers-sdk/pull/14209) [`e13b8c0`](https://github.com/cloudflare/workers-sdk/commit/e13b8c02db3b65861cf84faaf276ffb79025079f) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "create-cloudflare" + + The following dependency versions have been updated: + + | Dependency | From | To | + | --------------- | ------- | ------ | + | @angular/create | 21.2.13 | 22.0.0 | + +- [#14216](https://github.com/cloudflare/workers-sdk/pull/14216) [`6b903e5`](https://github.com/cloudflare/workers-sdk/commit/6b903e5e93f76084417df16764f15cbcc6f1f23a) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "create-cloudflare" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ------------- | ------ | ------ | + | @tanstack/cli | 0.68.0 | 0.69.1 | + ## 2.70.0 ### Minor Changes diff --git a/packages/create-cloudflare/package.json b/packages/create-cloudflare/package.json index 0b669d2e27..fef2f6c0a1 100644 --- a/packages/create-cloudflare/package.json +++ b/packages/create-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "create-cloudflare", - "version": "2.70.0", + "version": "2.70.1", "description": "A CLI for creating and deploying new applications to Cloudflare.", "keywords": [ "cloudflare", diff --git a/packages/edge-preview-authenticated-proxy/CHANGELOG.md b/packages/edge-preview-authenticated-proxy/CHANGELOG.md index ddd6ebcd3f..f1e78696fa 100644 --- a/packages/edge-preview-authenticated-proxy/CHANGELOG.md +++ b/packages/edge-preview-authenticated-proxy/CHANGELOG.md @@ -1,5 +1,11 @@ # edge-preview-authenticated-proxy +## 0.3.2 + +### Patch Changes + +- [#14157](https://github.com/cloudflare/workers-sdk/pull/14157) [`8444499`](https://github.com/cloudflare/workers-sdk/commit/84444993c1227c7aad42d24fcfe9c07c9f3e73aa) Thanks [@penalosa](https://github.com/penalosa)! - Internal infrastructure changes + ## 0.3.1 ### Patch Changes diff --git a/packages/edge-preview-authenticated-proxy/package.json b/packages/edge-preview-authenticated-proxy/package.json index c68a940479..e18cbb413a 100644 --- a/packages/edge-preview-authenticated-proxy/package.json +++ b/packages/edge-preview-authenticated-proxy/package.json @@ -1,6 +1,6 @@ { "name": "@cloudflare/edge-preview-authenticated-proxy", - "version": "0.3.1", + "version": "0.3.2", "private": true, "scripts": { "check:type": "tsc", diff --git a/packages/local-explorer-ui/CHANGELOG.md b/packages/local-explorer-ui/CHANGELOG.md index c7eb18417c..36040eb133 100644 --- a/packages/local-explorer-ui/CHANGELOG.md +++ b/packages/local-explorer-ui/CHANGELOG.md @@ -1,5 +1,11 @@ # @cloudflare/local-explorer-ui +## 0.14.0 + +### Minor Changes + +- [#14154](https://github.com/cloudflare/workers-sdk/pull/14154) [`204f90a`](https://github.com/cloudflare/workers-sdk/commit/204f90a39000e54a9387eb45b54b2a6d894d8dcd) Thanks [@pombosilva](https://github.com/pombosilva)! - Add a restart-from-step button to each row in the workflow instance step list + ## 0.13.3 ### Patch Changes diff --git a/packages/local-explorer-ui/package.json b/packages/local-explorer-ui/package.json index 34a8589a66..9cc567c434 100644 --- a/packages/local-explorer-ui/package.json +++ b/packages/local-explorer-ui/package.json @@ -1,6 +1,6 @@ { "name": "@cloudflare/local-explorer-ui", - "version": "0.13.3", + "version": "0.14.0", "private": true, "type": "module", "scripts": { diff --git a/packages/miniflare/CHANGELOG.md b/packages/miniflare/CHANGELOG.md index 9dd7c05d8d..8c143de4d1 100644 --- a/packages/miniflare/CHANGELOG.md +++ b/packages/miniflare/CHANGELOG.md @@ -1,5 +1,37 @@ # miniflare +## 4.20260609.0 + +### Patch Changes + +- [#14192](https://github.com/cloudflare/workers-sdk/pull/14192) [`d076bcc`](https://github.com/cloudflare/workers-sdk/commit/d076bcc847adc0cb52c34863d3ad77f8faee5fbb) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "miniflare", "wrangler" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ---------- | ------------ | ------------ | + | workerd | 1.20260603.1 | 1.20260605.1 | + +- [#14217](https://github.com/cloudflare/workers-sdk/pull/14217) [`24497d0`](https://github.com/cloudflare/workers-sdk/commit/24497d0f5fb327d7c86f5f3022510b53cfec931d) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "miniflare", "wrangler" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ---------- | ------------ | ------------ | + | workerd | 1.20260605.1 | 1.20260608.1 | + +- [#14231](https://github.com/cloudflare/workers-sdk/pull/14231) [`4bb572f`](https://github.com/cloudflare/workers-sdk/commit/4bb572f264089b2ec1ce3a4b0d2f48c226cb4431) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "miniflare", "wrangler" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ---------- | ------------ | ------------ | + | workerd | 1.20260608.1 | 1.20260609.1 | + +- [#14177](https://github.com/cloudflare/workers-sdk/pull/14177) [`48c4ff0`](https://github.com/cloudflare/workers-sdk/commit/48c4ff00483e9346c9fe6dcb981009b081c0a204) Thanks [@ktKongTong](https://github.com/ktKongTong)! - Enable local scheduled handler dispatch for Workers + Assets (#9882) + + It is now possible to trigger a scheduled handler on a Worker that has assets. + ## 4.20260603.0 ### Minor Changes diff --git a/packages/miniflare/package.json b/packages/miniflare/package.json index 2c9fdb736d..a45dcb7291 100644 --- a/packages/miniflare/package.json +++ b/packages/miniflare/package.json @@ -1,6 +1,6 @@ { "name": "miniflare", - "version": "4.20260603.0", + "version": "4.20260609.0", "description": "Fun, full-featured, fully-local simulator for Cloudflare Workers", "keywords": [ "cloudflare", diff --git a/packages/pages-shared/CHANGELOG.md b/packages/pages-shared/CHANGELOG.md index 6229b120e7..ee6d842f93 100644 --- a/packages/pages-shared/CHANGELOG.md +++ b/packages/pages-shared/CHANGELOG.md @@ -1,5 +1,12 @@ # @cloudflare/pages-shared +## 0.13.144 + +### Patch Changes + +- Updated dependencies [[`d076bcc`](https://github.com/cloudflare/workers-sdk/commit/d076bcc847adc0cb52c34863d3ad77f8faee5fbb), [`24497d0`](https://github.com/cloudflare/workers-sdk/commit/24497d0f5fb327d7c86f5f3022510b53cfec931d), [`4bb572f`](https://github.com/cloudflare/workers-sdk/commit/4bb572f264089b2ec1ce3a4b0d2f48c226cb4431), [`48c4ff0`](https://github.com/cloudflare/workers-sdk/commit/48c4ff00483e9346c9fe6dcb981009b081c0a204)]: + - miniflare@4.20260609.0 + ## 0.13.143 ### Patch Changes diff --git a/packages/pages-shared/package.json b/packages/pages-shared/package.json index 53a858f13d..bed2e575fa 100644 --- a/packages/pages-shared/package.json +++ b/packages/pages-shared/package.json @@ -1,6 +1,6 @@ { "name": "@cloudflare/pages-shared", - "version": "0.13.143", + "version": "0.13.144", "repository": { "type": "git", "url": "https://github.com/cloudflare/workers-sdk.git", diff --git a/packages/vite-plugin-cloudflare/CHANGELOG.md b/packages/vite-plugin-cloudflare/CHANGELOG.md index 13758418a3..48a205e35d 100644 --- a/packages/vite-plugin-cloudflare/CHANGELOG.md +++ b/packages/vite-plugin-cloudflare/CHANGELOG.md @@ -1,5 +1,13 @@ # @cloudflare/vite-plugin +## 1.40.1 + +### Patch Changes + +- Updated dependencies [[`23aecac`](https://github.com/cloudflare/workers-sdk/commit/23aecac6a2d57ee5d4888405bd12cac66ab8a725), [`b932e47`](https://github.com/cloudflare/workers-sdk/commit/b932e47d49e736cb59159341a92045dcc65df0c6), [`d076bcc`](https://github.com/cloudflare/workers-sdk/commit/d076bcc847adc0cb52c34863d3ad77f8faee5fbb), [`24497d0`](https://github.com/cloudflare/workers-sdk/commit/24497d0f5fb327d7c86f5f3022510b53cfec931d), [`4bb572f`](https://github.com/cloudflare/workers-sdk/commit/4bb572f264089b2ec1ce3a4b0d2f48c226cb4431), [`165adb2`](https://github.com/cloudflare/workers-sdk/commit/165adb2084bde4bff453b54c4a984012b6999f29), [`776098c`](https://github.com/cloudflare/workers-sdk/commit/776098c79672e4b16c53aea1c127f45fe66a14bf), [`0706fbf`](https://github.com/cloudflare/workers-sdk/commit/0706fbf950548aaa8177a062a7c5d41822dfba0d), [`7993711`](https://github.com/cloudflare/workers-sdk/commit/79937112ff580c34b182b73ef830cdb17b5b798d), [`48c4ff0`](https://github.com/cloudflare/workers-sdk/commit/48c4ff00483e9346c9fe6dcb981009b081c0a204), [`8cf8c61`](https://github.com/cloudflare/workers-sdk/commit/8cf8c61efb9fd99892bcb250db12d7052b5fef08), [`8923f97`](https://github.com/cloudflare/workers-sdk/commit/8923f9769aaa13229d1cda535f95a9813465d765), [`b205fb7`](https://github.com/cloudflare/workers-sdk/commit/b205fb7ff0a1d897b5cbe2a9149978d9e581684c), [`a61ac29`](https://github.com/cloudflare/workers-sdk/commit/a61ac2936ae6b35146d637c18beb94567bb40bfa)]: + - wrangler@4.99.0 + - miniflare@4.20260609.0 + ## 1.40.0 ### Minor Changes diff --git a/packages/vite-plugin-cloudflare/package.json b/packages/vite-plugin-cloudflare/package.json index feafc7b4e8..4fb16f2122 100644 --- a/packages/vite-plugin-cloudflare/package.json +++ b/packages/vite-plugin-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@cloudflare/vite-plugin", - "version": "1.40.0", + "version": "1.40.1", "description": "Cloudflare plugin for Vite", "keywords": [ "cloudflare", diff --git a/packages/vitest-pool-workers/CHANGELOG.md b/packages/vitest-pool-workers/CHANGELOG.md index e188a6ac59..2696c94bac 100644 --- a/packages/vitest-pool-workers/CHANGELOG.md +++ b/packages/vitest-pool-workers/CHANGELOG.md @@ -1,5 +1,13 @@ # @cloudflare/vitest-pool-workers +## 0.16.14 + +### Patch Changes + +- Updated dependencies [[`23aecac`](https://github.com/cloudflare/workers-sdk/commit/23aecac6a2d57ee5d4888405bd12cac66ab8a725), [`b932e47`](https://github.com/cloudflare/workers-sdk/commit/b932e47d49e736cb59159341a92045dcc65df0c6), [`d076bcc`](https://github.com/cloudflare/workers-sdk/commit/d076bcc847adc0cb52c34863d3ad77f8faee5fbb), [`24497d0`](https://github.com/cloudflare/workers-sdk/commit/24497d0f5fb327d7c86f5f3022510b53cfec931d), [`4bb572f`](https://github.com/cloudflare/workers-sdk/commit/4bb572f264089b2ec1ce3a4b0d2f48c226cb4431), [`165adb2`](https://github.com/cloudflare/workers-sdk/commit/165adb2084bde4bff453b54c4a984012b6999f29), [`776098c`](https://github.com/cloudflare/workers-sdk/commit/776098c79672e4b16c53aea1c127f45fe66a14bf), [`0706fbf`](https://github.com/cloudflare/workers-sdk/commit/0706fbf950548aaa8177a062a7c5d41822dfba0d), [`7993711`](https://github.com/cloudflare/workers-sdk/commit/79937112ff580c34b182b73ef830cdb17b5b798d), [`48c4ff0`](https://github.com/cloudflare/workers-sdk/commit/48c4ff00483e9346c9fe6dcb981009b081c0a204), [`8cf8c61`](https://github.com/cloudflare/workers-sdk/commit/8cf8c61efb9fd99892bcb250db12d7052b5fef08), [`8923f97`](https://github.com/cloudflare/workers-sdk/commit/8923f9769aaa13229d1cda535f95a9813465d765), [`b205fb7`](https://github.com/cloudflare/workers-sdk/commit/b205fb7ff0a1d897b5cbe2a9149978d9e581684c), [`a61ac29`](https://github.com/cloudflare/workers-sdk/commit/a61ac2936ae6b35146d637c18beb94567bb40bfa)]: + - wrangler@4.99.0 + - miniflare@4.20260609.0 + ## 0.16.13 ### Patch Changes diff --git a/packages/vitest-pool-workers/package.json b/packages/vitest-pool-workers/package.json index 3452ad7d3d..13fc799454 100644 --- a/packages/vitest-pool-workers/package.json +++ b/packages/vitest-pool-workers/package.json @@ -1,6 +1,6 @@ { "name": "@cloudflare/vitest-pool-workers", - "version": "0.16.13", + "version": "0.16.14", "description": "Workers Vitest integration for writing Vitest unit and integration tests that run inside the Workers runtime", "keywords": [ "cloudflare", diff --git a/packages/wrangler-bundler/CHANGELOG.md b/packages/wrangler-bundler/CHANGELOG.md index b880bf9ce1..dd202c83c3 100644 --- a/packages/wrangler-bundler/CHANGELOG.md +++ b/packages/wrangler-bundler/CHANGELOG.md @@ -1,5 +1,12 @@ # @cloudflare/wrangler-bundler +## 0.1.3 + +### Patch Changes + +- Updated dependencies [[`23aecac`](https://github.com/cloudflare/workers-sdk/commit/23aecac6a2d57ee5d4888405bd12cac66ab8a725), [`b932e47`](https://github.com/cloudflare/workers-sdk/commit/b932e47d49e736cb59159341a92045dcc65df0c6), [`d076bcc`](https://github.com/cloudflare/workers-sdk/commit/d076bcc847adc0cb52c34863d3ad77f8faee5fbb), [`24497d0`](https://github.com/cloudflare/workers-sdk/commit/24497d0f5fb327d7c86f5f3022510b53cfec931d), [`4bb572f`](https://github.com/cloudflare/workers-sdk/commit/4bb572f264089b2ec1ce3a4b0d2f48c226cb4431), [`165adb2`](https://github.com/cloudflare/workers-sdk/commit/165adb2084bde4bff453b54c4a984012b6999f29), [`776098c`](https://github.com/cloudflare/workers-sdk/commit/776098c79672e4b16c53aea1c127f45fe66a14bf), [`0706fbf`](https://github.com/cloudflare/workers-sdk/commit/0706fbf950548aaa8177a062a7c5d41822dfba0d), [`7993711`](https://github.com/cloudflare/workers-sdk/commit/79937112ff580c34b182b73ef830cdb17b5b798d), [`8cf8c61`](https://github.com/cloudflare/workers-sdk/commit/8cf8c61efb9fd99892bcb250db12d7052b5fef08), [`8923f97`](https://github.com/cloudflare/workers-sdk/commit/8923f9769aaa13229d1cda535f95a9813465d765), [`b205fb7`](https://github.com/cloudflare/workers-sdk/commit/b205fb7ff0a1d897b5cbe2a9149978d9e581684c), [`a61ac29`](https://github.com/cloudflare/workers-sdk/commit/a61ac2936ae6b35146d637c18beb94567bb40bfa)]: + - wrangler@4.99.0 + ## 0.1.2 ### Patch Changes diff --git a/packages/wrangler-bundler/package.json b/packages/wrangler-bundler/package.json index 7b2ad7c2d5..fa38c03ad2 100644 --- a/packages/wrangler-bundler/package.json +++ b/packages/wrangler-bundler/package.json @@ -1,6 +1,6 @@ { "name": "@cloudflare/wrangler-bundler", - "version": "0.1.2", + "version": "0.1.3", "description": "esbuild-based dev server for Cloudflare Workers, extracted from `wrangler dev`", "license": "MIT OR Apache-2.0", "repository": { diff --git a/packages/wrangler/CHANGELOG.md b/packages/wrangler/CHANGELOG.md index f908a33368..307ee935c4 100644 --- a/packages/wrangler/CHANGELOG.md +++ b/packages/wrangler/CHANGELOG.md @@ -1,5 +1,119 @@ # wrangler +## 4.99.0 + +### Minor Changes + +- [#14169](https://github.com/cloudflare/workers-sdk/pull/14169) [`0706fbf`](https://github.com/cloudflare/workers-sdk/commit/0706fbf950548aaa8177a062a7c5d41822dfba0d) Thanks [@edmundhung](https://github.com/edmundhung)! - Introduce `createTestHarness()` for integration testing Workers + + It runs Workers in a local preview environment using production build output and works with both Wrangler projects and Workers built by the Cloudflare Vite plugin. + + Use it from any Node.js test runner to send requests to individual Workers, trigger scheduled events, reset the server between tests, and mock outbound requests with libraries that intercept `globalThis.fetch()`, such as MSW. + + You can also capture structured logs from your Workers with `getLogs()`, or dump out a diagnostic timeline with `debug()` when tests fail: + + ```ts + import { createTestHarness } from "wrangler"; + + const server = createTestHarness({ + workers: [ + { configPath: "./dist/web_worker/wrangler.json" }, + { configPath: "./dist/api_worker/wrangler.json" }, + ], + }); + + await server.listen(); + await server.fetch("http://example.com"); + + const apiWorker = server.getWorker("api-worker"); + await apiWorker.fetch("http://example.com/users/123"); + await apiWorker.scheduled({ cron: "0 0 * * *" }); + + server.getLogs(); + + if (testFailed) { + server.debug(); + } + + await server.reset(); + await server.close(); + ``` + +- [#14174](https://github.com/cloudflare/workers-sdk/pull/14174) [`8cf8c61`](https://github.com/cloudflare/workers-sdk/commit/8cf8c61efb9fd99892bcb250db12d7052b5fef08) Thanks [@oliy](https://github.com/oliy)! - Surface pipeline status and failure reasons in `wrangler pipelines list` and `wrangler pipelines get` + + `wrangler pipelines list` now includes a `Status` column, and when any pipelines are in a `failed` state it prints a summary of each failing pipeline along with the reason reported by the API. + + `wrangler pipelines get` now shows the pipeline `Status` in the general details and, for failed pipelines, highlights the failure with the reason returned by the server so it is clear why a pipeline is not running. + +- [#14211](https://github.com/cloudflare/workers-sdk/pull/14211) [`a61ac29`](https://github.com/cloudflare/workers-sdk/commit/a61ac2936ae6b35146d637c18beb94567bb40bfa) Thanks [@james-elicx](https://github.com/james-elicx)! - Add `--version-tag` support to `wrangler versions deploy` to deploy a version by its tag + + You can now roll out or roll back a version by the tag it was uploaded with (e.g. a commit SHA passed to `--tag` at upload time) instead of first looking up its Version ID: + + `wrangler versions deploy --version-tag @100%` + + The tag is resolved to a Version ID against the worker's deployable versions, and the `@` shorthand works just like the existing `@` notation, including splitting traffic across multiple `--version-tag` values. If a tag matches no deployable version, or matches more than one, the command errors and asks you to deploy by Version ID directly. Note that tags can only be resolved against recent (deployable) versions — older versions that have aged out of that window must still be deployed by Version ID. + +### Patch Changes + +- [#14163](https://github.com/cloudflare/workers-sdk/pull/14163) [`23aecac`](https://github.com/cloudflare/workers-sdk/commit/23aecac6a2d57ee5d4888405bd12cac66ab8a725) Thanks [@emily-shen](https://github.com/emily-shen)! - Print deploy warnings even in non-interactive contexts when strict mode is off + + Currently, wrangler deploy checks whether the incoming deploy configuration has destructive conflicts with the current configuration. Previously, we only performed this check in interactive contexts, or if the `--strict` flag was passed in. Now this warning is always printed, and it remains non-blocking in non-interactive contexts. + +- [#14173](https://github.com/cloudflare/workers-sdk/pull/14173) [`b932e47`](https://github.com/cloudflare/workers-sdk/commit/b932e47d49e736cb59159341a92045dcc65df0c6) Thanks [@gpanders](https://github.com/gpanders)! - Handle API validation errors from `wrangler containers ssh` + + Wrangler now lets the Containers API validate SSH instance IDs and preserves raw API error bodies such as `INVALID_INSTANCE_ID` when reporting validation failures. + +- [#14192](https://github.com/cloudflare/workers-sdk/pull/14192) [`d076bcc`](https://github.com/cloudflare/workers-sdk/commit/d076bcc847adc0cb52c34863d3ad77f8faee5fbb) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "miniflare", "wrangler" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ---------- | ------------ | ------------ | + | workerd | 1.20260603.1 | 1.20260605.1 | + +- [#14217](https://github.com/cloudflare/workers-sdk/pull/14217) [`24497d0`](https://github.com/cloudflare/workers-sdk/commit/24497d0f5fb327d7c86f5f3022510b53cfec931d) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "miniflare", "wrangler" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ---------- | ------------ | ------------ | + | workerd | 1.20260605.1 | 1.20260608.1 | + +- [#14231](https://github.com/cloudflare/workers-sdk/pull/14231) [`4bb572f`](https://github.com/cloudflare/workers-sdk/commit/4bb572f264089b2ec1ce3a4b0d2f48c226cb4431) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "miniflare", "wrangler" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ---------- | ------------ | ------------ | + | workerd | 1.20260608.1 | 1.20260609.1 | + +- [#14195](https://github.com/cloudflare/workers-sdk/pull/14195) [`165adb2`](https://github.com/cloudflare/workers-sdk/commit/165adb2084bde4bff453b54c4a984012b6999f29) Thanks [@dario-piotrowicz](https://github.com/dario-piotrowicz)! - Show actionable error message when authentication fails during remote dev + + When `wrangler dev` with remote bindings encountered an authentication error (expired token, revoked OAuth, or invalid API token), the user saw a generic "A request to the Cloudflare API failed" message with no indication that authentication was the problem. + + Now, authentication failures during remote dev display a clear error message with actionable steps. + +- [#14034](https://github.com/cloudflare/workers-sdk/pull/14034) [`776098c`](https://github.com/cloudflare/workers-sdk/commit/776098c79672e4b16c53aea1c127f45fe66a14bf) Thanks [@matingathani](https://github.com/matingathani)! - Fix `wrangler types --check` reporting types as out of date in multi-worker setups + + Previously, running `wrangler types --check -c primary/wrangler.jsonc` in a multi-worker project would incorrectly report types as out of date, even when they were current. This happened because the secondary worker config paths (passed via additional `-c` flags during generation) were not stored in the generated types file header, so `--check` had no way to resolve the secondary workers' service bindings when verifying the hash. + + The fix stores secondary config paths in the generated file's header comment so that `--check` can recover them automatically. Users no longer need to re-pass every `-c` flag when running `--check` — only the primary config is required. + +- [#14053](https://github.com/cloudflare/workers-sdk/pull/14053) [`7993711`](https://github.com/cloudflare/workers-sdk/commit/79937112ff580c34b182b73ef830cdb17b5b798d) Thanks [@fallintoplace](https://github.com/fallintoplace)! - Prevent delete-only `wrangler secret bulk` input from creating a new Worker + + Previously, `wrangler secret bulk` could create a draft Worker when the input only deleted secrets and the target Worker name did not exist. Delete-only bulk secret operations now leave Worker-not-found as an error instead of creating a new Worker. + +- [#14055](https://github.com/cloudflare/workers-sdk/pull/14055) [`8923f97`](https://github.com/cloudflare/workers-sdk/commit/8923f9769aaa13229d1cda535f95a9813465d765) Thanks [@dario-piotrowicz](https://github.com/dario-piotrowicz)! - Preserve all deployment-affecting CLI flags in the interactive deploy config flow + + When running `wrangler deploy` without a config file and going through the interactive setup flow, CLI flags beyond `--compatibility-flags` (such as `--routes`/`--route`, `--domains`/`--domain`, `--triggers`, `--var`, `--define`, `--alias`, `--jsx-factory`, `--jsx-fragment`, `--tsconfig`, `--minify`, `--upload-source-maps`, `--no-bundle`, `--logpush`, `--keep-vars`, `--legacy-env`, and `--dispatch-namespace`) were silently dropped. These flags are now persisted to the generated `wrangler.jsonc` config file (where a config field equivalent exists) and included in the suggested CLI command when the user declines config file generation. + +- [#14196](https://github.com/cloudflare/workers-sdk/pull/14196) [`b205fb7`](https://github.com/cloudflare/workers-sdk/commit/b205fb7ff0a1d897b5cbe2a9149978d9e581684c) Thanks [@odiak](https://github.com/odiak)! - Validate JSON stdin values for `wrangler secret bulk` + + JSON input piped through stdin now validates that secret values are strings or null before sending them to the API, matching the existing behavior for file input. + +- Updated dependencies [[`d076bcc`](https://github.com/cloudflare/workers-sdk/commit/d076bcc847adc0cb52c34863d3ad77f8faee5fbb), [`24497d0`](https://github.com/cloudflare/workers-sdk/commit/24497d0f5fb327d7c86f5f3022510b53cfec931d), [`4bb572f`](https://github.com/cloudflare/workers-sdk/commit/4bb572f264089b2ec1ce3a4b0d2f48c226cb4431), [`48c4ff0`](https://github.com/cloudflare/workers-sdk/commit/48c4ff00483e9346c9fe6dcb981009b081c0a204)]: + - miniflare@4.20260609.0 + ## 4.98.0 ### Minor Changes diff --git a/packages/wrangler/package.json b/packages/wrangler/package.json index 7a852f369f..2ede3fe4f9 100644 --- a/packages/wrangler/package.json +++ b/packages/wrangler/package.json @@ -1,6 +1,6 @@ { "name": "wrangler", - "version": "4.98.0", + "version": "4.99.0", "description": "Command-line interface for all things Cloudflare Workers", "keywords": [ "assembly", From 41f75c0b2ba3f0f4a88ca792c1b5c8914374d61d Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Tue, 9 Jun 2026 14:16:55 +0100 Subject: [PATCH 7/7] Improve D1 error messages for missing or conflicting options (#14230) --- .changeset/improve-d1-errors.md | 9 +++++++ .../wrangler/src/__tests__/d1/execute.test.ts | 10 ++++--- .../src/__tests__/d1/insights.test.ts | 10 ++++--- .../wrangler/src/__tests__/d1/migrate.test.ts | 4 ++- .../src/__tests__/d1/timeTravel.test.ts | 2 +- packages/wrangler/src/d1/execute.ts | 27 ++++++++++++------- packages/wrangler/src/d1/export.ts | 9 ++++--- packages/wrangler/src/d1/insights.ts | 21 ++++++++++----- .../wrangler/src/d1/timeTravel/restore.ts | 13 +++++---- 9 files changed, 72 insertions(+), 33 deletions(-) create mode 100644 .changeset/improve-d1-errors.md diff --git a/.changeset/improve-d1-errors.md b/.changeset/improve-d1-errors.md new file mode 100644 index 0000000000..94204d4ae9 --- /dev/null +++ b/.changeset/improve-d1-errors.md @@ -0,0 +1,9 @@ +--- +"wrangler": patch +--- + +Improve D1 error messages for missing or conflicting options + +Error messages for `d1 execute`, `d1 export`, `d1 time-travel restore`, and `d1 insights` now clearly state which option is missing or conflicting, explain why the combination is invalid, and suggest how to fix the issue. + +Additionally, duration validation errors in `d1 insights` are now thrown as `UserError` instead of plain `Error`, ensuring they are displayed cleanly to users rather than as unexpected crashes. diff --git a/packages/wrangler/src/__tests__/d1/execute.test.ts b/packages/wrangler/src/__tests__/d1/execute.test.ts index 9a024758ec..5713aaffaf 100644 --- a/packages/wrangler/src/__tests__/d1/execute.test.ts +++ b/packages/wrangler/src/__tests__/d1/execute.test.ts @@ -46,7 +46,7 @@ describe("execute", () => { }); await expect(runWrangler("d1 execute db")).rejects.toThrowError( - `Error: must provide --command or --file` + `Missing required option --command or --file. Provide a SQL command inline with --command="", or a path to a SQL file with --file=.` ); }); @@ -81,7 +81,7 @@ describe("execute", () => { await expect( runWrangler(`d1 execute db --command "select;" --local --remote`) ).rejects.toThrowError( - "Error: can't use --local and --remote at the same time" + `Error: can't use --local and --remote at the same time` ); }); @@ -95,7 +95,9 @@ describe("execute", () => { await expect( runWrangler(`d1 execute db --command "select;" --local --preview`) - ).rejects.toThrowError(`Error: can't use --preview without --remote`); + ).rejects.toThrowError( + `Cannot use --preview without --remote. The --preview flag targets a preview D1 database, which requires the --remote flag. Remove --preview or add --remote.` + ); }); it("should reject the use of --preview with --local with --json", async ({ @@ -114,7 +116,7 @@ describe("execute", () => { JSON.stringify( { error: { - text: "Error: can't use --preview without --remote", + text: "Cannot use --preview without --remote. The --preview flag targets a preview D1 database, which requires the --remote flag. Remove --preview or add --remote.", }, }, null, diff --git a/packages/wrangler/src/__tests__/d1/insights.test.ts b/packages/wrangler/src/__tests__/d1/insights.test.ts index bdf57dee70..db1bcc7b8d 100644 --- a/packages/wrangler/src/__tests__/d1/insights.test.ts +++ b/packages/wrangler/src/__tests__/d1/insights.test.ts @@ -26,14 +26,14 @@ describe("getDurationDates()", () => { expect, }) => { expect(() => getDurationDates("32d")).toThrowError( - "Duration cannot be greater than 31 days" + `Invalid --time-period value "32d": 32 days exceeds the maximum of 31 days. Provide a value of 31d or less.` ); }); it("should throw an error if duration is greater than 31 days (in minutes)", ({ expect, }) => { expect(() => getDurationDates("44641m")).toThrowError( - "Duration cannot be greater than 44640 minutes (31 days)" + `Invalid --time-period value "44641m": 44641 minutes exceeds the maximum of 44640 minutes (31 days). Provide a value of 44640m or less.` ); }); @@ -41,12 +41,14 @@ describe("getDurationDates()", () => { expect, }) => { expect(() => getDurationDates("745h")).toThrowError( - "Duration cannot be greater than 744 hours (31 days)" + `Invalid --time-period value "745h": 745 hours exceeds the maximum of 744 hours (31 days). Provide a value of 744h or less.` ); }); it("should throw an error if duration unit is invalid", ({ expect }) => { - expect(() => getDurationDates("1y")).toThrowError("Invalid duration unit"); + expect(() => getDurationDates("1y")).toThrowError( + `Invalid --time-period unit "y" in "1y". Supported units: d (days), h (hours), m (minutes). Example: --time-period=7d.` + ); }); it("should return the correct start and end dates", ({ expect }) => { diff --git a/packages/wrangler/src/__tests__/d1/migrate.test.ts b/packages/wrangler/src/__tests__/d1/migrate.test.ts index f86f97bd8c..4fe4cbd8b7 100644 --- a/packages/wrangler/src/__tests__/d1/migrate.test.ts +++ b/packages/wrangler/src/__tests__/d1/migrate.test.ts @@ -291,7 +291,9 @@ describe("migrate", () => { await expect( runWrangler("d1 migrations apply --local db --preview") - ).rejects.toThrowError(`Error: can't use --preview without --remote`); + ).rejects.toThrowError( + `Cannot use --preview without --remote. The --preview flag targets a preview D1 database, which requires the --remote flag. Remove --preview or add --remote.` + ); }); it("multiple accounts: should throw when trying to apply migrations without an account_id in config", async ({ diff --git a/packages/wrangler/src/__tests__/d1/timeTravel.test.ts b/packages/wrangler/src/__tests__/d1/timeTravel.test.ts index 9f600afdde..820d1923f0 100644 --- a/packages/wrangler/src/__tests__/d1/timeTravel.test.ts +++ b/packages/wrangler/src/__tests__/d1/timeTravel.test.ts @@ -35,7 +35,7 @@ describe("time-travel", () => { "d1 time-travel restore db --timestamp=1234 --bookmark=5678" ) ).rejects.toThrowError( - `Provide either a timestamp, or a bookmark - not both.` + `Cannot use --timestamp and --bookmark together. Provide only one: --timestamp to restore to a point in time, or --bookmark to restore to a specific bookmark.` ); }); }); diff --git a/packages/wrangler/src/d1/execute.ts b/packages/wrangler/src/d1/execute.ts index 56cf6504a1..386e65104c 100644 --- a/packages/wrangler/src/d1/execute.ts +++ b/packages/wrangler/src/d1/execute.ts @@ -238,9 +238,12 @@ export async function executeSql({ ? ({ command } as ExecuteInput) : null; if (!input) { - throw new UserError(`Error: must provide --command or --file.`, { - telemetryMessage: "d1 execute missing command or file", - }); + throw new UserError( + `Missing required option --command or --file. Provide a SQL command inline with --command="", or a path to a SQL file with --file=.`, + { + telemetryMessage: "d1 execute missing command or file", + } + ); } if (local && remote) { throw new UserError( @@ -251,14 +254,20 @@ export async function executeSql({ ); } if (preview && !remote) { - throw new UserError(`Error: can't use --preview without --remote`, { - telemetryMessage: "d1 execute preview requires remote", - }); + throw new UserError( + `Cannot use --preview without --remote. The --preview flag targets a preview D1 database, which requires the --remote flag. Remove --preview or add --remote.`, + { + telemetryMessage: "d1 execute preview requires remote", + } + ); } if (persistTo && !local) { - throw new UserError(`Error: can't use --persist-to without --local`, { - telemetryMessage: "d1 execute persist-to requires local", - }); + throw new UserError( + `Cannot use --persist-to without --local. The --persist-to flag specifies a local persistence directory, which requires the --local flag. Remove --persist-to or add --local.`, + { + telemetryMessage: "d1 execute persist-to requires local", + } + ); } if (input.file) { await checkForSQLiteBinary(input.file); diff --git a/packages/wrangler/src/d1/export.ts b/packages/wrangler/src/d1/export.ts index 3c31715880..1f07a129eb 100644 --- a/packages/wrangler/src/d1/export.ts +++ b/packages/wrangler/src/d1/export.ts @@ -92,9 +92,12 @@ export const d1ExportCommand = createCommand({ args; if (!schema && !data) { - throw new UserError(`You cannot specify both --no-schema and --no-data`, { - telemetryMessage: "d1 export conflicting no-schema and no-data flags", - }); + throw new UserError( + `Cannot use --no-schema and --no-data together. At least one of schema or data must be included in the export. Remove one of the flags.`, + { + telemetryMessage: "d1 export conflicting no-schema and no-data flags", + } + ); } const stats = statSync(output, { throwIfNoEntry: false }); diff --git a/packages/wrangler/src/d1/insights.ts b/packages/wrangler/src/d1/insights.ts index 2a616f6629..d6f3a6d763 100644 --- a/packages/wrangler/src/d1/insights.ts +++ b/packages/wrangler/src/d1/insights.ts @@ -1,3 +1,4 @@ +import { UserError } from "@cloudflare/workers-utils"; import { fetchGraphqlResult } from "../cfetch"; import { createCommand } from "../core/create-command"; import { logger } from "../logger"; @@ -25,7 +26,10 @@ export function getDurationDates(durationString: string) { switch (durationUnit) { case "d": if (durationValue > 31) { - throw new Error("Duration cannot be greater than 31 days"); + throw new UserError( + `Invalid --time-period value "${durationString}": ${durationValue} days exceeds the maximum of 31 days. Provide a value of 31d or less.`, + { telemetryMessage: "d1 insights duration exceeds maximum" } + ); } startDate = new Date( endDate.getTime() - durationValue * 24 * 60 * 60 * 1000 @@ -33,22 +37,27 @@ export function getDurationDates(durationString: string) { break; case "m": if (durationValue > 31 * 24 * 60) { - throw new Error( - `Duration cannot be greater than ${31 * 24 * 60} minutes (31 days)` + throw new UserError( + `Invalid --time-period value "${durationString}": ${durationValue} minutes exceeds the maximum of ${31 * 24 * 60} minutes (31 days). Provide a value of ${31 * 24 * 60}m or less.`, + { telemetryMessage: "d1 insights duration exceeds maximum" } ); } startDate = new Date(endDate.getTime() - durationValue * 60 * 1000); break; case "h": if (durationValue > 31 * 24) { - throw new Error( - `Duration cannot be greater than ${31 * 24} hours (31 days)` + throw new UserError( + `Invalid --time-period value "${durationString}": ${durationValue} hours exceeds the maximum of ${31 * 24} hours (31 days). Provide a value of ${31 * 24}h or less.`, + { telemetryMessage: "d1 insights duration exceeds maximum" } ); } startDate = new Date(endDate.getTime() - durationValue * 60 * 60 * 1000); break; default: - throw new Error("Invalid duration unit"); + throw new UserError( + `Invalid --time-period unit "${durationUnit}" in "${durationString}". Supported units: d (days), h (hours), m (minutes). Example: --time-period=7d.`, + { telemetryMessage: "d1 insights invalid duration unit" } + ); } return [startDate.toISOString(), endDate.toISOString()]; diff --git a/packages/wrangler/src/d1/timeTravel/restore.ts b/packages/wrangler/src/d1/timeTravel/restore.ts index 12e0d13847..79fe44c70e 100644 --- a/packages/wrangler/src/d1/timeTravel/restore.ts +++ b/packages/wrangler/src/d1/timeTravel/restore.ts @@ -49,17 +49,20 @@ export const d1TimeTravelRestoreCommand = createCommand({ validateArgs(args) { if (args.timestamp && args.bookmark) { throw new UserError( - "Provide either a timestamp, or a bookmark - not both.", + "Cannot use --timestamp and --bookmark together. Provide only one: --timestamp to restore to a point in time, or --bookmark to restore to a specific bookmark.", { telemetryMessage: "d1 time travel restore conflicting timestamp and bookmark", } ); } else if (!args.timestamp && !args.bookmark) { - throw new UserError("Provide either a timestamp or a bookmark", { - telemetryMessage: - "d1 time travel restore missing timestamp or bookmark", - }); + throw new UserError( + "Missing required option --timestamp or --bookmark. Provide --timestamp to restore to a point in time (e.g. --timestamp=2023-07-13T08:46:42.228Z), or --bookmark to restore to a specific bookmark.", + { + telemetryMessage: + "d1 time travel restore missing timestamp or bookmark", + } + ); } }, async handler({ database, json, timestamp, bookmark }, { config }) {