From eacedbaf56a9687f1bac31dd14985334263e2f0d Mon Sep 17 00:00:00 2001 From: Edmund Hung Date: Thu, 22 Jan 2026 14:42:28 +0000 Subject: [PATCH 1/8] fix(wrangler): error when Worker is not found in (#12044) --- .changeset/eight-teeth-smoke.md | 7 +++++ .../wrangler/src/__tests__/secret.test.ts | 29 +++++++++++++++++++ .../deploy/check-remote-secrets-override.ts | 18 ++++++++++-- packages/wrangler/src/secret/index.ts | 19 +++++++++--- packages/wrangler/src/utils/fetch-secrets.ts | 16 +--------- 5 files changed, 68 insertions(+), 21 deletions(-) create mode 100644 .changeset/eight-teeth-smoke.md diff --git a/.changeset/eight-teeth-smoke.md b/.changeset/eight-teeth-smoke.md new file mode 100644 index 000000000000..943f1a8e9452 --- /dev/null +++ b/.changeset/eight-teeth-smoke.md @@ -0,0 +1,7 @@ +--- +"wrangler": patch +--- + +Fix `wrangler secret list` to error when the Worker is not found + +Previously, running `wrangler secret list` against a non-existent Worker would silently return an empty array, making it difficult to diagnose issues like being logged into the wrong account. It now returns an error with suggestions for common causes. diff --git a/packages/wrangler/src/__tests__/secret.test.ts b/packages/wrangler/src/__tests__/secret.test.ts index 6350988fc314..25141dcb6540 100644 --- a/packages/wrangler/src/__tests__/secret.test.ts +++ b/packages/wrangler/src/__tests__/secret.test.ts @@ -897,6 +897,35 @@ describe("wrangler secret", () => { ); }); + it("should error if worker is not found (error code 10007)", async () => { + msw.use( + http.get( + `*/accounts/:accountId/workers/scripts/:scriptName/secrets`, + () => { + return HttpResponse.json( + createFetchResult(null, false, [ + { + code: WORKER_NOT_FOUND_ERR_CODE, + message: workerNotFoundErrorMessage, + }, + ]) + ); + }, + { once: true } + ) + ); + await expect( + runWrangler("secret list --name non-existent-worker") + ).rejects.toThrowErrorMatchingInlineSnapshot( + ` + [Error: Worker "non-existent-worker" not found. + + If this is a new Worker, run \`wrangler deploy\` first to create it. + Otherwise, check that the Worker name is correct and you're logged into the right account.] + ` + ); + }); + describe("banner tests", () => { it("banner if pretty", async () => { mockListRequest({ scriptName: "script-name" }); diff --git a/packages/wrangler/src/deploy/check-remote-secrets-override.ts b/packages/wrangler/src/deploy/check-remote-secrets-override.ts index ada0b19cdd0b..3ccf8804e3ce 100644 --- a/packages/wrangler/src/deploy/check-remote-secrets-override.ts +++ b/packages/wrangler/src/deploy/check-remote-secrets-override.ts @@ -1,4 +1,5 @@ import { fetchSecrets } from "../utils/fetch-secrets"; +import { isWorkerNotFoundError } from "../utils/worker-not-found-error"; import type { Config } from "@cloudflare/workers-utils"; /** @@ -24,8 +25,21 @@ export async function checkRemoteSecretsOverride( const bindingNames = extractBindingNames(config); if (envVarNames.length + bindingNames.length > 0) { - const secrets = await fetchSecrets(config, targetEnv); - const secretNames = new Set(secrets.map((secret) => secret.name)); + const secretNames = new Set(); + + try { + const secrets = await fetchSecrets(config, targetEnv); + + for (const secret of secrets) { + secretNames.add(secret.name); + } + } catch (e) { + if (isWorkerNotFoundError(e)) { + // Worker doesn't exist yet (first deployment), so no secrets to override + return { override: false }; + } + throw e; + } const envVarNamesOverridingSecrets = envVarNames.filter((name) => secretNames.has(name) diff --git a/packages/wrangler/src/secret/index.ts b/packages/wrangler/src/secret/index.ts index 966920005840..4d6dc13be711 100644 --- a/packages/wrangler/src/secret/index.ts +++ b/packages/wrangler/src/secret/index.ts @@ -387,10 +387,21 @@ export const secretListCommand = createCommand({ ); } - const secrets = await fetchSecrets( - { ...config, name: scriptName }, - args.env - ); + let secrets: Awaited>; + + try { + secrets = await fetchSecrets({ ...config, name: scriptName }, args.env); + } catch (e) { + if (isWorkerNotFoundError(e)) { + throw new UserError( + `Worker "${scriptName}"${args.env ? ` (env: ${args.env})` : ""} not found.\n\n` + + `If this is a new Worker, run \`wrangler deploy\` first to create it.\n` + + `Otherwise, check that the Worker name is correct and you're logged into the right account.` + ); + } + + throw e; + } if (args.format === "pretty") { for (const workerSecret of secrets) { diff --git a/packages/wrangler/src/utils/fetch-secrets.ts b/packages/wrangler/src/utils/fetch-secrets.ts index 2b76af829fdd..a63e93f8bb4f 100644 --- a/packages/wrangler/src/utils/fetch-secrets.ts +++ b/packages/wrangler/src/utils/fetch-secrets.ts @@ -1,4 +1,3 @@ -import { APIError } from "@cloudflare/workers-utils"; import { fetchResult } from "../cfetch"; import { requireAuth } from "../user"; import { useServiceEnvironments } from "./useServiceEnvironments"; @@ -18,18 +17,5 @@ export async function fetchSecrets( ? `/accounts/${accountId}/workers/services/${scriptName}/environments/${environment}/secrets` : `/accounts/${accountId}/workers/scripts/${scriptName}/secrets`; - const secrets = await fetchResult<{ name: string; type: string }[]>( - config, - url - ).catch((e) => { - if (e instanceof APIError && e.code === 10007) { - // The worker was not found this means that this is the workers' first deployment - // so there are obviously no secrets - return []; - } - - throw e; - }); - - return secrets; + return fetchResult<{ name: string; type: string }[]>(config, url); } From e414f05271887ed43a9a0a660d66565e9847c489 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Somhairle=20MacLe=C3=B2id?= Date: Thu, 22 Jan 2026 15:00:03 +0000 Subject: [PATCH 2/8] Add support for customising inspector IP address (#12008) Adds a new `--inspector-ip` CLI flag and `dev.inspector_ip` configuration option to allow customising the IP address that the inspector server listens on. This enables debugging in Docker containers and other environments where binding to 127.0.0.1 is not sufficient. Previously, the inspector was hardcoded to listen only on 127.0.0.1, which prevented debugging in containerized environments where external access is needed. Fixes #5603 Co-authored-by: Claude Sonnet 4.5 --- .changeset/README.md | 2 + .changeset/custom-inspector-ip.md | 25 +++++++ packages/miniflare/src/index.ts | 2 + packages/miniflare/src/plugins/core/index.ts | 1 + .../inspector-proxy-controller.ts | 34 ++++++++-- packages/workers-utils/src/config/config.ts | 8 +++ .../workers-utils/src/config/validation.ts | 9 +++ .../normalize-and-validate-config.test.ts | 1 + .../__tests__/config-validation-pages.test.ts | 1 + packages/wrangler/src/__tests__/dev.test.ts | 66 +++++++++++++++++++ packages/wrangler/src/api/dev.ts | 1 + .../api/startDevWorker/ConfigController.ts | 29 +++++--- .../startDevWorker/LocalRuntimeController.ts | 2 + packages/wrangler/src/dev.ts | 4 ++ packages/wrangler/src/dev/miniflare/index.ts | 2 + packages/wrangler/src/dev/start-dev.ts | 1 + packages/wrangler/src/pages/dev.ts | 1 + 17 files changed, 173 insertions(+), 16 deletions(-) create mode 100644 .changeset/custom-inspector-ip.md diff --git a/.changeset/README.md b/.changeset/README.md index d743fffba841..b07fe3b2accf 100644 --- a/.changeset/README.md +++ b/.changeset/README.md @@ -91,6 +91,8 @@ The changelog uses h3 for section headers, so any headers in changeset content m For new features or significant changes, consider including a brief usage example. Examples can be helpful for users to understand new functionality, but they are not mandatory—use your judgment based on how self-explanatory the change is. +When showing Wrangler configuration examples, use `wrangler.json` (with JSONC syntax for comments) rather than `wrangler.toml`. + ## Multiple Changesets If your PR makes multiple distinct user-facing changes, create separate changesets so each gets its own changelog entry. Don't lump unrelated changes together, and don't mix different types of changes (e.g., bug fix + new feature) in a single changeset. diff --git a/.changeset/custom-inspector-ip.md b/.changeset/custom-inspector-ip.md new file mode 100644 index 000000000000..b0a38e9367e4 --- /dev/null +++ b/.changeset/custom-inspector-ip.md @@ -0,0 +1,25 @@ +--- +"wrangler": minor +"miniflare": minor +"@cloudflare/workers-utils": minor +--- + +Add support for customising the inspector IP address + +Adds a new `--inspector-ip` CLI flag and `dev.inspector_ip` configuration option to allow customising the IP address that the inspector server listens on. Previously, the inspector was hardcoded to listen only on `127.0.0.1`. + +Example usage: + +```bash +# CLI flag +wrangler dev --inspector-ip 0.0.0.0 +``` + +```jsonc +// wrangler.json +{ + "dev": { + "inspector_ip": "0.0.0.0", + }, +} +``` diff --git a/packages/miniflare/src/index.ts b/packages/miniflare/src/index.ts index 9596fa6e2549..e84db1b05b69 100644 --- a/packages/miniflare/src/index.ts +++ b/packages/miniflare/src/index.ts @@ -1003,6 +1003,7 @@ export class Miniflare { this.#maybeInspectorProxyController = new InspectorProxyController( this.#sharedOpts.core.inspectorPort, + this.#sharedOpts.core.inspectorHost, this.#log, workerNamesToProxy ); @@ -2042,6 +2043,7 @@ export class Miniflare { } else { await this.#maybeInspectorProxyController.updateConnection( this.#sharedOpts.core.inspectorPort, + this.#sharedOpts.core.inspectorHost ?? "127.0.0.1", maybePort, this.#workerNamesToProxy() ); diff --git a/packages/miniflare/src/plugins/core/index.ts b/packages/miniflare/src/plugins/core/index.ts index ddbf4f914757..fc214958621f 100644 --- a/packages/miniflare/src/plugins/core/index.ts +++ b/packages/miniflare/src/plugins/core/index.ts @@ -239,6 +239,7 @@ export const CoreSharedOptionsSchema = z httpsCertPath: z.string().optional(), inspectorPort: z.number().optional(), + inspectorHost: z.string().optional(), verbose: z.boolean().optional(), diff --git a/packages/miniflare/src/plugins/core/inspector-proxy/inspector-proxy-controller.ts b/packages/miniflare/src/plugins/core/inspector-proxy/inspector-proxy-controller.ts index e60db8b94299..0483ed7481cd 100644 --- a/packages/miniflare/src/plugins/core/inspector-proxy/inspector-proxy-controller.ts +++ b/packages/miniflare/src/plugins/core/inspector-proxy/inspector-proxy-controller.ts @@ -36,6 +36,7 @@ export class InspectorProxyController { constructor( private inspectorPortOption: number, + private inspectorHostOption: string = "127.0.0.1", private log: Log, private workerNamesToProxy: Set ) { @@ -78,10 +79,16 @@ export class InspectorProxyController { * @param server the server to start listening. */ async #startListening(server: Server): Promise { - this.log.debug("Trying to listen on port: " + this.inspectorPortOption); + this.log.debug( + `Trying to listen on ${this.inspectorHostOption}:${this.inspectorPortOption}` + ); return new Promise((resolve, reject) => { server.once("error", reject); - server.listen(this.inspectorPortOption, resolve); + server.listen( + this.inspectorPortOption, + this.inspectorHostOption, + resolve + ); }); } @@ -134,7 +141,12 @@ export class InspectorProxyController { if (hostHeader == null) return { statusText: null, status: 400 }; try { const host = new URL(`http://${hostHeader}`); - if (!ALLOWED_HOST_HOSTNAMES.includes(host.hostname)) { + // Allow the configured inspector host in addition to the default allowed hostnames + const allowedHostnames = [ + ...ALLOWED_HOST_HOSTNAMES, + this.inspectorHostOption, + ]; + if (!allowedHostnames.includes(host.hostname)) { return { statusText: "Disallowed `Host` header", status: 401 }; } } catch { @@ -247,17 +259,25 @@ export class InspectorProxyController { } async getInspectorURL(): Promise { - return getWebsocketURL(await this.#getInspectorPort()); + return getWebsocketURL( + this.inspectorHostOption, + await this.#getInspectorPort() + ); } async updateConnection( inspectorPortOption: number, + inspectorHostOption: string, runtimeInspectorPort: number, workerNamesToProxy: Set ) { this.workerNamesToProxy = workerNamesToProxy; - if (this.inspectorPortOption !== inspectorPortOption) { + if ( + this.inspectorPortOption !== inspectorPortOption || + this.inspectorHostOption !== inspectorHostOption + ) { this.inspectorPortOption = inspectorPortOption; + this.inspectorHostOption = inspectorHostOption; await this.#restartServer(); } @@ -309,8 +329,8 @@ export class InspectorProxyController { } } -function getWebsocketURL(port: number): URL { - return new URL(`ws://127.0.0.1:${port}`); +function getWebsocketURL(host: string, port: number): URL { + return new URL(`ws://${host}:${port}`); } const ALLOWED_HOST_HOSTNAMES = ["127.0.0.1", "[::1]", "localhost"]; diff --git a/packages/workers-utils/src/config/config.ts b/packages/workers-utils/src/config/config.ts index b1d05a178c53..5289f8715b68 100644 --- a/packages/workers-utils/src/config/config.ts +++ b/packages/workers-utils/src/config/config.ts @@ -217,6 +217,13 @@ export interface DevConfig { */ inspector_port: number | undefined; + /** + * IP address for the local dev server's inspector to listen on + * + * @default 127.0.0.1 + */ + inspector_ip: string | undefined; + /** * Protocol that local wrangler dev server listens to requests on. * @@ -299,6 +306,7 @@ export const defaultWranglerConfig: Config = { ip: process.platform === "win32" ? "127.0.0.1" : "localhost", port: undefined, // the default of 8787 is set at runtime inspector_port: undefined, // the default of 9229 is set at runtime + inspector_ip: undefined, // the default of 127.0.0.1 is set at runtime local_protocol: "http", upstream_protocol: "http", host: undefined, diff --git a/packages/workers-utils/src/config/validation.ts b/packages/workers-utils/src/config/validation.ts index 4ee117104a63..d271b0038788 100644 --- a/packages/workers-utils/src/config/validation.ts +++ b/packages/workers-utils/src/config/validation.ts @@ -598,6 +598,7 @@ function normalizeAndValidateDev( ip = process.platform === "win32" ? "127.0.0.1" : "localhost", port, inspector_port, + inspector_ip, local_protocol = localProtocolArg ?? "http", // In remote mode upstream_protocol must be https, otherwise it defaults to local_protocol. upstream_protocol = upstreamProtocolArg ?? remoteArg @@ -620,6 +621,13 @@ function normalizeAndValidateDev( inspector_port, "number" ); + validateOptionalProperty( + diagnostics, + "dev", + "inspector_ip", + inspector_ip, + "string" + ); validateOptionalProperty( diagnostics, "dev", @@ -665,6 +673,7 @@ function normalizeAndValidateDev( ip, port, inspector_port, + inspector_ip, local_protocol, upstream_protocol, host, diff --git a/packages/workers-utils/tests/config/validation/normalize-and-validate-config.test.ts b/packages/workers-utils/tests/config/validation/normalize-and-validate-config.test.ts index 30378a7cd7d4..6eefa410b401 100644 --- a/packages/workers-utils/tests/config/validation/normalize-and-validate-config.test.ts +++ b/packages/workers-utils/tests/config/validation/normalize-and-validate-config.test.ts @@ -44,6 +44,7 @@ describe("normalizeAndValidateConfig()", () => { host: undefined, enable_containers: true, inspector_port: undefined, + inspector_ip: undefined, container_engine: undefined, generate_types: false, }, diff --git a/packages/wrangler/src/__tests__/config-validation-pages.test.ts b/packages/wrangler/src/__tests__/config-validation-pages.test.ts index b7c4e9292655..04ce561ac3af 100644 --- a/packages/wrangler/src/__tests__/config-validation-pages.test.ts +++ b/packages/wrangler/src/__tests__/config-validation-pages.test.ts @@ -181,6 +181,7 @@ describe("validatePagesConfig()", () => { ip: "127.0.0.0", port: 1234, inspector_port: 5678, + inspector_ip: undefined, local_protocol: "https", upstream_protocol: "https", host: "test-host", diff --git a/packages/wrangler/src/__tests__/dev.test.ts b/packages/wrangler/src/__tests__/dev.test.ts index d89a6209fd31..93fdb867a027 100644 --- a/packages/wrangler/src/__tests__/dev.test.ts +++ b/packages/wrangler/src/__tests__/dev.test.ts @@ -1321,6 +1321,72 @@ describe.sequential("wrangler dev", () => { }); }); + describe("inspector ip", () => { + it("should default inspector ip to 127.0.0.1", async () => { + writeWranglerConfig({ + main: "index.js", + }); + fs.writeFileSync("index.js", `export default {};`); + const config = await runWranglerUntilConfig("dev"); + assert(typeof config.dev.inspector === "object"); + expect(config.dev.inspector?.hostname).toEqual("127.0.0.1"); + }); + + it("should read --inspector-ip", async () => { + writeWranglerConfig({ + main: "index.js", + }); + fs.writeFileSync("index.js", `export default {};`); + const config = await runWranglerUntilConfig("dev --inspector-ip=0.0.0.0"); + assert(typeof config.dev.inspector === "object"); + expect(config.dev.inspector?.hostname).toEqual("0.0.0.0"); + }); + + it("should read dev.inspector_ip from wrangler config", async () => { + writeWranglerConfig({ + main: "index.js", + dev: { + inspector_ip: "0.0.0.0", + }, + }); + fs.writeFileSync("index.js", `export default {};`); + const config = await runWranglerUntilConfig("dev"); + assert(typeof config.dev.inspector === "object"); + expect(config.dev.inspector?.hostname).toEqual("0.0.0.0"); + }); + + it("should use --inspector-ip over dev.inspector_ip from wrangler config", async () => { + writeWranglerConfig({ + main: "index.js", + dev: { + inspector_ip: "0.0.0.0", + }, + }); + fs.writeFileSync("index.js", `export default {};`); + const config = await runWranglerUntilConfig( + "dev --inspector-ip=192.168.1.1" + ); + assert(typeof config.dev.inspector === "object"); + expect(config.dev.inspector?.hostname).toEqual("192.168.1.1"); + }); + + it("should error if a bad dev.inspector_ip config is provided", async () => { + writeWranglerConfig({ + main: "index.js", + dev: { + // @ts-expect-error intentionally bad ip + inspector_ip: 12345, + }, + }); + fs.writeFileSync("index.js", `export default {};`); + await expect(runWrangler("dev")).rejects + .toThrowErrorMatchingInlineSnapshot(` + [Error: Processing wrangler.toml configuration: + - Expected "dev.inspector_ip" to be of type string but got 12345.] + `); + }); + }); + describe("port", () => { it("should default port to 8787 if it is not in use", async () => { writeWranglerConfig({ diff --git a/packages/wrangler/src/api/dev.ts b/packages/wrangler/src/api/dev.ts index b5ac2070661d..9b1e41b859e7 100644 --- a/packages/wrangler/src/api/dev.ts +++ b/packages/wrangler/src/api/dev.ts @@ -186,6 +186,7 @@ export async function unstable_dev( compatibilityFlags: options?.compatibilityFlags, ip: "127.0.0.1", inspectorPort: options?.inspectorPort ?? 0, + inspectorIp: undefined, v: undefined, cwd: undefined, localProtocol: options?.localProtocol, diff --git a/packages/wrangler/src/api/startDevWorker/ConfigController.ts b/packages/wrangler/src/api/startDevWorker/ConfigController.ts index 987fdd13691f..bf579aabf0c7 100644 --- a/packages/wrangler/src/api/startDevWorker/ConfigController.ts +++ b/packages/wrangler/src/api/startDevWorker/ConfigController.ts @@ -60,6 +60,25 @@ import type { WorkerRegistry } from "miniflare"; const getInspectorPort = memoizeGetPort(DEFAULT_INSPECTOR_PORT, "127.0.0.1"); const getLocalPort = memoizeGetPort(DEFAULT_LOCAL_PORT, "localhost"); +async function resolveInspectorConfig( + config: Config, + input: StartDevWorkerInput +): Promise { + if (input.dev?.inspector === false) { + return false; + } + const hostname = + input.dev?.inspector?.hostname ?? config.dev.inspector_ip ?? "127.0.0.1"; + const port = + input.dev?.inspector?.port ?? + config.dev.inspector_port ?? + (await getInspectorPort(hostname)); + return { + hostname, + port, + }; +} + async function resolveDevConfig( config: Config, input: StartDevWorkerInput @@ -133,15 +152,7 @@ async function resolveDevConfig( httpsKeyPath: input.dev?.server?.httpsKeyPath, httpsCertPath: input.dev?.server?.httpsCertPath, }, - inspector: - input.dev?.inspector === false - ? false - : { - port: - input.dev?.inspector?.port ?? - config.dev.inspector_port ?? - (await getInspectorPort()), - }, + inspector: await resolveInspectorConfig(config, input), origin: { secure: input.dev?.origin?.secure ?? config.dev.upstream_protocol === "https", diff --git a/packages/wrangler/src/api/startDevWorker/LocalRuntimeController.ts b/packages/wrangler/src/api/startDevWorker/LocalRuntimeController.ts index 34e7d0412c03..7034f3234666 100644 --- a/packages/wrangler/src/api/startDevWorker/LocalRuntimeController.ts +++ b/packages/wrangler/src/api/startDevWorker/LocalRuntimeController.ts @@ -123,10 +123,12 @@ export async function convertToConfigBundle( ? { inspect: false, inspectorPort: undefined, + inspectorHost: undefined, } : { inspect: true, inspectorPort: 0, + inspectorHost: event.config.dev.inspector?.hostname, }), localPersistencePath: event.config.dev.persist, liveReload: event.config.dev?.liveReload ?? false, diff --git a/packages/wrangler/src/dev.ts b/packages/wrangler/src/dev.ts index 038ae2eb5f06..ca8d701ee1ea 100644 --- a/packages/wrangler/src/dev.ts +++ b/packages/wrangler/src/dev.ts @@ -108,6 +108,10 @@ export const dev = createCommand({ describe: "Port for devtools to connect to", type: "number", }, + "inspector-ip": { + describe: "IP address for devtools to connect to", + type: "string", + }, routes: { describe: "Routes to upload", alias: "route", diff --git a/packages/wrangler/src/dev/miniflare/index.ts b/packages/wrangler/src/dev/miniflare/index.ts index e99a96e3bb29..4eeeee39fde3 100644 --- a/packages/wrangler/src/dev/miniflare/index.ts +++ b/packages/wrangler/src/dev/miniflare/index.ts @@ -72,6 +72,7 @@ export interface ConfigBundle { initialIp: string; rules: Config["rules"]; inspectorPort: number | undefined; + inspectorHost: string | undefined; localPersistencePath: string | null; liveReload: boolean; crons: Config["triggers"]["crons"]; @@ -855,6 +856,7 @@ export async function buildMiniflareOptions( host: config.initialIp, port: config.initialPort, inspectorPort: config.inspect ? config.inspectorPort : undefined, + inspectorHost: config.inspect ? config.inspectorHost : undefined, liveReload: config.liveReload, upstream, unsafeDevRegistryPath: config.devRegistry, diff --git a/packages/wrangler/src/dev/start-dev.ts b/packages/wrangler/src/dev/start-dev.ts index 8db1eacbd94a..6d1954e7c433 100644 --- a/packages/wrangler/src/dev/start-dev.ts +++ b/packages/wrangler/src/dev/start-dev.ts @@ -272,6 +272,7 @@ async function setupDevEnv( httpsKeyPath: args.httpsKeyPath, }, inspector: { + hostname: args.inspectorIp, port: args.inspectorPort, }, origin: { diff --git a/packages/wrangler/src/pages/dev.ts b/packages/wrangler/src/pages/dev.ts index bb2bc2835ed1..2d65decbcb75 100644 --- a/packages/wrangler/src/pages/dev.ts +++ b/packages/wrangler/src/pages/dev.ts @@ -920,6 +920,7 @@ export const pagesDevCommand = createCommand({ ip, port, inspectorPort, + inspectorIp: undefined, localProtocol, httpsKeyPath: args.httpsKeyPath, httpsCertPath: args.httpsCertPath, From 77e82d25e13800d34426ba6774def3fcc2c7de21 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Jan 2026 16:54:58 +0100 Subject: [PATCH 3/8] chore(deps): bump the workerd-and-workers-types group with 2 updates (#12040) * chore(deps): bump the workerd-and-workers-types group with 2 updates Bumps the workerd-and-workers-types group with 2 updates: [workerd](https://github.com/cloudflare/workerd) and [@cloudflare/workers-types](https://github.com/cloudflare/workerd). Updates `workerd` from 1.20260120.0 to 1.20260122.0 - [Release notes](https://github.com/cloudflare/workerd/releases) - [Changelog](https://github.com/cloudflare/workerd/blob/main/RELEASE.md) - [Commits](https://github.com/cloudflare/workerd/compare/v1.20260120.0...v1.20260122.0) Updates `@cloudflare/workers-types` from 4.20260120.0 to 4.20260122.0 - [Release notes](https://github.com/cloudflare/workerd/releases) - [Changelog](https://github.com/cloudflare/workerd/blob/main/RELEASE.md) - [Commits](https://github.com/cloudflare/workerd/commits) --- updated-dependencies: - dependency-name: workerd dependency-version: 1.20260122.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: workerd-and-workers-types - dependency-name: "@cloudflare/workers-types" dependency-version: 4.20260122.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: workerd-and-workers-types ... Signed-off-by: dependabot[bot] * chore: update dependencies of "miniflare", "wrangler" The following dependency versions have been updated: | Dependency | From | To | | ---------- | ------------ | ------------ | | workerd | 1.20260120.0 | 1.20260122.0 | --------- 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-12040.md | 12 + packages/miniflare/package.json | 2 +- packages/wrangler/package.json | 2 +- pnpm-lock.yaml | 312 +++++++++++++++----------- pnpm-workspace.yaml | 4 +- 5 files changed, 201 insertions(+), 131 deletions(-) create mode 100644 .changeset/dependabot-update-12040.md diff --git a/.changeset/dependabot-update-12040.md b/.changeset/dependabot-update-12040.md new file mode 100644 index 000000000000..8a9d3e983491 --- /dev/null +++ b/.changeset/dependabot-update-12040.md @@ -0,0 +1,12 @@ +--- +"miniflare": patch +"wrangler": patch +--- + +chore: update dependencies of "miniflare", "wrangler" + +The following dependency versions have been updated: + +| Dependency | From | To | +| ---------- | ------------ | ------------ | +| workerd | 1.20260120.0 | 1.20260122.0 | diff --git a/packages/miniflare/package.json b/packages/miniflare/package.json index 20f44e957c8b..7b9217889c35 100644 --- a/packages/miniflare/package.json +++ b/packages/miniflare/package.json @@ -46,7 +46,7 @@ "@cspotcode/source-map-support": "0.8.1", "sharp": "^0.34.5", "undici": "catalog:default", - "workerd": "1.20260120.0", + "workerd": "1.20260122.0", "ws": "catalog:default", "youch": "4.1.0-beta.10", "zod": "^3.25.76" diff --git a/packages/wrangler/package.json b/packages/wrangler/package.json index 7217619dc8dc..e2ec7bce9c6d 100644 --- a/packages/wrangler/package.json +++ b/packages/wrangler/package.json @@ -73,7 +73,7 @@ "miniflare": "workspace:*", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", - "workerd": "1.20260120.0" + "workerd": "1.20260122.0" }, "devDependencies": { "@aws-sdk/client-s3": "^3.721.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 06f91e66f60f..5305e2b52b7e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,8 +10,8 @@ catalogs: specifier: ^0.10.11 version: 0.10.15 '@cloudflare/workers-types': - specifier: ^4.20260120.0 - version: 4.20260120.0 + specifier: ^4.20260122.0 + version: 4.20260122.0 '@typescript-eslint/eslint-plugin': specifier: ^8.35.1 version: 8.46.3 @@ -160,7 +160,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -205,7 +205,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 ts-dedent: specifier: ^2.2.0 version: 2.2.0 @@ -223,7 +223,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -244,7 +244,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -268,7 +268,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -304,7 +304,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 undici: specifier: catalog:default version: 7.18.2 @@ -319,7 +319,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/mimetext': specifier: ^2.0.4 version: 2.0.4 @@ -358,7 +358,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/jest-image-snapshot': specifier: ^6.4.0 version: 6.4.0 @@ -385,7 +385,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 miniflare: specifier: workspace:* version: link:../../packages/miniflare @@ -455,7 +455,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/node': specifier: ^20.19.9 version: 20.19.9 @@ -479,7 +479,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/is-even': specifier: ^1.0.2 version: 1.0.2 @@ -516,7 +516,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -544,7 +544,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/node': specifier: ^20.19.9 version: 20.19.9 @@ -574,7 +574,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 undici: specifier: catalog:default version: 7.18.2 @@ -592,7 +592,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/debug': specifier: 4.1.12 version: 4.1.12 @@ -625,7 +625,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -646,7 +646,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -671,7 +671,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@fixture/pages-plugin': specifier: workspace:* version: link:../pages-plugin-example @@ -695,7 +695,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -734,7 +734,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -755,7 +755,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -776,7 +776,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -794,7 +794,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 is-odd: specifier: ^3.0.1 version: 3.0.1 @@ -813,7 +813,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@fixture/pages-plugin': specifier: workspace:* version: link:../pages-plugin-example @@ -873,7 +873,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -894,7 +894,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -1071,19 +1071,19 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 fixtures/rules-app: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 fixtures/secrets-store: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 wrangler: specifier: workspace:* version: link:../../packages/wrangler @@ -1107,7 +1107,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/is-even': specifier: ^1.0.2 version: 1.0.2 @@ -1131,7 +1131,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 vitest: specifier: catalog:default version: 3.2.3(@types/debug@4.1.12)(@types/node@20.19.9)(@vitest/ui@3.2.3)(jiti@2.6.0)(lightningcss@1.30.2)(msw@2.12.0(@types/node@20.19.9)(typescript@5.9.3))(yaml@2.8.1) @@ -1146,7 +1146,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 esbuild: specifier: catalog:default version: 0.27.0 @@ -1176,7 +1176,7 @@ importers: version: link:../../packages/vitest-pool-workers '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@microlabs/otel-cf-workers': specifier: 1.0.0-rc.45 version: 1.0.0-rc.45(@opentelemetry/api@1.7.0) @@ -1238,7 +1238,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 undici: specifier: catalog:default version: 7.18.2 @@ -1293,7 +1293,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 wrangler: specifier: workspace:* version: link:../../packages/wrangler @@ -1332,7 +1332,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 run-script-os: specifier: ^1.1.6 version: 1.1.6 @@ -1356,7 +1356,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -1377,7 +1377,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -1398,7 +1398,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -1419,7 +1419,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -1440,7 +1440,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/jest-image-snapshot': specifier: ^6.4.0 version: 6.4.0 @@ -1473,7 +1473,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 playwright-chromium: specifier: catalog:default version: 1.56.1 @@ -1497,7 +1497,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -1515,7 +1515,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -1617,7 +1617,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -1755,7 +1755,7 @@ importers: version: link:../eslint-config-shared '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@octokit/types': specifier: ^13.8.0 version: 13.8.0 @@ -1779,7 +1779,7 @@ importers: version: link:../eslint-config-shared '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/cookie': specifier: ^0.6.0 version: 0.6.0 @@ -1845,7 +1845,7 @@ importers: version: link:../eslint-config-shared '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 eslint: specifier: catalog:default version: 9.39.1(jiti@2.6.0) @@ -1875,10 +1875,10 @@ importers: version: link:../eslint-config-shared '@cloudflare/vitest-pool-workers': specifier: catalog:default - version: 0.10.15(@cloudflare/workers-types@4.20260120.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@2.1.9) + version: 0.10.15(@cloudflare/workers-types@4.20260122.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@2.1.9) '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/mime': specifier: ^3.0.4 version: 3.0.4 @@ -1910,8 +1910,8 @@ importers: specifier: catalog:default version: 7.18.2 workerd: - specifier: 1.20260120.0 - version: 1.20260120.0 + specifier: 1.20260122.0 + version: 1.20260122.0 ws: specifier: catalog:default version: 8.18.0 @@ -1939,7 +1939,7 @@ importers: version: link:../workers-shared '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@cloudflare/workflows-shared': specifier: workspace:* version: link:../workflows-shared @@ -2108,7 +2108,7 @@ importers: version: link:../eslint-config-shared '@cloudflare/vitest-pool-workers': specifier: catalog:default - version: 0.10.15(@cloudflare/workers-types@4.20260120.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@3.2.3) + version: 0.10.15(@cloudflare/workers-types@4.20260122.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@3.2.3) '@cloudflare/workers-shared': specifier: workspace:* version: link:../workers-shared @@ -2117,7 +2117,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 concurrently: specifier: ^8.2.2 version: 8.2.2 @@ -2157,7 +2157,7 @@ importers: version: link:../eslint-config-shared '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/cookie': specifier: ^0.6.0 version: 0.6.0 @@ -2197,7 +2197,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/node': specifier: ^20.19.9 version: 20.19.9 @@ -2227,7 +2227,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 esbuild: specifier: catalog:default version: 0.27.0 @@ -2316,7 +2316,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -2403,7 +2403,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2424,7 +2424,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2445,7 +2445,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2466,7 +2466,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2487,7 +2487,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2508,7 +2508,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2529,7 +2529,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2550,7 +2550,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2571,7 +2571,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2592,7 +2592,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2613,7 +2613,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2634,7 +2634,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2655,7 +2655,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2676,7 +2676,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2697,7 +2697,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2718,7 +2718,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2739,7 +2739,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/mimetext': specifier: ^2.0.4 version: 2.0.4 @@ -2772,7 +2772,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2793,7 +2793,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2814,7 +2814,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2835,7 +2835,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2856,7 +2856,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2877,7 +2877,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -2898,7 +2898,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@playground/main-resolution-package': specifier: file:./package version: file:packages/vite-plugin-cloudflare/playground/main-resolution/package @@ -2922,7 +2922,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/express': specifier: ^5.0.1 version: 5.0.1 @@ -2949,7 +2949,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@playground/module-resolution-excludes': specifier: file:./packages/excludes version: file:packages/vite-plugin-cloudflare/playground/module-resolution/packages/excludes @@ -2961,7 +2961,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.20260120.0)(typescript@5.8.3) + version: 2.12.0(@cloudflare/workers-types@4.20260122.0)(typescript@5.8.3) '@types/react': specifier: ^18.3.11 version: 18.3.18 @@ -2994,7 +2994,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -3015,7 +3015,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/debug': specifier: ^4.1.12 version: 4.1.12 @@ -3064,7 +3064,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/react': specifier: 19.1.0 version: 19.1.0 @@ -3085,7 +3085,7 @@ importers: dependencies: partyserver: specifier: ^0.0.64 - version: 0.0.64(@cloudflare/workers-types@4.20260120.0) + version: 0.0.64(@cloudflare/workers-types@4.20260122.0) partysocket: specifier: ^1.0.3 version: 1.0.3 @@ -3104,7 +3104,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@tailwindcss/vite': specifier: ^4.0.15 version: 4.0.15(vite@7.1.12(@types/node@20.19.9)(jiti@2.6.0)(lightningcss@1.30.2)(yaml@2.8.1)) @@ -3140,7 +3140,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@prisma/adapter-d1': specifier: ^7.0.0 version: 7.0.1 @@ -3177,7 +3177,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/react': specifier: 19.1.0 version: 19.1.0 @@ -3207,7 +3207,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -3228,7 +3228,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -3256,7 +3256,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/react': specifier: 19.1.0 version: 19.1.0 @@ -3289,7 +3289,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -3310,7 +3310,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -3331,7 +3331,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@vitejs/plugin-basic-ssl': specifier: ^2.0.0 version: 2.0.0(vite@7.1.12(@types/node@20.19.9)(jiti@2.6.0)(lightningcss@1.30.2)(yaml@2.8.1)) @@ -3355,7 +3355,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -3376,7 +3376,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -3397,7 +3397,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -3418,7 +3418,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 @@ -3458,7 +3458,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@cloudflare/workflows-shared': specifier: workspace:* version: link:../workflows-shared @@ -3676,13 +3676,13 @@ importers: version: link:../eslint-config-shared '@cloudflare/vitest-pool-workers': specifier: catalog:default - version: 0.10.15(@cloudflare/workers-types@4.20260120.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@2.1.9) + version: 0.10.15(@cloudflare/workers-types@4.20260122.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@2.1.9) '@cloudflare/workers-tsconfig': specifier: workspace:* version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@sentry/cli': specifier: ^2.37.0 version: 2.41.1(encoding@0.1.13) @@ -3799,13 +3799,13 @@ importers: version: link:../eslint-config-shared '@cloudflare/vitest-pool-workers': specifier: catalog:default - version: 0.10.15(@cloudflare/workers-types@4.20260120.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@3.2.3) + version: 0.10.15(@cloudflare/workers-types@4.20260122.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@3.2.3) '@cloudflare/workers-tsconfig': specifier: workspace:* version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@types/mime': specifier: ^3.0.4 version: 3.0.4 @@ -3849,8 +3849,8 @@ importers: specifier: 2.0.0-rc.24 version: 2.0.0-rc.24 workerd: - specifier: 1.20260120.0 - version: 1.20260120.0 + specifier: 1.20260122.0 + version: 1.20260122.0 optionalDependencies: fsevents: specifier: ~2.3.2 @@ -3885,7 +3885,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -4899,6 +4899,12 @@ packages: cpu: [x64] os: [darwin] + '@cloudflare/workerd-darwin-64@1.20260122.0': + resolution: {integrity: sha512-sZgqoCzoIOyiFny33Xs4JeElr3sjf515hIuSolCvFmLZzrZrickLjgOe/kuwx+LTtdQ8UsA9aV06aFw7+hQ7cw==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + '@cloudflare/workerd-darwin-arm64@1.20251210.0': resolution: {integrity: sha512-Mg8iYIZQFnbevq/ls9eW/eneWTk/EE13Pej1MwfkY5et0jVpdHnvOLywy/o+QtMJFef1AjsqXGULwAneYyBfHw==} engines: {node: '>=16'} @@ -4911,6 +4917,12 @@ packages: cpu: [arm64] os: [darwin] + '@cloudflare/workerd-darwin-arm64@1.20260122.0': + resolution: {integrity: sha512-ijYOwqFo/iR+zZoqbbeHeruwgymdnmdTOPrqjv1OZEma58uxZs0G00MucJFuJAQGP3QlqTCF/U7ffUAn/9EOYA==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + '@cloudflare/workerd-linux-64@1.20251210.0': resolution: {integrity: sha512-kjC2fCZhZ2Gkm1biwk2qByAYpGguK5Gf5ic8owzSCUw0FOUfQxTZUT9Lp3gApxsfTLbbnLBrX/xzWjywH9QR4g==} engines: {node: '>=16'} @@ -4923,6 +4935,12 @@ packages: cpu: [x64] os: [linux] + '@cloudflare/workerd-linux-64@1.20260122.0': + resolution: {integrity: sha512-yJp9y/f0umbnCTN8zn4qw6H061qeWHc04dNoA3bG+BYc64fz6KPOwuu/xUYUvjZf/juJq/ZwajMqAdgetfP93w==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + '@cloudflare/workerd-linux-arm64@1.20251210.0': resolution: {integrity: sha512-2IB37nXi7PZVQLa1OCuO7/6pNxqisRSO8DmCQ5x/3sezI5op1vwOxAcb1osAnuVsVN9bbvpw70HJvhKruFJTuA==} engines: {node: '>=16'} @@ -4935,6 +4953,12 @@ packages: cpu: [arm64] os: [linux] + '@cloudflare/workerd-linux-arm64@1.20260122.0': + resolution: {integrity: sha512-xaf5P8l5r1OyxiFfYUJqTwDnNigD/z/6I/KPF3E9HXq+vyDVXUwgKrSEtfq4hu0LteqhoAP7HtCv1YupcwLN1A==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + '@cloudflare/workerd-windows-64@1.20251210.0': resolution: {integrity: sha512-Uaz6/9XE+D6E7pCY4OvkCuJHu7HcSDzeGcCGY1HLhojXhHd7yL52c3yfiyJdS8hPatiAa0nn5qSI/42+aTdDSw==} engines: {node: '>=16'} @@ -4947,8 +4971,14 @@ packages: cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20260120.0': - resolution: {integrity: sha512-B8pueG+a5S+mdK3z8oKu1ShcxloZ7qWb68IEyLLaepvdryIbNC7JVPcY0bWsjS56UQVKc5fnyRge3yZIwc9bxw==} + '@cloudflare/workerd-windows-64@1.20260122.0': + resolution: {integrity: sha512-67qm3e5Wg4iYkClhqR0JGGDbV8DULnJzbJFC/2GnEIT8wrTI5FHdWdzEbPkdl4Tje+XHaFQKisGvtab1UX9nqw==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@cloudflare/workers-types@4.20260122.0': + resolution: {integrity: sha512-ktjHXwjsjxFqsnCb9YQj9l12i6yfK5klBggKddogQ4KT3GCaU3Kq6IAkd4bGZSZrgwwbCkhAuhTzz4a3llA97g==} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -13963,6 +13993,11 @@ packages: engines: {node: '>=16'} hasBin: true + workerd@1.20260122.0: + resolution: {integrity: sha512-bXYaydU2/r8g/T3reXnBZDSNyFSQ7fO8uiU2Tu6xNZcgncqVozGAqMPgP5LkiG92uT94ToeklptoHNvJ/DXBvA==} + engines: {node: '>=16'} + hasBin: true + wrangler@4.54.0: resolution: {integrity: sha512-bANFsjDwJLbprYoBK+hUDZsVbUv2SqJd8QvArLIcZk+fPq4h/Ohtj5vkKXD3k0s2bD1DXLk08D+hYmeNH+xC6A==} engines: {node: '>=20.0.0'} @@ -15390,7 +15425,7 @@ snapshots: lodash.memoize: 4.1.2 marked: 0.3.19 - '@cloudflare/vitest-pool-workers@0.10.15(@cloudflare/workers-types@4.20260120.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@2.1.9)': + '@cloudflare/vitest-pool-workers@0.10.15(@cloudflare/workers-types@4.20260122.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@2.1.9)': dependencies: '@vitest/runner': 3.2.3 '@vitest/snapshot': 3.2.3 @@ -15400,14 +15435,14 @@ snapshots: miniflare: 4.20251210.0 semver: 7.7.3 vitest: 2.1.9(@types/node@20.19.9)(@vitest/ui@2.1.9)(lightningcss@1.30.2)(msw@2.12.0(@types/node@20.19.9)(typescript@5.9.3)) - wrangler: 4.54.0(@cloudflare/workers-types@4.20260120.0) + wrangler: 4.54.0(@cloudflare/workers-types@4.20260122.0) zod: 3.25.76 transitivePeerDependencies: - '@cloudflare/workers-types' - bufferutil - utf-8-validate - '@cloudflare/vitest-pool-workers@0.10.15(@cloudflare/workers-types@4.20260120.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@3.2.3)': + '@cloudflare/vitest-pool-workers@0.10.15(@cloudflare/workers-types@4.20260122.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@3.2.3)': dependencies: '@vitest/runner': 3.2.3 '@vitest/snapshot': 3.2.3 @@ -15417,7 +15452,7 @@ snapshots: miniflare: 4.20251210.0 semver: 7.7.3 vitest: 3.2.3(@types/debug@4.1.12)(@types/node@20.19.9)(@vitest/ui@3.2.3)(jiti@2.6.0)(lightningcss@1.30.2)(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(supports-color@9.2.2)(yaml@2.8.1) - wrangler: 4.54.0(@cloudflare/workers-types@4.20260120.0) + wrangler: 4.54.0(@cloudflare/workers-types@4.20260122.0) zod: 3.25.76 transitivePeerDependencies: - '@cloudflare/workers-types' @@ -15430,31 +15465,46 @@ snapshots: '@cloudflare/workerd-darwin-64@1.20260120.0': optional: true + '@cloudflare/workerd-darwin-64@1.20260122.0': + optional: true + '@cloudflare/workerd-darwin-arm64@1.20251210.0': optional: true '@cloudflare/workerd-darwin-arm64@1.20260120.0': optional: true + '@cloudflare/workerd-darwin-arm64@1.20260122.0': + optional: true + '@cloudflare/workerd-linux-64@1.20251210.0': optional: true '@cloudflare/workerd-linux-64@1.20260120.0': optional: true + '@cloudflare/workerd-linux-64@1.20260122.0': + optional: true + '@cloudflare/workerd-linux-arm64@1.20251210.0': optional: true '@cloudflare/workerd-linux-arm64@1.20260120.0': optional: true + '@cloudflare/workerd-linux-arm64@1.20260122.0': + optional: true + '@cloudflare/workerd-windows-64@1.20251210.0': optional: true '@cloudflare/workerd-windows-64@1.20260120.0': optional: true - '@cloudflare/workers-types@4.20260120.0': {} + '@cloudflare/workerd-windows-64@1.20260122.0': + optional: true + + '@cloudflare/workers-types@4.20260122.0': {} '@colors/colors@1.5.0': optional: true @@ -16704,7 +16754,7 @@ snapshots: '@prisma/adapter-d1@7.0.1': dependencies: - '@cloudflare/workers-types': 4.20260120.0 + '@cloudflare/workers-types': 4.20260122.0 '@prisma/driver-adapter-utils': 7.0.1 ky: 1.7.5 @@ -16931,10 +16981,10 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@remix-run/cloudflare@2.12.0(@cloudflare/workers-types@4.20260120.0)(typescript@5.8.3)': + '@remix-run/cloudflare@2.12.0(@cloudflare/workers-types@4.20260122.0)(typescript@5.8.3)': dependencies: '@cloudflare/kv-asset-handler': 0.1.3 - '@cloudflare/workers-types': 4.20260120.0 + '@cloudflare/workers-types': 4.20260122.0 '@remix-run/server-runtime': 2.12.0(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 @@ -22454,9 +22504,9 @@ snapshots: parseurl@1.3.3: {} - partyserver@0.0.64(@cloudflare/workers-types@4.20260120.0): + partyserver@0.0.64(@cloudflare/workers-types@4.20260122.0): dependencies: - '@cloudflare/workers-types': 4.20260120.0 + '@cloudflare/workers-types': 4.20260122.0 nanoid: 5.1.0 partysocket@1.0.3: @@ -25313,7 +25363,15 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20260120.0 '@cloudflare/workerd-windows-64': 1.20260120.0 - wrangler@4.54.0(@cloudflare/workers-types@4.20260120.0): + workerd@1.20260122.0: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20260122.0 + '@cloudflare/workerd-darwin-arm64': 1.20260122.0 + '@cloudflare/workerd-linux-64': 1.20260122.0 + '@cloudflare/workerd-linux-arm64': 1.20260122.0 + '@cloudflare/workerd-windows-64': 1.20260122.0 + + wrangler@4.54.0(@cloudflare/workers-types@4.20260122.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.1 '@cloudflare/unenv-preset': 2.7.13(unenv@2.0.0-rc.24)(workerd@1.20251210.0) @@ -25324,7 +25382,7 @@ snapshots: unenv: 2.0.0-rc.24 workerd: 1.20251210.0 optionalDependencies: - '@cloudflare/workers-types': 4.20260120.0 + '@cloudflare/workers-types': 4.20260122.0 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index b7c2559d49a2..6874c232b9a2 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -34,8 +34,8 @@ catalog: "ws": "8.18.0" esbuild: "0.27.0" playwright-chromium: "^1.56.1" - "@cloudflare/workers-types": "^4.20260120.0" - workerd: "1.20260120.0" + "@cloudflare/workers-types": "^4.20260122.0" + workerd: "1.20260122.0" eslint: "^9.39.1" smol-toml: "^1.5.2" # CAUTION: Most usage of @cloudflare/vitest-pool-workers in this mono repo should use workspace:* instead of this catalog version From 5e3be54da116ef1b28998b25366b2fc38ed77ddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Somhairle=20MacLe=C3=B2id?= Date: Thu, 22 Jan 2026 17:23:42 +0000 Subject: [PATCH 4/8] disable vite 8 for now (#12051) --- .github/workflows/vite-plugin-playgrounds.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/vite-plugin-playgrounds.yml b/.github/workflows/vite-plugin-playgrounds.yml index 79fdb5604b98..9a0ce9951964 100644 --- a/.github/workflows/vite-plugin-playgrounds.yml +++ b/.github/workflows/vite-plugin-playgrounds.yml @@ -26,8 +26,8 @@ jobs: include: - os: ubuntu-latest vite: "vite-6" - - os: ubuntu-latest - vite: vite-8-beta + # - os: ubuntu-latest + # vite: vite-8-beta runs-on: ${{ matrix.os }} steps: - name: Checkout Repo From 05714f871022e998dfbd7005f795d2fa3b9aee56 Mon Sep 17 00:00:00 2001 From: emily-shen <69125074+emily-shen@users.noreply.github.com> Date: Thu, 22 Jan 2026 17:34:40 +0000 Subject: [PATCH 5/8] Add initial plumbing for a local explorer worker (#12034) * create fixture with many bindings * Add resource api worker to miniflare * gate behind experimental flag * add tests * changeset * fixups * rename to local explorer and more fixups --- .changeset/polite-years-exist.md | 8 +++ fixtures/worker-with-resources/package.json | 21 ++++++ fixtures/worker-with-resources/src/index.ts | 50 +++++++++++++++ .../worker-with-resources/tests/index.test.ts | 64 +++++++++++++++++++ fixtures/worker-with-resources/tsconfig.json | 17 +++++ .../worker-with-resources/vitest.config.mts | 12 ++++ .../worker-configuration.d.ts | 13 ++++ fixtures/worker-with-resources/wrangler.jsonc | 24 +++++++ packages/miniflare/src/index.ts | 5 +- .../miniflare/src/plugins/core/constants.ts | 2 + packages/miniflare/src/plugins/core/index.ts | 34 +++++++++- .../miniflare/src/workers/core/constants.ts | 1 + .../src/workers/core/entry.worker.ts | 14 +++- .../src/workers/local-explorer/api.worker.ts | 10 +++ .../src/miniflare-options.ts | 3 + .../src/environment-variables/factory.ts | 5 ++ .../environment-variables/misc-variables.ts | 9 +++ packages/wrangler/src/dev/miniflare/index.ts | 2 + pnpm-lock.yaml | 18 ++++++ 19 files changed, 309 insertions(+), 3 deletions(-) create mode 100644 .changeset/polite-years-exist.md create mode 100644 fixtures/worker-with-resources/package.json create mode 100644 fixtures/worker-with-resources/src/index.ts create mode 100644 fixtures/worker-with-resources/tests/index.test.ts create mode 100644 fixtures/worker-with-resources/tsconfig.json create mode 100644 fixtures/worker-with-resources/vitest.config.mts create mode 100644 fixtures/worker-with-resources/worker-configuration.d.ts create mode 100644 fixtures/worker-with-resources/wrangler.jsonc create mode 100644 packages/miniflare/src/workers/local-explorer/api.worker.ts diff --git a/.changeset/polite-years-exist.md b/.changeset/polite-years-exist.md new file mode 100644 index 000000000000..9914822d2a20 --- /dev/null +++ b/.changeset/polite-years-exist.md @@ -0,0 +1,8 @@ +--- +"@cloudflare/vite-plugin": minor +"@cloudflare/workers-utils": minor +"miniflare": minor +"wrangler": minor +--- + +Add a no-op local explorer worker, which is gated by the experimental flag `X_LOCAL_EXPLORER`. diff --git a/fixtures/worker-with-resources/package.json b/fixtures/worker-with-resources/package.json new file mode 100644 index 000000000000..0fb5e7fe2b1d --- /dev/null +++ b/fixtures/worker-with-resources/package.json @@ -0,0 +1,21 @@ +{ + "name": "@fixture/worker-with-resources", + "private": true, + "scripts": { + "cf-typegen": "wrangler types --no-include-runtime", + "deploy": "wrangler deploy", + "start": "wrangler dev", + "test:ci": "vitest run", + "test:watch": "vitest" + }, + "devDependencies": { + "@cloudflare/workers-tsconfig": "workspace:^", + "@cloudflare/workers-types": "catalog:default", + "typescript": "catalog:default", + "vitest": "catalog:default", + "wrangler": "workspace:*" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/fixtures/worker-with-resources/src/index.ts b/fixtures/worker-with-resources/src/index.ts new file mode 100644 index 000000000000..7ae5d047fcdc --- /dev/null +++ b/fixtures/worker-with-resources/src/index.ts @@ -0,0 +1,50 @@ +import { DurableObject } from "cloudflare:workers"; + +export default { + async fetch(request: Request, env: Env): Promise { + const url = new URL(request.url); + switch (url.pathname) { + // KV routes + case "/kv/get": { + const keyToGet = url.searchParams.get("key") ?? "default"; + const value = await env.KV.get(keyToGet); + return new Response(value || "null"); + } + case "/kv/put": { + const keyToSet = url.searchParams.get("key") ?? "default"; + const val = url.searchParams.get("value"); + await env.KV.put(keyToSet, val); + return new Response("OK"); + } + + // D1 database route + case "/d1": { + await env.DB.exec(` + DROP TABLE IF EXISTS users; + CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT); + INSERT INTO users (id, name) VALUES (1, 'Alice'), (2, 'Bob'); + `); + return new Response("OK"); + } + // Durable Object SQLite routes + case "/do": { + const id = url.searchParams.get("id") || "default"; + const doId = env.DO.idFromName(id); + const stub = env.DO.get(doId); + return stub.fetch(request); + } + } + return new Response("Hello World!"); + }, +}; + +export class MyDurableObject extends DurableObject { + async fetch(_request: Request): Promise { + this.ctx.storage.sql.exec(` + DROP TABLE IF EXISTS users; + CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT); + INSERT INTO users (id, name) VALUES (1, 'Alice'), (2, 'Bob'); + `); + return new Response("OK"); + } +} diff --git a/fixtures/worker-with-resources/tests/index.test.ts b/fixtures/worker-with-resources/tests/index.test.ts new file mode 100644 index 000000000000..859711884e4b --- /dev/null +++ b/fixtures/worker-with-resources/tests/index.test.ts @@ -0,0 +1,64 @@ +import { resolve } from "path"; +import { afterAll, beforeAll, describe, expect, it } from "vitest"; +import { runWranglerDev } from "../../shared/src/run-wrangler-long-lived"; + +describe("local explorer", () => { + describe("with X_LOCAL_EXPLORER=true", () => { + let ip: string; + let port: number; + let stop: (() => Promise) | undefined; + + beforeAll(async () => { + ({ ip, port, stop } = await runWranglerDev( + resolve(__dirname, ".."), + ["--port=0", "--inspector-port=0"], + { X_LOCAL_EXPLORER: "true" } + )); + }); + + afterAll(async () => { + await stop?.(); + }); + + it("returns local explorer API response for /cdn-cgi/explorer/api", async () => { + const response = await fetch(`http://${ip}:${port}/cdn-cgi/explorer/api`); + const text = await response.text(); + expect(text).toBe("Hello from local explorer API"); + }); + + it("returns worker response for normal requests", async () => { + const response = await fetch(`http://${ip}:${port}/`); + const text = await response.text(); + expect(text).toBe("Hello World!"); + }); + }); + + describe("without X_LOCAL_EXPLORER (default)", () => { + let ip: string; + let port: number; + let stop: (() => Promise) | undefined; + + beforeAll(async () => { + ({ ip, port, stop } = await runWranglerDev(resolve(__dirname, ".."), [ + "--port=0", + "--inspector-port=0", + ])); + }); + + afterAll(async () => { + await stop?.(); + }); + + it("returns worker response for /cdn-cgi/explorer/api", async () => { + const response = await fetch(`http://${ip}:${port}/cdn-cgi/explorer/api`); + const text = await response.text(); + expect(text).toBe("Hello World!"); + }); + + it("returns worker response for normal requests", async () => { + const response = await fetch(`http://${ip}:${port}/`); + const text = await response.text(); + expect(text).toBe("Hello World!"); + }); + }); +}); diff --git a/fixtures/worker-with-resources/tsconfig.json b/fixtures/worker-with-resources/tsconfig.json new file mode 100644 index 000000000000..dc1834e6db1f --- /dev/null +++ b/fixtures/worker-with-resources/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "types": [ + "./worker-configuration.d.ts", + "@cloudflare/workers-types", + "node" + ], + "target": "ES2020", + "esModuleInterop": true, + "module": "preserve", + "lib": ["ES2020"], + "skipLibCheck": true, + "moduleResolution": "node", + "noEmit": true + }, + "include": ["tests"] +} diff --git a/fixtures/worker-with-resources/vitest.config.mts b/fixtures/worker-with-resources/vitest.config.mts new file mode 100644 index 000000000000..71c6924f8bf3 --- /dev/null +++ b/fixtures/worker-with-resources/vitest.config.mts @@ -0,0 +1,12 @@ +import { defineProject, mergeConfig } from "vitest/config"; +import configShared from "../../vitest.shared"; + +export default mergeConfig( + configShared, + defineProject({ + test: { + maxConcurrency: 1, + fileParallelism: false, + }, + }) +); diff --git a/fixtures/worker-with-resources/worker-configuration.d.ts b/fixtures/worker-with-resources/worker-configuration.d.ts new file mode 100644 index 000000000000..4354bdc91269 --- /dev/null +++ b/fixtures/worker-with-resources/worker-configuration.d.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// Generated by Wrangler by running `wrangler types --no-include-runtime` (hash: b2cbbf416df3649267950e8534e79347) +declare namespace Cloudflare { + interface GlobalProps { + mainModule: typeof import("./src/index"); + } + interface Env { + KV: KVNamespace; + DO: DurableObjectNamespace; + DB: D1Database; + } +} +interface Env extends Cloudflare.Env {} diff --git a/fixtures/worker-with-resources/wrangler.jsonc b/fixtures/worker-with-resources/wrangler.jsonc new file mode 100644 index 000000000000..0daf63a0958e --- /dev/null +++ b/fixtures/worker-with-resources/wrangler.jsonc @@ -0,0 +1,24 @@ +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "worker-w-resources", + "main": "src/index.ts", + "compatibility_date": "2023-05-04", + "kv_namespaces": [ + { + "binding": "KV", + }, + ], + "d1_databases": [ + { + "binding": "DB", + }, + ], + "durable_objects": { + "bindings": [ + { + "name": "DO", + "class_name": "MyDurableObject", + }, + ], + }, +} diff --git a/packages/miniflare/src/index.ts b/packages/miniflare/src/index.ts index e84db1b05b69..176598c42191 100644 --- a/packages/miniflare/src/index.ts +++ b/packages/miniflare/src/index.ts @@ -1587,7 +1587,10 @@ export class Miniflare { }); } - // Bindings for `ProxyServer` Durable Object + /** + * Bindings for `ProxyServer` Durable Object for the magic proxy and local explorer. + * Contains all workerd-native bindings. + */ const proxyBindings: Worker_Binding[] = []; const allWorkerBindings = new Map(); diff --git a/packages/miniflare/src/plugins/core/constants.ts b/packages/miniflare/src/plugins/core/constants.ts index 0d95dd8e9610..e9fb5e7bc26a 100644 --- a/packages/miniflare/src/plugins/core/constants.ts +++ b/packages/miniflare/src/plugins/core/constants.ts @@ -2,6 +2,8 @@ export const CORE_PLUGIN_NAME = "core"; // Service for HTTP socket entrypoint (for checking runtime ready, routing, etc) export const SERVICE_ENTRY = `${CORE_PLUGIN_NAME}:entry`; +// Service for local explorer API +export const SERVICE_LOCAL_EXPLORER = `${CORE_PLUGIN_NAME}:local-explorer`; // Service prefix for all regular user workers const SERVICE_USER_PREFIX = `${CORE_PLUGIN_NAME}:user`; // Service prefix for `workerd`'s builtin services (network, external, disk) diff --git a/packages/miniflare/src/plugins/core/index.ts b/packages/miniflare/src/plugins/core/index.ts index fc214958621f..6463381fa164 100644 --- a/packages/miniflare/src/plugins/core/index.ts +++ b/packages/miniflare/src/plugins/core/index.ts @@ -9,6 +9,7 @@ import { bold } from "kleur/colors"; import { MockAgent } from "undici"; import SCRIPT_ENTRY from "worker:core/entry"; import STRIP_CF_CONNECTING_IP from "worker:core/strip-cf-connecting-ip"; +import SCRIPT_LOCAL_EXPLORER_API from "worker:local-explorer/api"; import { z } from "zod"; import { fetch } from "../../http"; import { @@ -55,6 +56,7 @@ import { getCustomNodeServiceName, getUserServiceName, SERVICE_ENTRY, + SERVICE_LOCAL_EXPLORER, } from "./constants"; import { buildStringScriptPath, @@ -276,6 +278,8 @@ export const CoreSharedOptionsSchema = z unsafeStickyBlobs: z.boolean().optional(), // Enable directly triggering user Worker handlers with paths like `/cdn-cgi/handler/scheduled` unsafeTriggerHandlers: z.boolean().optional(), + // Enable the local explorer at /cdn-cgi/explorer + unsafeLocalExplorer: z.boolean().optional(), // Enable logging requests logRequests: z.boolean().default(true), @@ -946,6 +950,7 @@ export interface GlobalServicesOptions { fallbackWorkerName: string | undefined; loopbackPort: number; log: Log; + /** All user workerd-native bindings, used for Miniflare's magic proxy and the local explorer worker */ proxyBindings: Worker_Binding[]; } export function getGlobalServices({ @@ -997,6 +1002,14 @@ export function getGlobalServices({ // Add `proxyBindings` here, they'll be added to the `ProxyServer` `env` ...proxyBindings, ]; + if (sharedOptions.unsafeLocalExplorer) { + serviceEntryBindings.push({ + name: CoreBindings.SERVICE_LOCAL_EXPLORER, + service: { + name: SERVICE_LOCAL_EXPLORER, + }, + }); + } if (sharedOptions.upstream !== undefined) { serviceEntryBindings.push({ name: CoreBindings.TEXT_UPSTREAM_URL, @@ -1016,7 +1029,7 @@ export function getGlobalServices({ data: encoder.encode(liveReloadScript), }); } - return [ + const services: Service[] = [ { name: SERVICE_LOOPBACK, external: { http: { cfBlobHeader: CoreHeaders.CF_BLOB } }, @@ -1062,6 +1075,25 @@ export function getGlobalServices({ }, }, ]; + + if (sharedOptions.unsafeLocalExplorer) { + services.push({ + name: SERVICE_LOCAL_EXPLORER, + worker: { + compatibilityDate: "2026-01-01", + compatibilityFlags: ["nodejs_compat"], + modules: [ + { + name: "api.worker.js", + esModule: SCRIPT_LOCAL_EXPLORER_API(), + }, + ], + bindings: [...proxyBindings], + }, + }); + } + + return services; } function getWorkerScript( diff --git a/packages/miniflare/src/workers/core/constants.ts b/packages/miniflare/src/workers/core/constants.ts index e73f1c445205..9a70eaae5c72 100644 --- a/packages/miniflare/src/workers/core/constants.ts +++ b/packages/miniflare/src/workers/core/constants.ts @@ -31,6 +31,7 @@ export const CoreBindings = { SERVICE_LOOPBACK: "MINIFLARE_LOOPBACK", SERVICE_USER_ROUTE_PREFIX: "MINIFLARE_USER_ROUTE_", SERVICE_USER_FALLBACK: "MINIFLARE_USER_FALLBACK", + SERVICE_LOCAL_EXPLORER: "MINIFLARE_LOCAL_EXPLORER", TEXT_CUSTOM_SERVICE: "MINIFLARE_CUSTOM_SERVICE", IMAGES_SERVICE: "MINIFLARE_IMAGES_SERVICE", TEXT_UPSTREAM_URL: "MINIFLARE_UPSTREAM_URL", diff --git a/packages/miniflare/src/workers/core/entry.worker.ts b/packages/miniflare/src/workers/core/entry.worker.ts index d606cbf61cd2..da5bb2f9b3c1 100644 --- a/packages/miniflare/src/workers/core/entry.worker.ts +++ b/packages/miniflare/src/workers/core/entry.worker.ts @@ -19,6 +19,7 @@ import { handleScheduled } from "./scheduled"; type Env = { [CoreBindings.SERVICE_LOOPBACK]: Fetcher; [CoreBindings.SERVICE_USER_FALLBACK]: Fetcher; + [CoreBindings.SERVICE_LOCAL_EXPLORER]: Fetcher; [CoreBindings.TEXT_CUSTOM_SERVICE]: string; [CoreBindings.TEXT_UPSTREAM_URL]?: string; [CoreBindings.JSON_CF_BLOB]: IncomingRequestCfProperties; @@ -349,6 +350,9 @@ function maybeLogRequest( return res; } +/** + * Proxy here refers to the 'magic proxy' used by getPlatformProxy + */ function handleProxy(request: Request, env: Env) { const ns = env[CoreBindings.DURABLE_OBJECT_NAMESPACE_PROXY]; // Always use the same singleton Durable Object instance, so we always have @@ -378,7 +382,7 @@ export default >{ }; request = new Request(request, { cf }); - // The proxy client will always specify an operation + // The magic proxy client (used by getPlatformProxy) will always specify an operation const isProxy = request.headers.get(CoreHeaders.OP) !== null; if (isProxy) return handleProxy(request, env); @@ -405,6 +409,14 @@ export default >{ } try { + if (env[CoreBindings.SERVICE_LOCAL_EXPLORER]) { + if (url.pathname.startsWith("/cdn-cgi/explorer/api")) { + return await env[CoreBindings.SERVICE_LOCAL_EXPLORER].fetch(request); + } else if (url.pathname.startsWith("/cdn-cgi/explorer")) { + return new Response("Pretend this is an asset"); + // TODO: serve assets using disk service + } + } if (env[CoreBindings.TRIGGER_HANDLERS]) { if ( url.pathname === "/cdn-cgi/handler/scheduled" || diff --git a/packages/miniflare/src/workers/local-explorer/api.worker.ts b/packages/miniflare/src/workers/local-explorer/api.worker.ts new file mode 100644 index 000000000000..06d2149905e6 --- /dev/null +++ b/packages/miniflare/src/workers/local-explorer/api.worker.ts @@ -0,0 +1,10 @@ +// local explorer API Worker +// Provides a REST API for viewing and manipulating user resources + +import { WorkerEntrypoint } from "cloudflare:workers"; + +export default class LocalExplorerAPI extends WorkerEntrypoint { + async fetch(): Promise { + return new Response("Hello from local explorer API"); + } +} diff --git a/packages/vite-plugin-cloudflare/src/miniflare-options.ts b/packages/vite-plugin-cloudflare/src/miniflare-options.ts index 1405558bb157..1ab84bb2d622 100644 --- a/packages/vite-plugin-cloudflare/src/miniflare-options.ts +++ b/packages/vite-plugin-cloudflare/src/miniflare-options.ts @@ -7,6 +7,7 @@ import { generateContainerBuildId, resolveDockerHost, } from "@cloudflare/containers-shared"; +import { getLocalExplorerFromEnv } from "@cloudflare/workers-utils"; import { getDefaultDevRegistryPath, kUnsafeEphemeralUniqueKey, @@ -430,6 +431,7 @@ export async function getDevMiniflareOptions( inputInspectorPort === false ? undefined : inputInspectorPort, unsafeDevRegistryPath: getDefaultDevRegistryPath(), unsafeTriggerHandlers: true, + unsafeLocalExplorer: getLocalExplorerFromEnv(), handleStructuredLogs: getStructuredLogsLogger(logger), defaultPersistRoot: getPersistenceRoot( resolvedViteConfig.root, @@ -621,6 +623,7 @@ export async function getPreviewMiniflareOptions( inputInspectorPort === false ? undefined : inputInspectorPort, unsafeDevRegistryPath: getDefaultDevRegistryPath(), unsafeTriggerHandlers: true, + unsafeLocalExplorer: getLocalExplorerFromEnv(), handleStructuredLogs: getStructuredLogsLogger(logger), defaultPersistRoot: getPersistenceRoot( resolvedViteConfig.root, diff --git a/packages/workers-utils/src/environment-variables/factory.ts b/packages/workers-utils/src/environment-variables/factory.ts index 735fcf07195b..22842cd3e87d 100644 --- a/packages/workers-utils/src/environment-variables/factory.ts +++ b/packages/workers-utils/src/environment-variables/factory.ts @@ -86,6 +86,11 @@ type VariableNames = /** Direct authorization token for API requests. */ | "WRANGLER_CF_AUTHORIZATION_TOKEN" + // ## Experimental Feature Flags + + /** Enable the local explorer UI at /cdn-cgi/explorer (experimental, default: false). */ + | "X_LOCAL_EXPLORER" + // ## CI-specific Variables (Internal Use) /** Override command used by `wrangler init` (default: "create cloudflare@^2.5.0"). */ diff --git a/packages/workers-utils/src/environment-variables/misc-variables.ts b/packages/workers-utils/src/environment-variables/misc-variables.ts index 3176f6d14cc4..fc730b330c0e 100644 --- a/packages/workers-utils/src/environment-variables/misc-variables.ts +++ b/packages/workers-utils/src/environment-variables/misc-variables.ts @@ -336,3 +336,12 @@ export const getCloudflareEnv = getEnvironmentVariableFactory({ export const getOpenNextDeployFromEnv = getEnvironmentVariableFactory({ variableName: "OPEN_NEXT_DEPLOY", }); + +/** + * `X_LOCAL_EXPLORER` enables the local explorer UI at /cdn-cgi/explorer. + * This is an experimental feature flag. Defaults to false when not set. + */ +export const getLocalExplorerFromEnv = getBooleanEnvironmentVariableFactory({ + variableName: "X_LOCAL_EXPLORER", + defaultValue: false, +}); diff --git a/packages/wrangler/src/dev/miniflare/index.ts b/packages/wrangler/src/dev/miniflare/index.ts index 4eeeee39fde3..837fe33ea948 100644 --- a/packages/wrangler/src/dev/miniflare/index.ts +++ b/packages/wrangler/src/dev/miniflare/index.ts @@ -2,6 +2,7 @@ import assert from "node:assert"; import { randomUUID } from "node:crypto"; import path from "node:path"; import { getDevContainerImageName } from "@cloudflare/containers-shared"; +import { getLocalExplorerFromEnv } from "@cloudflare/workers-utils"; import { Log, LogLevel } from "miniflare"; import { ModuleTypeToRuleType } from "../../deployment-bundle/module-collection"; import { withSourceURLs } from "../../deployment-bundle/source-url"; @@ -864,6 +865,7 @@ export async function buildMiniflareOptions( unsafeHandleDevRegistryUpdate: onDevRegistryUpdate, unsafeProxySharedSecret: proxyToUserWorkerAuthenticationSecret, unsafeTriggerHandlers: true, + unsafeLocalExplorer: getLocalExplorerFromEnv(), // The way we run Miniflare instances with wrangler dev is that there are two: // - one holding the proxy worker, // - and one holding the user worker. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5305e2b52b7e..d0acb24c5d0a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1298,6 +1298,24 @@ importers: specifier: workspace:* version: link:../../packages/wrangler + fixtures/worker-with-resources: + devDependencies: + '@cloudflare/workers-tsconfig': + specifier: workspace:^ + version: link:../../packages/workers-tsconfig + '@cloudflare/workers-types': + specifier: catalog:default + version: 4.20260120.0 + typescript: + specifier: catalog:default + version: 5.8.3 + vitest: + specifier: catalog:default + version: 3.2.3(@types/debug@4.1.12)(@types/node@20.19.9)(@vitest/ui@3.2.3)(jiti@2.6.0)(lightningcss@1.30.2)(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(supports-color@9.2.2)(yaml@2.8.1) + wrangler: + specifier: workspace:* + version: link:../../packages/wrangler + fixtures/worker-with-unsafe-external-plugin: devDependencies: '@cloudflare/vitest-pool-workers': From ad4666cf86db5fe08de7f798b0c8d17fdd5b10fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Somhairle=20MacLe=C3=B2id?= Date: Thu, 22 Jan 2026 17:57:35 +0000 Subject: [PATCH 6/8] fix: remove remote option from hyperdrive create command (#12006) * fix: remove remote option from hyperdrive create command Hyperdrive does not support remote bindings during local development. This removes the confusing --use-remote flag and 'remote resource' prompt. Fixes #11674 * Use object spread for createdResourceConfig options --- .changeset/brown-schools-fry.md | 9 +++++++++ AGENTS.md | 9 ++++++++- packages/wrangler/src/__tests__/hyperdrive.test.ts | 11 +++++++++++ packages/wrangler/src/hyperdrive/create.ts | 10 ++++------ 4 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 .changeset/brown-schools-fry.md diff --git a/.changeset/brown-schools-fry.md b/.changeset/brown-schools-fry.md new file mode 100644 index 000000000000..1a0d360a9afb --- /dev/null +++ b/.changeset/brown-schools-fry.md @@ -0,0 +1,9 @@ +--- +"wrangler": patch +--- + +Remove `--use-remote` option from `wrangler hyperdrive create` command + +Hyperdrive does not support remote bindings during local development - it requires a `localConnectionString` to connect to a local database. This change removes the confusing "remote resource" prompt that was shown when creating a Hyperdrive config. + +Fixes #11674 diff --git a/AGENTS.md b/AGENTS.md index d1ffd9aa0359..a0db794cafd9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -100,7 +100,9 @@ This is the **Cloudflare Workers SDK** monorepo containing tools and libraries f **Creating Pull Requests:** -- Always use the PR template from `.github/pull_request_template.md` +- Always use the PR template from `.github/PULL_REQUEST_TEMPLATE.md` - do not replace it with your own format +- Fill in the template: replace the issue link placeholder, add description, check appropriate boxes +- Keep all checkboxes in the template (don't delete unchecked ones) - PR title format: `[package name] description` (e.g. `[wrangler] Fix bug in dev command`) - If the change doesn't require a changeset, add the `no-changeset-required` label @@ -125,3 +127,8 @@ Run `pnpm check` before submitting changes to ensure all quality gates pass. ## Changesets Every change to package code requires a changeset or it will not trigger a release. Read `.changeset/README.md` before creating changesets. + +**Changeset Format:** + +- Do not use conventional commit prefixes (e.g., `fix:`, `feat:`) in changeset descriptions +- Start with a capital letter and describe the change directly (e.g., "Remove unused option" not "fix: remove unused option") diff --git a/packages/wrangler/src/__tests__/hyperdrive.test.ts b/packages/wrangler/src/__tests__/hyperdrive.test.ts index e2ac34228ff8..c2d9622b1959 100644 --- a/packages/wrangler/src/__tests__/hyperdrive.test.ts +++ b/packages/wrangler/src/__tests__/hyperdrive.test.ts @@ -138,6 +138,17 @@ describe("hyperdrive commands", () => { `); }); + it("should not include remote option in hyperdrive config output (hyperdrive does not support remote bindings)", async () => { + const reqProm = mockHyperdriveCreate(); + await runWrangler( + "hyperdrive create test123 --connection-string='postgresql://test:password@example.com:12345/neondb'" + ); + await reqProm; + + // Hyperdrive does not support remote bindings in local dev, so the output should never contain "remote" + expect(std.out).not.toContain("remote"); + }); + it("should handle creating a hyperdrive and printing a TOML snipped", async () => { const reqProm = mockHyperdriveCreate(); writeWranglerConfig(); diff --git a/packages/wrangler/src/hyperdrive/create.ts b/packages/wrangler/src/hyperdrive/create.ts index 7a58ab404909..cb9b17dd912c 100644 --- a/packages/wrangler/src/hyperdrive/create.ts +++ b/packages/wrangler/src/hyperdrive/create.ts @@ -29,11 +29,6 @@ export const hyperdriveCreateCommand = createCommand({ type: "string", description: "The binding name of this resource in your Worker", }, - "use-remote": { - type: "boolean", - description: - "Use a remote binding when adding the newly created resource to your config", - }, "update-config": { type: "boolean", description: @@ -64,7 +59,10 @@ export const hyperdriveCreateCommand = createCommand({ }), config.configPath, args.env, - args + { + ...args, + useRemote: false, // Hyperdrive does not support remote bindings in local dev + } ); }, }); From 4bf0ffd1bb4e5f988c76ae3f100bba2d747f68d6 Mon Sep 17 00:00:00 2001 From: Ben <4991309+NuroDev@users.noreply.github.com> Date: Thu, 22 Jan 2026 18:52:28 +0000 Subject: [PATCH 7/8] Fixed broken lockfile (#12054) --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d0acb24c5d0a..c1c66a53217b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1305,7 +1305,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260120.0 + version: 4.20260122.0 typescript: specifier: catalog:default version: 5.8.3 From b9eec1d962f7cf194cb7f2b8448c1440d15c7423 Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Thu, 22 Jan 2026 20:44:33 +0100 Subject: [PATCH 8/8] refactor: downloadRemoteTemplate error clarification (#12042) --- .../src/__tests__/templates.test.ts | 63 +++++++++++++++++++ packages/create-cloudflare/src/templates.ts | 46 ++++++++++---- .../create-cloudflare/templates/next/c3.ts | 6 +- 3 files changed, 102 insertions(+), 13 deletions(-) diff --git a/packages/create-cloudflare/src/__tests__/templates.test.ts b/packages/create-cloudflare/src/__tests__/templates.test.ts index 9806945bc589..97aa6dfce539 100644 --- a/packages/create-cloudflare/src/__tests__/templates.test.ts +++ b/packages/create-cloudflare/src/__tests__/templates.test.ts @@ -433,6 +433,69 @@ describe("downloadRemoteTemplate", () => { expect(cloneMock).toHaveBeenCalledWith("/path/to/clone"); }); + + test("should transform GitHub URL without path to degit format", async () => { + await downloadRemoteTemplate( + "https://github.com/cloudflare/workers-graphql-server", + ); + + expect(degit).toHaveBeenCalledWith( + "github:cloudflare/workers-graphql-server", + expect.anything(), + ); + }); + + test("should transform GitHub URL with trailing slash to degit format", async () => { + await downloadRemoteTemplate("https://github.com/cloudflare/workers-sdk/"); + + expect(degit).toHaveBeenCalledWith( + "github:cloudflare/workers-sdk", + expect.anything(), + ); + }); + + test("should transform GitHub URL with subdirectory to degit format", async () => { + await downloadRemoteTemplate( + "https://github.com/cloudflare/workers-sdk/templates/worker-r2", + ); + + expect(degit).toHaveBeenCalledWith( + "github:cloudflare/workers-sdk/templates/worker-r2", + expect.anything(), + ); + }); + + test("should transform GitHub URL with tree/main to degit format", async () => { + await downloadRemoteTemplate( + "https://github.com/cloudflare/workers-sdk/tree/main", + ); + + expect(degit).toHaveBeenCalledWith( + "github:cloudflare/workers-sdk#main", + expect.anything(), + ); + }); + + test("should transform GitHub URL with tree/main/subdirectory to degit format", async () => { + await downloadRemoteTemplate( + "https://github.com/cloudflare/workers-sdk/tree/main/templates", + ); + + expect(degit).toHaveBeenCalledWith( + "github:cloudflare/workers-sdk/templates#main", + expect.anything(), + ); + }); + + test("should throw error when using a branch other than main", async () => { + await expect( + downloadRemoteTemplate( + "https://github.com/cloudflare/workers-sdk/tree/dev", + ), + ).rejects.toThrow( + "Failed to clone remote template: https://github.com/cloudflare/workers-sdk/tree/dev\nUse the format \"github://sub/directory[#]\" to clone a specific branch other than 'main'", + ); + }); }); describe("deriveCorrelatedArgs", () => { diff --git a/packages/create-cloudflare/src/templates.ts b/packages/create-cloudflare/src/templates.ts index 063bccf1f24f..a7c4eac3c031 100644 --- a/packages/create-cloudflare/src/templates.ts +++ b/packages/create-cloudflare/src/templates.ts @@ -872,8 +872,9 @@ const inferCopyFilesDefinition = (path: string): CopyFiles => { /** * Downloads an external template from a git repo. * - * @param src The url of the git repository to download the template from. - * For convenience, `owner/repo` is also accepted. + * @param src Any source supported by degit, e.g. a GitHub repo URL + * If the URL contains a subdirectory, it must be specified using the format + * supported by degit, i.e. `github://sub/directory[#]` * @param options Options for downloading the template: * - mode: The mode to use for downloading the template. Defaults to 'git'. * - intoFolder: The folder to download the template into. Defaults to a temporary directory. @@ -886,19 +887,42 @@ export async function downloadRemoteTemplate( intoFolder?: string; } = {}, ) { + const ghRegex = + /^https:\/\/github\.com\/(?[\w-]+)\/(?[\w.-]+)(?:\/(?.*))?$/; + + let errorMessage = `Failed to clone remote template: ${src}`; try { // degit runs `git clone` internally which may prompt for credentials if required // Avoid using a `spinner()` during this operation -- use updateStatus instead. updateStatus(`Cloning template from: ${blue(src)}`); - // GitHub URL with subdirectory is not supported by degit and has to be transformed. - // This only addresses input template URLs on the main branch as a branch name - // might includes slashes that span multiple segments in the URL and cannot be - // reliably differentiated from the subdirectory path. - if (src.startsWith("https://github.com/") && src.includes("/tree/main/")) { - src = src - .replace("https://github.com/", "github:") - .replace("/tree/main/", "/"); + // Add support for `https://github.com///tree/main/[]` format + // Subdirectories are only supported for the 'main' branch in this format + if (src.startsWith("https://github.com/")) { + const match = src.match(ghRegex); + if (match?.groups) { + const { user, repo, path } = match.groups; + + const pathSegments = (path ?? "").split("/").filter((s) => s !== ""); + + let branch = ""; + + if (pathSegments[0] === "tree" && pathSegments.length >= 2) { + // The URL contains a branch. + // Subdirectories are only supported for the 'main' branch. + branch = pathSegments[1]; + + if (branch !== "main") { + errorMessage += + "\nUse the format \"github://sub/directory[#]\" to clone a specific branch other than 'main'"; + throw new Error("Unsupported format"); + } + + pathSegments.splice(0, 2); // Remove 'tree' and branch name + } + + src = `github:${user}/${repo}${pathSegments.length > 0 ? `/${pathSegments.join("/")}` : ""}${branch ? `#${branch}` : ""}`; + } } const emitter = degit(src, { @@ -915,7 +939,7 @@ export async function downloadRemoteTemplate( return tmpDir; } catch { updateStatus(`${brandColor("template")} ${dim("failed")}`); - throw new Error(`Failed to clone remote template: ${src}`); + throw new Error(errorMessage); } } diff --git a/packages/create-cloudflare/templates/next/c3.ts b/packages/create-cloudflare/templates/next/c3.ts index 3ce052065cd1..26aafeaab319 100644 --- a/packages/create-cloudflare/templates/next/c3.ts +++ b/packages/create-cloudflare/templates/next/c3.ts @@ -3,8 +3,10 @@ import type { TemplateConfig } from "../../src/templates"; import type { C3Context } from "types"; const generate = async (ctx: C3Context) => { - const repoUrl = - "https://github.com/opennextjs/opennextjs-cloudflare/tree/main/create-cloudflare/next"; + // Easy way to switch branch for local testing + const branch = "main"; + + const repoUrl = `github:opennextjs/opennextjs-cloudflare/create-cloudflare/next#${branch}`; await downloadRemoteTemplate(repoUrl, { intoFolder: ctx.project.path,