From c81f036ec6457263fa4c18fcb4fbc870327628c7 Mon Sep 17 00:00:00 2001 From: Cina Saffary Date: Tue, 14 Apr 2026 08:18:12 -0500 Subject: [PATCH] fix(wrangler): `wrangler preview` no longer warns about missing inheritable bindings --- .changeset/four-banks-peel.md | 5 ++ .../wrangler/src/__tests__/preview.test.ts | 86 +++++++++++++++++++ packages/wrangler/src/preview/preview.ts | 9 +- 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 .changeset/four-banks-peel.md diff --git a/.changeset/four-banks-peel.md b/.changeset/four-banks-peel.md new file mode 100644 index 0000000000..57d1304180 --- /dev/null +++ b/.changeset/four-banks-peel.md @@ -0,0 +1,5 @@ +--- +"wrangler": patch +--- + +`wrangler preview` no longer warns on inheritable binding types being missing from `previews` config. diff --git a/packages/wrangler/src/__tests__/preview.test.ts b/packages/wrangler/src/__tests__/preview.test.ts index 1d7453c041..8cf14ca4b5 100644 --- a/packages/wrangler/src/__tests__/preview.test.ts +++ b/packages/wrangler/src/__tests__/preview.test.ts @@ -505,6 +505,92 @@ describe("wrangler preview", () => { expect(std.warn).not.toContain("IMPORTANT_BINDING"); }); + test("should not warn about inheritable top-level bindings missing from previews", async ({ + expect, + }) => { + mkdirSync("public", { recursive: true }); + writeFileSync("public/index.html", "

Hello

"); + writeFileSync( + "wrangler.json", + JSON.stringify({ + name: "test-worker", + main: "src/index.ts", + compatibility_date: "2025-01-01", + assets: { + binding: "ASSETS", + directory: "public", + }, + }) + ); + + msw.use( + http.get( + `*/accounts/:accountId/workers/workers/:workerId/previews/:previewId`, + () => + HttpResponse.json( + { + success: false, + result: null, + errors: [{ code: 10025, message: "Preview not found" }], + }, + { status: 404 } + ) + ), + http.post( + `*/accounts/:accountId/workers/workers/:workerId/previews`, + () => + HttpResponse.json({ + success: true, + result: { + id: "preview-id-assets", + name: "test-preview", + slug: "test-preview", + urls: ["https://test-preview.test-worker.cloudflare.app"], + worker_name: "test-worker", + created_on: new Date().toISOString(), + }, + }) + ), + http.post( + `*/accounts/:accountId/workers/scripts/:workerId/assets-upload-session`, + () => + HttpResponse.json({ + success: true, + result: { buckets: [], jwt: "assets-jwt-from-session" }, + }) + ), + http.post( + `*/accounts/:accountId/workers/workers/:workerId/previews/:previewId/deployments`, + () => + HttpResponse.json({ + success: true, + result: { + id: "deployment-id-assets", + preview_id: "preview-id-assets", + preview_name: "test-preview", + urls: ["https://assets123.test-worker.cloudflare.app"], + compatibility_date: "2025-01-01", + env: {}, + created_on: new Date().toISOString(), + }, + }) + ), + http.get(`*/accounts/:accountId/workers/workers/:workerId`, () => + HttpResponse.json({ + success: true, + result: { + preview_defaults: {}, + }, + }) + ) + ); + + await runWrangler("preview --name test-preview"); + + expect(std.warn).not.toContain("Your configuration has diverged."); + expect(std.warn).not.toContain("ASSETS"); + }); + test("should output preview and deployment JSON with --json", async ({ expect, }) => { diff --git a/packages/wrangler/src/preview/preview.ts b/packages/wrangler/src/preview/preview.ts index e083c85add..96b5937395 100644 --- a/packages/wrangler/src/preview/preview.ts +++ b/packages/wrangler/src/preview/preview.ts @@ -721,6 +721,12 @@ function formatDeploymentResource( return drawConnectedChildBox(lines, { footerLines, indent: " " }); } +function isInheritableBinding( + binding: Exclude[string] +) { + return binding.type === "assets"; +} + function logMissingPreviewsBindingsWarning( topLevelBindings: StartDevWorkerInput["bindings"], remotePreviewDefaultBindings: Record | undefined, @@ -732,7 +738,8 @@ function logMissingPreviewsBindingsWarning( ]); const missingBindings = Object.fromEntries( Object.entries(topLevelBindings ?? {}).filter( - ([name]) => !availableBindingNames.has(name) + ([name, binding]) => + !availableBindingNames.has(name) && !isInheritableBinding(binding) ) );