Patch Changes
-
#13978
fa1f61fThanks @sassyconsultingllc! - Bumpwsfrom 8.18.0 to 8.20.1 to address GHSA-58qx-3vcg-4xpxGHSA-58qx-3vcg-4xpx / CVE-2026-45736 reports an uninitialized-memory disclosure in
ws@<8.20.1when aTypedArrayis passed as the reason argument toWebSocket.close(). The fix shipped in ws@8.20.1 on 2026-05-12. This change bumps the workspace catalog entry so thatminiflare,wrangler, and@cloudflare/vite-pluginall pick up the patched release. -
#13977
2679e05Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260518.1 1.20260519.1 -
#13984
7e40d98Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260519.1 1.20260520.1 -
#13963
adc9221Thanks @gabivlj! - Preserve sibling container image tags during local dev cleanupWrangler now keeps other
cloudflare-devimage tags from the same dev session when multiple containers share a Dockerfile. Previously, duplicate-image cleanup could remove earlier container tags if Docker BuildKit produced the same image ID for each build. -
#13839
735852dThanks @matingathani! - fix: show actionable hint when/membershipsreturns a bad-credentials error (code 9106)Previously,
wranglerthrew a raw Cloudflare API error ("Missing X-Auth-Key, X-Auth-Email or Authorization headers") with no guidance. Now it emits aUserErrorexplaining that an environment variable such asCLOUDFLARE_API_TOKEN,CLOUDFLARE_API_KEY, orCLOUDFLARE_EMAILmay be set to an invalid value, and suggests runningwrangler logout/wrangler loginto re-authenticate. -
#13912
d803737Thanks @petebacondarwin! - Fix/cdn-cgi/*host validation incorrectly accepting subdomains of exact configured routesMiniflare's
/cdn-cgi/*host/origin validator was treating exact configured routes the same as wildcard configured routes, so a request whoseHostorOriginhostname was a subdomain of an exact route (e.g.sub.my-custom-site.comfor amy-custom-site.com/*route) was incorrectly accepted. Exact configured routes and the configuredupstreamhostname are now required to match the request hostname exactly. Subdomain matching is only applied to wildcard routes such as*.example.com/*. Localhost hostnames continue to be allowed as before.This affects
wrangler devand local development through@cloudflare/vite-plugin, both of which use Miniflare under the hood. -
#13919
c7eab7fThanks @petebacondarwin! - Fix the outboundCF-Workerheader reflecting the route pattern hostname instead of the parent zone, and falling back to<worker-name>.example.comundervite dev,vitest-pool-workers, andgetPlatformProxyTwo related issues affected the
CF-Workerheader on outbound subrequests in local development:- Under
@cloudflare/vite-plugin,@cloudflare/vitest-pool-workers, andgetPlatformProxy, the header fell back to<worker-name>.example.comeven whenrouteswere configured, becauseunstable_getMiniflareWorkerOptionsand the equivalentgetPlatformProxyworker-options path did not propagate azonevalue to Miniflare. This broke local development against services that reject unknownCF-Workerhosts (for example, Apple WeatherKit returns403 Forbidden). - Across the above paths and
wrangler dev --local, when a route used thezone_namefield (for example{ pattern: "foo.example.com/*", zone_name: "example.com" }), the header was set to the pattern's hostname (foo.example.com) rather than the zone name (example.com). Production setsCF-Workerto the zone name that owns the Worker, so this was inconsistent with deployed behaviour.
Both bugs are fixed: the new
unstable_getMiniflareWorkerOptions/getPlatformProxypath now propagates azonederived from the first configured route, and all four local-dev paths now prefer a route's explicitzone_nameover the pattern hostname when computing that zone. Whenzone_nameisn't set, the existing best-effort behaviour is preserved — forwrangler devthis meansdev.hostis still honoured as a local override and the pattern hostname is used as a final fallback. Resolving the parent zone forzone_id-only,custom_domain, or plain-string routes would require an API lookup, so locally we still approximate it with the pattern hostname.Note:
dev.hostis intentionally not consulted by theunstable_getMiniflareWorkerOptions/getPlatformProxypaths — thedevconfig block is specific towrangler dev. - Under
-
#13990
e04e180Thanks @petebacondarwin! - Improve the log message shown when an asset upload attempt fails and is retriedThe retry message now reports which attempt is being made (e.g.
Asset upload failed. Retrying... 1 of 5 attempts.), making it easier to gauge how close Wrangler is to exhausting its retry budget. The raw error object is no longer appended to this user-facing message; it is instead logged at debug level (visible viaWRANGLER_LOG=debug). -
#13954
62abf97Thanks @petebacondarwin! - Read the on-disk OAuth state lazily soCLOUDFLARE_API_TOKENfrom.envtakes priority correctlyWrangler previously read its OAuth state from the user auth config file (for example
~/.config/.wrangler/config/default.toml) eagerly at module-import time. That happens before.envfiles are loaded, so the in-memory state would always hold the OAuth tokens even when the user only wanted to authenticate viaCLOUDFLARE_API_TOKEN. If that stored OAuth token happened to be expired, Wrangler would try to refresh it (and fail), aborting the command withFailed to fetch auth token: 400 Bad RequestandNot logged in.— even though a valid API token was in scope.Wrangler now reads the auth config file on demand, after
.envhas been loaded. WhenCLOUDFLARE_API_TOKEN(orCLOUDFLARE_API_KEY+CLOUDFLARE_EMAIL) is present, the OAuth state on disk is no longer consulted, the OAuth refresh endpoint is no longer called, and the env-based token is used directly. Sibling-process refresh-token rotation is also handled naturally because every check reads the current file contents.Internally, the exported
reinitialiseAuthTokens()function is removed — there is no module-level OAuth cache left to invalidate.Fixes #13744.
-
#13951
e349fe0Thanks @sejoker! - Enforce minimum 60 second interval for R2 Data Catalog sinksR2 Data Catalog sinks now require a minimum
--roll-intervalof 60 seconds to prevent compaction issues in the R2 Data Catalog. This validation is applied when creating sinks viawrangler pipelines sinks createwith typer2-data-catalog, and during the interactivewrangler pipelines setupflow.Regular R2 sinks are not affected and can still use intervals as low as 10 seconds.
-
#13959
da0fa8cThanks @dmmulroy! - Recognize Artifacts repositories that are still being createdWrangler's Artifacts repo status type now accepts the
creatinglifecycle state alongside existing in-progress statuses. -
#13964
a5c9365Thanks @danielrs! - Use dedicated API endpoint forwrangler secret bulkwrangler secret bulknow uses a more efficient, dedicated API endpoint. This reduces the operation from 2 API calls to 1 and eliminates the risk of accidentally affecting non-secret bindings. -
Updated dependencies [
fa1f61f,2679e05,7e40d98,d803737,59cd880,e8c2031]:- miniflare@4.20260520.0