From c2ed7c23057b5fd74788f9b0c5415edc8a592276 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Somhairle=20MacLe=C3=B2id?= Date: Mon, 23 Feb 2026 14:22:30 +0000 Subject: [PATCH 1/7] Use `capnweb` native `ReadableStream` support for remote Media bindings (#12582) --- .changeset/capnweb-streams-media-bindings.md | 6 + packages/miniflare/package.json | 2 +- packages/miniflare/scripts/build.mjs | 3 +- .../src/plugins/dispatch-namespace/index.ts | 52 ++++++--- packages/miniflare/src/plugins/media/index.ts | 29 ----- .../miniflare/src/plugins/shared/constants.ts | 5 +- .../dispatch-namespace-proxy.worker.ts | 30 +++++ .../dispatch-namespace.worker.ts | 53 ++------- .../src/workers/media/binding.worker.ts | 104 ------------------ .../workers/shared/remote-bindings-utils.ts | 71 +++++++++++- .../shared/remote-proxy-client.worker.ts | 44 ++++---- packages/wrangler/package.json | 2 +- .../remoteBindings/ProxyServerWorker.ts | 40 ------- packages/wrangler/tsup.config.ts | 1 + pnpm-lock.yaml | 17 +-- pnpm-workspace.yaml | 1 + 16 files changed, 192 insertions(+), 268 deletions(-) create mode 100644 .changeset/capnweb-streams-media-bindings.md create mode 100644 packages/miniflare/src/workers/dispatch-namespace/dispatch-namespace-proxy.worker.ts delete mode 100644 packages/miniflare/src/workers/media/binding.worker.ts diff --git a/.changeset/capnweb-streams-media-bindings.md b/.changeset/capnweb-streams-media-bindings.md new file mode 100644 index 000000000000..a583518df557 --- /dev/null +++ b/.changeset/capnweb-streams-media-bindings.md @@ -0,0 +1,6 @@ +--- +"miniflare": patch +"wrangler": patch +--- + +Internal refactor to use capnweb's native `ReadableStream` support to power remote Media and Dispatch Namespace bindings. diff --git a/packages/miniflare/package.json b/packages/miniflare/package.json index f5046f326c26..a7b8d37fa443 100644 --- a/packages/miniflare/package.json +++ b/packages/miniflare/package.json @@ -78,7 +78,7 @@ "acorn": "8.14.0", "acorn-walk": "8.3.2", "capnp-es": "catalog:default", - "capnweb": "^0.1.0", + "capnweb": "catalog:default", "chokidar": "^4.0.1", "ci-info": "catalog:default", "concurrently": "^8.2.2", diff --git a/packages/miniflare/scripts/build.mjs b/packages/miniflare/scripts/build.mjs index 3543c6a2744f..ad75ac9ee3ce 100644 --- a/packages/miniflare/scripts/build.mjs +++ b/packages/miniflare/scripts/build.mjs @@ -174,6 +174,7 @@ const embedWorkersPlugin = { if (builder === undefined) { builder = await esbuild.context({ platform: "node", // Marks `node:*` imports as external + conditions: ["workerd", "worker", "browser"], format: "esm", target: "esnext", bundle: true, @@ -186,7 +187,7 @@ const embedWorkersPlugin = { minifySyntax: true, outdir: build.initialOptions.outdir, outbase: pkgRoot, - // Apply the node-to-internal rewrite only for shared extension workers + // Shared extension workers need node:* → node-internal:* plugins: args.path === miniflareSharedExtensionPath || args.path === miniflareZodExtensionPath diff --git a/packages/miniflare/src/plugins/dispatch-namespace/index.ts b/packages/miniflare/src/plugins/dispatch-namespace/index.ts index 318d41137812..dab9ada5cfb5 100644 --- a/packages/miniflare/src/plugins/dispatch-namespace/index.ts +++ b/packages/miniflare/src/plugins/dispatch-namespace/index.ts @@ -1,9 +1,12 @@ -import LOCAL_DISPATCH_NAMESPACE from "worker:dispatch-namespace/dispatch-namespace"; +import SCRIPT_DISPATCH_NAMESPACE from "worker:dispatch-namespace/dispatch-namespace"; +import SCRIPT_DISPATCH_NAMESPACE_PROXY from "worker:dispatch-namespace/dispatch-namespace-proxy"; import { z } from "zod"; import { Worker_Binding } from "../../runtime"; import { + getUserBindingServiceName, Plugin, ProxyNodeBinding, + remoteProxyClientWorker, RemoteProxyConnectionString, } from "../shared"; @@ -22,6 +25,18 @@ export const DispatchNamespaceOptionsSchema = z.object({ export const DISPATCH_NAMESPACE_PLUGIN_NAME = "dispatch-namespace"; +/** Service name for the proxy client worker backing a dispatch namespace. */ +function getProxyServiceName( + name: string, + remoteProxyConnectionString?: RemoteProxyConnectionString +): string { + return getUserBindingServiceName( + `${DISPATCH_NAMESPACE_PLUGIN_NAME}-proxy`, + name, + remoteProxyConnectionString + ); +} + export const DISPATCH_NAMESPACE_PLUGIN: Plugin< typeof DispatchNamespaceOptionsSchema > = { @@ -39,17 +54,14 @@ export const DISPATCH_NAMESPACE_PLUGIN: Plugin< wrapped: { moduleName: `${DISPATCH_NAMESPACE_PLUGIN_NAME}:local-dispatch-namespace`, innerBindings: [ - ...(config.remoteProxyConnectionString?.href - ? [ - { - name: "remoteProxyConnectionString", - text: config.remoteProxyConnectionString.href, - }, - ] - : []), { - name: "binding", - text: name, + name: "proxyClient", + service: { + name: getProxyServiceName( + name, + config.remoteProxyConnectionString + ), + }, }, ], }, @@ -68,8 +80,20 @@ export const DISPATCH_NAMESPACE_PLUGIN: Plugin< ]) ); }, - async getServices() { - return []; + async getServices({ options }) { + if (!options.dispatchNamespaces) { + return []; + } + + return Object.entries(options.dispatchNamespaces).map(([name, config]) => ({ + name: getProxyServiceName(name, config.remoteProxyConnectionString), + worker: remoteProxyClientWorker( + config.remoteProxyConnectionString, + name, + undefined, + SCRIPT_DISPATCH_NAMESPACE_PROXY + ), + })); }, getExtensions({ options }) { if (!options.some((o) => o.dispatchNamespaces)) { @@ -81,7 +105,7 @@ export const DISPATCH_NAMESPACE_PLUGIN: Plugin< modules: [ { name: `${DISPATCH_NAMESPACE_PLUGIN_NAME}:local-dispatch-namespace`, - esModule: LOCAL_DISPATCH_NAMESPACE(), + esModule: SCRIPT_DISPATCH_NAMESPACE(), internal: true, }, ], diff --git a/packages/miniflare/src/plugins/media/index.ts b/packages/miniflare/src/plugins/media/index.ts index 30e7f4b007d4..69e7d35c1744 100644 --- a/packages/miniflare/src/plugins/media/index.ts +++ b/packages/miniflare/src/plugins/media/index.ts @@ -1,4 +1,3 @@ -import BINDING from "worker:media/binding"; import { z } from "zod"; import { getUserBindingServiceName, @@ -61,34 +60,6 @@ export const MEDIA_PLUGIN: Plugin = { options.media.binding, options.media.remoteProxyConnectionString ), - worker: { - compatibilityDate: "2025-01-01", - modules: [ - { - name: "index.worker.js", - esModule: BINDING(), - }, - ], - bindings: [ - { - name: "remote", - service: { - name: getUserBindingServiceName( - `${MEDIA_PLUGIN_NAME}:remote`, - options.media.binding, - options.media.remoteProxyConnectionString - ), - }, - }, - ], - }, - }, - { - name: getUserBindingServiceName( - `${MEDIA_PLUGIN_NAME}:remote`, - options.media.binding, - options.media.remoteProxyConnectionString - ), worker: remoteProxyClientWorker( options.media.remoteProxyConnectionString, options.media.binding diff --git a/packages/miniflare/src/plugins/shared/constants.ts b/packages/miniflare/src/plugins/shared/constants.ts index d15ce5f73ce6..3a9158a42ead 100644 --- a/packages/miniflare/src/plugins/shared/constants.ts +++ b/packages/miniflare/src/plugins/shared/constants.ts @@ -76,14 +76,15 @@ export function objectEntryWorker( export function remoteProxyClientWorker( remoteProxyConnectionString: RemoteProxyConnectionString | undefined, binding: string, - bindingType?: string + bindingType?: string, + script?: () => string ) { return { compatibilityDate: "2025-01-01", modules: [ { name: "index.worker.js", - esModule: SCRIPT_REMOTE_PROXY_CLIENT(), + esModule: (script ?? SCRIPT_REMOTE_PROXY_CLIENT)(), }, ], bindings: [ diff --git a/packages/miniflare/src/workers/dispatch-namespace/dispatch-namespace-proxy.worker.ts b/packages/miniflare/src/workers/dispatch-namespace/dispatch-namespace-proxy.worker.ts new file mode 100644 index 000000000000..00e643eba923 --- /dev/null +++ b/packages/miniflare/src/workers/dispatch-namespace/dispatch-namespace-proxy.worker.ts @@ -0,0 +1,30 @@ +import { WorkerEntrypoint } from "cloudflare:workers"; +import { + makeRemoteProxyStub, + RemoteBindingEnv, + throwRemoteRequired, +} from "../shared/remote-bindings-utils"; + +/** Proxy client for dispatch namespace bindings. */ +export default class DispatchNamespaceProxy extends WorkerEntrypoint { + get( + name: string, + args?: { [key: string]: unknown }, + options?: DynamicDispatchOptions + ): Fetcher { + if (!this.env.remoteProxyConnectionString) { + throwRemoteRequired(this.env.binding); + } + return makeRemoteProxyStub( + this.env.remoteProxyConnectionString, + this.env.binding, + { + "MF-Dispatch-Namespace-Options": JSON.stringify({ + name, + args, + options, + }), + } + ); + } +} diff --git a/packages/miniflare/src/workers/dispatch-namespace/dispatch-namespace.worker.ts b/packages/miniflare/src/workers/dispatch-namespace/dispatch-namespace.worker.ts index 3cf98ff1a61d..73cb3013f556 100644 --- a/packages/miniflare/src/workers/dispatch-namespace/dispatch-namespace.worker.ts +++ b/packages/miniflare/src/workers/dispatch-namespace/dispatch-namespace.worker.ts @@ -1,56 +1,21 @@ -import { newWebSocketRpcSession } from "capnweb"; -import { makeFetch } from "../shared/remote-bindings-utils"; +/** + * Wrapped binding extension for dispatch namespaces. + * + * Delegates to {@link DispatchNamespaceProxy} via a service binding. + */ interface Env { - remoteProxyConnectionString: string | undefined; - binding: string; + proxyClient: DispatchNamespace; } -export default function (env: Env) { +export default function (env: Env): DispatchNamespace { return { get( name: string, - args?: { [key: string]: any }, + args?: { [key: string]: unknown }, options?: DynamicDispatchOptions ): Fetcher { - if (!env.remoteProxyConnectionString) { - throw new Error(`Binding ${env.binding} needs to be run remotely`); - } - const url = new URL(env.remoteProxyConnectionString); - url.protocol = "ws:"; - url.searchParams.set("MF-Binding", env.binding); - url.searchParams.set( - "MF-Dispatch-Namespace-Options", - JSON.stringify({ name, args, options }) - ); - - type ProxiedService = Omit & { - fetch: typeof fetch; - connect: never; - }; - const stub = newWebSocketRpcSession(url.href); - - return new Proxy(stub, { - get(_, p) { - // We don't want to wrap direct .fetch() calls on a customer worker in a JSRPC layer - // Instead, intercept accesses to the specific `fetch` key, and send them directly - if (p === "fetch") { - return makeFetch( - env.remoteProxyConnectionString, - env.binding, - new Headers({ - "MF-Dispatch-Namespace-Options": JSON.stringify({ - name, - args, - options, - }), - }) - ); - } - - return Reflect.get(stub, p); - }, - }); + return env.proxyClient.get(name, args, options); }, } satisfies DispatchNamespace; } diff --git a/packages/miniflare/src/workers/media/binding.worker.ts b/packages/miniflare/src/workers/media/binding.worker.ts deleted file mode 100644 index 2bb50df0fd6d..000000000000 --- a/packages/miniflare/src/workers/media/binding.worker.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { RpcTarget, WorkerEntrypoint } from "cloudflare:workers"; - -type Env = { - remote: Fetcher; -}; - -type FitOption = "contain" | "cover" | "scale-down"; -type FormatOption = "jpg" | "png" | "m4a"; -type ModeOption = "video" | "spritesheet" | "frame" | "audio"; - -type MediaTransformationInputOptions = { - fit?: FitOption; - width?: number; - height?: number; -}; - -type MediaTransformationOutputOptions = { - mode?: ModeOption; - audio?: boolean; - time?: string; - duration?: string; - format?: FormatOption; - imageCount?: number; -}; - -export default class MediaBinding extends WorkerEntrypoint { - async input(media: ReadableStream): Promise { - return new MediaTransformer(this.env.remote, media); - } -} - -class MediaTransformer extends RpcTarget { - constructor( - private remote: Fetcher, - private input: ReadableStream - ) { - super(); - } - - transform( - options: MediaTransformationInputOptions - ): MediaTransformationGenerator { - return new MediaTransformationGenerator(this.remote, this.input, options); - } -} - -class MediaTransformationGenerator extends RpcTarget { - constructor( - private remote: Fetcher, - private input: ReadableStream, - private inputOptions: MediaTransformationInputOptions - ) { - super(); - } - - async output( - outputOptions: MediaTransformationOutputOptions - ): Promise { - const resp = await this.remote.fetch(`http://example.com`, { - body: this.input, - method: "POST", - headers: { - "x-cf-media-input-options": JSON.stringify(this.inputOptions), - "x-cf-media-output-options": JSON.stringify(outputOptions), - }, - }); - - const contentType = resp.headers.get("x-cf-media-content-type") as string; - - return new MediaTransformationResult( - resp.body as ReadableStream, - contentType - ); - } -} - -class MediaTransformationResult extends RpcTarget { - constructor( - private responseStream: ReadableStream, - private responseContentType: string - ) { - super(); - } - - media() { - const [stream1, stream2] = this.responseStream.tee(); - this.responseStream = stream1; - return stream2; - } - - response() { - const [stream1, stream2] = this.responseStream.tee(); - this.responseStream = stream1; - return new Response(stream2, { - headers: { - "Content-Type": this.contentType(), - }, - }); - } - - contentType() { - return this.responseContentType; - } -} diff --git a/packages/miniflare/src/workers/shared/remote-bindings-utils.ts b/packages/miniflare/src/workers/shared/remote-bindings-utils.ts index 21a4fcd5d830..d780671e8171 100644 --- a/packages/miniflare/src/workers/shared/remote-bindings-utils.ts +++ b/packages/miniflare/src/workers/shared/remote-bindings-utils.ts @@ -1,3 +1,27 @@ +import { newWebSocketRpcSession } from "capnweb"; + +/** + * Common environment type for remote binding workers. + */ +export type RemoteBindingEnv = { + remoteProxyConnectionString?: string; + binding: string; + bindingType?: string; +}; + +/** Headers sent alongside proxy requests to provide additional context. */ +export type ProxyMetadata = { + "MF-Binding-Type"?: string; + "MF-Dispatch-Namespace-Options"?: string; +}; + +/** + * Throws a consistent error when a binding requires remote mode but isn't configured for it. + */ +export function throwRemoteRequired(bindingName: string): never { + throw new Error(`Binding ${bindingName} needs to be run remotely`); +} + export function makeFetch( remoteProxyConnectionString: string | undefined, bindingName: string, @@ -5,7 +29,7 @@ export function makeFetch( ) { return (input: RequestInfo | URL, init?: RequestInit): Promise => { if (!remoteProxyConnectionString) { - throw new Error(`Binding ${bindingName} needs to be run remotely`); + throwRemoteRequired(bindingName); } const request = new Request(input, init); @@ -28,3 +52,48 @@ export function makeFetch( return fetch(remoteProxyConnectionString, req); }; } + +/** + * Create a remote proxy stub that proxies to a remote binding via capnweb. + * + * Intercepts `.fetch()` to use plain HTTP; forwards other accesses to capnweb. + */ +export function makeRemoteProxyStub( + remoteProxyConnectionString: string, + bindingName: string, + metadata?: ProxyMetadata +): Fetcher { + const url = new URL(remoteProxyConnectionString); + url.protocol = url.protocol === "https:" ? "wss:" : "ws:"; + url.searchParams.set("MF-Binding", bindingName); + if (metadata) { + for (const [key, value] of Object.entries(metadata)) { + if (value !== undefined) { + url.searchParams.set(key, value); + } + } + } + + type ProxiedService = Omit & { + fetch: typeof fetch; + connect: never; + }; + const stub = newWebSocketRpcSession(url.href) as unknown as ProxiedService; + + const headers = metadata + ? new Headers( + Object.entries(metadata).filter( + (entry): entry is [string, string] => entry[1] !== undefined + ) + ) + : undefined; + + return new Proxy(stub, { + get(_, p) { + if (p === "fetch") { + return makeFetch(remoteProxyConnectionString, bindingName, headers); + } + return Reflect.get(stub, p); + }, + }); +} diff --git a/packages/miniflare/src/workers/shared/remote-proxy-client.worker.ts b/packages/miniflare/src/workers/shared/remote-proxy-client.worker.ts index 16d66972decb..c5b6cee08db7 100644 --- a/packages/miniflare/src/workers/shared/remote-proxy-client.worker.ts +++ b/packages/miniflare/src/workers/shared/remote-proxy-client.worker.ts @@ -1,43 +1,39 @@ -import { newWebSocketRpcSession } from "capnweb"; import { WorkerEntrypoint } from "cloudflare:workers"; -import { makeFetch } from "./remote-bindings-utils"; +import { + makeFetch, + makeRemoteProxyStub, + RemoteBindingEnv, + throwRemoteRequired, +} from "./remote-bindings-utils"; -type Env = { - remoteProxyConnectionString?: string; - binding: string; - bindingType?: string; -}; -export default class Client extends WorkerEntrypoint { - async fetch(request: Request) { +/** Generic remote proxy client for bindings. */ +export default class Client extends WorkerEntrypoint { + fetch(request: Request): Promise { return makeFetch( this.env.remoteProxyConnectionString, this.env.binding )(request); } - constructor(ctx: ExecutionContext, env: Env) { - let stub: unknown; - if (env.remoteProxyConnectionString) { - const url = new URL(env.remoteProxyConnectionString); - url.protocol = "ws:"; - url.searchParams.set("MF-Binding", env.binding); - if (env.bindingType) { - url.searchParams.set("MF-Binding-Type", env.bindingType); - } - stub = newWebSocketRpcSession(url.href); - } - + constructor(ctx: ExecutionContext, env: RemoteBindingEnv) { super(ctx, env); + const stub = env.remoteProxyConnectionString + ? makeRemoteProxyStub( + env.remoteProxyConnectionString, + env.binding, + env.bindingType ? { "MF-Binding-Type": env.bindingType } : undefined + ) + : undefined; + return new Proxy(this, { - get(target, prop) { + get: (target, prop) => { if (Reflect.has(target, prop)) { return Reflect.get(target, prop); } if (!stub) { - throw new Error(`Binding ${env.binding} needs to be run remotely`); + throwRemoteRequired(env.binding); } - return Reflect.get(stub, prop); }, }); diff --git a/packages/wrangler/package.json b/packages/wrangler/package.json index 1ede874f22b8..ecfdc0943658 100644 --- a/packages/wrangler/package.json +++ b/packages/wrangler/package.json @@ -113,7 +113,7 @@ "@vitest/ui": "catalog:default", "@webcontainer/env": "^1.1.0", "am-i-vibing": "^0.1.0", - "capnweb": "^0.1.0", + "capnweb": "catalog:default", "chalk": "^5.2.0", "chokidar": "^4.0.1", "ci-info": "catalog:default", diff --git a/packages/wrangler/templates/remoteBindings/ProxyServerWorker.ts b/packages/wrangler/templates/remoteBindings/ProxyServerWorker.ts index 190afc8366f8..ac8bfd72c048 100644 --- a/packages/wrangler/templates/remoteBindings/ProxyServerWorker.ts +++ b/packages/wrangler/templates/remoteBindings/ProxyServerWorker.ts @@ -21,39 +21,6 @@ class BindingNotFoundError extends Error { } } -/** - * Here be dragons! capnweb does not currently support ReadableStreams, which Media - * bindings use for input. As such, Media Bindings cannot be directly used via capnweb, - * and need to be special cased. - */ - -function isSpecialCaseMediaBindingRequest(headers: Headers): boolean { - return headers.has("x-cf-media-input-options"); -} -async function evaluateMediaBinding( - headers: Headers, - stream: ReadableStream, - binding: MediaBinding -): Promise { - const inputOptions = JSON.parse( - headers.get("x-cf-media-input-options") as string - ); - const outputOptions = JSON.parse( - headers.get("x-cf-media-output-options") as string - ); - - const result = await binding - .input(stream) - .transform(inputOptions) - .output(outputOptions); - - return new Response(await result.media(), { - headers: { - "x-cf-media-content-type": await result.contentType(), - }, - }); -} - /** * For most bindings, we expose them as * - RPC stubs directly to capnweb, or @@ -187,13 +154,6 @@ export default { originalHeaders.set(name, value); } } - if (isSpecialCaseMediaBindingRequest(originalHeaders)) { - return evaluateMediaBinding( - originalHeaders, - request.body as ReadableStream, - fetcher as unknown as MediaBinding - ); - } return fetcher.fetch( request.headers.get("MF-URL") ?? "http://example.com", diff --git a/packages/wrangler/tsup.config.ts b/packages/wrangler/tsup.config.ts index 76e3576e887e..5e24c43e7a1d 100644 --- a/packages/wrangler/tsup.config.ts +++ b/packages/wrangler/tsup.config.ts @@ -32,6 +32,7 @@ function embedWorkersPlugin({ workersContexts.get(args.path) ?? (await esbuild.context({ platform: "node", // Marks `node:*` imports as external + conditions: ["workerd", "worker", "browser"], format: "esm", target: "esnext", bundle: true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e348b8aea30c..4183b610ca5b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,6 +30,9 @@ catalogs: capnp-es: specifier: ^0.0.14 version: 0.0.14 + capnweb: + specifier: ^0.5.0 + version: 0.5.0 ci-info: specifier: ^4.4.0 version: 4.4.0 @@ -2255,8 +2258,8 @@ importers: specifier: catalog:default version: 0.0.14(typescript@5.8.3) capnweb: - specifier: ^0.1.0 - version: 0.1.0 + specifier: catalog:default + version: 0.5.0 chokidar: specifier: ^4.0.1 version: 4.0.1 @@ -4249,8 +4252,8 @@ importers: specifier: ^0.1.0 version: 0.1.0 capnweb: - specifier: ^0.1.0 - version: 0.1.0 + specifier: catalog:default + version: 0.5.0 chalk: specifier: ^5.2.0 version: 5.3.0 @@ -9465,8 +9468,8 @@ packages: typescript: optional: true - capnweb@0.1.0: - resolution: {integrity: sha512-+pygKx1JFTZTRdd1hHgaBRg5BwULEDZq8ZoHXkYP2GXNV3lrjXLj5qzlGz+SgBCJjWUmNBtlh7JPWdr0wIbY8w==} + capnweb@0.5.0: + resolution: {integrity: sha512-fujruGZ4jw3u7mzjqgU+Iad9ms2pS7jwEaAR42bbQe9Eax8Rq+MAOCLT1zmmL5AB/wuKf+0YoCYxfcnSfk2/1Q==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -20471,7 +20474,7 @@ snapshots: optionalDependencies: typescript: 5.8.3 - capnweb@0.1.0: {} + capnweb@0.5.0: {} caseless@0.12.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index b6c9440368aa..3590d875ae0a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -43,6 +43,7 @@ catalog: # ultimately included in vitest-pool-workers (through Wrangler), causing a circular dependency. "@cloudflare/vitest-pool-workers": "^0.10.11" "capnp-es": "^0.0.14" + "capnweb": "^0.5.0" "ci-info": "^4.4.0" catalogs: From 4cee91e87edddf6decfded0ef6fb503d36d25961 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:12:08 +0000 Subject: [PATCH 2/7] [C3] bump create-solid from 0.6.11 to 0.6.13 in /packages/create-cloudflare/src/frameworks (#12635) 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/c3-frameworks-update-12635.md | 11 +++++++++++ .../create-cloudflare/src/frameworks/package.json | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 .changeset/c3-frameworks-update-12635.md diff --git a/.changeset/c3-frameworks-update-12635.md b/.changeset/c3-frameworks-update-12635.md new file mode 100644 index 000000000000..2d6fd204d4af --- /dev/null +++ b/.changeset/c3-frameworks-update-12635.md @@ -0,0 +1,11 @@ +--- +"create-cloudflare": patch +--- + +Update dependencies of "create-cloudflare" + +The following dependency versions have been updated: + +| Dependency | From | To | +| ------------ | ------ | ------ | +| create-solid | 0.6.11 | 0.6.13 | diff --git a/packages/create-cloudflare/src/frameworks/package.json b/packages/create-cloudflare/src/frameworks/package.json index 72e68eb2be53..fab5fae8f929 100644 --- a/packages/create-cloudflare/src/frameworks/package.json +++ b/packages/create-cloudflare/src/frameworks/package.json @@ -15,7 +15,7 @@ "create-vite": "8.3.0", "create-rwsdk": "3.1.3", "create-react-router": "7.13.0", - "create-solid": "0.6.11", + "create-solid": "0.6.13", "create-vike": "0.0.581", "create-vue": "3.21.1", "create-waku": "0.12.5-1.0.0-alpha.3-0", From ed0c4c7c1ae714e711b451e947df242d7e6b6024 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Somhairle=20MacLe=C3=B2id?= Date: Mon, 23 Feb 2026 15:17:25 +0000 Subject: [PATCH 3/7] Add hierarchical AGENTS.md knowledge base for key packages (#12641) --- AGENTS.md | 72 ++++++++++++++++++++++- packages/create-cloudflare/AGENTS.md | 31 ++++++++++ packages/miniflare/AGENTS.md | 52 ++++++++++++++++ packages/vite-plugin-cloudflare/AGENTS.md | 32 ++++++++++ packages/vitest-pool-workers/AGENTS.md | 61 +++++++++++++++++++ packages/workers-utils/AGENTS.md | 35 +++++++++++ packages/wrangler/AGENTS.md | 50 ++++++++++++++++ 7 files changed, 330 insertions(+), 3 deletions(-) create mode 100644 packages/create-cloudflare/AGENTS.md create mode 100644 packages/miniflare/AGENTS.md create mode 100644 packages/vite-plugin-cloudflare/AGENTS.md create mode 100644 packages/vitest-pool-workers/AGENTS.md create mode 100644 packages/workers-utils/AGENTS.md create mode 100644 packages/wrangler/AGENTS.md diff --git a/AGENTS.md b/AGENTS.md index fa19022c30d3..b0aea97c0cde 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -63,6 +63,21 @@ This is the **Cloudflare Workers SDK** monorepo containing tools and libraries f - Shared ESLint config in `packages/eslint-config-shared/` - Dependency management via pnpm catalog system +## WHERE TO LOOK + +| Task | Location | Notes | +| ---------------------------------------------- | ---------------------------------------------- | ---------------------------------------------------------------- | +| Add/modify a CLI command | `packages/wrangler/src/` | Commands registered in `src/index.ts` (2k+ line yargs tree) | +| Change local dev behavior | `packages/miniflare/src/` | `src/index.ts` is the main `Miniflare` class | +| Modify Workers runtime simulation | `packages/miniflare/src/workers/` | ~30 embedded worker scripts, built via `worker:` virtual imports | +| Add a test fixture | `fixtures/` | Each fixture is a full workspace member with own `package.json` | +| Shared config types/validation | `packages/workers-utils/src/config/` | `validation.ts` is the config normalizer (large file) | +| Test helpers (runInTempDir, seed, mockConsole) | `packages/workers-utils/src/test-helpers/` | Shared across wrangler, miniflare, others | +| Cloudflare API mocks for tests | `packages/wrangler/src/__tests__/helpers/msw/` | MSW handlers per API domain | +| CI workflows | `.github/workflows/` | `test-and-check.yml` is the primary gate | +| Build/deploy scripts | `tools/deployments/` | Validation + deployment helpers, run via `esbuild-register` | +| Changeset config and rules | `.changeset/README.md` | Must read before creating changesets | + ## Development Guidelines **Requirements:** @@ -84,17 +99,34 @@ This is the **Cloudflare Workers SDK** monorepo containing tools and libraries f - Format with Prettier - run `pnpm prettify` in the workspace root before committing - All changes to published packages require a changeset (see below) +**Formatting (Prettier):** + +- Tabs (not spaces), double quotes, semicolons, trailing commas (es5) +- Import order enforced: builtins → third-party → parent → sibling → index → types +- `prettier-plugin-packagejson` sorts package.json keys + +**Security:** + +- Custom ESLint rule `workers-sdk/no-unsafe-command-execution`: no template literals or string concatenation in `exec`/`spawn`/`execFile` calls (command injection prevention, CWE-78). Disabled in test files only. + +**Dependencies:** + +- Packages must bundle deps into distributables; runtime `dependencies` are forbidden except for an explicit allowlist +- External (non-bundled) deps must be declared in `scripts/deps.ts` with `EXTERNAL_DEPENDENCIES` and a comment explaining why + **Testing Standards:** - Unit tests with Vitest for all packages - Fixture tests in `/fixtures` directory for filesystem/Worker scenarios - E2E tests require real Cloudflare account credentials - Use `vitest-pool-workers` for testing actual Workers runtime behavior +- Shared vitest config (`vitest.shared.ts`): 50s timeouts, `retry: 2`, `restoreMocks: true` **Git Workflow:** - Check you are not on main before committing. Create a new branch for your work from main if needed. - Clean commit history required before first review +- Don't squash commits after review - Never commit without changesets for user-facing changes - PR template requirements: Remove "Fixes #..." line when no relevant issue exists, keep all checkboxes (don't delete unchecked ones) @@ -108,12 +140,12 @@ This is the **Cloudflare Workers SDK** monorepo containing tools and libraries f ## Key Locations -- `/fixtures` - Test fixtures and example applications +- `/fixtures` - Test fixtures and example applications (each a workspace member) - `/packages/wrangler/src` - Main Wrangler CLI source code - `/packages/miniflare/src` - Miniflare source -- `/tools` - Build scripts and deployment utilities +- `/tools` - Build scripts and deployment utilities (run via `esbuild-register`, no build step) - `turbo.json` - Turbo build configuration -- `pnpm-workspace.yaml` - Workspace configuration +- `pnpm-workspace.yaml` - Workspace configuration (~156 workspace members) ## Testing Strategy @@ -132,3 +164,37 @@ Every change to package code requires a changeset or it will not trigger a relea The changeset descriptions can either use conventional commit prefixes (e.g., "fix: remove unused option") or start with a capital letter and describe the change directly (e.g., "Remove unused option" not"). + +**Changeset Rules:** + +- Major versions for `wrangler` are currently **forbidden** +- `patch`: bug fixes; `minor`: new features, deprecations, experimental breaking changes; `major`: stable breaking changes only +- No h1/h2/h3 headers in changeset descriptions (changelog uses h3) +- Config examples must use `wrangler.json` (JSONC), not `wrangler.toml` +- Separate changesets for distinct changes; do not lump unrelated changes + +## Anti-Patterns + +These are explicitly forbidden across the repo: + +- **npm/yarn** → use pnpm +- **`any` type** → properly type everything +- **Non-null assertions (`!`)** → use type narrowing +- **Floating promises** → await or void explicitly +- **Missing curly braces** → always brace control flow +- **`console.*` in wrangler** → use the `logger` singleton +- **Direct Cloudflare REST API calls** → use the Cloudflare TypeScript SDK +- **Named imports from `ci-info`** → use default import (`import ci from "ci-info"`) +- **Runtime dependencies** → bundle deps; external deps need explicit allowlist entry +- **Committing to main** → always work on a branch + +## Subdirectory Knowledge + +Packages with their own AGENTS.md for deeper context: + +- `packages/wrangler/AGENTS.md` - CLI architecture, command structure, test patterns +- `packages/miniflare/AGENTS.md` - Worker simulation, embedded workers, build system +- `packages/vite-plugin-cloudflare/AGENTS.md` - Plugin architecture, playground setup +- `packages/create-cloudflare/AGENTS.md` - Scaffolding, template system +- `packages/vitest-pool-workers/AGENTS.md` - 3-context architecture, cloudflare:test module +- `packages/workers-utils/AGENTS.md` - Shared config validation, test helpers diff --git a/packages/create-cloudflare/AGENTS.md b/packages/create-cloudflare/AGENTS.md new file mode 100644 index 000000000000..428073fef162 --- /dev/null +++ b/packages/create-cloudflare/AGENTS.md @@ -0,0 +1,31 @@ +# AGENTS.md — Create Cloudflare (C3) + +## OVERVIEW + +Project scaffolding CLI for Cloudflare Workers. Single entry: `src/cli.ts` serves as CLI, library export, and bin target. + +## STRUCTURE + +- `src/cli.ts` — Main entry. Exports `main(argv)` for programmatic use, has shebang for direct execution +- `templates/` — Scaffolding templates (excluded from linting and most formatting) +- `scripts/build.ts` — esbuild-based build → `dist/cli.js` + +## BUILD + +- esbuild bundles `src/cli.ts` as CJS → `dist/cli.js` +- `package.json` `main`, `exports["."]`, and `bin` all point at `dist/cli.js` +- No separate bin shim — the built output IS the bin + +## CONVENTIONS + +- `no-console: error` — use project's logging utilities +- Own `.prettierrc` — same settings as root but without `prettier-plugin-packagejson` +- Templates excluded from linting (except `c3.ts` files within templates) +- Templates excluded from formatting (except hello-world templates) + +## TESTING + +- E2E tests run across pnpm/npm (yarn/bun also supported but not in CI), Linux/Windows +- Own vitest setup: mocks `log-update` and `@cloudflare/cli/streams` +- CI has experimental matrix for framework testing +- Python/UV installed in CI for Python framework E2E tests diff --git a/packages/miniflare/AGENTS.md b/packages/miniflare/AGENTS.md new file mode 100644 index 000000000000..894a197c614a --- /dev/null +++ b/packages/miniflare/AGENTS.md @@ -0,0 +1,52 @@ +# Miniflare — Agent Guide + +## Overview + +Local dev simulator for Cloudflare Workers, powered by workerd runtime. Main class `Miniflare` in `src/index.ts`. + +## Structure + +- `src/index.ts` — Main `Miniflare` class, server setup, plugin orchestration, all exports +- `src/workers/` — ~30 embedded worker scripts (D1, KV, R2, caches, etc.), built via `worker:` virtual import scheme +- `src/workers/shared/` — Shared utilities across embedded workers +- `src/runtime/config/generated/workerd.ts` — Generated workerd Cap'n Proto config types +- `test/` — Tests (`.spec.ts` naming, NOT `.test.ts`) +- `test/test-shared/` — Shared test utilities +- `bootstrap.js` — Deprecated CLI stub (prints error directing to `wrangler dev`) +- `scripts/build.mjs` — Custom esbuild build script + +## Build + +- Custom `scripts/build.mjs` bundles `src/index.ts` as CJS → `dist/src/index.js` +- Also compiles ~30 embedded worker scripts via `worker:...` virtual import scheme — each triggers a nested esbuild sub-build producing standalone ESM worker scripts +- Build outputs: `dist/`, `bootstrap.js`, `worker-metafiles/` + +## Lint Status (Transitional) + +- Many shared ESLint rules temporarily DISABLED: `curly`, `no-explicit-any`, `consistent-type-imports`, `no-shadow`, `no-floating-promises`, others +- Comment in config: "temporarily enabled while we transition Miniflare to use the standard workers-sdk eslint config" +- `no-console: error` is on, except for `src/workers/` and `scripts/` + +## TypeScript + +- Does NOT extend shared `@cloudflare/workers-tsconfig` — has its own full config +- Uses `experimentalDecorators` +- Path aliases: `miniflare:shared`, `miniflare:zod` +- `declaration: true` (emits .d.ts) + +## Testing + +- Test files use `.spec.ts` (NOT `.test.ts`) +- `pool: "forks"`, `singleFork: true` +- Does NOT extend `vitest.shared.ts` — own full vitest config +- Timeouts: 30s test, 30s hook +- `globals: true` +- Factory pattern: `miniflareTest(opts, handler?)` creates instance in `beforeAll`, disposes in `afterAll` +- `useDispose(mf)` / `disposeWithRetry()` — exponential backoff for Windows EPERM file locking +- `useServer()` — temp HTTP server with auto-cleanup +- `TestLog` — captures log entries by level + +## Version Pinning + +- Miniflare minor version must match workerd minor version +- `.github/changeset-version.js` enforces this: if changeset bumps miniflare minor beyond workerd's, it converts to patch diff --git a/packages/vite-plugin-cloudflare/AGENTS.md b/packages/vite-plugin-cloudflare/AGENTS.md new file mode 100644 index 000000000000..68eeac0091dc --- /dev/null +++ b/packages/vite-plugin-cloudflare/AGENTS.md @@ -0,0 +1,32 @@ +# AGENTS.md — vite-plugin-cloudflare + +## OVERVIEW + +Vite plugin for Cloudflare Workers development. Exports `cloudflare()` plugin factory from `src/index.ts`. ESM-only output. + +## STRUCTURE + +- `src/index.ts` — Plugin factory (uses top-level `await` for `assertWranglerVersion()`) +- `src/workers/` — 4 internal worker entries: `asset-worker`, `router-worker`, `runner-worker`, `vite-proxy-worker` +- `playground/` — ~47 playground apps, each a workspace member (nested workspace under this package) +- `e2e/` — E2E tests with Playwright +- `__tests__/` — Unit tests use `.spec.ts` naming + +## BUILD + +- Only package using `tsdown` as build tool +- Outputs ESM (`.mjs`) to `dist/index.mjs` +- Also bundles 4 internal worker scripts from `src/workers/*/index.ts` as separate neutral-platform outputs to `dist/workers/` + +## CONVENTIONS + +- No named imports from `"wrangler"` — must use `import * as wrangler from "wrangler"` (namespace import only, enforced by eslint) +- Uses separate pnpm catalog (`catalogs.vite-plugin`) with different Vite version (7.x) than rest of repo (5.x) +- Top-level `await` in entry — only possible because ESM-only +- Playground directory `worker-♫/` has unicode in name (intentional) + +## TESTING + +- Unit tests: `.spec.ts` in `__tests__/` +- E2E tests: `.test.ts` in `e2e/`, own vitest config +- Playground tests: Playwright-based, tested across Vite 6/7/8-beta in CI diff --git a/packages/vitest-pool-workers/AGENTS.md b/packages/vitest-pool-workers/AGENTS.md new file mode 100644 index 000000000000..62715065521f --- /dev/null +++ b/packages/vitest-pool-workers/AGENTS.md @@ -0,0 +1,61 @@ +# vitest-pool-workers — Agent Guide + +> Custom Vitest pool for running Worker tests inside the actual workerd runtime. +> Do NOT repeat root AGENTS.md content (pnpm, changesets, code style, etc.). + +## THREE-CONTEXT ARCHITECTURE + +### 1. Pool (`src/pool/index.ts`) + +- Runs in Node.js Vitest process +- Main export (`exports["."]`), built as ESM (`.mjs`) +- Orchestrates test execution + +### 2. Config (`src/config/index.ts`) + +- Runs in Node.js +- Exported as `exports["./config"]`, built as CJS (`.cjs`) +- Provides `defineWorkersConfig()` / `defineWorkersProject()` helpers +- Injects Vite plugin for `cloudflare:test` resolution, sets resolve conditions (`workerd`, `worker`, `browser`) + +### 3. Worker (`src/worker/index.ts`) + +- Runs inside workerd runtime +- NOT exported via package.json — internal entry +- Contains HACK: monkeypatches VitestExecutor to access singleton +- Has direct cross-package source import into `miniflare/src/workers/core/devalue` + +## BUILD + +`scripts/bundle.mjs` runs 3 separate esbuild builds: + +1. `undici` mock-agent (CJS) +2. pool + worker (ESM) +3. config + libs (CJS) + +Types entry `types/cloudflare-test.d.ts` is hand-written (NOT generated from source). + +## THE `cloudflare:test` MODULE + +Tests inside workerd import from `cloudflare:test`: + +```ts +import { env, fetchMock, SELF } from "cloudflare:test"; +``` + +Resolved by custom Vite plugin (`@cloudflare/vitest-pool-workers:config`) that re-exports from `cloudflare:test-internal` (runtime-provided). + +## CONVENTIONS + +- `expect` must come from test context: `it("name", ({ expect }) => {})` — never `import { expect } from "vitest"` +- Tests use `.test.ts` naming +- Excludes `*.worker.test.ts` from vitest config + +## TESTING + +- Does NOT extend `vitest.shared.ts` +- Hook timeout: 60s, retry: 2 +- Global setup starts mock npm registry, installs local package to temp dir +- Test helper: custom `test` fixture with `tmpPath`, `seed()`, `vitestRun()`, `vitestDev()` +- Fixtures in `fixtures/vitest-pool-workers-examples/` (20+ sub-fixtures testing KV, R2, D1, DO, Queues, etc.) +- Skipped on Windows CI due to flakiness diff --git a/packages/workers-utils/AGENTS.md b/packages/workers-utils/AGENTS.md new file mode 100644 index 000000000000..d72432517ecd --- /dev/null +++ b/packages/workers-utils/AGENTS.md @@ -0,0 +1,35 @@ +# AGENTS.md — workers-utils + +## OVERVIEW + +Shared utility package used across wrangler, miniflare, and others. Two main areas: config validation and test helpers. + +## STRUCTURE + +- `src/config/` — Configuration types, validation, normalization + - `validation.ts` — The config normalizer (large file). Central to all wrangler config processing. + - `environment.ts` — Environment/config field definitions (many deprecated fields) + - `config.ts` — Config types +- `src/test-helpers/` — Shared test utilities used across packages +- `src/types.ts` — Shared type definitions + +## KEY EXPORTS + +### Config + +- Validation pipeline normalizes wrangler.json/toml into typed config objects +- Used by wrangler for all config loading + +### Test Helpers + +- `runInTempDir()` — Creates temp dir, chdir's into it, stubs HOME/XDG_CONFIG_HOME, cleans up +- `seed(files)` — Writes `Record` of path->content into temp dir +- `writeWranglerConfig()` / `readWranglerConfig()` — Mock wrangler config files (TOML, JSON, JSONC) +- `mockConsoleMethods()` — Spies on console, returns normalized output with `.debug`, `.out`, `.info`, `.err`, `.warn` +- `normalizeString()` — Multi-stage pipeline: strips timings, thin spaces, temp dirs, normalizes slashes/cwd/dates/tables/error markers/byte values + +## NOTES + +- `validation.ts` is the largest single file in the monorepo after generated code — changes here affect all config processing +- Many deprecated fields in `environment.ts` — check `@deprecated` annotations before modifying +- Test helpers imported as `@cloudflare/workers-utils/test-helpers` across packages diff --git a/packages/wrangler/AGENTS.md b/packages/wrangler/AGENTS.md new file mode 100644 index 000000000000..727a7d269ac1 --- /dev/null +++ b/packages/wrangler/AGENTS.md @@ -0,0 +1,50 @@ +# Wrangler — Agent Guide + +Wrangler-specific context only. See root `AGENTS.md` for monorepo conventions. + +## Overview + +Main CLI for Cloudflare Workers. ~2k-line yargs command tree in `src/index.ts`. Entry point is `src/cli.ts` (NOT `src/index.ts`). + +## Structure + +- `src/` — CLI source +- `src/__tests__/` — Unit tests, helpers in `src/__tests__/helpers/` +- `e2e/` — E2E tests, requires Cloudflare credentials +- `bin/wrangler.js` — Shim that spawns Node with `--experimental-vm-modules` +- `templates/` — Worker templates + +## Entry Points + +- `src/cli.ts` — Build entry AND library API surface (dual-purpose). Calls `main()` when run directly; re-exports `./api` when imported as library. +- `src/index.ts` — Yargs CLI tree builder (large file). Exports `main()`. NOT the package entry point despite the name. +- `src/api/index.ts` — Public programmatic API barrel. + +## Conventions (Wrangler-Specific) + +- No `console.*` — use `logger` singleton +- No `__dirname` / `__filename` — use `getBasePath()` +- No global `fetch` — use undici's fetch +- No direct Cloudflare REST API calls — use the Cloudflare TypeScript SDK + +## Build + +- tsup: single entry `src/cli.ts` → `wrangler-dist/cli.js` +- `package.json` `main` points at `wrangler-dist/cli.js` +- Custom `embedWorkersPlugin()` bundles Worker templates via esbuild for tests + +## Testing + +- Pool: `"forks"` (not threads) — heavy global mocking +- `runWrangler(cmd)` calls `main()` in-process (no subprocess) +- MSW for API mocking — pre-built handlers per API domain in `src/__tests__/helpers/msw/` +- Shared helpers: `runInTempDir()`, `mockAccountId()`, `mockApiToken()`, `mockConfirm()`, `mockPrompt()`, `mockSelect()`, `captureRequestsFrom()` +- Unit timeout: 15s, retry: 0 (overrides shared config) +- E2E timeout: 90s, bail: 1, singleThread +- `globals: true` for vitest globals +- Output normalization via `normalizeString()` pipeline + +## Anti-Patterns + +- Never import `expect` from vitest — use test context `({ expect }) => {}` +- Test files use `.test.ts` (not `.spec.ts`) From d4e335eeed660c23e1957d35a69fe8e9c47deec0 Mon Sep 17 00:00:00 2001 From: ANT Bot <116369605+workers-devprod@users.noreply.github.com> Date: Mon, 23 Feb 2026 17:09:22 +0000 Subject: [PATCH 4/7] Version Packages (#12612) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/blue-dragons-wave.md | 5 -- .changeset/c3-frameworks-update-12630.md | 11 ---- .changeset/c3-frameworks-update-12631.md | 11 ---- .changeset/c3-frameworks-update-12633.md | 11 ---- .changeset/c3-frameworks-update-12634.md | 11 ---- .changeset/c3-frameworks-update-12635.md | 11 ---- .changeset/capnweb-streams-media-bindings.md | 6 --- .changeset/dependabot-update-12618.md | 12 ----- .changeset/dependabot-update-12637.md | 12 ----- .changeset/lucky-chairs-relate.md | 9 ---- .changeset/purple-queens-vanish.md | 6 --- .changeset/reduce-fs-errors.md | 11 ---- .changeset/soft-apes-ask.md | 5 -- packages/create-cloudflare/CHANGELOG.md | 54 ++++++++++++++++++++ packages/create-cloudflare/package.json | 2 +- packages/miniflare/CHANGELOG.md | 26 ++++++++++ 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 | 12 +++++ packages/vitest-pool-workers/package.json | 2 +- packages/workers-utils/CHANGELOG.md | 10 ++++ packages/workers-utils/package.json | 2 +- packages/wrangler/CHANGELOG.md | 35 +++++++++++++ packages/wrangler/package.json | 2 +- 27 files changed, 159 insertions(+), 128 deletions(-) delete mode 100644 .changeset/blue-dragons-wave.md delete mode 100644 .changeset/c3-frameworks-update-12630.md delete mode 100644 .changeset/c3-frameworks-update-12631.md delete mode 100644 .changeset/c3-frameworks-update-12633.md delete mode 100644 .changeset/c3-frameworks-update-12634.md delete mode 100644 .changeset/c3-frameworks-update-12635.md delete mode 100644 .changeset/capnweb-streams-media-bindings.md delete mode 100644 .changeset/dependabot-update-12618.md delete mode 100644 .changeset/dependabot-update-12637.md delete mode 100644 .changeset/lucky-chairs-relate.md delete mode 100644 .changeset/purple-queens-vanish.md delete mode 100644 .changeset/reduce-fs-errors.md delete mode 100644 .changeset/soft-apes-ask.md diff --git a/.changeset/blue-dragons-wave.md b/.changeset/blue-dragons-wave.md deleted file mode 100644 index dae0642210d6..000000000000 --- a/.changeset/blue-dragons-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"wrangler": patch ---- - -Add a warning in the autoconfig logic letting users know that support for projects inside workspaces is limited diff --git a/.changeset/c3-frameworks-update-12630.md b/.changeset/c3-frameworks-update-12630.md deleted file mode 100644 index a77b42c84f56..000000000000 --- a/.changeset/c3-frameworks-update-12630.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-vue | 3.21.0 | 3.21.1 | diff --git a/.changeset/c3-frameworks-update-12631.md b/.changeset/c3-frameworks-update-12631.md deleted file mode 100644 index a269be7fe4cd..000000000000 --- a/.changeset/c3-frameworks-update-12631.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-vike | 0.0.575 | 0.0.581 | diff --git a/.changeset/c3-frameworks-update-12633.md b/.changeset/c3-frameworks-update-12633.md deleted file mode 100644 index 74145299f48b..000000000000 --- a/.changeset/c3-frameworks-update-12633.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/create-start | 0.59.3 | 0.59.8 | diff --git a/.changeset/c3-frameworks-update-12634.md b/.changeset/c3-frameworks-update-12634.md deleted file mode 100644 index cf850c3ef641..000000000000 --- a/.changeset/c3-frameworks-update-12634.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.12.1 | 0.12.2 | diff --git a/.changeset/c3-frameworks-update-12635.md b/.changeset/c3-frameworks-update-12635.md deleted file mode 100644 index 2d6fd204d4af..000000000000 --- a/.changeset/c3-frameworks-update-12635.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-solid | 0.6.11 | 0.6.13 | diff --git a/.changeset/capnweb-streams-media-bindings.md b/.changeset/capnweb-streams-media-bindings.md deleted file mode 100644 index a583518df557..000000000000 --- a/.changeset/capnweb-streams-media-bindings.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"miniflare": patch -"wrangler": patch ---- - -Internal refactor to use capnweb's native `ReadableStream` support to power remote Media and Dispatch Namespace bindings. diff --git a/.changeset/dependabot-update-12618.md b/.changeset/dependabot-update-12618.md deleted file mode 100644 index e784f2c7f5fc..000000000000 --- a/.changeset/dependabot-update-12618.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.20260219.0 | 1.20260227.0 | diff --git a/.changeset/dependabot-update-12637.md b/.changeset/dependabot-update-12637.md deleted file mode 100644 index 71743632afb6..000000000000 --- a/.changeset/dependabot-update-12637.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.20260227.0 | 1.20260302.0 | diff --git a/.changeset/lucky-chairs-relate.md b/.changeset/lucky-chairs-relate.md deleted file mode 100644 index ddbcf2f9930c..000000000000 --- a/.changeset/lucky-chairs-relate.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"create-cloudflare": patch ---- - -Fix --variant flag being ignored for pages - -When creating a Pages project using `npm create cloudflare -- --type pages --variant `, -the `--variant` flag was being ignored, causing users to be prompted for variant selection -or defaulting to an unexpected variant. This now correctly passes the variant to the project setup. diff --git a/.changeset/purple-queens-vanish.md b/.changeset/purple-queens-vanish.md deleted file mode 100644 index c4175b1d5f0b..000000000000 --- a/.changeset/purple-queens-vanish.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@cloudflare/workers-utils": patch -"wrangler": patch ---- - -Switch to `empathic` for file-system upwards traversal to reduce dependency bloat. diff --git a/.changeset/reduce-fs-errors.md b/.changeset/reduce-fs-errors.md deleted file mode 100644 index 4a0c473ce6e4..000000000000 --- a/.changeset/reduce-fs-errors.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"create-cloudflare": patch -"miniflare": patch -"@cloudflare/vitest-pool-workers": patch -"@cloudflare/workers-utils": patch -"wrangler": patch ---- - -Optimize filesystem operations by using Node.js's throwIfNoEntry: false option - -This reduces the number of system calls made when checking for file existence by avoiding the overhead of throwing and catching errors for missing paths. This is an internal performance optimization with no user-visible behavioral changes. diff --git a/.changeset/soft-apes-ask.md b/.changeset/soft-apes-ask.md deleted file mode 100644 index 5ed03a889b2f..000000000000 --- a/.changeset/soft-apes-ask.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"wrangler": patch ---- - -Implemented logic within `wrangler containers registries configure` to check if a specified secret name is already in-use and offer to reuse that secret. Also added `--skip-confirmation` flag to the command to skip all interactive prompts. diff --git a/packages/create-cloudflare/CHANGELOG.md b/packages/create-cloudflare/CHANGELOG.md index 3624ca3f3e4f..d9489577519a 100644 --- a/packages/create-cloudflare/CHANGELOG.md +++ b/packages/create-cloudflare/CHANGELOG.md @@ -1,5 +1,59 @@ # create-cloudflare +## 2.64.3 + +### Patch Changes + +- [#12630](https://github.com/cloudflare/workers-sdk/pull/12630) [`e8fddc5`](https://github.com/cloudflare/workers-sdk/commit/e8fddc58fb99892f2ce5d1bb8c940b29acbe6c2a) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "create-cloudflare" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ---------- | ------ | ------ | + | create-vue | 3.21.0 | 3.21.1 | + +- [#12631](https://github.com/cloudflare/workers-sdk/pull/12631) [`5641c52`](https://github.com/cloudflare/workers-sdk/commit/5641c525bf65395918de0495fed2dd0c42f56d85) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "create-cloudflare" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ----------- | ------- | ------- | + | create-vike | 0.0.575 | 0.0.581 | + +- [#12633](https://github.com/cloudflare/workers-sdk/pull/12633) [`35c8ebd`](https://github.com/cloudflare/workers-sdk/commit/35c8ebd688e7d4aaf30b3a147fa5b65e405f740f) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "create-cloudflare" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ---------------------- | ------ | ------ | + | @tanstack/create-start | 0.59.3 | 0.59.8 | + +- [#12634](https://github.com/cloudflare/workers-sdk/pull/12634) [`11ace96`](https://github.com/cloudflare/workers-sdk/commit/11ace963bd195792bd53f7eec444c35fbbb27ec9) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "create-cloudflare" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ---------- | ------ | ------ | + | sv | 0.12.1 | 0.12.2 | + +- [#12635](https://github.com/cloudflare/workers-sdk/pull/12635) [`4cee91e`](https://github.com/cloudflare/workers-sdk/commit/4cee91e87edddf6decfded0ef6fb503d36d25961) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "create-cloudflare" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ------------ | ------ | ------ | + | create-solid | 0.6.11 | 0.6.13 | + +- [#12609](https://github.com/cloudflare/workers-sdk/pull/12609) [`1714b9b`](https://github.com/cloudflare/workers-sdk/commit/1714b9bbc834d6eac5982a41daf91026c1ad44b1) Thanks [@Hari-07](https://github.com/Hari-07)! - Fix --variant flag being ignored for pages + + When creating a Pages project using `npm create cloudflare -- --type pages --variant `, + the `--variant` flag was being ignored, causing users to be prompted for variant selection + or defaulting to an unexpected variant. This now correctly passes the variant to the project setup. + +- [#12602](https://github.com/cloudflare/workers-sdk/pull/12602) [`58a4020`](https://github.com/cloudflare/workers-sdk/commit/58a4020eaafcb56cb81dd7d08c58d3d75da08603) Thanks [@anonrig](https://github.com/anonrig)! - Optimize filesystem operations by using Node.js's throwIfNoEntry: false option + + This reduces the number of system calls made when checking for file existence by avoiding the overhead of throwing and catching errors for missing paths. This is an internal performance optimization with no user-visible behavioral changes. + ## 2.64.2 ### Patch Changes diff --git a/packages/create-cloudflare/package.json b/packages/create-cloudflare/package.json index 265ff6d67281..c32d8fa2ba9d 100644 --- a/packages/create-cloudflare/package.json +++ b/packages/create-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "create-cloudflare", - "version": "2.64.2", + "version": "2.64.3", "description": "A CLI for creating and deploying new applications to Cloudflare.", "keywords": [ "cloudflare", diff --git a/packages/miniflare/CHANGELOG.md b/packages/miniflare/CHANGELOG.md index b16668066cfd..474b61a19679 100644 --- a/packages/miniflare/CHANGELOG.md +++ b/packages/miniflare/CHANGELOG.md @@ -1,5 +1,31 @@ # miniflare +## 4.20260302.0 + +### Patch Changes + +- [#12582](https://github.com/cloudflare/workers-sdk/pull/12582) [`c2ed7c2`](https://github.com/cloudflare/workers-sdk/commit/c2ed7c23057b5fd74788f9b0c5415edc8a592276) Thanks [@penalosa](https://github.com/penalosa)! - Internal refactor to use capnweb's native `ReadableStream` support to power remote Media and Dispatch Namespace bindings. + +- [#12618](https://github.com/cloudflare/workers-sdk/pull/12618) [`d920811`](https://github.com/cloudflare/workers-sdk/commit/d9208114c391a2a9f49adab9056c3ddb24005984) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "miniflare", "wrangler" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ---------- | ------------ | ------------ | + | workerd | 1.20260219.0 | 1.20260227.0 | + +- [#12637](https://github.com/cloudflare/workers-sdk/pull/12637) [`896734d`](https://github.com/cloudflare/workers-sdk/commit/896734d4a754dded85086f88641f26848e554913) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "miniflare", "wrangler" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ---------- | ------------ | ------------ | + | workerd | 1.20260227.0 | 1.20260302.0 | + +- [#12602](https://github.com/cloudflare/workers-sdk/pull/12602) [`58a4020`](https://github.com/cloudflare/workers-sdk/commit/58a4020eaafcb56cb81dd7d08c58d3d75da08603) Thanks [@anonrig](https://github.com/anonrig)! - Optimize filesystem operations by using Node.js's throwIfNoEntry: false option + + This reduces the number of system calls made when checking for file existence by avoiding the overhead of throwing and catching errors for missing paths. This is an internal performance optimization with no user-visible behavioral changes. + ## 4.20260219.0 ### Minor Changes diff --git a/packages/miniflare/package.json b/packages/miniflare/package.json index a7b8d37fa443..250a351112ad 100644 --- a/packages/miniflare/package.json +++ b/packages/miniflare/package.json @@ -1,6 +1,6 @@ { "name": "miniflare", - "version": "4.20260219.0", + "version": "4.20260302.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 5483b352accf..427e1c4c0dc9 100644 --- a/packages/pages-shared/CHANGELOG.md +++ b/packages/pages-shared/CHANGELOG.md @@ -1,5 +1,12 @@ # @cloudflare/pages-shared +## 0.13.110 + +### Patch Changes + +- Updated dependencies [[`c2ed7c2`](https://github.com/cloudflare/workers-sdk/commit/c2ed7c23057b5fd74788f9b0c5415edc8a592276), [`d920811`](https://github.com/cloudflare/workers-sdk/commit/d9208114c391a2a9f49adab9056c3ddb24005984), [`896734d`](https://github.com/cloudflare/workers-sdk/commit/896734d4a754dded85086f88641f26848e554913), [`58a4020`](https://github.com/cloudflare/workers-sdk/commit/58a4020eaafcb56cb81dd7d08c58d3d75da08603)]: + - miniflare@4.20260302.0 + ## 0.13.109 ### Patch Changes diff --git a/packages/pages-shared/package.json b/packages/pages-shared/package.json index fa10040a9ce7..dccdc2ca462a 100644 --- a/packages/pages-shared/package.json +++ b/packages/pages-shared/package.json @@ -1,6 +1,6 @@ { "name": "@cloudflare/pages-shared", - "version": "0.13.109", + "version": "0.13.110", "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 ad5040f117b2..65bdd681fa3b 100644 --- a/packages/vite-plugin-cloudflare/CHANGELOG.md +++ b/packages/vite-plugin-cloudflare/CHANGELOG.md @@ -1,5 +1,13 @@ # @cloudflare/vite-plugin +## 1.25.3 + +### Patch Changes + +- Updated dependencies [[`e93dc01`](https://github.com/cloudflare/workers-sdk/commit/e93dc01839aee047b37188b850cac7f3465c7bd4), [`c2ed7c2`](https://github.com/cloudflare/workers-sdk/commit/c2ed7c23057b5fd74788f9b0c5415edc8a592276), [`d920811`](https://github.com/cloudflare/workers-sdk/commit/d9208114c391a2a9f49adab9056c3ddb24005984), [`896734d`](https://github.com/cloudflare/workers-sdk/commit/896734d4a754dded85086f88641f26848e554913), [`ebdbe52`](https://github.com/cloudflare/workers-sdk/commit/ebdbe52c2bcd1b30758b54de57a046f3ab196f04), [`58a4020`](https://github.com/cloudflare/workers-sdk/commit/58a4020eaafcb56cb81dd7d08c58d3d75da08603), [`6f6cd94`](https://github.com/cloudflare/workers-sdk/commit/6f6cd944480d6161c582c7af68f6c4205ddeaefe)]: + - wrangler@4.67.1 + - miniflare@4.20260302.0 + ## 1.25.2 ### Patch Changes diff --git a/packages/vite-plugin-cloudflare/package.json b/packages/vite-plugin-cloudflare/package.json index 1bb59638ac0b..2375e89555cb 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.25.2", + "version": "1.25.3", "description": "Cloudflare plugin for Vite", "keywords": [ "cloudflare", diff --git a/packages/vitest-pool-workers/CHANGELOG.md b/packages/vitest-pool-workers/CHANGELOG.md index 6947582d98d0..5a670034b62c 100644 --- a/packages/vitest-pool-workers/CHANGELOG.md +++ b/packages/vitest-pool-workers/CHANGELOG.md @@ -1,5 +1,17 @@ # @cloudflare/vitest-pool-workers +## 0.12.15 + +### Patch Changes + +- [#12602](https://github.com/cloudflare/workers-sdk/pull/12602) [`58a4020`](https://github.com/cloudflare/workers-sdk/commit/58a4020eaafcb56cb81dd7d08c58d3d75da08603) Thanks [@anonrig](https://github.com/anonrig)! - Optimize filesystem operations by using Node.js's throwIfNoEntry: false option + + This reduces the number of system calls made when checking for file existence by avoiding the overhead of throwing and catching errors for missing paths. This is an internal performance optimization with no user-visible behavioral changes. + +- Updated dependencies [[`e93dc01`](https://github.com/cloudflare/workers-sdk/commit/e93dc01839aee047b37188b850cac7f3465c7bd4), [`c2ed7c2`](https://github.com/cloudflare/workers-sdk/commit/c2ed7c23057b5fd74788f9b0c5415edc8a592276), [`d920811`](https://github.com/cloudflare/workers-sdk/commit/d9208114c391a2a9f49adab9056c3ddb24005984), [`896734d`](https://github.com/cloudflare/workers-sdk/commit/896734d4a754dded85086f88641f26848e554913), [`ebdbe52`](https://github.com/cloudflare/workers-sdk/commit/ebdbe52c2bcd1b30758b54de57a046f3ab196f04), [`58a4020`](https://github.com/cloudflare/workers-sdk/commit/58a4020eaafcb56cb81dd7d08c58d3d75da08603), [`6f6cd94`](https://github.com/cloudflare/workers-sdk/commit/6f6cd944480d6161c582c7af68f6c4205ddeaefe)]: + - wrangler@4.67.1 + - miniflare@4.20260302.0 + ## 0.12.14 ### Patch Changes diff --git a/packages/vitest-pool-workers/package.json b/packages/vitest-pool-workers/package.json index 97de7e434133..1e52d6a2a15d 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.12.14", + "version": "0.12.15", "description": "Workers Vitest integration for writing Vitest unit and integration tests that run inside the Workers runtime", "keywords": [ "cloudflare", diff --git a/packages/workers-utils/CHANGELOG.md b/packages/workers-utils/CHANGELOG.md index a5f05a96d7e6..dd0ed6cad935 100644 --- a/packages/workers-utils/CHANGELOG.md +++ b/packages/workers-utils/CHANGELOG.md @@ -1,5 +1,15 @@ # @cloudflare/workers-utils +## 0.11.1 + +### Patch Changes + +- [#12601](https://github.com/cloudflare/workers-sdk/pull/12601) [`ebdbe52`](https://github.com/cloudflare/workers-sdk/commit/ebdbe52c2bcd1b30758b54de57a046f3ab196f04) Thanks [@43081j](https://github.com/43081j)! - Switch to `empathic` for file-system upwards traversal to reduce dependency bloat. + +- [#12602](https://github.com/cloudflare/workers-sdk/pull/12602) [`58a4020`](https://github.com/cloudflare/workers-sdk/commit/58a4020eaafcb56cb81dd7d08c58d3d75da08603) Thanks [@anonrig](https://github.com/anonrig)! - Optimize filesystem operations by using Node.js's throwIfNoEntry: false option + + This reduces the number of system calls made when checking for file existence by avoiding the overhead of throwing and catching errors for missing paths. This is an internal performance optimization with no user-visible behavioral changes. + ## 0.11.0 ### Minor Changes diff --git a/packages/workers-utils/package.json b/packages/workers-utils/package.json index bfd6ed7294e1..9080bb1b3778 100644 --- a/packages/workers-utils/package.json +++ b/packages/workers-utils/package.json @@ -1,6 +1,6 @@ { "name": "@cloudflare/workers-utils", - "version": "0.11.0", + "version": "0.11.1", "description": "Utility package for common Worker operations", "homepage": "https://github.com/cloudflare/workers-sdk#readme", "bugs": { diff --git a/packages/wrangler/CHANGELOG.md b/packages/wrangler/CHANGELOG.md index 9adcc8e0d13b..516daa79b003 100644 --- a/packages/wrangler/CHANGELOG.md +++ b/packages/wrangler/CHANGELOG.md @@ -1,5 +1,40 @@ # wrangler +## 4.67.1 + +### Patch Changes + +- [#12595](https://github.com/cloudflare/workers-sdk/pull/12595) [`e93dc01`](https://github.com/cloudflare/workers-sdk/commit/e93dc01839aee047b37188b850cac7f3465c7bd4) Thanks [@dario-piotrowicz](https://github.com/dario-piotrowicz)! - Add a warning in the autoconfig logic letting users know that support for projects inside workspaces is limited + +- [#12582](https://github.com/cloudflare/workers-sdk/pull/12582) [`c2ed7c2`](https://github.com/cloudflare/workers-sdk/commit/c2ed7c23057b5fd74788f9b0c5415edc8a592276) Thanks [@penalosa](https://github.com/penalosa)! - Internal refactor to use capnweb's native `ReadableStream` support to power remote Media and Dispatch Namespace bindings. + +- [#12618](https://github.com/cloudflare/workers-sdk/pull/12618) [`d920811`](https://github.com/cloudflare/workers-sdk/commit/d9208114c391a2a9f49adab9056c3ddb24005984) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "miniflare", "wrangler" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ---------- | ------------ | ------------ | + | workerd | 1.20260219.0 | 1.20260227.0 | + +- [#12637](https://github.com/cloudflare/workers-sdk/pull/12637) [`896734d`](https://github.com/cloudflare/workers-sdk/commit/896734d4a754dded85086f88641f26848e554913) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update dependencies of "miniflare", "wrangler" + + The following dependency versions have been updated: + + | Dependency | From | To | + | ---------- | ------------ | ------------ | + | workerd | 1.20260227.0 | 1.20260302.0 | + +- [#12601](https://github.com/cloudflare/workers-sdk/pull/12601) [`ebdbe52`](https://github.com/cloudflare/workers-sdk/commit/ebdbe52c2bcd1b30758b54de57a046f3ab196f04) Thanks [@43081j](https://github.com/43081j)! - Switch to `empathic` for file-system upwards traversal to reduce dependency bloat. + +- [#12602](https://github.com/cloudflare/workers-sdk/pull/12602) [`58a4020`](https://github.com/cloudflare/workers-sdk/commit/58a4020eaafcb56cb81dd7d08c58d3d75da08603) Thanks [@anonrig](https://github.com/anonrig)! - Optimize filesystem operations by using Node.js's throwIfNoEntry: false option + + This reduces the number of system calls made when checking for file existence by avoiding the overhead of throwing and catching errors for missing paths. This is an internal performance optimization with no user-visible behavioral changes. + +- [#12591](https://github.com/cloudflare/workers-sdk/pull/12591) [`6f6cd94`](https://github.com/cloudflare/workers-sdk/commit/6f6cd944480d6161c582c7af68f6c4205ddeaefe) Thanks [@martinezjandrew](https://github.com/martinezjandrew)! - Implemented logic within `wrangler containers registries configure` to check if a specified secret name is already in-use and offer to reuse that secret. Also added `--skip-confirmation` flag to the command to skip all interactive prompts. + +- Updated dependencies [[`c2ed7c2`](https://github.com/cloudflare/workers-sdk/commit/c2ed7c23057b5fd74788f9b0c5415edc8a592276), [`d920811`](https://github.com/cloudflare/workers-sdk/commit/d9208114c391a2a9f49adab9056c3ddb24005984), [`896734d`](https://github.com/cloudflare/workers-sdk/commit/896734d4a754dded85086f88641f26848e554913), [`58a4020`](https://github.com/cloudflare/workers-sdk/commit/58a4020eaafcb56cb81dd7d08c58d3d75da08603)]: + - miniflare@4.20260302.0 + ## 4.67.0 ### Minor Changes diff --git a/packages/wrangler/package.json b/packages/wrangler/package.json index ecfdc0943658..825ec16cd590 100644 --- a/packages/wrangler/package.json +++ b/packages/wrangler/package.json @@ -1,6 +1,6 @@ { "name": "wrangler", - "version": "4.67.0", + "version": "4.67.1", "description": "Command-line interface for all things Cloudflare Workers", "keywords": [ "wrangler", From 8d882fa1c4aa812482e53df2b668bf3b28549ece Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Mon, 23 Feb 2026 17:21:41 +0000 Subject: [PATCH 5/7] Autoconfig GA (#12614) --- .changeset/gentle-moons-argue.md | 5 ++++ .changeset/yummy-snails-stand.md | 5 ++++ .../src/__tests__/autoconfig/run.test.ts | 4 +-- .../wrangler/src/__tests__/deploy.test.ts | 30 ++++++++++++++----- packages/wrangler/src/__tests__/index.test.ts | 4 +-- packages/wrangler/src/__tests__/setup.test.ts | 2 +- packages/wrangler/src/autoconfig/details.ts | 1 + packages/wrangler/src/deploy/index.ts | 2 +- packages/wrangler/src/setup.ts | 2 +- 9 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 .changeset/gentle-moons-argue.md create mode 100644 .changeset/yummy-snails-stand.md diff --git a/.changeset/gentle-moons-argue.md b/.changeset/gentle-moons-argue.md new file mode 100644 index 000000000000..0897c5b60adb --- /dev/null +++ b/.changeset/gentle-moons-argue.md @@ -0,0 +1,5 @@ +--- +"wrangler": minor +--- + +Enable autoconfig for `wrangler deploy` by default (while allowing users to still disable it via `--x-autoconfig=false` if necessary) diff --git a/.changeset/yummy-snails-stand.md b/.changeset/yummy-snails-stand.md new file mode 100644 index 000000000000..74280af9141e --- /dev/null +++ b/.changeset/yummy-snails-stand.md @@ -0,0 +1,5 @@ +--- +"wrangler": minor +--- + +Mark the `wrangler setup` command as stable diff --git a/packages/wrangler/src/__tests__/autoconfig/run.test.ts b/packages/wrangler/src/__tests__/autoconfig/run.test.ts index 0bcae87a286c..8612a3eae0c6 100644 --- a/packages/wrangler/src/__tests__/autoconfig/run.test.ts +++ b/packages/wrangler/src/__tests__/autoconfig/run.test.ts @@ -94,11 +94,11 @@ describe("autoconfig (deploy)", () => { clearOutputFilePath(); }); - it("should not check for autoconfig without flag", async () => { + it("should not check for autoconfig when `deploy` is run with `--x-autoconfig=false`", async () => { writeWorkerSource(); writeWranglerConfig({ main: "index.js" }); const getDetailsSpy = vi.spyOn(details, "getDetailsForAutoConfig"); - await runDeploy(); + await runDeploy(`--x-autoconfig=false`); expect(getDetailsSpy).not.toHaveBeenCalled(); }); diff --git a/packages/wrangler/src/__tests__/deploy.test.ts b/packages/wrangler/src/__tests__/deploy.test.ts index 3ddebe6797e5..8204d1859bd1 100644 --- a/packages/wrangler/src/__tests__/deploy.test.ts +++ b/packages/wrangler/src/__tests__/deploy.test.ts @@ -114,9 +114,7 @@ vi.mock("../package-manager", async (importOriginal) => ({ }, })); -vi.mock("../autoconfig/details"); vi.mock("../autoconfig/run"); -vi.mock("../autoconfig/frameworks"); vi.mock("../autoconfig/frameworks/utils/packages"); vi.mock("../autoconfig/c3-vendor/command"); @@ -566,13 +564,13 @@ describe("deploy", () => { `); }); - it("should error helpfully if pages_build_output_dir is set in wrangler.toml", async () => { + it("should error helpfully if pages_build_output_dir is set in wrangler.toml when --x-autoconfig=false", async () => { writeWranglerConfig({ pages_build_output_dir: "public", name: "test-name", }); await expect( - runWrangler("deploy") + runWrangler("deploy --x-autoconfig=false") ).rejects.toThrowErrorMatchingInlineSnapshot( ` [Error: It looks like you've run a Workers-specific command in a Pages project. @@ -581,6 +579,22 @@ describe("deploy", () => { ); }); + it("should error helpfully if pages_build_output_dir is set in wrangler.toml and --x-autoconfig is provided", async () => { + mockConfirm({ + text: "Are you sure that you want to proceed?", + result: true, + }); + + writeWranglerConfig({ + pages_build_output_dir: "public", + name: "test-name", + }); + await expect(runWrangler("deploy --x-autoconfig")).rejects.toThrowError(); + expect(std.warn).toContain( + "It seems that you have run `wrangler deploy` on a Pages project, `wrangler pages deploy` should be used instead." + ); + }); + it("should attempt to run the autoconfig flow when pages_build_output_dir and (--x-autoconfig is used)", async () => { writeWranglerConfig({ pages_build_output_dir: "public", @@ -589,7 +603,7 @@ describe("deploy", () => { const getDetailsForAutoConfigSpy = vi .spyOn(await import("../autoconfig/details"), "getDetailsForAutoConfig") - .mockResolvedValue({ + .mockResolvedValueOnce({ configured: false, projectPath: process.cwd(), workerName: "test-name", @@ -628,7 +642,7 @@ describe("deploy", () => { const getDetailsForAutoConfigSpy = vi .spyOn(await import("../autoconfig/details"), "getDetailsForAutoConfig") - .mockResolvedValue({ + .mockResolvedValueOnce({ configured: false, projectPath: process.cwd(), workerName: "test-name", @@ -16603,13 +16617,13 @@ export default{ expect(std.warn).toMatchInlineSnapshot(`""`); }); - it("should not delegate to open-next deploy when the --x-autoconfig flag is not provided", async () => { + it("should not delegate to open-next deploy when --x-autoconfig=false is provided", async () => { const runCommandSpy = (await import("../autoconfig/c3-vendor/command")) .runCommand; await mockOpenNextLikeProject(); - await runWrangler("deploy"); + await runWrangler("deploy --x-autoconfig=false"); expect(runCommandSpy).not.toHaveBeenCalledOnce(); diff --git a/packages/wrangler/src/__tests__/index.test.ts b/packages/wrangler/src/__tests__/index.test.ts index e5d715125782..7d5fd7c23c6c 100644 --- a/packages/wrangler/src/__tests__/index.test.ts +++ b/packages/wrangler/src/__tests__/index.test.ts @@ -58,7 +58,7 @@ describe("wrangler", () => { wrangler queues 📬 Manage Workers Queues wrangler rollback [version-id] 🔙 Rollback a deployment for a Worker wrangler secret 🤫 Generate a secret that can be referenced in a Worker - wrangler setup 🪄 Setup a project to work on Cloudflare [experimental] + wrangler setup 🪄 Setup a project to work on Cloudflare wrangler tail [worker] 🦚 Start a log tailing session for a Worker wrangler triggers 🎯 Updates the triggers of your current deployment [experimental] wrangler types [path] 📝 Generate types from your Worker configuration @@ -129,7 +129,7 @@ describe("wrangler", () => { wrangler queues 📬 Manage Workers Queues wrangler rollback [version-id] 🔙 Rollback a deployment for a Worker wrangler secret 🤫 Generate a secret that can be referenced in a Worker - wrangler setup 🪄 Setup a project to work on Cloudflare [experimental] + wrangler setup 🪄 Setup a project to work on Cloudflare wrangler tail [worker] 🦚 Start a log tailing session for a Worker wrangler triggers 🎯 Updates the triggers of your current deployment [experimental] wrangler types [path] 📝 Generate types from your Worker configuration diff --git a/packages/wrangler/src/__tests__/setup.test.ts b/packages/wrangler/src/__tests__/setup.test.ts index 69c55a858bf4..e55ebb422007 100644 --- a/packages/wrangler/src/__tests__/setup.test.ts +++ b/packages/wrangler/src/__tests__/setup.test.ts @@ -35,7 +35,7 @@ describe("wrangler setup", () => { expect(std.out).toMatchInlineSnapshot(` "wrangler setup - 🪄 Setup a project to work on Cloudflare [experimental] + 🪄 Setup a project to work on Cloudflare GLOBAL FLAGS -c, --config Path to Wrangler configuration file [string] diff --git a/packages/wrangler/src/autoconfig/details.ts b/packages/wrangler/src/autoconfig/details.ts index 30c5f2231e36..d69ce0e61974 100644 --- a/packages/wrangler/src/autoconfig/details.ts +++ b/packages/wrangler/src/autoconfig/details.ts @@ -253,6 +253,7 @@ async function detectFramework( name: "Cloudflare Pages", id: "cloudflare-pages", }, + dist: wranglerConfig?.pages_build_output_dir, }, packageManager, }; diff --git a/packages/wrangler/src/deploy/index.ts b/packages/wrangler/src/deploy/index.ts index 399028ac80ae..6acbab3e035f 100644 --- a/packages/wrangler/src/deploy/index.ts +++ b/packages/wrangler/src/deploy/index.ts @@ -256,7 +256,7 @@ export const deployCommand = createCommand({ describe: "Experimental: Enables framework detection and automatic configuration when deploying", type: "boolean", - default: false, + default: true, }, }, behaviour: { diff --git a/packages/wrangler/src/setup.ts b/packages/wrangler/src/setup.ts index b02a6703c168..b30ae5727d31 100644 --- a/packages/wrangler/src/setup.ts +++ b/packages/wrangler/src/setup.ts @@ -14,7 +14,7 @@ export const setupCommand = createCommand({ metadata: { description: "🪄 Setup a project to work on Cloudflare", owner: "Workers: Authoring and Testing", - status: "experimental", + status: "stable", category: "Compute & AI", }, args: { From 38c643afcb72d8f63ae24b8014cee0d25dc25db4 Mon Sep 17 00:00:00 2001 From: Dario Piotrowicz Date: Mon, 23 Feb 2026 18:34:22 +0000 Subject: [PATCH 6/7] Quarantine all the Angular C3 e2e tests (#12645) --- .../e2e/tests/frameworks/test-config.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/create-cloudflare/e2e/tests/frameworks/test-config.ts b/packages/create-cloudflare/e2e/tests/frameworks/test-config.ts index 62c91442133a..7dd3c7d980ea 100644 --- a/packages/create-cloudflare/e2e/tests/frameworks/test-config.ts +++ b/packages/create-cloudflare/e2e/tests/frameworks/test-config.ts @@ -167,6 +167,9 @@ function getFrameworkTestConfig(pm: string): NamedFrameworkTestConfig[] { }, nodeCompat: false, flags: ["--style", "sass"], + // TODO: currently the Angular tests are failing with `URL with hostname "localhost" is not allowed.` + // we need to investigate this so that we can un-quarantine the Angular tests + quarantine: true, }, { name: "angular:workers", @@ -186,6 +189,9 @@ function getFrameworkTestConfig(pm: string): NamedFrameworkTestConfig[] { }, nodeCompat: false, flags: ["--style", "sass"], + // TODO: currently the Angular tests are failing with `URL with hostname "localhost" is not allowed.` + // we need to investigate this so that we can un-quarantine the Angular tests + quarantine: true, }, { name: "gatsby:pages", @@ -784,6 +790,9 @@ function getExperimentalFrameworkTestConfig( nodeCompat: false, flags: ["--style", "sass"], verifyTypes: false, + // TODO: currently the Angular tests are failing with `URL with hostname "localhost" is not allowed.` + // we need to investigate this so that we can un-quarantine the Angular tests + quarantine: true, }, { name: "nuxt:workers", From 6aaabb08967ea874a689f12940dd79418295199c Mon Sep 17 00:00:00 2001 From: ANT Bot <116369605+workers-devprod@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:10:49 +0000 Subject: [PATCH 7/7] Version Packages (#12643) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/gentle-moons-argue.md | 5 ----- .changeset/yummy-snails-stand.md | 5 ----- packages/vite-plugin-cloudflare/CHANGELOG.md | 7 +++++++ packages/vite-plugin-cloudflare/package.json | 2 +- packages/vitest-pool-workers/CHANGELOG.md | 7 +++++++ packages/vitest-pool-workers/package.json | 2 +- packages/wrangler/CHANGELOG.md | 8 ++++++++ packages/wrangler/package.json | 2 +- 8 files changed, 25 insertions(+), 13 deletions(-) delete mode 100644 .changeset/gentle-moons-argue.md delete mode 100644 .changeset/yummy-snails-stand.md diff --git a/.changeset/gentle-moons-argue.md b/.changeset/gentle-moons-argue.md deleted file mode 100644 index 0897c5b60adb..000000000000 --- a/.changeset/gentle-moons-argue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"wrangler": minor ---- - -Enable autoconfig for `wrangler deploy` by default (while allowing users to still disable it via `--x-autoconfig=false` if necessary) diff --git a/.changeset/yummy-snails-stand.md b/.changeset/yummy-snails-stand.md deleted file mode 100644 index 74280af9141e..000000000000 --- a/.changeset/yummy-snails-stand.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"wrangler": minor ---- - -Mark the `wrangler setup` command as stable diff --git a/packages/vite-plugin-cloudflare/CHANGELOG.md b/packages/vite-plugin-cloudflare/CHANGELOG.md index 65bdd681fa3b..889a15a5fcbd 100644 --- a/packages/vite-plugin-cloudflare/CHANGELOG.md +++ b/packages/vite-plugin-cloudflare/CHANGELOG.md @@ -1,5 +1,12 @@ # @cloudflare/vite-plugin +## 1.25.4 + +### Patch Changes + +- Updated dependencies [[`8d882fa`](https://github.com/cloudflare/workers-sdk/commit/8d882fa1c4aa812482e53df2b668bf3b28549ece), [`8d882fa`](https://github.com/cloudflare/workers-sdk/commit/8d882fa1c4aa812482e53df2b668bf3b28549ece)]: + - wrangler@4.68.0 + ## 1.25.3 ### Patch Changes diff --git a/packages/vite-plugin-cloudflare/package.json b/packages/vite-plugin-cloudflare/package.json index 2375e89555cb..95dd01753c91 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.25.3", + "version": "1.25.4", "description": "Cloudflare plugin for Vite", "keywords": [ "cloudflare", diff --git a/packages/vitest-pool-workers/CHANGELOG.md b/packages/vitest-pool-workers/CHANGELOG.md index 5a670034b62c..711fcf84affb 100644 --- a/packages/vitest-pool-workers/CHANGELOG.md +++ b/packages/vitest-pool-workers/CHANGELOG.md @@ -1,5 +1,12 @@ # @cloudflare/vitest-pool-workers +## 0.12.16 + +### Patch Changes + +- Updated dependencies [[`8d882fa`](https://github.com/cloudflare/workers-sdk/commit/8d882fa1c4aa812482e53df2b668bf3b28549ece), [`8d882fa`](https://github.com/cloudflare/workers-sdk/commit/8d882fa1c4aa812482e53df2b668bf3b28549ece)]: + - wrangler@4.68.0 + ## 0.12.15 ### Patch Changes diff --git a/packages/vitest-pool-workers/package.json b/packages/vitest-pool-workers/package.json index 1e52d6a2a15d..2d39de38fe17 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.12.15", + "version": "0.12.16", "description": "Workers Vitest integration for writing Vitest unit and integration tests that run inside the Workers runtime", "keywords": [ "cloudflare", diff --git a/packages/wrangler/CHANGELOG.md b/packages/wrangler/CHANGELOG.md index 516daa79b003..49ea557713e1 100644 --- a/packages/wrangler/CHANGELOG.md +++ b/packages/wrangler/CHANGELOG.md @@ -1,5 +1,13 @@ # wrangler +## 4.68.0 + +### Minor Changes + +- [#12614](https://github.com/cloudflare/workers-sdk/pull/12614) [`8d882fa`](https://github.com/cloudflare/workers-sdk/commit/8d882fa1c4aa812482e53df2b668bf3b28549ece) Thanks [@dario-piotrowicz](https://github.com/dario-piotrowicz)! - Enable autoconfig for `wrangler deploy` by default (while allowing users to still disable it via `--x-autoconfig=false` if necessary) + +- [#12614](https://github.com/cloudflare/workers-sdk/pull/12614) [`8d882fa`](https://github.com/cloudflare/workers-sdk/commit/8d882fa1c4aa812482e53df2b668bf3b28549ece) Thanks [@dario-piotrowicz](https://github.com/dario-piotrowicz)! - Mark the `wrangler setup` command as stable + ## 4.67.1 ### Patch Changes diff --git a/packages/wrangler/package.json b/packages/wrangler/package.json index 825ec16cd590..b77284c2d711 100644 --- a/packages/wrangler/package.json +++ b/packages/wrangler/package.json @@ -1,6 +1,6 @@ { "name": "wrangler", - "version": "4.67.1", + "version": "4.68.0", "description": "Command-line interface for all things Cloudflare Workers", "keywords": [ "wrangler",