chore(deps): update dependency wrangler to v4.93.1#96
Open
renovate[bot] wants to merge 1 commit into
Open
Conversation
Contributor
|
📚 Docs preview deployed https://scratchyjs-docs-pr-96.asjas.workers.dev Updates automatically on every push to this PR. |
Contributor
⚡ Benchmark Results
|
| Suite — Benchmark | ops/sec | mean (µs) | p99 (µs) | ±rme |
|---|---|---|---|---|
| SharedRingBuffer – small payload (64 B) — write 64 bytes | 688.2 K | 0.0015 | 0.0053 | ±1.01% |
| SharedRingBuffer – small payload (64 B) — write + read 64 bytes | 502.2 K | 0.0020 | 0.0078 | ±1.19% |
| SharedRingBuffer – medium payload (1 KB) — write 1 KB | 293.6 K | 0.0034 | 0.0118 | ±0.53% |
| SharedRingBuffer – medium payload (1 KB) — write + read 1 KB | 260.1 K | 0.0038 | 0.0167 | ±0.50% |
| SharedRingBuffer – large payload (16 KB) — write 16 KB | 59.4 K | 0.0168 | 0.0400 | ±0.82% |
| SharedRingBuffer – large payload (16 KB) — write + read 16 KB | 74.4 K | 0.0134 | 0.0397 | ±30.43% |
| SharedRingBuffer – sequential throughput (100 × 64 B) — 100 write + read cycles | 42.7 K | 0.0234 | 0.0366 | ±0.37% |
| SharedRingBuffer – introspection — availableToRead | 14.89 M | 0.0001 | 0.0001 | ±0.10% |
| SharedRingBuffer – introspection — isEmpty | 14.93 M | 0.0001 | 0.0001 | ±0.12% |
| SharedRingBuffer – introspection — isFull | 14.76 M | 0.0001 | 0.0001 | ±0.11% |
benchmarks/renderer/shared-buffer.bench.ts
| Suite — Benchmark | ops/sec | mean (µs) | p99 (µs) | ±rme |
|---|---|---|---|---|
| SharedBuffer – allocation — createSharedBuffer(4 KB) | 656.5 K | 0.0015 | 0.0065 | ±1.00% |
| SharedBuffer – allocation — createSharedBuffer(64 KB) | 48.4 K | 0.0207 | 0.0406 | ±12.45% |
| SharedBuffer – small payload round-trip — write small JSON | 359.2 K | 0.0028 | 0.0099 | ±0.35% |
| SharedBuffer – small payload round-trip — write + read small JSON | 250.4 K | 0.0040 | 0.0138 | ±0.42% |
| SharedBuffer – medium payload round-trip — write medium JSON (~2 KB) | 96.2 K | 0.0104 | 0.0273 | ±0.42% |
| SharedBuffer – medium payload round-trip — write + read medium JSON (~2 KB) | 58.3 K | 0.0172 | 0.0384 | ±0.38% |
| SharedBuffer – large payload round-trip — write large JSON (~10 KB) | 15.6 K | 0.0639 | 0.0997 | ±0.36% |
| SharedBuffer – large payload round-trip — write + read large JSON (~10 KB) | 7.7 K | 0.1291 | 0.1597 | ±0.32% |
benchmarks/utils/ip-address.bench.ts
| Suite — Benchmark | ops/sec | mean (µs) | p99 (µs) | ±rme |
|---|---|---|---|---|
| getClientIPAddress – no IP headers — no IP-related headers → null | 2.62 M | 0.0004 | 0.0007 | ±0.69% |
| getClientIPAddress – single header — cf-connecting-ip (Cloudflare) | 1.53 M | 0.0007 | 0.0011 | ±0.41% |
| getClientIPAddress – single header — x-forwarded-for (simple) | 1.85 M | 0.0005 | 0.0009 | ±0.37% |
| getClientIPAddress – single header — x-real-ip | 1.42 M | 0.0007 | 0.0013 | ±1.11% |
| getClientIPAddress – single header — true-client-ip (Akamai / Cloudflare Enterprise) | 1.45 M | 0.0007 | 0.0010 | ±1.11% |
| getClientIPAddress – x-forwarded-for multi-hop — 2-hop chain | 1.78 M | 0.0006 | 0.0008 | ±0.12% |
| getClientIPAddress – x-forwarded-for multi-hop — 4-hop chain | 1.61 M | 0.0006 | 0.0010 | ±1.19% |
| getClientIPAddress – Forwarded header (RFC 7239) — simple for= directive | 969.6 K | 0.0010 | 0.0015 | ±1.07% |
| getClientIPAddress – Forwarded header (RFC 7239) — for= with port | 733.4 K | 0.0014 | 0.0023 | ±0.47% |
| getClientIPAddress – Forwarded header (RFC 7239) — IPv6 literal | 714.2 K | 0.0014 | 0.0024 | ±2.11% |
| getClientIPAddress – Forwarded header (RFC 7239) — multi-hop Forwarded | 803.6 K | 0.0012 | 0.0021 | ±0.41% |
| getClientIPAddress – IPv6 addresses — x-forwarded-for IPv6 | 1.11 M | 0.0009 | 0.0016 | ±0.35% |
benchmarks/utils/promise.bench.ts
| Suite — Benchmark | ops/sec | mean (µs) | p99 (µs) | ±rme |
|---|---|---|---|---|
| promiseHash – concurrent resolution — 2 already-resolved promises | 847.6 K | 0.0012 | 0.0029 | ±1.29% |
| promiseHash – concurrent resolution — 5 already-resolved promises | 513.2 K | 0.0019 | 0.0029 | ±0.42% |
| promiseHash – concurrent resolution — 10 already-resolved promises | 288.2 K | 0.0035 | 0.0084 | ±1.90% |
| promiseHash – concurrent resolution — 5 promises with object values | 467.6 K | 0.0021 | 0.0034 | ±1.01% |
| timeout – wrapping fast promises — timeout wrapping an already-resolved promise (1 s budget) | 929.6 K | 0.0011 | 0.0021 | ±0.40% |
| timeout – wrapping fast promises — timeout wrapping an already-resolved object (5 s budget) | 895.0 K | 0.0011 | 0.0017 | ±0.38% |
benchmarks/utils/safe-redirect.bench.ts
| Suite — Benchmark | ops/sec | mean (µs) | p99 (µs) | ±rme |
|---|---|---|---|---|
| safeRedirect – valid paths — root path / | 7.32 M | 0.0001 | 0.0002 | ±0.12% |
| safeRedirect – valid paths — simple path /dashboard | 3.52 M | 0.0003 | 0.0003 | ±0.11% |
| safeRedirect – valid paths — nested path /settings/profile | 3.21 M | 0.0003 | 0.0003 | ±0.11% |
| safeRedirect – valid paths — path with query string /search?q=hello | 3.48 M | 0.0003 | 0.0003 | ±0.11% |
| safeRedirect – valid paths — path with hash /docs#section | 3.40 M | 0.0003 | 0.0005 | ±0.25% |
| safeRedirect – rejected inputs — absolute URL https://evil.com | 4.75 M | 0.0002 | 0.0002 | ±0.11% |
| safeRedirect – rejected inputs — protocol-relative URL //evil.com | 4.61 M | 0.0002 | 0.0002 | ±0.11% |
| safeRedirect – rejected inputs — backslash-relative /\evil.com | 4.60 M | 0.0002 | 0.0004 | ±0.12% |
| safeRedirect – rejected inputs — path traversal /../etc/passwd | 4.18 M | 0.0002 | 0.0003 | ±0.15% |
| safeRedirect – rejected inputs — null input | 16.26 M | 0.0001 | 0.0001 | ±0.11% |
| safeRedirect – rejected inputs — undefined input | 16.20 M | 0.0001 | 0.0001 | ±0.10% |
| safeRedirect – rejected inputs — empty string | 16.22 M | 0.0001 | 0.0001 | ±0.11% |
| safeRedirect – percent-encoded bypass — percent-encoded // (%2F%2F) | 4.40 M | 0.0002 | 0.0002 | ±0.11% |
| safeRedirect – percent-encoded bypass — percent-encoded path traversal (%2e%2e) | 4.66 M | 0.0002 | 0.0002 | ±0.11% |
| safeRedirect – percent-encoded bypass — mixed percent-encoded absolute URL | 4.28 M | 0.0002 | 0.0003 | ±0.11% |
| safeRedirect – custom default redirect — valid path with custom default | 3.57 M | 0.0003 | 0.0003 | ±0.21% |
| safeRedirect – custom default redirect — invalid input with custom default | 4.45 M | 0.0002 | 0.0002 | ±0.11% |
ℹ️ No base results from
mainfound — delta column omitted on first run.
f7203d0 to
6a2ac0f
Compare
6a2ac0f to
4bb140e
Compare
e4234e8 to
1312473
Compare
1312473 to
85dd944
Compare
85dd944 to
0dbf29f
Compare
0dbf29f to
1cdb819
Compare
|
All alerts resolved. Learn more about Socket for GitHub. This PR previously contained dependency changes with security issues that have been resolved, removed, or ignored. |
1cdb819 to
73fcab0
Compare
73fcab0 to
5ea4fb1
Compare
5ea4fb1 to
5d15d37
Compare
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
5d15d37 to
7dcbbad
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
4.84.0→4.93.1Release Notes
cloudflare/workers-sdk (wrangler)
v4.93.1Compare Source
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:
#13984
7e40d98Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
#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:@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).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.#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]:v4.93.0Compare Source
Minor Changes
#13901
aac7ca0Thanks @bghira! - Addwrangler ai models schemacommand for fetching model schemasYou can now run
wrangler ai models schema <model>to fetch the input and output schema for a Workers AI model from the public model catalog schema endpoint.#12656
ae047eeThanks @mikenomitch! - Add--containers-rollout=noneThis allows you to skip deploying a container. This is useful if you know that your container is not going to be updated or you don't have Docker locally, but still want to make changes to your Worker.
#13901
aac7ca0Thanks @bghira! - Addwrangler ai models listcommand for querying the Workers AI model catalogwrangler ai models listaccepts--search,--task,--author,--source, and--hide-experimental, matching the public model catalog search endpoint.Patch Changes
#13948
b25dc0dThanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
#13882
a4f22bcThanks @matingathani! - Throw a clear error when a D1 migration is cancelled instead of silently returning#13950
f78d435Thanks @dario-piotrowicz! - Improve the Docker CLI error message to be more actionable.Include a link to Docker installation docs, platform-specific instructions for starting the daemon, and guidance for alternative Docker-compatible CLIs.
#11896
c5c9e20Thanks @staticpayload! - Surface remote proxy session errorsWhen remote bindings fail to start, include the controller reason and root cause in the error message to make failures like missing
cloudflaredclearer.#13932
ebf4b24Thanks @zebp! - Fix local Workflow startup when compatibility flags includeexperimentalMiniflare now deduplicates compatibility flags for the internal Workflow engine service. This prevents
wrangler devfrom failing withCompatibility flag specified multiple times: experimentalwhen the user's Worker already enables that flag.#13929
895baf5Thanks @Caio-Nogueira! - Prompt to provision a workers.dev subdomain before deploying WorkflowsWrangler now checks for the account-level workers.dev subdomain when deploying Workflows, even if the Worker is not being published to workers.dev. If the subdomain has not been registered yet, Wrangler prompts to create one before calling the Workflows deploy API so users avoid an opaque server-side deployment failure.
#13930
7bcdf45Thanks @shiminshen! - Sweep stale.wrangler/tmp/*dirs left behind by abnormal exitsA
wrangler devsession creates.wrangler/tmp/bundle-*and.wrangler/tmp/dev-*directories at startup and removes them via asignal-exithook on graceful shutdown. When the process exited abnormally (SIGKILL, OOM, host crash) those directories were left behind and accumulated across sessions, slowing down dependency-walking tools that follow the bundle-emitted absolute-path imports.wranglernow sweeps entries in.wrangler/tmp/older than 24 hours when a new temporary directory is requested, bounding the leak regardless of how prior sessions exited.Updated dependencies [
b25dc0d,ebf4b24,b27eb18]:v4.92.0Compare Source
Minor Changes
#13670
506aa02Thanks @elithrar! - Addwrangler artifactscommands for managing Artifacts repos and repo tokens.This adds CLI support for the Artifacts control-plane workflows that were previously only available through the API. You can now list and inspect namespaces, create, list, inspect, and delete repos, and issue repo-scoped tokens when you need to authenticate git access.
The new commands support both human-readable output and
--jsonoutput so they fit existing Wrangler automation patterns.#13916
be8a98cThanks @emily-shen! - Add--keep-varsflag towrangler versions upload, matching the existing behavior inwrangler deploy. When set, environment variables configured via the dashboard are preserved rather than being deleted before the upload.Patch Changes
#13926
19ed49aThanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
#11471
3ff0a50Thanks @HW13! - Improvewrangler types --env-interfacefor multi-worker projects.Custom env interfaces generated by
wrangler typesno longer expand fromCloudflare.Env, avoiding some unintended type expansion when multiple workers' generated types are used together.#13910
bf688f7Thanks @timoconnellaus! - FixFailed to fetch auth token: 401 Unauthorizedfrom sibling-rotated refresh tokensrefreshTokenpreviously used the refresh token from module-levellocalState, which is populated once at startup and never re-read. OAuth refresh tokens are single-use, so when a sibling wrangler process (in another repo, another shell, or a parallel script) refreshes first, it rotates the token server-side and writes the new value to the shared config file (~/Library/Preferences/.wrangler/config/default.tomlon macOS). The long-lived process — typicallywrangler dev— then sends its stale in-memory token on the next refresh and gets401 Unauthorizedfromhttps://dash.cloudflare.com/oauth2/token, falling through to interactive login and timing out unattended.refreshTokennow callsreinitialiseAuthTokens()before exchanging, picking up the latest refresh token written by any sibling process. The previously emptycatch {}also now logs the underlying error at debug level so future refresh failures are diagnosable without source-diving.#13843
2e72c83Thanks @nzws! - Fixwrangler versions secret put/delete/bulkto preserve the existing version's placement settingsWhen creating a new version via
wrangler versions secret, the previous code only re-emitted a bare{ mode: "smart" }placement when the API reportedplacement_mode === "smart", dropping any other placement entirely. The new version is now created with the placement settings returned by the API, so placement settings survive a secret put/delete/bulk round-trip.#13908
802eaf4Thanks @shiminshen! - fix: stop rewriting query strings that happen to contain the requestHostwrangler devpreviously rewrote occurrences of the outer host insiderequest.url's query string. For example, a request to?echo=https%3A%2F%2Fdevelopment.test%2FpathwithHost: development.testwould be seen by the user worker as?echo=https%3A%2F%2Fproduction.test%2Fpath, silently mutating opaque application data such asredirect_urivalues in OAuth flows.The proxy worker now sets the internal
MF-Original-URLheader after its blanket host-rewriting pass over request headers, so the URL passed to the user worker preserves the original query string.#13827
8f5cdb1Thanks @greyvugrin! - Fix multi-environment warning when CLOUDFLARE_ENV is setCommands that warn when multiple environments are configured but none is specified (e.g.
wrangler deploy,wrangler secret put) were not accounting for theCLOUDFLARE_ENVenvironment variable when deciding whether to show the warning. This caused a misleading warning to appear even when the target environment was correctly specified viaCLOUDFLARE_ENV.Updated dependencies [
19ed49a]:v4.91.0Compare Source
Minor Changes
#13822
c8be316Thanks @edmundhung! - Add named tunnel support and tunnel shortcuts towrangler devYou can now use
wrangler dev --tunnel --tunnel-name <name>to start a dev session with an existing named Cloudflare Tunnel, or set--tunnel-nameahead of time and start it later by pressingtto start or close the tunnel. This gives you a stable public hostname for local development instead of the temporarytrycloudflare.comURL used by Quick Tunnels.Patch Changes
#13848
d4794a8Thanks @MattieTK! - Condense repeated environment configuration warningsWrangler now summarises repeated missing
varsanddefineentries in environment configuration warnings. Experimentalunsafewarnings are also only emitted once when the field appears at both the top level and in the active environment.#13894
58b4403Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
#13780
4352f87Thanks @matingathani! - Normalize legacy instance type aliases (standard→standard-1,dev→lite) to prevent phantom EDIT diffs on every deploy#13834
a9e6741Thanks @matingathani! - fix: hotkeys now work with Caps Lock enabledWrangler's dev server hotkeys (e.g.
bto open browser andxto exit) did not respond when Caps Lock was enabled. These hotkeys now work consistently whether or not Caps Lock is on.#13750
da664d5Thanks @matingathani! - fix: automatically delete log files older than 30 days and add WRANGLER_WRITE_LOGS=false to disable disk loggingWrangler previously accumulated log files in
~/.wrangler/logs/indefinitely, causing some users to accumulate gigabytes of logs over time.Log files older than 30 days are now automatically cleaned up on the first log write. Disk logging can be disabled entirely by setting
WRANGLER_WRITE_LOGS=false.#13914
bdc398cThanks @Maximo-Guk! - preserve native shape of non-stringvarsin worker previewswrangler previewpreviously coerced every non-string entry inpreviews.vars(arrays, objects, numbers, booleans) into aplain_textbinding viaJSON.stringify, so at runtime the worker saw a literal string instead of the value declared inwrangler.jsonc.wrangler deployalready serializes non-string vars asjsonbindings so the Workers runtime parses them back into native JS values; previews now match.Before:
After:
#13778
1420f10Thanks @maxwellpeterson! - Propagateunsafe.bindingsand service bindingcross_account_grantto worker previewsWorker previews now propagate
unsafe.bindingsdeclared on thepreviewsconfig block to the deployment metadata, mirroring the deploy-time behavior. Without this, internal binding shapes that wrangler doesn't yet model (notably service bindings carryingcross_account_grant) were silently dropped on previews while working fine on regular deploys. The same change wires throughcross_account_granton typedservicesbindings.Updated dependencies [
58b4403,f781a2b]:v4.90.1Compare Source
Patch Changes
#13866
4e44ce6Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
#13837
b0cee1dThanks @matingathani! - Fix beta/open-beta status message ignoringprintBanner: false— when a command setsprintBanner: (args) => !args.json, the status banner no longer appears in JSON output#13887
d878e13Thanks @apeacock1991! - Fixwrangler devhanging on shutdown when remote bindings are presentstartDev() registers dev hotkeys before authenticating the user. During interactive dev sessions, the auth callback re-registers hotkeys, which updates the local unregisterHotKeys variable to a new cleanup function. However, the unregisterHotKeys value returned to callers was captured as a direct reference to the initial registration, so it would call the stale cleanup function instead of the current one.
This has been fixed by returning a wrapper function () => unregisterHotKeys?.() instead of the variable directly. The wrapper evaluates unregisterHotKeys at call time, ensuring it always invokes the latest cleanup function even after re-registration.
#13867
971dfe3Thanks @petebacondarwin! - Fix race inRemoteProxySession.updateBindingsso it waits for the remote worker to finish reloading with the new bindings before resolvingPreviously,
updateBindingsresolved as soon as the config update event was dispatched, long before the remote worker had been re-uploaded and the local proxy worker had unpaused. Callers that issued requests immediately afterwards could see flaky failures — typically "WebSocket connection failed" for JSRPC bindings such as service bindings or dispatch namespaces — because the local proxy worker was still in its paused state during the reload window.updateBindingsnow waits for the nextreloadCompleteevent and for the local proxy worker's runtime-message queue to drain before returning, so callers can safely issue requests afterawait session.updateBindings(...). If the reload fails, the rejection fromupdateBindingscarries the underlying error.#13867
971dfe3Thanks @petebacondarwin! - Fix unhandledAbortErrorfromwrangler dev's remote tail WebSocket when the bundle rebuilds or the dev session shuts downThe remote-runtime tail-logs WebSocket (
#activeTailinRemoteRuntimeController) was constructed with the sameAbortSignalthatonBundleStartaborts to cancel in-flight preview-session operations. The abort destroyed the WebSocket's underlying upgrade request withAbortError, which had noerrorlistener attached and propagated as an unhandled exception. We now attach anerrorlistener at WebSocket construction that ignores errors (logging at debug level), matching the safeguards already present on theterminatepaths in#previewTokenandteardown().Updated dependencies [
4e44ce6,5d936c5]:v4.90.0Compare Source
Minor Changes
#12279
248bc08Thanks @penalosa! - Add deprecation warning fordelivery_delayin queue producer bindingsThe
delivery_delaysetting in[[queues.producers]]was silently having no effect since 2024. This change adds a deprecation warning when the setting is used, informing users that queue-level settings should be configured usingwrangler queues updateinstead. The setting will be removed in a future version.Patch Changes
#13853
8852b0cThanks @gpanders! - Fix Containers SSH config#13858
e414e56Thanks @penalosa! - Fixwrangler whoamiand account selection failing for Account API TokensThe
/membershipsfallback for Account API Tokens was checking for code 9109, but/membershipsactually returns 9106 for that case. Correct the code so the fallback to/accountstriggers as intended.Updated dependencies []:
v4.89.1Compare Source
Patch Changes
#13824
dd3baf3Thanks @emily-shen! - Fix container deployment being skipped for Workers for Platforms user workersPreviously, deploying a worker with
--dispatch-namespacewould early-exit before callingdeployContainers(), meaning container-app registration that links the image to the Durable Object namespace was never executed for WfP user workers. Container deployment now runs before the WfP early exit.Updated dependencies [
5cf6f81]:v4.89.0Compare Source
Minor Changes
#13055
f3fed88Thanks @GregBrimble! - Introducing thecacheconfiguration option for Workers.You can now set
{ cache: { enabled: true } }in your Wrangler configuration file to enable a HTTP cache in front of your Worker'sfetchhandler. This is also supported in[previews]configuration —previews.cacheoverrides the top-levelcachesetting for preview deployments, and falls back to the top-level value when absent. More information can be found in our documentation.#13776
1a54ac5Thanks @petebacondarwin! -wrangler devand other Miniflare-backed commands now run the localworkerdruntime withTZ=UTCto match productionPreviously,
wrangler dev(and other commands that spin up Miniflare, such aswrangler kv,wrangler d1,wrangler r2,wrangler check) inherited the host machine's timezone, soDateandIntlAPIs inside a Worker observed the developer's local timezone during local development but UTC in production. This caused subtle, hard-to-debug differences between local and deployed behaviour.Local development now matches production. Code that previously relied on the host timezone during
wrangler devwill need to either accept UTC (the production behaviour) or explicitly construct dates/formatters with the desired timezone.Patch Changes
#13829
2284f20Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
#13841
332f527Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
#13777
18e833dThanks @matingathani! - fix: throw a clear error when _routes.json contains invalid JSON instead of silently skipping it#13751
b6cea17Thanks @matingathani! - fix: ensurewrangler types --check --env-filedoes not falsely report stale types when.dev.varsexists#13775
53e846aThanks @maxwellpeterson! - Fixwrangler previewnot propagating theassetsbinding to preview deploymentsPreviously,
wrangler previewwould upload the asset manifest correctly but the resulting preview deployment had noASSETSbinding (or whatever name was configured underassets.binding). Workers reading from the binding would seeundefinedand fail at runtime.The fix emits the assets binding into the deployment's
envmap alongside other bindings, mirroringwrangler deploy.#13770
beff19cThanks @petebacondarwin! - Only show accounts available for the current login auth inwrangler whoamiand the interactive account pickerWrangler now lists the intersection of
/accountsand/membershipsinstead of either endpoint alone, dropping accounts the active OAuth token or API token has no membership in. Theaccountsfield ofwrangler whoami --jsonis filtered the same way. When/membershipsis inaccessible to the current auth (e.g. Account API Tokens) Wrangler falls back to/accountsso those tokens continue to work as before.#13832
af42fedThanks @gpanders! - Showcontainers sshinwrangler containers --helpand inwrangler containers ssh --helpThe
containers sshcommand was previously hidden, so it did not appear in the list of subcommands shown bywrangler containers --help, and its description was omitted fromwrangler containers ssh --help. The command is now listed with its description in both places.Updated dependencies [
2284f20,332f527,039bada,1a54ac5]:v4.88.0Compare Source
Minor Changes
#13760
e07825aThanks @danielgek! - Addbuiltinstorage option towrangler ai-search create.wrangler ai-search createnow supports a third storage type,builtin, in addition tor2andweb-crawler. When--type builtinis selected (or chosen interactively), Wrangler creates the instance using Cloudflare-managed storage by omittingtypeandsourcefrom the API request — the API treats an absenttypeas builtin storage. Builtin instances do not accept--source,--prefix,--include-items, or--exclude-items.#13721
58899d8Thanks @danielgek! - Add optionalcustom_metadatastep towrangler ai-search createThe
wrangler ai-search createinteractive wizard now lets you declare custom metadata fields that the new AI Search instance should index. Each field is afield_namepaired with adata_type(text,number,boolean, ordatetime).You can provide fields up-front via the new repeatable
--custom-metadataflag usingfield_name:data_typesyntax:For larger schemas, use
--custom-metadata-schemato point at a JSON file containing an array of{ field_name, data_type }objects:[ { "field_name": "title", "data_type": "text" }, { "field_name": "views", "data_type": "number" } ]#13701
18b9d5bThanks @dario-piotrowicz! - Prompt for missing name and compatibility date interactively duringwrangler deployWhen deploying without a project name or
compatibility_datein your configuration or CLI arguments,wrangler deploynow interactively prompts for the missing values instead of immediately failing with an error. For compatibility date, the prompt offers to use today's date; if you decline, the existing error is shown. The compatibility date prompt is skipped when--latestis passed. In non-interactive or CI environments, behavior is unchanged.Additionally, when no config file exists,
wrangler deploynow offers to save the prompted name and compatibility date to awrangler.jsoncfile for future use. This interactive flow is available for allwrangler deployinvocations — not just asset-only deployments.#13810
2b8c0ccThanks @jamesopstad! - Stabilize thesecretsconfiguration propertyThe
secretsproperty in the Wrangler config file is no longer experimental and will no longer emit an experimental warning when used. Required secrets are validated during local development and deploy, and used as the source of truth for type generation.{ "secrets": { "required": ["API_KEY", "DB_PASSWORD"] } }Patch Changes
#13765
3020214Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
#13800
0099265Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
#13812
25f5ef2Thanks @emily-shen! - fix:--aliasCLI flag now works inwrangler deployThe
--aliasflag was accepted but silently ignored duringwrangler deploy— onlyconfig.aliastook effect. We now collect aliases from both config and CLI flags.#13772
194d75eThanks @zakcutner! - Fixwrangler typesto generateFetcherforunsafe.bindingsentries withtype: "service"Previously, all entries in
unsafe.bindings(other thanratelimit) generated a fallbackanytype.wrangler typesnow generatesFetcherfor unsafe bindings declared withtype: "service", matching the type used for regular service bindings.#13818
9f532f7Thanks @1000hz! - Support Flagship bindings in Worker Previewswrangler previewnow acceptsflagshipentries in thepreviewsblock and includes them in Preview deployment bindings. This lets Workers that use Flagship bindings deploy Preview versions with preview-specific Flagship app IDs.#12974
1127114Thanks @ask-bonk! - Fixpropsand fetcher-type service bindings being dropped inunstable_getMiniflareWorkerOptionsThe post-processing in
unstable_getMiniflareWorkerOptionswas rebuildingserviceBindingsfrom scratch, which silently droppedpropson service bindings and droppedfetcher-type bindings entirely. It was also re-derivingdurableObjectsidentically to whatbuildMiniflareBindingOptionsalready produces. Both have been removed;buildMiniflareBindingOptionsnow produces the final bindings unchanged.#13739
3ceadefThanks @edmundhung! - Skip confirmation prompts inwrangler versions deploywhen versions are provided as CLI argumentsPassing version IDs or version specs to
wrangler versions deploynow applies those values directly instead of opening interactive prompts to confirm the same versions and percentages. This makes the command easier to automate without requiring--yes.#13745
1a5cc86Thanks @edmundhung! - fix: preserve request ports inOriginandRefererheaders when usingwrangler dev --hostUpdated dependencies [
3020214,0099265,bb27219,12fb5db]:v4.87.0Compare Source
Minor Changes
#13726
b5ac54bThanks @penalosa! - Hard fail on Node.js < 22Wrangler no longer supports Node.js 20.x, as it reached end-of-life on 2026-04-30. The minimum supported Node.js version is now 22.0.0. See https://github.com/nodejs/release?tab=readme-ov-file#end-of-life-releases.
#13717
9a1f014Thanks @NuroDev! - Add an experimentalexperimental_generateTypes()programmatic API.Wrangler now exposes
experimental_generateTypes()from the package root so you can generate Worker types in code using the same logic aswrangler types. The API supports the same core type-generation options (include env/runtime toggles) and returns structured output with separateenvandruntimecontent alongside the combined formatted output.Patch Changes
#13732
22e1a61Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
#13754
00523c8Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
#13711
1c4d850Thanks @dario-piotrowicz! - fix: skip auto-config and OpenNext delegation when--configis explicitly providedWhen
--configis passed towrangler deploy, the user is explicitly targeting a specific Worker configuration. Previously, wrangler would ignore--configand delegate toopennextjs-cloudflare deployif it detected an OpenNext project in the working directory, silently deploying the wrong Worker. Now, both auto-config detection and OpenNext delegation are skipped when--configis provided, matching thConfiguration
📅 Schedule: (in timezone Africa/Johannesburg)
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.