AstroEco is Contributing…
Display your GitHub pull requests using astro-loader-github-prs

Changes
astro:contentbuildsrenderwith a factory call since #17818 (7.3.0):export const render = createRenderEntry({ logger }). The bundler keeps unannotated calls, sorenderEntrystays in every server bundle that importsastro:content. Its dynamicimport('astro:content-module-imports')stays with it. That's the map that lazily imports every renderable entry.- As a result, when on-demand routes only read collection data (
getCollection(),getEntry()) and never callrender(), every entry rendered by prerendered pages is still compiled into the server output. In 7.2,renderEntrywas a plain exported function and was tree-shaken. - This marks the factory call
/* @__PURE__ */, so an unusedrenderis dropped again. Bundles that do userender()keep it, so runtime behavior is unchanged.
Real-world impact: on a Vercel site with ~200 MDX posts in 11 locales and a few on-demand routes (/blog listing, /compare/*), the _render function went from 50 MB (7.2.10) to 389 MB (7.3.0 through 7.4.2). Vercel rejects that: "exceeds the maximum uncompressed size limit of 250mb". With this change it's back to 49 MB, and all of the site's on-demand routes still render.
Bisected on that site: 7.2.10 builds a 49 MB function, while 7.3.1, 7.3.4, 7.3.8, 7.4.0 and 7.4.2 build 389–390 MB. Walking the server environment's module graph points to this chain:
on-demand page → astro:content → content/runtime.js (renderEntry)
→ import('astro:content-module-imports') → import(<every entry>.mdx?astroPropagatedAssets)
Testing
- Added
content-render-tree-shaking.test.tswith a fixture that has two MDX entries, a prerendered page that renders them withrender(), and an on-demand page that only callsgetCollection(). The test asserts that no server chunk contains an entry's compiled body, and that both pages render. The fixture usesretainBody: false, so the marker can only reach the server output through a compiled entry module and not through the data store.- Without the change, it fails:
dist/server/chunks/first_*.mjscontains the entry. - With the change, it passes.
- Without the change, it fails:
test/content*.test.ts,test/ssr-prerender*.test.ts,test/server-islands.test.ts,test/csp-server-islands.test.tsandtest/live-*.test.tsall pass (80/80).
Docs
No docs needed: this is a bundle-size fix with no API or behavior change.
Made with AI.

Changes
- Fixes #18418 by preserving component-rendered
<link>tags (such as stylesheets and preconnect hints) in@astrojs/reactisland markup. - React 19 auto-injects resource preloads (e.g., for
<img>tags), which are intended to be stripped from island output. However, the regex previously stripped all<link rel="...">tags includingstylesheetandpreconnect, causing missing styles prior to hydration and React hydration mismatches (#418 / #423). - Updated stripping logic to target only auto-injected preloads (
rel="preload|modulepreload") on React 19+. - Skips stripping completely on React 18, which does not inject resource hints.
- Added changeset
.changeset/preserve-react-island-links.md.
Testing
- Updated
packages/integrations/react/test/react-19-preloads.test.tsto assert that component-rendered<link rel="stylesheet">and<link rel="preconnect">are preserved in the rendered island markup while preloads remain stripped. - Verified all
@astrojs/reacttest suites pass cleanly. - Biome formatting and lint checks pass.
Docs
No documentation changes needed; this fixes unintended stripping of developer-rendered tags to align with expected component behavior.

Changes
Fixes #18530.
matchAllRoutes in packages/astro/src/core/routing/match.ts only tested route.pattern, while matchRoute in the same file and Router.matchAll also check fallbackRoutes. This meant i18n fallback routes were not matched by the dev server path that uses matchAllRoutes. It now checks fallback routes the same way, so behaviour is consistent across the three matchers.
Testing
- No new test added: dev-server route matching is covered by the existing routing tests, which run in CI.
- Verified with a focused before/after reproduction: before the fix,
matchAllRoutes('/blog')missed a route whose fallback pattern is/blog; after the fix it matches, same asmatchRoute.

Changes
Fixes #18527.
generateDynamicPattern in @astrojs/underscore-redirects only read the first part of each route segment, so compound dynamic routes were truncated when generating _redirects entries: post-[id] produced /post- instead of /post-:id. It now joins every part of a segment, so post-[id] produces /post-:id and [year]-[month]-[slug] produces /:year-:month-:slug.
Testing
- Added two tests to
packages/underscore-redirects/test/astro.test.tscoveringpost-[id]and[year]-[month]-[slug]. - The full underscore-redirects test file passes (9/9) against the fixed code; before the fix the two new tests failed with the truncated patterns.

Changes
- Fixes an unhandled
TypeError: Cannot convert undefined or null to objectwhen callingroute.generate()orgetRouteGenerator()(/* no args */)on static routes without arguments (fixes #18528). - Defaults
paramsto{}ingetRouteGeneratorand safely coalescesparams ?? {}when passing tosanitizeParams. - Added patch changeset
.changeset/quiet-routes-generate.md.
Testing
- Added unit tests in
packages/astro/test/units/routing/generator.test.tsverifyinggenerator()andgenerator(undefined)return the expected static path without throwing. - Verified dynamic routes called without params continue throwing
Missing parameter: <name>. - Verified formatting and linting via Biome.
Docs
Bug fix only; no documentation changes needed as the TypeScript signature already documents (data?: any) => string.

Changes
- Client bundles built with the Cloudflare adapter no longer contain raw
process.env.*references. Previously, the adapter applied'process.env': 'process.env'to the top-level Vite config, which leaked into client chunks and causedReferenceError: process is not definedin the browser for any code that readsprocess.envat import time (e.g.@vuetify/v0). - The define is now applied only to the
ssrandprerenderVite environments, mirroring how theglobalThis.processbanner was already scoped in #18213. Client bundles receive Vite's default browser replacement ({}) again.
Testing
- Added a test in
packages/integrations/cloudflare/test/static.test.tsthat builds a fixture containing a client-only component that referencesprocess.env.*and asserts the output chunk does not contain a bareprocess.envreference.
Docs
- No docs update needed; this is a bug fix restoring behavior that was unintentionally broken — no public API or configuration surface changed.
Closes #18507

Changes
astro infono longer triggers theDEP0190Node.js deprecation warning on Node 24+. The warning was caused by passing an args array to tinyexec withshell: true, which Node 24 flags as a security risk. Removingshell: trueis safe because tinyexec already handles Windows.cmdshims without it, matching howastro addalready invokes package managers.- Drops the now-unused
shelloption fromCommandExecutorOptionsandTinyexecCommandExecutor.
Testing
- Adds
packages/astro/test/units/cli/info.test.tscovering that the npm, pnpm, and yarn package-manager executors do not passshell: trueto the underlying command executor.
Docs
- No docs update needed; this is an internal implementation fix with no user-facing API change.
Closes #18485

Changes
- Astro's bundled
.astrocomponents (ClientRouter.astro,Code.astro,Debug.astro,Image.astro,Picture.astro) now compile cleanly under every option inastro/tsconfigs/strictest. With@astrojs/ts-content-mapper,tsctype-checks.astrosource files innode_modulesusing the project's own compiler options — meaningskipLibCheckdoes not apply — so projects extendingstrictestpreviously saw 9 unavoidable errors they could not fix. - The two strictest options responsible were
exactOptionalPropertyTypes(7 errors acrossCode.astro,Image.astro,Picture.astro) andnoUncheckedIndexedAccess(2 errors inClientRouter.astro,Debug.astro). Each component was updated to satisfy those constraints.
Testing
- No dedicated test files were added; the correctness is verified by
tscitself passing on the fixed components understrictest. The existing component type-check coverage in CI did not previously includepackages/astro/components/*.astrounder thestrictestpreset, so no existing assertions changed.
Docs
- No docs update needed; this is a bug fix in internal component implementations with no API surface change.
Closes #18471

Changes
- Cached 404/500 responses with a
nullbody are no longer stored in the memory provider. Previously,serializeResponse()converted thenullbody to an emptyArrayBuffer, so cache hits returned an empty response body instead of the rendered error page (which the router could only produce whenresponse.body === null). - Adds an
isErrorPageReroute()guard incore/cache/memory-provider.tsthat skips caching (and deletes any stale SWR entry) when the response has a reroutable status (404 or 500) and anullbody. One trade-off: endpoints that return an empty 404/500 withskipErrorReroutewill also bypass the cache, though the response they send is still correct.
Testing
- New unit tests in
packages/astro/test/units/cache/memory-provider.test.tscovering both the initial-request path and the SWR revalidation path for empty 404 and 500 responses, asserting they are not stored and that stale entries are evicted.
Docs
- No docs update needed; this is a bug fix restoring the already-documented behavior of the memory cache provider.
Closes #18456

Changes
- JSON content collection entries saved with a UTF-8 byte order mark (Visual Studio, PowerShell 5.1
Set-Content -Encoding UTF8, "UTF-8 with BOM" in editors) failed to load:glob()threwDataCollectionEntryParseError("Unexpected token ... is not valid JSON", the token being the invisible BOM) andfile()logged "Error reading data" and dropped the whole collection. - Strip a leading BOM before
JSON.parsein the.jsondata entry type, and when thefile()loader reads its file (so custom parsers, e.g. for a CSV exported from Excel, also get clean text). - YAML/TOML entries and frontmatter (#12664) already accept a BOM, and so does Node's own
require()of JSON.
Testing
Added unit tests for both loaders that write a BOM-prefixed JSON file to a temp dir; they fail without the change and pass with it. Also reproduced with a small Astro project: astro build fails before and renders both collections after.
Docs
No docs needed, bug fix.
I used Claude Code to write this change.

Changes
- String tag names (
.astrodynamic tags, JSX, MDX) now go through one shared helper that renders only the leading valid element name, so characters like/or=can't change the generated markup. - Strings that don't start with a valid element name (e.g.
'!--','') now throw instead of producing invalid HTML.
Testing
- New unit tests for the helper and the JSX renderer.
- Extended the dynamic tag fixture test with a
/case.
Docs
- No docs needed.

Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| undici (source) | 7.30.0 → 8.12.2 |
undici vulnerable to Denial of Service via unhandled error on excessive content-encodings
CVE-2026-109869 / GHSA-xjj6-f33q-929c
More information
Details
Impact
undici's fetch() crashes the Node.js process when a malicious server returns a response with more than five content codings and closes the connection before sending the body. undici rejects such responses (a content-encoding limit), but it created the internal response stream before that check and returned without attaching an error listener or aborting the request. The early close then surfaces a content-length mismatch on that orphaned internal stream, which Node.js treats as an unhandled error and terminates the process. A remote, unauthenticated server can trigger this with a single response, even when the application correctly catches the fetch() rejection. undici 6.x, 7.x, and 8.x are affected.
Patches
Upgrade to 6.29.1, 7.30.1, or 8.12.2. undici now validates the content-encoding chain before creating the internal body stream and aborts the response when the limit is exceeded, so no error can surface on an orphaned stream.
Workarounds
None.
Severity
- CVSS Score: 7.5 / 10 (High)
- Vector String:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
References
- https://github.com/nodejs/undici/security/advisories/GHSA-xjj6-f33q-929c
- https://nvd.nist.gov/vuln/detail/CVE-2026-109869
- https://github.com/nodejs/undici/commit/07ded4941b1e72afec862958c3b8ddf468f3b429
- https://github.com/nodejs/undici/commit/1325a87dfb3492f8e87e6b0a84b3bda4e82e3436
- https://github.com/nodejs/undici/commit/b5084c7dc239172d75c336b1cd51ddac023938a5
- https://cna.openjsf.org/security-advisories.html
- https://github.com/nodejs/undici/releases/tag/v6.29.1
- https://github.com/nodejs/undici/releases/tag/v7.30.1
- https://github.com/nodejs/undici/releases/tag/v8.12.2
- https://github.com/advisories/GHSA-xjj6-f33q-929c
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
undici vulnerable to Subresource Integrity bypass via non-lowercase algorithm tokens
CVE-2026-109841 / GHSA-f72v-6w45-q472
More information
Details
Impact
undici's fetch() verifies Subresource Integrity (SRI) metadata by looking up the algorithm token in a lowercase-only set, but the SRI specification defines a valid token by its ASCII-lowercase form. A correct but non-lowercase token such as SHA256-... or Sha256-... is therefore treated as unknown and skipped. When no recognized algorithm remains, undici treats the integrity list as empty and accepts the response, so a server that returns a body different from the pinned digest passes the check.
An application that pins a response with a valid uppercase or mixed-case SRI token receives attacker-controlled bytes with no integrity error. The attacker needs only to control the response body, not the application's integrity metadata. The issue affects response integrity only. The regression was introduced in undici 7.15.0; releases 7.14.0 and earlier lowercase the token and are not affected.
Patches
Upgrade to 7.30.1 or 8.12.2. undici now normalizes the algorithm token to ASCII lowercase before validating it and before selecting the strongest algorithm, so case variants of SHA-256, SHA-384, and SHA-512 are verified correctly.
Workarounds
Use lowercase algorithm tokens (sha256, sha384, sha512) in integrity metadata.
Severity
- CVSS Score: 5.9 / 10 (Medium)
- Vector String:
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N
References
- https://github.com/nodejs/undici/security/advisories/GHSA-f72v-6w45-q472
- https://nvd.nist.gov/vuln/detail/CVE-2026-109841
- https://github.com/nodejs/undici/commit/18bc8a1e09d15bc45815154a289dcf6fd5254d00
- https://github.com/nodejs/undici/commit/4f7ef6806e532ab9e29ccd6229b1b9d241e1b1f0
- https://cna.openjsf.org/security-advisories.html
- https://github.com/nodejs/undici/releases/tag/v7.30.1
- https://github.com/nodejs/undici/releases/tag/v8.12.2
- https://github.com/advisories/GHSA-f72v-6w45-q472
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
undici vulnerable to Denial of Service via unbounded memory in the EventSource parser
CVE-2026-109924 / GHSA-4qv8-2p9j-2685
More information
Details
Impact
undici's EventSource client can be driven to exhaust process memory by a malicious or compromised Server-Sent Events peer. By sending millions of tiny completed data: fields with no blank event separator, or a single unfinished line split across many chunks, the parser retains a growing amount of per-field and per-chunk state. The byte-based maxEventSize and maxResponseSize limits do not bound that retained state, and maxResponseSize is enforced on the compressed body before decompression, so a small compressed response can expand into enough retained memory to terminate the process. The application only needs to maintain an EventSource connection to an untrusted peer, which controls only the response. Availability is the only impact.
Patches
Upgrade to 6.29.1, 7.30.1, or 8.12.2, which bound the retained EventSource parser state (the number of data fields and buffered chunks, the unfinished-line length, and per-field byte totals) independently of the byte limits.
Workarounds
None.
Severity
- CVSS Score: 5.9 / 10 (Medium)
- Vector String:
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H
References
- https://github.com/nodejs/undici/security/advisories/GHSA-4qv8-2p9j-2685
- https://nvd.nist.gov/vuln/detail/CVE-2026-109924
- https://github.com/nodejs/undici/commit/299162740d5f39120092277e70efacb4d151c1c6
- https://github.com/nodejs/undici/commit/789ef26461c648480433846607154f52d74ec9ab
- https://github.com/nodejs/undici/commit/c43b23fdc6b37e1283d4347408bb16800f867d9e
- https://cna.openjsf.org/security-advisories.html
- https://github.com/nodejs/undici/releases/tag/v6.29.1
- https://github.com/nodejs/undici/releases/tag/v7.30.1
- https://github.com/nodejs/undici/releases/tag/v8.12.2
- https://github.com/advisories/GHSA-4qv8-2p9j-2685
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
undici WebSocket client vulnerable to Denial of Service via failed HTTP/2 handshake
CVE-2026-109855 / GHSA-qq8j-7v2v-3rwp
More information
Details
Impact
undici's experimental WebSocket client (enabled by default via allowH2: true) crashes the Node.js process when it connects to a malicious server over HTTP/2. If the server answers the WebSocket upgrade with a response that fails handshake validation, undici aborts the request, but the abort is a no-op because the request is already marked completed, so the underlying ClientHttp2Stream is left open with no error listener. When the server then destroys the connection, the orphaned stream emits an unhandled error and the process exits. A remote, unauthenticated server can therefore deny service to any client that opens a WebSocket to it over HTTP/2. undici 8.11.0 and 8.11.1 are affected; the regression was introduced in 8.11.0.
Patches
Upgrade to 8.11.2.
Workarounds
Set allowH2: false to disable HTTP/2 for WebSocket connections, or avoid opening WebSocket connections to untrusted servers, until upgrading.
Severity
- CVSS Score: 7.5 / 10 (High)
- Vector String:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
References
- https://github.com/nodejs/undici/security/advisories/GHSA-qq8j-7v2v-3rwp
- https://nvd.nist.gov/vuln/detail/CVE-2026-109855
- https://github.com/nodejs/undici/pull/5873
- https://github.com/nodejs/undici/commit/dd28c5c55f4a25f7c441fd4365b1191f96c3b8bf
- https://cna.openjsf.org/security-advisories.html
- https://github.com/nodejs/undici/releases/tag/v8.11.2
- https://github.com/advisories/GHSA-qq8j-7v2v-3rwp
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
undici WebSocket client vulnerable to Denial of Service via unbounded automatic PONG buffering
CVE-2026-109932 / GHSA-9fm3-97px-rjf6
More information
Details
Impact
undici's WebSocket client (including Node.js's bundled globalThis.WebSocket) can be driven to exhaust process memory by a malicious or compromised WebSocket server. For every PING frame received, the receiver automatically writes a PONG response to the socket and ignores the false return value from socket.write(), which is a backpressure signal, so a server that streams small PING frames while never reading the client's PONGs makes the outbound write queue and heap grow without bound until the Node.js process runs out of memory and terminates. The attack is remote and unauthenticated, needs only a normal WebSocket connection, and is asymmetric: small inbound PINGs produce a much larger retained outbound queue. Availability is the only impact. undici 5.x, 6.x, 7.x, and 8.x are affected; the WebSocket client was introduced in 5.15.0.
Patches
Upgrade to 6.29.1, 7.30.1, or 8.12.2, which pause WebSocket frame parsing when the automatic PONG response hits socket backpressure and resume on drain, bounding the outbound queue.
Workarounds
None.
Severity
- CVSS Score: 5.9 / 10 (Medium)
- Vector String:
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H
References
- https://github.com/nodejs/undici/security/advisories/GHSA-9fm3-97px-rjf6
- https://nvd.nist.gov/vuln/detail/CVE-2026-109932
- https://github.com/nodejs/undici/commit/39f93e142df03e559fe7c3d1fc7fba9beee2c185
- https://github.com/nodejs/undici/commit/53944624462b6797560288c55dbd8c66857bb495
- https://github.com/nodejs/undici/commit/b217373bb024cd93f85eb5b3ffd25684855f60f8
- https://cna.openjsf.org/security-advisories.html
- https://github.com/nodejs/undici/releases/tag/v6.29.1
- https://github.com/nodejs/undici/releases/tag/v7.30.1
- https://github.com/nodejs/undici/releases/tag/v8.12.2
- https://github.com/advisories/GHSA-9fm3-97px-rjf6
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
undici vulnerable to Denial of Service via TLS 1.2 certificate-changing renegotiation
CVE-2026-87018 / GHSA-qrxm-fqhp-jwvm
More information
Details
Impact
undici crashes the client process when a TLS 1.2 server renegotiates after the connection is established and presents a different, CA-trusted certificate whose hostname does not match the requested host. Node.js re-runs hostname verification on the renegotiated handshake and destroys the socket with ERR_TLS_CERT_ALTNAME_INVALID. undici's established socket error handler asserted that this error code could never occur, so the peer-controlled error became an uncaught AssertionError that terminates the Node.js process. Both the HTTP/1.1 and HTTP/2 paths are affected.
A malicious or compromised HTTPS endpoint reached through undici or the global fetch() can crash the client with a single server-initiated renegotiation, taking down all in-flight requests and background work in the process. Only TLS 1.2 is affected, because TLS 1.3 does not support renegotiation. Exploitation does not require a CA compromise: the attacker controls the endpoint and can present two ordinary valid certificates, the first matching the requested URL and the second intentionally not matching it.
Patches
Upgrade to undici 6.29.1, 7.30.1, or 8.12.2.
Workarounds
Restrict outbound connections to TLS 1.3, for example by setting connect: { minVersion: 'TLSv1.3', maxVersion: 'TLSv1.3' } on the client or agent, so that renegotiation cannot occur, when the target endpoints support TLS 1.3.
Severity
- CVSS Score: 7.5 / 10 (High)
- Vector String:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
References
- https://github.com/nodejs/undici/security/advisories/GHSA-qrxm-fqhp-jwvm
- https://nvd.nist.gov/vuln/detail/CVE-2026-87018
- https://github.com/nodejs/undici/commit/12cfd96c3f430897656e3edc1c5e02be8c1cd309
- https://github.com/nodejs/undici/commit/b40fbfc0651703cf9fa9f6ced68b679f28d8bb28
- https://github.com/nodejs/undici/commit/e257e9f8fb42eedd50727b9cf65e548c8925e4a8
- https://cna.openjsf.org/security-advisories.html
- https://github.com/nodejs/undici/releases/tag/v6.29.1
- https://github.com/nodejs/undici/releases/tag/v7.30.1
- https://github.com/nodejs/undici/releases/tag/v8.12.2
- https://github.com/advisories/GHSA-qrxm-fqhp-jwvm
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
undici vulnerable to TLS certificate validation bypass via dropped tls options in Agent
CVE-2026-109383 / GHSA-2m5v-pch6-74hx
More information
Details
Impact
undici's Agent passes its constructor options through a JSON-based deep clone (JSON.parse(JSON.stringify(...))) before forwarding them to each per-origin Pool. JSON cannot represent functions, so a caller-supplied tls option containing a checkServerIdentity callback is silently dropped before it reaches the TLS layer. As a result, a TLS peer whose certificate a custom checkServerIdentity was written to reject, but which passes Node's default hostname and chain checks, is silently accepted when the request is made through Agent. Because Agent is the default dispatcher behind request, fetch, and setGlobalDispatcher, this is the path most applications use. EnvHttpProxyAgent is also affected on its direct and NO_PROXY routes, which delegate to an internal Agent.
Only applications that pass a function-valued tls option (such as a custom checkServerIdentity for certificate or public-key pinning) are affected. Passing the same options through connect is not affected. This is the Agent counterpart of the BalancedPool certificate validation bypass fixed in CVE-2026-84961.
Patches
Upgrade to undici 6.29.1, 7.30.1, or 8.12.2. Agent now preserves the tls option outside the JSON clone, so custom TLS verification callbacks are forwarded to each origin unchanged.
Workarounds
Pass the TLS options through connect instead of tls. For proxied EnvHttpProxyAgent destinations, use requestTls / proxyTls.
Severity
- CVSS Score: 7.4 / 10 (High)
- Vector String:
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
References
- https://github.com/nodejs/undici/security/advisories/GHSA-2m5v-pch6-74hx
- https://nvd.nist.gov/vuln/detail/CVE-2026-109383
- https://github.com/nodejs/undici/commit/04cb74b1db131ff8f5b4557dce811cbf5f4664b4
- https://github.com/nodejs/undici/commit/8c59f6b302898cb2e9b0f7962cd7212b6e597c9f
- https://github.com/nodejs/undici/commit/f75eac00ac177f7b2e6c8bfbd52d4113164286e6
- https://cna.openjsf.org/security-advisories.html
- https://github.com/nodejs/undici/releases/tag/v6.29.1
- https://github.com/nodejs/undici/releases/tag/v7.30.1
- https://github.com/nodejs/undici/releases/tag/v8.12.2
- https://github.com/advisories/GHSA-2m5v-pch6-74hx
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
undici vulnerable to cache poisoning and cross-user disclosure via cross-origin redirects
CVE-2026-109829 / GHSA-4w7w-5xrc-9h26
More information
Details
Impact
When an originless Agent composes the redirect and cache interceptors as compose(redirect(), cache()) with a shared cache (type: 'shared'), the cache builds its key from the original request URL before the redirect handler changes the origin. The response produced after a redirect is then stored under the original key, even when the redirect crossed to a different origin.
An attacker who controls the target of a redirect from a trusted URL can have their response cached under that trusted URL. A later caller requesting the trusted URL receives the attacker's body from the shared cache without either origin being contacted, allowing persistent cache poisoning. The same key confusion also discloses private data: when an authenticated request returns a private, no-store redirect to a user-specific resource, the final response is stored under the original URL and can be served to a later unauthenticated caller.
The cache interceptor was introduced in undici 7.0.0, and all 7.x and 8.x releases before the patched versions are affected. Applications are affected only when an originless Agent, a shared MemoryCacheStore or SqliteCacheStore, and the composition compose(redirect(), cache()) are all used. Origin-bound Client and Pool dispatchers, and the reverse composition compose(cache(), redirect()), are not affected.
Patches
Upgrade to 7.30.1 or 8.12.2. Before storing a response, undici now verifies that the origin that produced it still matches the cache key, and preserves each redirect hop's cache-control policy, so cross-origin redirect responses and responses behind a no-store or private hop are no longer cached under the original key.
Workarounds
Compose the interceptors as compose(cache(), redirect()), use per-origin dispatchers and cache stores, or disable shared caching on redirect-capable requests.
Severity
- CVSS Score: 7.4 / 10 (High)
- Vector String:
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
References
- https://github.com/nodejs/undici/security/advisories/GHSA-4w7w-5xrc-9h26
- https://nvd.nist.gov/vuln/detail/CVE-2026-109829
- https://github.com/nodejs/undici/commit/26c2bfb3def0b67241ce878e80657ed5d6c3efa8
- https://github.com/nodejs/undici/commit/b20b82ad80a405a12b6ce1f341bcd418de390aa0
- https://cna.openjsf.org/security-advisories.html
- https://github.com/nodejs/undici/releases/tag/v7.30.1
- https://github.com/nodejs/undici/releases/tag/v8.12.2
- https://github.com/advisories/GHSA-4w7w-5xrc-9h26
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
undici vulnerable to Denial of Service via unhandled exception in the decompress interceptor
CVE-2026-87029 / GHSA-55wc-3pg8-jfw6
More information
Details
Impact
undici's decompress interceptor forwards decompressed response data to the downstream handler from zlib stream event callbacks without catching exceptions those callbacks may throw. undici's engine converts a synchronous throw from a downstream handler into a per-request failure, but that protection is not in place when the throw happens asynchronously from a zlib callback. As a result, a downstream handler that throws by design, for example the built-in dump interceptor which throws when a response exceeds its maxSize, escapes as an uncaught exception and terminates the Node.js process.
A malicious or compromised HTTP server can crash any client that composes the decompress interceptor with dump (or another response handler that throws), by returning a small compressed body that decompresses to more than the configured limit. The compressed bytes on the wire are tiny, so only the decompressed size matters. If the application keeps the process alive with a global uncaught-exception handler, the affected request instead hangs until the body timeout.
Patches
Upgrade to undici 7.30.1 or 8.12.2.
Workarounds
Avoid composing the decompress interceptor with a response handler that throws during response processing (such as dump with a maxSize) until upgrading.
Severity
- CVSS Score: 5.9 / 10 (Medium)
- Vector String:
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H
References
- https://github.com/nodejs/undici/security/advisories/GHSA-55wc-3pg8-jfw6
- https://nvd.nist.gov/vuln/detail/CVE-2026-87029
- https://github.com/nodejs/undici/commit/63cba7712ca012b2603c6aeeb4c72d8692332cd0
- https://github.com/nodejs/undici/commit/f851f315db1f2acce0ea668f88d9d0fa61c8420c
- https://cna.openjsf.org/security-advisories.html
- https://github.com/nodejs/undici/releases/tag/v7.30.1
- https://github.com/nodejs/undici/releases/tag/v8.12.2
- https://github.com/advisories/GHSA-55wc-3pg8-jfw6
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
nodejs/undici (undici)
v8.12.2
Security fixes
High severity
Denial of service via TLS 1.2 certificate-changing renegotiation
CVE-2026-87018 · GHSA-qrxm-fqhp-jwvm
A malicious or compromised HTTPS server could crash the Node.js process by initiating TLS 1.2 renegotiation and presenting a different, CA-trusted certificate whose hostname did not match the requested host. The resulting socket error reached an assertion in undici's HTTP/1.1 and HTTP/2 connection handling. This release handles post-connect certificate errors without terminating the process.
TLS certificate validation bypass through dropped Agent options
CVE-2026-109383 · GHSA-2m5v-pch6-74hx
Agent used a JSON-based clone for constructor options, which silently removed function-valued TLS options such as checkServerIdentity. Applications relying on custom certificate or public-key verification could therefore accept a certificate that the callback was intended to reject. This release preserves TLS options when creating per-origin dispatchers.
Cache poisoning and cross-user disclosure through cross-origin redirects
CVE-2026-109829 · GHSA-4w7w-5xrc-9h26
When an originless Agent combined redirect and shared-cache interceptors as compose(redirect(), cache()), a response from a cross-origin redirect could be stored under the original URL. This could allow persistent cache poisoning or disclosure of user-specific responses to later callers. This release verifies the response origin before caching and preserves redirect-hop cache-control policy.
Denial of service through excessive Content-Encoding values
CVE-2026-109869 · GHSA-xjj6-f33q-929c
A malicious HTTP server could crash the Node.js process by returning more than five content codings and closing the connection before sending the body. Although fetch() rejected the response, an error from an orphaned internal stream could remain unhandled. This release validates the content-encoding chain before creating the body stream and aborts oversized chains safely.
Medium severity
Denial of service through the decompress interceptor
CVE-2026-87029 · GHSA-55wc-3pg8-jfw6
An exception thrown by a downstream response handler from an asynchronous decompression callback could escape as an uncaught exception. A server could trigger this when decompress was composed with a handler such as dump with a size limit. This release converts downstream handler exceptions into per-request errors.
Subresource Integrity bypass with non-lowercase algorithm tokens
CVE-2026-109841 · GHSA-f72v-6w45-q472
fetch() treated valid mixed-case or uppercase SRI algorithm tokens, such as SHA256, as unknown and could accept a response whose body did not match the configured digest. This release normalizes algorithm tokens before validation and digest selection.
Denial of service through unbounded EventSource parser state
CVE-2026-109924 · GHSA-4qv8-2p9j-2685
A malicious Server-Sent Events endpoint could exhaust process memory by sending many tiny data: fields without completing an event, or by splitting an unfinished line across many chunks. This release bounds retained EventSource parser state, including field counts, buffered chunks, unfinished-line length, and retained field data.
Denial of service through unbounded automatic WebSocket PONG buffering
CVE-2026-109932 · GHSA-9fm3-97px-rjf6
A malicious WebSocket server could exhaust process memory by flooding the client with PING frames while not reading the automatic PONG responses. undici previously ignored socket backpressure and allowed the outbound queue to grow without bound. This release pauses frame parsing when PONG writes encounter backpressure and resumes after the socket drains.
Full Changelog: nodejs/undici@v8.12.1...v8.12.2
v8.12.1
What's Changed
- fix: restore build:wasm npm script by @mcollina in #6009
- test: add unexpected disconnect guards to http2-body-delete.js by @Kesavamoorthig06 in #5970
New Contributors
- @Kesavamoorthig06 made their first contribution in #5970
Full Changelog: nodejs/undici@v8.12.0...v8.12.1
v8.12.0
What's Changed
- fix(cookies): ignore a numeric expires outside the Date range by @xia-chao in #5832
- fix(http2): pause bodyTimeout while applying backpressure by @jasnell in #5884
- fix(cache): track cached response abort state by @mcollina in #5820
- fix(deduplicate): make terminal callbacks exception-safe by @mcollina in #5838
- fix(decompress): stop inflating compress and x-compress by @luantaraschi in #5665
- fix(cache): evict least recently used entries in MemoryCacheStore by @jasnell in #5869
- fix(eventsource): fix redirect targets in eventsource by @jasnell in #5878
- fix(redirect): fix throwOnMaxRedirect edge by @jasnell in #5879
- fix: normalize HTTP/2 headers for legacy dispatch handlers by @Knowzzz in #5867
- fix(session cache): fix bug in tls session caching by @jasnell in #5882
- docs: fix relative links broken by the README move by @v1teka in #5843
- fix(redirect): add error code to max redirects error by @mcollina in #5895
- fix(eventsource): fix retry wrap bug by @jasnell in #5875
- fix(retry): keep request headers when resuming a download by @jasnell in #5870
- fix(proxyagent): correct handling of the host header by @jasnell in #5868
- fix(http1): fix handling of 204/304 responses by @jasnell in #5864
- test: add unexpected disconnect guards to two more h2 tests by @zeexzeex in #5825
- fix(cache): preserve 304 response event order with async stores by @marcopiraccini in #5797
- fix(dns): handle a null pick, and stop failing over to an expired record by @datrixlab in #5791
- fix: keep a header named proto across features by @luantaraschi in #5688
- ci: exclude tests from CodeQL analysis by @mcollina in #5905
- fix(pool): ensure that removed clients don't pick up requests by @jasnell in #5881
- feat: Added @perseveranza-pets/milo as alternative experimental HTTP parser by @ShogunPanda in #5492
- extractBody fixes 2 by @KhafraDev in #5926
- reenable cachestorage wpts by @KhafraDev in #5907
- fix(fetch): parse language tag in filename* parameters by @fallintoplace in #5908
- fix(client): preserve tracked response header field boundaries by @ronag in #5940
- fix(http1): fixup strictContentLength handling by @jasnell in #5897
- feat(cache): compress big sqlite cache entries with zstd by @mcollina in #5744
- fix(eventsource): enforce maxEventSize on unterminated lines by @mcollina in #5814
- limit zstd window size to 8 MB by @KhafraDev in #5955
- test: add unexpected disconnect guards to http2-body.js by @GhostCoder6969 in #5914
- test: fix "specifiy" typo in cache interceptor test by @ump45nose in #5922
- Wpt/wpt runner fixes by @KhafraDev in #5959
- fix(h2): unref a session detached by GOAWAY with no open streams by @kjsik11 in #5960
- feat: Throw an error when WebAssembly is not available. by @ShogunPanda in #5966
- chore: Vendor milo 0.9.0. by @ShogunPanda in #5954
- build(deps-dev): bump ws from 8.21.3 to 8.22.0 by @dependabot[bot] in #5968
- build(deps-dev): bump undici from 6.28.0 to 6.29.0 by @dependabot[bot] in #5933
- fix(typemap):
.md->.htmlby @avivkeller in #5602 - build(deps): bump js-yaml from 4.1.1 to 4.3.2 by @dependabot[bot] in #5810
- build(deps): bump brace-expansion by @dependabot[bot] in #5934
- build(deps-dev): bump fast-check from 4.10.1 to 4.10.2 by @dependabot[bot] in #5921
- test(fetch): settle h2 internal stream errors by @Yahiro025 in #5927
- docs(errors): clarify timeout error codes and related options by @theamodhshetty in #4856
- fix(interceptor): limit response error body size by @mcollina in #5942
- build(deps): bump codecov/codecov-action from 7.0.0 to 7.1.1 by @dependabot[bot] in #5946
- build(deps): bump hendrikmuhs/ccache-action from 1.2.23 to 1.2.24 by @dependabot[bot] in #5951
- build(deps): bump github/codeql-action/analyze from 4.37.9 to 4.38.2 by @dependabot[bot] in #5952
- build(deps): bump github/codeql-action/autobuild from 4.37.9 to 4.38.2 by @dependabot[bot] in #5950
- build(deps): bump github/codeql-action/init from 4.37.9 to 4.38.2 by @dependabot[bot] in #5948
- build(deps): bump github/codeql-action/upload-sarif from 4.37.9 to 4.38.2 by @dependabot[bot] in #5947
- build(deps): bump actions/checkout from 7.0.0 to 7.0.1 by @dependabot[bot] in #5630
- fix(http1): reset connections for no-body transfer encoding by @mcollina in #5941
- fix: exclude experimental milo from node.js core bundle by @mcollina in #5935
- test: re-enable HTTP/2 churn test on Node.js 26 by @mcollina in #5961
- test: keep the h2c unix socket path within sun_path limits by @mcollina in #5978
- fix(cache): preserve abort reasons after completion by @domenic in #5958
- test: update milo paths in bundle-parser test by @mcollina in #5979
- fix(cache): always treat zero-lifetime entries as stale by @mcollina in #5980
- build(deps): bump step-security/harden-runner from 2.21.0 to 2.21.1 by @dependabot[bot] in #5949
- fix(websocket,eventsource): keep receive limits behind dispatcher wrappers by @jasnell in #5896
- fix(http2): enforce max concurrent streams by @jasnell in #5885
- docs: sync WG collaborators with nodejs/undici team by @mcollina in #5991
- build(deps-dev): bump @fastify/busboy from 3.2.2 to 3.2.3 by @dependabot[bot] in #6005
- fix: ignore missing release ref during cleanup by @mcollina in #5891
- fix: reject unsupported FormData request bodies by @mcollina in #5913
- split wpt out of npm test by @mcollina in #5588
New Contributors
- @xia-chao made their first contribution in #5832
- @jasnell made their first contribution in #5884
- @Knowzzz made their first contribution in #5867
- @v1teka made their first contribution in #5843
- @datrixlab made their first contribution in #5791
- @fallintoplace made their first contribution in #5908
- @GhostCoder6969 made their first contribution in #5914
- @ump45nose made their first contribution in #5922
Full Changelog: nodejs/undici@v8.11.2...v8.12.0
v8.11.2
What's Changed
- fix: close rejected HTTP/2 WebSocket handshake streams by @mcollina in #5873
- fix: avoid reconnecting aborted requests by @Junaid-PK in #5846
New Contributors
- @Junaid-PK made their first contribution in #5846
Full Changelog: nodejs/undici@v8.11.1...v8.11.2
v8.11.1
What's Changed
- deslopify websocket test by @KhafraDev in #5851
- Revert "fix: preserve HTTP/2 for legacy fetch consumers" by @mcollina in #5860
- fix websocketstream bugs by @KhafraDev in #5863
- fix hang on 3xx response with large body by @KhafraDev in #5850
- docs: warn about buffering response bodies by @mcollina in #5872
- test: cover native fetch gzip decoding through the legacy bridge by @mcollina in #5874
Full Changelog: nodejs/undici@v8.11.0...v8.11.1
v8.11.0
What's Changed
- fix: complete upgrade diagnostics lifecycle by @BridgeAR in #5761
- build(deps): bump step-security/harden-runner from 2.19.4 to 2.21.0 by @dependabot[bot] in #5753
- fix(decompress): join a repeated content-encoding header by @luantaraschi in #5664
- fix(cookies): keep a cookie named proto in getCookies by @luantaraschi in #5663
- build(deps-dev): bump jest from 30.5.0 to 30.5.1 by @dependabot[bot] in #5784
- build(deps): bump got from 15.1.0 to 16.0.0 in /benchmarks by @dependabot[bot] in #5785
- fix: selectively re-enable SIMD for ppc64 by @richardlau in #5776
- use private fields for brand checks by @KhafraDev in #5792
- fix(h2): do not unref a session with open streams by @kjsik11 in #5782
- fix(h2): avoid pool fan-out during ALPN negotiation by @mcollina in #5799
- fix issue #5715 by @KhafraDev in #5805
- ci: extend macOS Node.js workflow timeout by @mcollina in #5775
- fix(env-http-proxy-agent): NO_PROXY wildcard semantics by @mcollina in #5777
- fix(h2): do not replay a request whose response already started after GOAWAY by @kjsik11 in #5788
- test: skip HTTP/2 churn test on Node.js 25 on all platforms by @kjsik11 in #5790
- fix(proxy-agent): preserve repeated iterable headers by @GiHoon1123 in #5779
- docs(errors): document ProxyConnectionError (UND_ERR_PRX_CONN) by @kilisamemarisaaa in #5781
- dataurl parsing improvements + update WPT by @KhafraDev in #5812
- fix(decompress): treat inherited Object.prototype names as unsupported encodings by @NgoQuocViet2001 in #5807
- test(h2): stabilize http2-connection by @ViniciusDev26 in #5801
- fix: preserve HTTP/2 for non-upgrade legacy requests by @mcollina in #5811
- fix: skip drain dispatch for clientTtl-evicted clients in PoolBase by @vwong in #5677
- chore: update tests blocking release by @vwong in #5828
- build(deps): bump uWebSockets.js from v20.68.0 to v20.70.0 in /benchmarks by @dependabot[bot] in #5824
- fix(deduplicate): settle requests when composed with retry by @mcollina in #5817
- fix(cache): do not report aborted on successful cache hits by @Yahiro025 in #5819
- fix(cookies): keep an Expires of 0 when serializing a cookie by @NgoQuocViet2001 in #5808
- fix: honor backpressure in decompression interceptor by @mcollina in #5829
- fix(h2): validate h2Options.maxConcurrentStreams itself by @kjsik11 in [#5830](https://redirect.github.com/nodejs/undici
[!IMPORTANT]
✂ PR body was truncated to here.
Configuration
📅 Schedule: (UTC)
- Branch creation
- At any time (no schedule defined)
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Changes
- Passes the issue author login to the needs-repro step through
env:and reads it as$USER_LOGINin the script.
Testing
- None, CI-only change.
Docs
- Not needed.

Fixes #18516.
When a second navigation starts before the previous view transition is ready, abortAndRecreateMostRecentTransition() calls skipTransition() on the pending transition. skipTransition() does not throw — it rejects viewTransition.ready with an AbortError. The try/catch around the call never covers that rejection, so it surfaces as an unhandled promise rejection in the browser console and fires any global unhandledrejection listener (error trackers, test runners).
The fix adds .catch(() => {}) on viewTransition.ready immediately before skipTransition(). This registers a handler for the rejection before it is created, silencing it. The stale comment ("might throw AbortError DOMException") is replaced with one that describes the actual behaviour.
The second navigation still completes normally — the only observable change is that the AbortError is no longer unhandled.

Changes
with fontProviders.npm({ remote: false }), unifont resolves installed font files to file:// URLs. the fonts pipeline only reads absolute paths from disk, so those URLs went to fetch() and dev and build failed with CannotFetchFontFile.
the npm provider now converts them to paths with fileURLToPath, same as the local provider, so they're read, hashed and watched as local files. this is the Astro side of #16218, the unifont side was fixed in August.
Testing
new case in providers.test.ts that installs a fake @fontsource package in a fixture, resolves it with remote: false and checks the font file comes back as an absolute path. fetch throws in that test, so it also covers that nothing goes to the network.
Docs
no docs change, this makes remote: false behave the way it's already documented.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @netlify/blobs (source) | ^11.1.4 → ^11.1.6 |
||
| @netlify/functions (source) | ^6.0.2 → ^6.0.3 |
||
| devalue | ^6.0.2 → ^6.0.3 |
Release Notes
netlify/primitives (@netlify/blobs)
v11.1.6
Dependencies
- The following workspace dependencies were updated
- dependencies
- @netlify/otel bumped from ^7.0.5 to ^7.0.6
- dependencies
v11.1.5
Dependencies
- The following workspace dependencies were updated
- dependencies
- @netlify/dev-utils bumped from 6.0.3 to 6.0.4
- @netlify/otel bumped from ^7.0.4 to ^7.0.5
- dependencies
netlify/primitives (@netlify/functions)
v6.0.3
Dependencies
- The following workspace dependencies were updated
- dependencies
- @netlify/types bumped from 3.2.0 to 3.3.0
- dependencies
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| devalue | ^6.0.2 → ^6.0.3 |
||
| linkedom | ^0.18.13 → ^0.18.14 |
||
| preact (source) | ^11.0.1 → ^11.0.2 |
Release Notes
preactjs/preact (preact)
v11.0.2
Fixes
- Keep queued components updating and finish
act()cleanup after an uncaught render error (#5265, thanks @JoviDeCroock) - Correct the browser ESM entry point for
preact/compat/server(#5304, thanks @rschristian) - Retain deferred hydration ranges through suspension, resumption, and unmounting (#5315, thanks @JoviDeCroock)
- Leave non-plain style objects untouched in compat, preserving string-valued signal styles (#5318, thanks @JoviDeCroock)
- Prevent duplicate DOM after an uncaught render error (#5328, thanks @brevin-aq and @JoviDeCroock)
Types
- Improve accessibility discriminated unions for dynamic input and select props (#5311, thanks @rschristian)
- Make accessible element attribute types the default (#5312, thanks @rschristian)
- Correct
createRefnullability and remove its defaultanytype (#5326, thanks @rschristian)
Performance
- Reduce core diff bundle size (#5316, thanks @JoviDeCroock)
- Trim core scheduling and DOM bookkeeping (#5317, thanks @JoviDeCroock)
- Reduce core bundle size (#5319, thanks @JoviDeCroock)
Maintenance
- Add a Drydock badge and remove the broken Brotli badge (#5307, thanks @JoviDeCroock)
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Changes
Fixes #18479.
Problem
When a component inside <body> calls Astro.csp.insertScriptHash(), its hash can be missing from the CSP <meta> tag because the tag is rendered before the component runs.
Layouts with <slot name="head" /> previously avoided this issue because asynchronous slot rendering buffered the body before the head was flushed. #17857 allowed synchronous slots to stay synchronous
Fix
For non-streaming renders, this PR delays generating the CSP <meta> tag until the whole page has rendered:
- The head writes a placeholder comment where the CSP
<meta>tag belongs. - After rendering completes,
renderPagereplaces the placeholder with the final tag, including hashes registered by body components.
This builds moves the replacement logic to renderPage so the fix covers both .astro and MDX pages.
Scope
This fix covers non-streaming renders. In streaming SSR, hashes registered after the head has been sent cannot be added to its CSP <meta> tag. A warning for those calls could be added in a follow-up.
Docs
No documentation changes are needed. The docs already describe using Astro.csp inside components.

Changes
- In
astro dev,view-transition-namestyles generated bytransition:nameare now correctly emitted when the component is only reachable through another component that has no styles, scripts, or CSS imports of its own. Previously,Menu.astro(which renders<Dot />) would staypropagation: 'none'becauseDot.astro's metadata wasn't available yet atresolveIdtime, causing the transition scope style to arrive too late and be dropped from<head>. - The
transformhook inpackages/astro/src/vite-plugin-head/index.tsnow walks a module's importers (and their ancestors) and marks themin-treewhen the transformed module carriesself/in-treepropagation. This mirrors the full-graph analysis thatastro buildalready performs, making dev behaviour consistent.
Testing
- New unit test added in
packages/astro/test/units/vite-plugin-head/head-metadata.test.tscovering the case where atransition:namecomponent is reached only through a non-propagating parent — verifying that the parent is correctly promoted toin-treepropagation after the child is transformed.
Docs
- No docs update needed; this is a dev-server-only bug fix with no API or behaviour changes visible to users beyond the bug being resolved.
Closes #18509

Changes
Adds .tif as an accepted image extension, next to .tiff. Tools like Lightroom and darktable export TIFFs as .tif, so those files currently have to be renamed before Astro treats them as images.
VALID_SUPPORTED_FORMATS is unchanged. It's checked against the detected format, which is still 'tiff', so image services see no difference.
ImageInputFormat is derived from VALID_INPUT_FORMATS, so it now also includes 'tif'. However, ImageMetadata.format is still 'tiff' at runtime, similar to 'jpeg' being detected as 'jpg'. Keeping 'tif' out of the type would need a separate extension list, which seemed like overkill for adding an alias.
Testing
- Integration (
test/core-image.test.ts,supports .tif): a new fixture page imports a 2×3.tifand renders it with<Image>. In dev, the test checks thatformatis'tiff', thatwidth/heightare read from the file, and that the optimizedsrcloads. - Unit (
test/units/assets/utils.test.ts):imageSrcToImportId(used for content collection images) returns an import ID for./photo.tif, where it previously returnedundefined.
Docs
Docs left unchanged. The astro:assets reference documents the possible values of ImageMetadata.format, and TIFF images report 'tiff' at runtime regardless of extension.

Changes
<ClientRouter />now passesbehavior: 'instant'to all scroll-restorescrollTocalls inmoveToLocation()and on page reload. Previously, omittingbehaviorcaused these calls to inherit CSSscroll-behavior: smooth, producing a visible animated scroll to the saved position on back/forward navigation. The browser restores scroll instantly in the same scenario, so this brings<ClientRouter />in line with native behavior.- Anchor (
#hash) navigation is unaffected because it does not go through thesescrollTocalls.
Testing
- Added an e2e test in
packages/astro/e2e/view-transitions.test.tscovering back/forward scroll restoration withscroll-behavior: smoothapplied tohtml. The test asserts thatscrollYreaches the saved position in at most one animation frame (i.e., no intermediate animated values).
Docs
- No docs update needed; this is a bug fix that aligns
<ClientRouter />with existing browser behavior, not a new option or API.
Closes #18505

Changes
<Picture>no longer emits a duplicate1xcandidate in<source>srcsetwhendensitiesincludes1. Previously, the component always prepended a plain (descriptorless, implicitly1x)image.srcto the srcset, and thengetSrcSetwould also produce an explicit1xentry for the same URL, resulting in invalid markup (X, X 1x, Y 2x).- The plain base candidate is now added only when the srcset does not already contain a
1xentry. This preserves existing behavior fordensities={[2]}(the base candidate is still included as the implicit1xfallback) while eliminating the duplicate whendensities={[1, 2]}.
Testing
- Added a fixture case in
packages/astro/test/core-image.test.tsasserting thatdensities={[1, 2]}produces exactly1x, 2xin the<source>srcset with no extra descriptorless candidate. The test fails without the fix and passes with it.
Docs
- No docs update needed; this is a bug fix for invalid HTML output with no API changes.
Closes #18501

astro build was resetting the last-modified date on two classes of output files.
Root cause 1, public/ directory. Vite copies the public directory internally and does not forward mtime or atime. Every copied file ends up with the build timestamp rather than the source timestamp.
Root cause 2, Font files. The font plugin wrote fonts from an in-memory Buffer via writeFileSync, which always creates a fresh file with the current timestamp. The disk cache already held the font with the correct source mtime, but it was never consulted at write time.
What changed.
-
packages/astro/src/core/fs/index.ts: AddedcopyTimestamps(srcDir, destDir). It walkssrcDirrecursively and for each file callsfs.promises.utimes(destFile, atime, mtime)to copy the timestamp from the source tree. Files missing indestDir(e.g. files filtered by Vite) are silently skipped viaENOENThandling. -
packages/astro/src/core/build/static-build.ts: After the client bundle build, callscopyTimestamps(settings.config.publicDir, outDir)to restore source timestamps on all public/ files. -
packages/astro/src/assets/fonts/vite-plugin-fonts.ts: Changed font copying to callfontFetcher.fetch()(which populates the disk cache), thencopyCachedFile(cacheFile, destFile)instead ofwriteFileSync(destFile, data).copyCachedFilealready callsutimesafter copying, so the cachemtimeis preserved end-to-end. Dropped the unusedwriteFileSyncimport.
Verified. Logic confirmed by code review. The copyTimestamps helper mirrors the existing copyCachedFile pattern already used in the image pipeline. The font-path change has the same observable behavior since fontFetcher.fetch() always caches before returning.
Fixes #18483
🤖 Generated with Claude Code
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@astrojs/starlight@0.42.8
Patch Changes

Changes
baseService.getSrcSet()now removes duplicate density values before building srcset candidates. Previously, equivalent inputs like[1, '1x', 2]or[1, 1, 2]produced duplicate descriptors (e.g.1x, 1x, 2x), violating the HTML spec's prohibition on duplicate density descriptors.- The fix wraps the parsed density values in
Array.from(new Set(...))before sorting, matching the deduplication already applied to thewidthsbranch of the same function. Only the emitted markup changes — no extra image files are generated.
Testing
- New unit test cases added to
packages/astro/test/units/assets/getImage.test.tscovering mixed numeric/string duplicates ([1, '1x', 2]), repeated numbers ([1, 1, 2]), and repeated strings (['1x', '1.0x', 2]), asserting that each density produces exactly one srcset candidate.
Docs
- No docs update needed; this is a bug fix for undocumented internal deduplication behavior.
Closes #18496
Description
This PR cherry picks a change from #4218 (comment) which is also needed in #4175 so we can land it independently of those two PRs.

Changes
- Failed
fetch()calls in the generated server island client script no longer surface asUncaught (in promise) TypeError. Previously, when a fetch rejected (network drop, aborted navigation, blocked cross-origin redirect), the top-levelawaitin the island module would throw unhandled, polluting error trackers even though the fallback content remained visible. Both the GET and POST island fetch calls now append.catch(() => {}), andreplaceServerIslandreturns early on a missing response or a failedr.text()read, keeping the fallback silently. - The
returnstatement suggested in the issue cannot be used at module top-level; the.catch(() => {})approach achieves the same effect without a syntax error.
Testing
- Extended
packages/astro/test/units/server-islands/server-islands-render.test.tsto cover the case wherefetchrejects, asserting that no error is thrown and the fallback content is preserved.
Docs
- No docs update needed; this is an internal error-handling fix with no new public API or configuration surface.
Closes #18495

Changes
- Astro 7.4.2 raised the Node.js minimum to
>=22.23.4for a security patch release, which broke StackBlitz WebContainers (stuck on Node 22.22.3 with no user control). Everyastrocommand now exits with "Node.js is not supported" on StackBlitz, which is the official reproduction path via astro.new. - Restores the WebContainer exception introduced in #15264: when
process.versions.webcontaineris set, the CLI uses>=22.22.0instead of>=22.23.4. Normal Node.js installations keep the stricter security minimum unchanged.
Testing
- No automated tests were added. The version check lives in top-level code in
bin/astro.mjswith no importable surface, and CI's Node versions (22.23.4 and 24) can't reproduce the failure path. The fix was verified by simulatingprocess.versions.webcontaineragainst the version satisfier.
Docs
- No docs update needed; this is a CLI compatibility guard with no user-facing API change.
Closes #18492

Changes
- Unused Astro components imported through a barrel file no longer contribute their scoped CSS to the bundle. In Rolldown (Astro 7),
$$createComponentcalls were not treated as pure, so Rolldown marked the component'sdefaultexport as rendered even when nothing on the page actually used it — causing Vite'scssScopeTotree-shaking to keep the associated CSS. Settingtreeshake.manualPureFunctions: ['$$createComponent']in the Rolldown options lets Rolldown drop those unused exports and Vite then drops their scoped styles. - User-supplied
treeshakeoptions are merged in so custom configurations are preserved;treeshake: falseis left untouched.
Testing
- A new unit test in
packages/astro/test/units/build/vite-build-config.test.tschecks that$$createComponentappears inmanualPureFunctionsin the generated Rolldown options. - The existing barrel-styles integration fixture (
packages/astro/test/fixtures/0-css/.../barrel-styles) gains a new assertion inpackages/astro/test/0-css.test.tscovering components whose frontmatter referencesAstro.self, which is the pattern that triggered the regression.
Docs
- No docs update needed; this is an internal build-config fix with no user-facing API changes.
Closes #18491

Changes
Add diagnostic reporters to astro check for terminal output, scripts, and CI artifacts. Following Biome's reporter flags, --reporter selects how diagnostics and the run summary are written. Reports go to stdout unless an adjacent --reporter-file selects a file.
# JSON on stdout
npx astro check --reporter=json
# SARIF file only
npx astro check --reporter=sarif --reporter-file=reports/astro.sarif
# Live terminal diagnostics and a SARIF file
npx astro check --reporter=default --reporter=sarif --reporter-file=reports/astro.sarifSupported formats are default, json, sarif, junit, and checkstyle. Repeat reporter/file groups for multiple outputs; a file flag without an adjacent reporter selects default plain text. Existing commands without reporter flags keep their default output.
- Route Astro startup, telemetry notification, and sync logs to stderr when there is no default stdout reporter. Suppress default diagnostics, summaries, and watch control sequences in structured output. Node and JSON logger handlers accept an explicit output stream.
- Preserve diagnostic codes, source locations, severity filtering, and exit status. JSON uses a documented versioned structure; SARIF uses UTF-16 columns and encoded file URIs. Each JUnit report contains one test whose failure follows the full results and
--minimumFailingSeverity. - Resolve file paths from the working directory, create missing parent directories, and overwrite after completed checks. Cancelled or superseded checks preserve the previous report; report files are excluded from watching. Structured watch stdout emits consecutive completed report documents.
- Expose a
reportersarray in the JavaScript API, plusreporter/reporterFilefor a single output. Include a minor changeset for@astrojs/checkand a patch changeset for Astro's CLI integration.
Docs
I've updated package README and linked reporting guide cover formats, stdout/file routing, repeated flags, JSON structure, severity mappings, CLI/API usage, paths, watch mode, and failures. CLI help is generated from the options.
The website CLI reference needs the corresponding options documented before release.

Fixes #18487
When CSP meta tags are on, createResult hashed children for every head style and script. External stylesheets and module scripts are stored as { props: { href|src }, children: '' }, so every page got 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=' (the SHA-256 of the empty string) in script-src and style-src.
A hash in those directives makes 'unsafe-inline' ignored, so a project that relied on it for inline styles or scripts would lose that without asking.
Only entries with actual inline content (and no href/src) are hashed now.
Test plan
- Unit test: external stylesheet + hoisted script with empty children do not emit the empty-string hash
Description
- Closes #4289
- With
lastUpdatedenabled, production builds read file names fromgit log --name-status. Git quotes and octal-escapes file names that contain non-ASCII characters by default (core.quotePath), for example"caf\303\251.md"forcafé.md. These names never matched the page file paths, so pages such aszh-cn/指南.mdrendered without a last updated date. The development server was not affected. - This PR runs the command with
-c core.quotePath=falseso git prints these file names verbatim. - The existing
getAllNewestCommitDatetests now include a file with non-ASCII characters in its name. Both tests fail without the fix and pass with it. - No visual changes.

Summary
- Apply host validation to Astro development request handling.
- Fall back to the local host when
allowedDomainsis absent, empty, or the incoming host fails validation. - Add unit and integration tests for development host handling.
Validation
The Phase 6 report records the following results:
- Unit tests: 13/13 passed.
- Integration tests: 6/6 passed.
- Biome check: passed.
- Type checks: passed.
- Staged diff whitespace check: passed.
These results are based on the recorded local validation report.
Scope and limitations
This change is proposed as defense in depth / hardening. The current evidence does not establish a confirmed exploitable vulnerability, CVE, zero-day, or bounty eligibility.
The change is submitted for maintainer review. Compatibility implications for custom development hosts should be considered, particularly when allowedDomains is not configured.
No merge or release is requested as part of this submission.

Changes
- Fixes duplicate
React.useId()values whenexperimentalDisableStreamingis enabled.renderToStringwas called without the per-componentidentifierPrefix, so every component started from the same id, and islands hydrated with a prefix the server HTML did not have. - Passes the existing
renderOptionstorenderToString, as the streaming paths already do. #6976 added the prefix for #6849 before the option from #13036 existed.
Testing
- Adds
react-disable-streaming.test.tswith a fixture that renders auseIdcomponent twice statically and twice withclient:idle. It checks that the ids are unique and that each island id contains the island'sprefix.
Docs
- No docs update needed, because the option and its documented behavior do not change.
Fixes #18498

Changes
Telemetry did a blocking git call on startup, causing pretty much every astro command to be 15-200ms slower than it should. This is specifically noticeable for astro dev.
Testing
Manually
Docs
N/A

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
astro@7.4.3
Patch Changes
-
#18488
e4e25faThanks @umeraamir69! - CSP no longer hashes empty children on external stylesheets and scripts, which was inserting the SHA-256 of the empty string intoscript-srcandstyle-src. -
#18500
e5a3a1bThanks @astro-factory! - Fixes<Image>and<Picture>emitting duplicatesrcsetcandidates whendensitiescontains equivalent values such as1and'1x' -
#18517
c3185b7Thanks @okxint! - Fix unhandledAbortErrorrejection whenClientRouterskips a pending view transition -
#18497
c712113Thanks @astro-factory! - Fixes an uncaughtTypeErrorin the browser when aserver:deferisland request fails due to a network error. The fallback content is kept, as it is for non-200 responses. -
#18525
d0240b9Thanks @astro-factory! - Fixes aDEP0190deprecation warning printed byastro infoon Node.js 24 and later -
#18511
d060ff9Thanks @astro-factory! - Fixestransition:namestyles missing in dev when the element is inside a component that is only rendered through another component with no styles or scripts -
#18494
5fe699cThanks @astro-factory! - Fixes theastroCLI refusing to run on StackBlitz by allowing Node.js>=22.22.0inside WebContainers, whose Node.js version users cannot change -
#18506
bf43a60Thanks @astro-factory! - Fixes<ClientRouter />animating scroll restoration on back/forward navigation whenscroll-behavior: smoothis set. Saved scroll positions are now restored instantly, matching the browser's native behavior. -
#18476
8ea79a2Thanks @astro-factory! - Fixes aDataCloneErrorcrash when building pages that render SVG imports with<Image />orgetImage()whileexperimental.parallelPrerenderis enabled. -
#18504
6dbd737Thanks @astro-factory! - Fixes<Picture>emitting a duplicate1xcandidate in<source>srcsetwhendensitiesincludes1 -
#18524
7524889Thanks @astro-factory! - Fixes type errors reported in Astro's built-in<Image />,<Picture />,<Code />,<Debug />and<ClientRouter />components when type-checking a project that extendsastro/tsconfigs/strictestwithtscand@astrojs/ts-content-mapper -
#18493
3773941Thanks @astro-factory! - Fixes scoped styles of unused Astro components being included in the build when those components are re-exported from a barrel file -
#18512
1151b9eThanks @jp-knj! - Fixes CSP hashes added withAstro.cspfrom components rendered inside<body>being left out of the CSP<meta>element in static builds, including MDX pages -
Updated dependencies [
6cf3423,edfbf4a]:- @astrojs/telemetry@3.4.2
- @astrojs/markdown-satteri@0.4.6
@astrojs/prism@4.1.2
Patch Changes
edfbf4aThanks @matthewp! - Fixes Prism code blocks for languages Prism doesn't support, such asvueorsvelte. Their code is now displayed as plain text instead of being rendered as HTML. Also correctly escapes the code block language in the generatedclassanddata-languageattributes.
@astrojs/cloudflare@14.4.3
Patch Changes
- #18526
d0504c2Thanks @astro-factory! - Fixesprocess is not definederrors in client-side scripts and islands that referenceprocess.env. The adapter'sprocess.envdefine now applies only to the server output, so browser builds get Vite's default replacement. - Updated dependencies []:
- @astrojs/underscore-redirects@1.0.4
@astrojs/markdoc@2.1.2
Patch Changes
edfbf4aThanks @matthewp! - Fixes Prism code blocks for languages Prism doesn't support, such asvueorsvelte. Their code is now displayed as plain text instead of being rendered as HTML. Also correctly escapes the code block language in the generatedclassanddata-languageattributes.- Updated dependencies [
edfbf4a]:- @astrojs/prism@4.1.2
@astrojs/mdx@8.1.2
Patch Changes
- Updated dependencies [
edfbf4a]:- @astrojs/markdown-satteri@0.4.6
@astrojs/react@7.1.2
Patch Changes
- #18482
9c88994Thanks @wrostomMM! - Fixes duplicateReact.useId()values across components whenexperimentalDisableStreamingis enabled
@astrojs/solid-js@7.1.2
Patch Changes
290b196Thanks @matthewp! - Escapes slot names when rendering the slot wrapper elements for Solid components
@astrojs/svelte@9.1.2
Patch Changes
5e47636Thanks @matthewp! - Escapes slot names when rendering the slot wrapper elements for Svelte components
@astrojs/vercel@11.0.17
Patch Changes
- #18085
785473bThanks @nikolas-sapa! - Fix redirects never matching on Vercel whentrailingSlash: 'always'is set. Redirect sources now include the trailing slash so they match the normalized request path. Sources whose last segment contains a dot are left unslashed, and dynamic or spread sources emit both the slashed and unslashed form, because Vercel only normalizes paths without a dot.
@astrojs/markdown-remark@7.3.5
Patch Changes
edfbf4aThanks @matthewp! - Fixes Prism code blocks for languages Prism doesn't support, such asvueorsvelte. Their code is now displayed as plain text instead of being rendered as HTML. Also correctly escapes the code block language in the generatedclassanddata-languageattributes.- Updated dependencies [
edfbf4a]:- @astrojs/prism@4.1.2
@astrojs/markdown-satteri@0.4.6
Patch Changes
edfbf4aThanks @matthewp! - Fixes Prism code blocks for languages Prism doesn't support, such asvueorsvelte. Their code is now displayed as plain text instead of being rendered as HTML. Also correctly escapes the code block language in the generatedclassanddata-languageattributes.- Updated dependencies [
edfbf4a]:- @astrojs/prism@4.1.2
@astrojs/telemetry@3.4.2
Patch Changes
- #18481
6cf3423Thanks @Princesseuh! - Avoids blocking Astro commands while looking up the anonymous project ID, by runninggitasynchronously. Events recorded at the same time now share a single lookup.

Changes
- SVG imports are Astro component functions with image metadata attached. When
experimental.parallelPrerenderis on, the prerender worker sends collected static-image transforms to the main thread viapostMessage, which uses structured cloning — functions cannot be cloned, causing aDataCloneError.resolveStaticImage()now detects whentransform.srcis a function (i.e. an SVG component) and replaces it with a plain-object copy of the metadata before recording the transform, making the value serializable without changing the data the image service receives.
Testing
- Added a unit test in
packages/astro/test/units/assets/static-images.test.tscovering the case where an SVG component function is passed assrc, asserting that the recorded transform stores a plain object rather than the original function.
Docs
- No docs update needed; this is a bug fix for an experimental feature with no API surface change.
Closes #18426

Changes
Bumps the minimum version of Node.js to 22.23.4
Reference https://nodejs.org/en/blog/vulnerability/october-2026-security-releases
Testing
Green CI
Docs

Changes
Tries to make our life easier when it comes to PRs:
- Adds a workflow that closes open pull requests when another pull request fixes every issue they close.
- Runs after a merge and on a weekly sweep, so duplicates opened before this workflow are cleaned up too.
- Skips drafts, pull requests from maintainers, and pull requests that also fix issues the merged change does not.
- Comments with the merged fix and a path to reopen.
Testing
- Ran the merge handler against
#18419, which closed the duplicate#18358. - Ran the sweep against the live repository, which found
#18064,#18324,#18338,#18358, and#18369. - Exercised pagination, deleted authors, reopened issues, partial supersets, permission failures, and state races with a stub harness.
zizmor --min-severity high --min-confidence highreports no findings.- Biome and Prettier checks pass.
Docs
No documentation changes. This is repository automation.
AI was used to write this change.

Changes
- Running
astro sync,astro check, orastro buildwhileastro devis active no longer wipes out the running dev server'snode_modules/.vite/deps_ssr, preventing 500 errors on the next HMR reload. cfPrismPluginnow checks the adapter'sisTypeGenPhaseflag before appendinginclude: ['prismjs/components/prism-*.js']to the SSR environment'soptimizeDeps. During type generation, the Prism glob is omitted so Vite honours thenoDiscovery: true, include: []opt-out and never re-runs the optimizer against the shared cache directory.
Testing
- Added
packages/integrations/cloudflare/test/typegen-phase.test.ts, which verifies thatcfPrismPlugindoes not inject the Prismincludeentries whenisTypeGenPhaseis true, and does inject them during normal dev/build phases.
Docs
- No docs update needed; this is a bug fix with no API surface change.
Closes #18464

Changes
@astrojs/upgrade [version]now pins packages to the requested exact version instead of silently falling back tolatest.resolveTargetVersion()previously only checked the argument against npm dist-tags; an exact semver like7.3.8never matched, so the CLI always resolved tolatestwith no warning.- The fix consults the
versionsmap already present in the npm metadata. If the argument is a published version of a package, that version is used with no^. Packages that never published that version (e.g.@astrojs/*integrations with their own version schemes) still fall back to^latest, preserving existing behaviour.
Testing
- New test cases added to
packages/upgrade/test/verify.test.tscovering: exact version resolves correctly, unknown version falls back tolatest, and dist-tag arguments continue to work.
Docs
- No docs update needed; the
[version]parameter was already advertised in the CLI help text — the fix makes the implementation match the documented behaviour.
Closes #18420

Changes
- Fixes
astro devrendering prerendered pages throughproductionEnvironment(instead of the dev render environment) when a customsrc/fetch.tsis used with@astrojs/cloudflareandprerenderEnvironment: "node". This caused pages with hoisted<script>tags or hydrated islands to be truncated withUnable to resolve [...]errors. - The Cloudflare adapter no longer adds Astro core packages (
astro,astro/fetch,astro/app, etc.) tooptimizeDeps.includefor the Node prerender environment. Previously those entries caused Vite to bundle a separate copy of those modules innode_modules/.vite/deps_prerender, givingnew FetchState(request)its own empty copy of the environmentsWeakMapand making it fall back toproductionEnvironment. The workerd prerender environment retains its include list unchanged.
Testing
- Adds a test in
packages/integrations/cloudflare/test/typegen-phase.test.tscovering the case whereprerenderEnvironment: "node"is combined with a customsrc/fetch.ts, asserting that the dev server renders the full page withoutUnable to resolveerrors.
Docs
- No docs update needed; this is a dev-server rendering correctness fix with no change to public API or configuration options.
Closes #18457

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to next, this PR will be updated.
next is currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, run changeset pre exit on next.
Releases
@astrojs/cloudflare@15.0.0-beta.3
Patch Changes
- #18462
f170236Thanks @ematipico! - Updates the@cloudflare/vite-pluginto the latest. The dependency isn't pinned anymore.

Changes
sharpImageService({ ...options })options are now preserved when the Cloudflare adapter'simageService: 'compile'mode replaces the build service. Previously,hasUserImageService()returnedfalsefor Sharp (noruntimekey), causing the adapter to substitute a bare{ entrypoint: 'astro/assets/services/sharp' }build service with noconfig, silently dropping user-supplied options likeavif.effort.- The fix copies the user's Sharp
configinto the generated build service:build: { ...COMPILE_BUILD_IMAGE_SERVICE, config: getRuntimeImageService(config.service).config }. This restores the behavior present in adapter 14.3.3.
Testing
- Adds a unit test in
packages/integrations/cloudflare/test/image-config.test.tscovering the case wheresharpImageService()is configured with options andimageService: 'compile'is set, asserting that the resolved build service retains the user'sconfig.
Docs
- No docs update needed; this is a bug fix restoring previously documented behaviour, with no API changes.
Closes #18437

Changes
Dirty hack to skip the sleep, all this code will go to waste anyway when we have TS7 support.
Fix #18310
Testing
Added tests
Docs
N/A

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
astro@7.4.2
Patch Changes
-
#18430
dda9ec3Thanks @Abhirup-99! - Speeds up content sync withexperimental.collectionStorage: "chunked"by computing each character's UTF-8 width from its code point instead of encoding every character throughTextEncoder. On a store of ~44k entries this cuts the chunking step from about 60 seconds to well under a second, with byte-identical output. -
#18438
5e0eaa4Thanks @astro-factory! - Fixesastro devwith@astrojs/cloudflarefailing withCalling `require` for "node-fetch"when a server dependency such ascross-fetchrequiresnode-fetch -
#18376
a4e201dThanks @okxint! - Fixesastro devtreating a stale lock file containing a Linux thread ID as a running Astro server. A successful process lookup with no matching PID now marks the lock as stale, preventingastro dev stopandastro dev --forcefrom killing the unrelated process that owns the thread. -
#18467
d1fb7d3Thanks @astro-factory! - Fixes thedefineConfig()types fori18n.defaultLocale,i18n.fallback, andi18n.domainsso they accept a custom locale'spathinstead of itscodes, matching how Astro validates and uses these values -
#18475
cf27e70Thanks @ematipico! - Bumps the minimum supported Node.js version to 22.23.4, which includes the fixes from the October 2026 Node.js security releasesThis is a patch release because the Node.js support and upgrade policy allows the Core team to raise the minimum Maintenance LTS version in a patch release when a disclosed and fixed Node.js security flaw affects Astro.
-
#18451
7a0ba6fThanks @DenisCDev! - Fixesastro sync,astro checkandastro buildreplacing the optimized dependencies of a dev server running in the same project, which broke framework islands in that dev server until it was restarted with--force -
#18336
e943003Thanks @astro-factory! - Fixes inline styles in dev so that framework-transformed CSS is used, such as scoped styles andv-bind()in Vue single-file components -
#18399
829fc00Thanks @astro-factory! - Fixes a dev server error (Could not find server component name) for aserver:deferisland that importsastro:actionsorastro:config/server, when its page was not the first island page loaded after starting the server -
#18330
4db9e0dThanks @Samuteg! - Fixes theastro:env/servervirtual module being generated with invalid JS in dev when any environment variable contains$replacement patterns ($`,$&,$',$1, …). The inlined env JSON was passed as a string toString.replace, so e.g. theKITTY_PUBLIC_KEYvalue set by default in Kitty terminals corrupted the module and broke dev withFailed to parse source for import analysis -
Updated dependencies [
cf27e70]:- @astrojs/telemetry@3.4.1
- @astrojs/markdown-satteri@0.4.5
@astrojs/prism@4.1.1
Patch Changes
-
#18475
cf27e70Thanks @ematipico! - Bumps the minimum supported Node.js version to 22.23.4, which includes the fixes from the October 2026 Node.js security releasesThis is a patch release because the Node.js support and upgrade policy allows the Core team to raise the minimum Maintenance LTS version in a patch release when a disclosed and fixed Node.js security flaw affects Astro.
create-astro@5.3.1
Patch Changes
-
#18475
cf27e70Thanks @ematipico! - Bumps the minimum supported Node.js version to 22.23.4, which includes the fixes from the October 2026 Node.js security releasesThis is a patch release because the Node.js support and upgrade policy allows the Core team to raise the minimum Maintenance LTS version in a patch release when a disclosed and fixed Node.js security flaw affects Astro.
@astrojs/cloudflare@14.4.2
Patch Changes
-
#18422
07700d4Thanks @cyface! - Fixes the/_imageendpoint returning a 500 error whenhrefpoints to a missing file or a file that isn't an image. It now responds with a 404 or 400 instead. -
#18465
f31f143Thanks @astro-factory! - Fixes a customsrc/fetch.tsrendering truncated pages without islands or hoisted scripts inastro devwhenprerenderEnvironment: 'node'is set -
#18461
8b77891Thanks @astro-factory! - Fixes options passed tosharpImageService()being ignored when generating images at build time withimageService: 'compile' -
#18468
119263aThanks @astro-factory! - Fixesastro sync,astro check, andastro buildoverwriting the dependency cache of a runningastro devserver, which caused it to fail with "The file does not exist ... in the optimize deps directory" errors -
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.4
@astrojs/markdoc@2.1.1
Patch Changes
-
#18475
cf27e70Thanks @ematipico! - Bumps the minimum supported Node.js version to 22.23.4, which includes the fixes from the October 2026 Node.js security releasesThis is a patch release because the Node.js support and upgrade policy allows the Core team to raise the minimum Maintenance LTS version in a patch release when a disclosed and fixed Node.js security flaw affects Astro.
-
Updated dependencies [
cf27e70]:- @astrojs/prism@4.1.1
@astrojs/mdx@8.1.1
Patch Changes
-
#18475
cf27e70Thanks @ematipico! - Bumps the minimum supported Node.js version to 22.23.4, which includes the fixes from the October 2026 Node.js security releasesThis is a patch release because the Node.js support and upgrade policy allows the Core team to raise the minimum Maintenance LTS version in a patch release when a disclosed and fixed Node.js security flaw affects Astro.
-
Updated dependencies []:
- @astrojs/markdown-satteri@0.4.5
@astrojs/partytown@2.1.9
Patch Changes
- #18439
3e80f04Thanks @hanford! - Updates Partytown to 1.0.1, which preserves queued events when falling back to the main thread withdataLayer.pushforwarded usingpreserveBehavior.
@astrojs/preact@6.1.1
Patch Changes
-
#18475
cf27e70Thanks @ematipico! - Bumps the minimum supported Node.js version to 22.23.4, which includes the fixes from the October 2026 Node.js security releasesThis is a patch release because the Node.js support and upgrade policy allows the Core team to raise the minimum Maintenance LTS version in a patch release when a disclosed and fixed Node.js security flaw affects Astro.
@astrojs/react@7.1.1
Patch Changes
-
#18475
cf27e70Thanks @ematipico! - Bumps the minimum supported Node.js version to 22.23.4, which includes the fixes from the October 2026 Node.js security releasesThis is a patch release because the Node.js support and upgrade policy allows the Core team to raise the minimum Maintenance LTS version in a patch release when a disclosed and fixed Node.js security flaw affects Astro.
@astrojs/solid-js@7.1.1
Patch Changes
-
#18475
cf27e70Thanks @ematipico! - Bumps the minimum supported Node.js version to 22.23.4, which includes the fixes from the October 2026 Node.js security releasesThis is a patch release because the Node.js support and upgrade policy allows the Core team to raise the minimum Maintenance LTS version in a patch release when a disclosed and fixed Node.js security flaw affects Astro.
@astrojs/svelte@9.1.1
Patch Changes
-
#18475
cf27e70Thanks @ematipico! - Bumps the minimum supported Node.js version to 22.23.4, which includes the fixes from the October 2026 Node.js security releasesThis is a patch release because the Node.js support and upgrade policy allows the Core team to raise the minimum Maintenance LTS version in a patch release when a disclosed and fixed Node.js security flaw affects Astro.
@astrojs/vue@7.1.2
Patch Changes
-
#18475
cf27e70Thanks @ematipico! - Bumps the minimum supported Node.js version to 22.23.4, which includes the fixes from the October 2026 Node.js security releasesThis is a patch release because the Node.js support and upgrade policy allows the Core team to raise the minimum Maintenance LTS version in a patch release when a disclosed and fixed Node.js security flaw affects Astro.
@astrojs/check@0.9.12
Patch Changes
- #18455
7af66fcThanks @astro-factory! - Fixes theastro-checkbinary ignoring its first two command-line arguments, so flags such as--help,--root,--watch, and--tsconfigare respected again. If your scripts padded the arguments to work around this (for example,astro-check -- -- --tsconfig ./tsconfig.app.json), remove the padding. - Updated dependencies [
044148d]:- @astrojs/language-server@2.17.3
@astrojs/language-server@2.17.3
Patch Changes
- #18460
044148dThanks @Princesseuh! - Speeds upastro checkby skipping a 10 ms editor-cancellation wait that ran before checking each file
@astrojs/markdown-remark@7.3.4
Patch Changes
- Updated dependencies [
cf27e70]:- @astrojs/prism@4.1.1
@astrojs/markdown-satteri@0.4.5
Patch Changes
- Updated dependencies [
cf27e70]:- @astrojs/prism@4.1.1
@astrojs/telemetry@3.4.1
Patch Changes
-
#18475
cf27e70Thanks @ematipico! - Bumps the minimum supported Node.js version to 22.23.4, which includes the fixes from the October 2026 Node.js security releasesThis is a patch release because the Node.js support and upgrade policy allows the Core team to raise the minimum Maintenance LTS version in a patch release when a disclosed and fixed Node.js security flaw affects Astro.
@astrojs/upgrade@0.8.1
Patch Changes
-
#18475
cf27e70Thanks @ematipico! - Bumps the minimum supported Node.js version to 22.23.4, which includes the fixes from the October 2026 Node.js security releasesThis is a patch release because the Node.js support and upgrade policy allows the Core team to raise the minimum Maintenance LTS version in a patch release when a disclosed and fixed Node.js security flaw affects Astro.
-
#18466
d7f5c54Thanks @astro-factory! - Fixes@astrojs/upgrade [version]ignoring an exact version number (for examplenpx @astrojs/upgrade 7.3.8) and upgrading to the latest release instead

Changes
bin/astro-check.jswas passingprocess.argv.slice(2)toparseArgsAsCheckConfig(), which already calls yargs'hideBin()internally — stripping two more entries. This caused the first two user-supplied arguments to be silently ignored (e.g.astro-check --helpran diagnostics instead of printing help, andastro-check --root srcignored--root). The binary now passes the fullprocess.argv, matching howparseArgsAsCheckConfig()is documented and how theastro checkCLI caller works.- The
packages/astrobuild script usedastro-check -- -- --tsconfig ...as a padding workaround to compensate for the double-strip. That padding is removed now that the binary handles argv correctly; users with the same workaround in their own scripts should drop it too (noted in the changeset).
Testing
- Added
packages/language-tools/astro-check/test/bin.test.ts, which spawns the built binary with--helpand asserts it exits successfully and prints help output. This test fails without the fix and passes with it.
Docs
- No docs update needed; this is a bug fix restoring already-documented behavior for
--root,--watch,--tsconfig, and--help.
Closes #18454
Description
- Closes #
- Manual sidebar links such as
{ label: 'Tabs', link: '/guides/components/#tabs' }are run throughformatPath(), which adds the trailing slash or.htmlextension to the end of the whole string. WithtrailingSlash: 'always'this produces/guides/components/#tabs/, and withbuild.format: 'file'it produces/guides/components/#tabs.html, so the link no longer targets the section. formatPath()now splits off any?queryor#hashsuffix, formats only the pathname as before, and appends the suffix back. Links without a query or hash are unchanged.- Added cases to
__tests__/basics/format-path.test.tscovering hashes and query strings fordirectorywithalwaysandnever, and forfile. They fail onmainand pass with this change. The fullpackages/starlightunit suite passes. - Includes a patch changeset.
Fixes #4286
Description
- Closes #
Was pretty simple so went straight to PR. Let me know if you'd prefer an issue.
- What does this PR change? Give us a brief description.
The PR adds fetchpriority=high to hero images, along with the loading=eager and decode=async that already exist.
Fetchpriority improves loading time of key resources on the page as discussed here: https://web.dev/articles/fetch-priority and hero images are most likely to be the LCP image so are exactly the types of resources that benefit from this.
Full disclosure I work on the Chrome team and maintain the above doc, but this is available in all modern browsers (caniuse, MDN). Happy to answer any questions on this feature (or anything else in web performance space).
Neither the existing loading not decode are configurable, nor are the documented (presumably cause they are not configureable?) so I followed that implementation here. Happy to make it configurable instead and/or document this (and the others) if you prefer.
- Did you change something visual? A before/after screenshot can be helpful.
No. This merely provides a slight performance boost to Hero images.

Changes
astro sync(also run byastro checkandastro build) creates a temporary Vite server withoptimizeDeps: { noDiscovery: true }. Astro itself (dev toolbar deps) and integrations such as@astrojs/reactand@astrojs/preactaddoptimizeDeps.includeentries, so Vite still runs the dependency optimizer on that server. It wrote to the project's default Vite cache,node_modules/.vite, which is the cache a runningastro devreads from. The dev server's optimized dependencies were replaced with ones built by the temporary server, for example React's productionjsx-dev-runtimewherejsxDEVisundefined, and islands broke with_jsxDEV is not a functionorInvalid hook calluntil the dev server was restarted with--force.- The temporary server now uses its own Vite
cacheDir,<cacheDir>/vite-sync/under Astro'scacheDir. It optimizes the same dependencies as before and plugins see the same config; only where the output is written changes.
Fixes #18449
Testing
- Added a test to
test/astro-sync.test.ts. It writes a placeholdernode_modules/.vite/deps/_metadata.json(standing in for a running dev server's cache) into a fixture that no other test starts a dev server on, runs sync, and asserts the file is unchanged. Without the change insync/index.tsit fails, because sync replaces the placeholder with its own optimizer metadata. With the change,pnpm -C packages/astro exec astro-scripts test "test/astro-sync.test.ts"passes 10/10. - Checked the same change against the reproduction from #18449 (astro 7.4.0 +
@astrojs/react): withastro devrunning,node_modules/.vite/depsis no longer modified byastro sync,astro checkorastro build, and sync's output goes tonode_modules/.astro/vite-sync/deps.
Docs
No docs change. There is no API or config change; the only visible effect is a vite-sync directory inside Astro's cacheDir.

Changes
- The
--preserveWatchOutputdescription in@astrojs/checkpreviously said "If set to false, output won't be cleared between checks in watch mode" — the opposite of the flag's actual behavior. The runtime code clears the terminal when the flag isfalse(default) and preserves output whentrue, so only the help string was wrong. Changed "false" to "true" in the description. - No behavior change; only the text shown by
astro check --helpis affected.
Testing
- No test changes. The existing
test/parseArgs.test.tsalready covers flag parsing behavior, and the change is limited to a static help string with no logic impact.
Docs
- No docs update needed; the change corrects inline CLI help text rather than user-facing documentation.
Closes #18443

Changes
astro check --watchno longer exits immediately when the project is located in a directory whose name containsnode_modulesor.git. Previously, chokidar'signoredcallback matched against the absolute path, so any project root containing those substrings was immediately excluded from watching, leaving nothing to keep the process alive.- Adds a
isInIgnoredDirectory(rootPath, filePath)helper that only checks path segments relative to the watched root, so only real<root>/node_modulesand<root>/.gitsub-directories are ignored — not the root itself or unrelated paths like.github.
Testing
- Adds
packages/language-tools/astro-check/test/watch.test.ts, covering that watch mode stays alive when the project path containsnode_modulesand that actualnode_modules/.gitsub-directories inside the project are still excluded.
Docs
- No docs update needed; this is a bug fix for an internal path-filtering predicate with no user-facing API change.
Closes #18442

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @playwright/test (source) | 1.64.0 → 1.64.1 |
Release Notes
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| devalue | ^6.0.2 → ^6.0.3 |
||
| fastify (source) | ^5.12.5 → ^5.12.7 |
Release Notes
fastify/fastify (fastify)
v5.12.7
Full Changelog: fastify/fastify@v5.12.6...v5.12.7
v5.12.6
⚠️ Security Release
- Fix for GHSA-389g-gv7q-r4x8
What's Changed
- [Backport 5.x] types: restrict route lookup methods by @github-actions[bot] in #7048
- [Backport 5.x] perf: decode string bodies once instead of per chunk by @github-actions[bot] in #7053
- [Backport 5.x] perf: avoid resetting the level of request child loggers by @github-actions[bot] in #7058
- [Backport 5.x] fix: resolve reply.mediaType from raw response headers by @github-actions[bot] in #7067
- [Backport 5.x] perf: use a FIFO cache for parsed content-types by @github-actions[bot] in #7072
- [Backport 5.x] fix(validation): lowercase header names in propertyNames enum/const by @mcollina in #7104
- [Backport 5.x] fix: copy a set-cookie array passed to reply.header instead of storing it by @github-actions[bot] in #7087
- [Backport 5.x] fix: remove error when HTTP QUERY request has empty body by @github-actions[bot] in #7060
- [Backport 5.x] docs: document fastify.query() shorthand for RFC 10008 by @github-actions[bot] in #7094
Full Changelog: fastify/fastify@v5.12.5...v5.12.6
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Changes
Raises the minimum Partytown version from ^1.0.0 to ^1.0.1, the latest stable release, following #18375.
Partytown 1.0.1 fixes a fallback that could discard queued analytics events: when dataLayer.push is forwarded with preserveBehavior, falling back to the main thread keeps the existing dataLayer and its events. It also avoids the deprecated fenced-frame API warning. See the release notes and fallback fix.
Updating the minimum ensures existing lockfiles cannot retain 1.0.0. Includes the lockfile update and a patch changeset so the integration can publish these fixes.
Testing
pnpm install --frozen-lockfile --ignore-scriptspnpm build— all 33 tasks passed, including the integration typecheck.pnpm -C packages/astro exec astro-scripts test 'test/ssr-partytown.test.ts' --strip-types— both tests passed, covering SSR script injection and worker assets in the manifest.pnpm -C packages/integrations/partytown exec publintpnpm formatandpnpm lint:ai— passed; the existing language-server test fixture still emits itsnoConsolewarning.pnpm exec changeset statusconfirms a patch release for@astrojs/partytown.
No new tests added for this dependency-only update. The fallback regression is covered upstream in QwikDev/partytown#790; the existing Astro tests check integration compatibility.
Docs
No configuration or API changes. The patch changeset describes the fix for the release notes.

Changes
astro devwith the Cloudflare adapter no longer crashes withCalling \require` for "node-fetch"when a CJS dependency (e.g.cross-fetch) requiresnode-fetchat load time. Vite now bundlesnode-fetchinto the optimized dep instead of leaving it as a bare externalrequire` call that workerd cannot resolve.- Removes
'node-fetch'from the hard-codedoptimizeDeps.excludelist applied to server environments when dependency discovery is enabled (noDiscovery === false). The exclude was a leftover from the Environment API refactor (#14306) — it previously lived in the top-level clientoptimizeDepsconfig and was never intended for workerdssrenvironments.
Testing
- Adds a unit test in
packages/astro/test/units/vite-plugin-environment/server-entries.test.tscovering thatnode-fetchis no longer excluded fromoptimizeDepsfor server environments with discovery enabled.
Docs
- No docs update needed; this is a bug fix restoring behavior that previously worked on Astro 6 / Vite 7.
Closes #18436

Changes
@astrojs/upgradenow reads the package manager's release age policy (npmmin-release-age, pnpmminimum-release-age).- It installs the newest version old enough instead of always pinning the newest. Before, the install failed when the policy blocked the newest version.
- If nothing newer than the installed version is allowed yet, the package is reported as up to date.
- Dist-tags (e.g.
beta) are respected. It never moves past the tag's version, and prereleases are only considered when the target is one. - Fetches the full package metadata once per package, and only when a policy is set.
- Changeset included.
Known limitations / not in this PR
- Yarn and Bun are not detected yet. They behave as before: the newest version is pinned, and the install fails with the generic "run manually" message if their policy blocks it.
- pnpm's existing
minimumReleaseAgeerror message ininstall.tsis unchanged. It remains as a fallback for cases where detection misses the policy. It matches on a plainMINIMUM_RELEASE_AGEsubstring without checking the package manager name. That is pre-existing and left alone here; actx.packageManager.name === 'pnpm'guard would be a small follow-up. - Transitive dependencies are not checked. The package manager resolves their ranges against the policy itself, and dependencies of an old-enough version should also be old enough. Peer dependency mismatches between packages pinned to different versions are not handled and have not been tested.
Testing
Added unit tests in packages/upgrade/test/verify.test.ts:
resolveTargetVersion: newest version is kept when old enough, an older allowed version is picked when it isn't, dist-tags are not passed, the installed version is kept when nothing newer is allowed, and publish times are ignored with no policy.getMinReleaseAge: npm days, pnpm minutes, unset ornullvalues, a failing config command, and unsupported package managers.
Also checked manually with --dry-run against astro 7.3.0 in an npm and a pnpm project (screenshots above): no policy targets 7.4.0, a 30-day policy targets 7.3.3, and a 60-day policy reports up to date.
Docs
No docs needed. This only changes which version the upgrade tool picks when a release age policy is set, and the changeset covers it.

Changes
Pass env.imageConfig to revalidateRemoteImage(). Without it, redirect destinations are checked against an empty allowlist during cache revalidation, causing warnings and the reuse of stale cached images even when the destinations are allowed.
Reproduction: https://github.com/mumumu6/astro-remote-image-redirect-repro
Testing
- Added two regression tests covering
image.domainsandimage.remotePatterns. Both fail without the fix. All 12 tests intest/units/assets/remote.test.tspass with the fix. - Built Astro, checked types, and ran Biome and ESLint on the changed files.
- Ran the reproduction against the patched Astro. The second build receives a 304 response and logs
revalidated cache entrywithout the stale-cache warning.
Docs
No documentation changes are needed, as this fix corrects existing behavior without introducing new configuration options.
Description
This PR adds a check to the GitHub Action benchmark job to make sure it only runs in the withastro org and not in forks. The reason is that I noticed that the benchmark fails in forks because of missing permissions, here is an example run: https://github.com/trueberryless/withastro-starlight/actions/runs/39007600241/job/117323145054

Changes
loadSharp()threwMissingSharpfor any failedimport('sharp'), dropping the original error. It's now passed as thecause, which Astro's error output already prints under "Caused by:".- Sharp's own error is often the only useful clue, e.g.
Unsupported CPU: Prebuilt binaries for Linux x64 require v2 microarchitecturewhen Sharp is installed but its binary can't run. Several Zulip self-hosters (Zulip's help center uses Starlight) spent months on an unexplained "Could not find Sharp" with exactly this cause.
Testing
- No test added. Nothing in the unit tests can make
import('sharp')fail, and adding module mocking seemed like too much for a one-line change. I checked it manually by loading the built service underqemu-x86_64 -cpu Penryn(a CPU without x86-64-v2): the error now includes Sharp's "Unsupported CPU" message.
Docs
- No docs update needed. The
MissingSharperror and its reference page are unchanged; the error just carries a cause now.
AI-assisted: written with Claude Code; I reviewed and tested the change.

Changes
Sparse array props prevent framework components from hydrating. For example, Array(2) serializes as {"items":[1,[null,null]]} when passed as { items: Array(2) }. The island decoder expects a tagged tuple for every entry and throws a TypeError on the bare null values.
Array.prototype.map skips missing entries. Visiting every entry with Array.from lets the existing serializer encode each hole as undefined, producing {"items":[1,[[0],[0]]]}. This uses the existing wire format and leaves the client script unchanged. It does not preserve the distinction between a hole and an explicit undefined property.
Testing
Both added regressions fail before the fix; all 27 serializer tests pass after rebuilding. The package build, typecheck, and changed-file lint and formatting checks pass.
The packed serializer and production island script were also exercised in a real browser. Leading, all-hole, and nested sparse arrays reach the hydration callback as undefined entries; the same cases throw before the fix. An explicit-undefined control passes both. The full dev-server and e2e suites were not run.
Docs
No documentation change is needed. Arrays are already supported as hydrated props, and this fixes their serialization without adding an API. An astro patch changeset describes the fix.

Changes
Fixes #18429.
getChunkEnd()indata-store-writer.tscalledTextEncoder.encode()once per character of the serialized store, only to learn that character's UTF-8 byte width. Withexperimental.collectionStorage: "chunked"this ran over the whole store on every sync and was ~63s of an 89s content sync on a 44k-entry (~180 MB serialized) store (node --cpu-profonastro sync).- The width is fully determined by the code point, so compute it arithmetically:
< 0x80 → 1,< 0x800 → 2,< 0x10000 → 3, else4. Lone surrogates fall in the 3-byte branch, which matches the U+FFFD (3 bytes) thatTextEncodersubstitutes for them, so the two agree on every input. - Output is byte-identical:
endIndexandbytesare unchanged for every input, so existing part files keep their xxhash names and nothing is invalidated. - Drops the now-unused module-level
ENCODER.
Real project (16.4k pages, warm cache): content sync 89s → 5.5s, full astro build 2:28 → 1:31. Standalone: 20 MB string, chunkString() 10.30s → 0.08s, identical parts.
Testing
- Added two unit tests to
chunk-string.test.ts: code points on each UTF-8 width boundary (U+007F/U+0080/U+07FF/U+0800/U+FFFF/U+10000) with an exact expected split, and lone surrogates (high, low, reversed) budgeted as 3 bytes. - Existing
chunkStringtests unchanged and pass. - Differential fuzz of the original vs. the arithmetic
getChunkEndon ~25M cases (ASCII, 2/3-byte BMP, boundary values, astral pairs, lone/reversed surrogates, U+FFFD, NUL;maxBytes1–1000; arbitrary start offsets including mid-pair), comparing both return values and the fullchunkString()split: 0 mismatches. Script and timing repro: https://gist.github.com/Abhirup-99/2adc2e813117342d215f1b998a4a461a - Verified on the real store that all 14 part files hash identically before and after.
Docs
No docs change: internal performance fix, no user-facing behaviour change.
🤖 Generated with Claude Code

Changes
- Svelte island CSS for conditionally-rendered child components (e.g.
{#if visible}<Panel />{/if}) was silently dropped from production builds when using Vite 8 / Rolldown. Rolldown ignores direct assignments to thebundleobject insidegenerateBundle, which caused the cssScopeTo recovery path inastro:rollup-plugin-build-cssto be a no-op — the deleted CSS assets were never restored. - The plugin now defers all CSS asset deletions to the end of
generateBundle. Instead of deleting and re-assigning, it builds a set of assets to keep during the cssScopeTo pass and only drops the rest, eliminating the need to write back tobundle.
Testing
- Re-enabled the existing integration test
packages/integrations/svelte/test/conditional-rendering.test.ts, which had been skipped with aTODO(rolldown)comment. This test covers Svelte island children that are conditionally rendered and verifies their scoped CSS is present in the production build output.
Docs
- No docs update needed; this is an internal build pipeline fix with no user-facing API changes.
Closes #18337

Changes
renderChunkinvite-plugin-server-islandsnow returns early unlesschunk.moduleIdsincludes\0virtual:astro:server-island-manifest. Previously the hook ran on every chunk containing the$$server-islands-map$$marker. When a page importedastro/config, Rolldown bundled the server-islands plugin's own source intochunks/create-vite_*.mjs, the hook rewrote the plugin'sserverIslandPlaceholderMapstring literal, and the build failed with[PARSE_ERROR] Unterminated string.- The guard is safe for all valid cases: the manifest chunk always carries its own virtual module ID, even when merged into a larger chunk or when output is minified.
Testing
- Updated
packages/astro/test/units/server-islands/vite-plugin-server-islands.test.tsto cover the early-return path: a chunk that contains the marker but does not include the virtual manifest module ID is left unchanged.
Docs
- No docs update needed; this is an internal build-pipeline fix with no user-facing API change.
Closes #18364

Changes
- Cached image files copied into
dist/now keep the source file'smtimeon all platforms. Previously, Node'scopyFilereset the timestamp to the current time on Linux and Windows; only macOS happened to preserve it viaclonefile(2)whenCOPYFILE_FICLONEwas used. - A new
copyCachedFilehelper inpackages/astro/src/core/fs/index.tswrapscopyFile(withCOPYFILE_FICLONE) and immediately applies the sourceatime/mtimeviastat+utimes. All four cache-hit paths in the assets pipeline (generate.ts) and the experimental incremental-build restore path (incremental.ts) now use it.
Testing
- Added
packages/astro/test/units/fs/copy-cached-file.test.ts, which verifies that the destination file'smtimematches the source file'smtimeto the millisecond aftercopyCachedFileruns.
Docs
- No docs update needed; this is an internal build-time behaviour fix with no user-facing API change.
Closes #18402

Changes
- Style-only HMR in
.astrocomponents now correctly hot-updates CSS instead of falling back to a full page reload when a PostCSS plugin (e.g.@unocss/postcsswith@apply) lists the processed file as a dependency of itself. - The first loop in
handleHotUpdatenow skips the case whereastroFile === ctx.file. Previously, when a component's own CSS dependency list included itself, the loop would delete the component's compile metadata, causingisStyleOnlyChangedto never run and Vite to receive an unfiltered module list that triggered a full reload. Other Astro files that legitimately depend on the changed file are still invalidated.
Testing
- Added a unit test in
packages/astro/test/units/vite-plugin-astro/hmr.test.tscovering the case where a PostCSS plugin registers the component as a dependency of its own style, verifying that a style-only edit produces a CSS hot update rather than a full reload.
Docs
- No docs update needed; this is a dev-server HMR bug fix with no user-facing API change.
Closes #18406

Changes
Fixes #18421
transform(): a localhrefwhoseASSETSfetch isn'toknow returns404, matching the remote-fetch branch. Before this, the 404 response body was passed to the Images binding as the source.transformStream(): when the Images binding rejects the source as not an image (IMAGES_TRANSFORM_ERROR 9412), the endpoint returns400instead of throwing. Any other binding error is rethrown unchanged.
Before → after, on a deployed Worker:
| Request | Before | After |
|---|---|---|
/_image?href=/robots.txt&w=100&f=webp |
500 | 400 |
/_image?href=/nope.png&w=100&f=webp |
500 | 404 |
/_image?href=/real.png&w=64&f=webp (a real PNG) |
— | 200 image/webp (40 KB → 1.5 KB) |
/_image?href=https://example.com/x.png (not allowed) |
403 | 403 (unchanged) |
Testing
- Added two cases to
test/image-binding-transform.test.ts: a mocked binding rejecting with 9412 →400, and a different binding error → still rejects. - The
content.okcheck intransform()has no unit test. That module importsastro:assets, which is why the existing tests targettransformStreamdirectly. I verified it on a deployed Worker instead (table above). Happy to add a fixture test if you'd prefer one. - Deployed verification: the reproduction from the issue (https://github.com/cyface/astro-cloudflare-image-500-repro), built against 14.3.4 with this change applied as a patch, and uploaded as a Worker preview version.
pnpm testinpackages/integrations/cloudflare: 403/417 pass. The 1 failure (server-island / framework dev tests) also fails onmainwithout this change.
Docs
None needed: there are no new options, and valid images behave the same. Only the error status for bad sources changes.
🤖 Generated with Claude Code

Changes
- Corrects the error message in
validateFontsCssVariables()from "be a valid indent" to "be a valid ident", matching the CSS<ident>token the message's own MDN link documents. No validation behavior changes.
Testing
- Adds an assertion to the existing "Should error on invalid css variable" test in
packages/astro/test/units/config/config-validate.test.tsthat the error message contains'be a valid ident:', covering the corrected wording.
Docs
- No docs update needed; this only corrects an error message string.
Closes #18356

Changes
- Fixes the
@astrojs/nodestandalone startup log being skipped on Node 26.12 whenHOSTis an IP literal: the log handler waits for thelisteningevent after it may already have fired, so the "Server listening" line never prints (server still serves requests). - Adds an
if (!server.listening)guard before waiting for the event, so the message is logged whenever the server is already up.
Testing
- Adds a unit test for
logListeningOncovering the already-listening case; hardened so the server is closed in anafter()hook (the previous version hung the test runner when the assertion failed).
Docs
- No docs update needed — startup log behavior only.

Changes
- Fixes conditionally-rendered island component styles being silently dropped from production builds under Vite 8 / Rolldown (
astro:rollup-plugin-build-css ... assigns to bundle variablewarning). - The CSS dedup loop no longer deletes the combined chunk while the cssScopeTo recovery still needs it: asset ids are only marked during dedup and deleted at the end, so statically-rendered island styles are kept and inlined.
Testing
- Re-enables
packages/integrations/svelte/test/conditional-rendering.test.ts(previously skipped with a TODO(rolldown)); it fails on main and passes with the fix.
Docs
- No docs update needed — build-internal fix.

Changes
- Fixes a build failure ("Unterminated string") when a page imports
astro/config: the server-islandsrenderChunkrewrite could run on the bundled plugin source itself, leaving a quoted placeholder unterminated in acreate-vite_*chunk. - The rewrite now only runs when the chunk contains the server-island manifest module, which is the only source of the placeholder.
Testing
- Adds a unit test for the server-islands
renderChunkcovering chunks that do not contain the manifest module.
Docs
- No docs update needed — build-internal fix.

Changes
- Keeps the last-modified time of cached assets when they are copied into the build output, so workflows that compare mtimes (rsync, deploy diffing, spotting cache-sourced files) see stable timestamps across platforms.
- Adds
copyCachedFile()which copies (with FICLONE where supported) and then restores the source mtime viautimes; used at all copy sites in the assets cache and incremental build restore. - Related to #18386 (same intent, different implementation); this PR uses a shared helper and keeps the change scoped to cache copies.
Testing
- Adds
test/units/fs/copy-cached-file.test.tsverifying copied contents and restored mtime.
Docs
- No docs update needed — internal build-output behavior only.

Changes
- Fixes
@astrojs/vueSSR concatenating slot HTML character-by-character when the slot content is large (e.g. an island): Astro hands slots to renderers as a String wrapper object, which Vue's streaming renderer treats as a nested buffer. StaticHtmlnow converts slot content withString()before settinginnerHTML, making Vue SSR render it as one string. Output markup is unchanged.
Testing
- Adds
test/units/static-html.test.tsverifying slot HTML is rendered as a single string.
Docs
- No docs update needed — no user-facing behavior or markup change.

Changes
- Stops style-only HMR from falling back to a full page reload when a PostCSS plugin (e.g.
@unocss/postcsswith@apply) lists the component as its own dependency. handleHotUpdatenow skips the component's own metadata when it appears in its own CSS dependencies, so Vite keeps serving the style modules instead of reloading the page.
Testing
- Adds 2 tests to
test/units/vite-plugin-astro/hmr.test.tscovering style-only updates when the CSS dependency list contains the file itself.
Docs
- No docs update needed — dev-mode HMR behavior only.

Changes
- Deploys with Vercel's Bun runtime when the project is built with Bun: the adapter reads
process.versions.bunand writes abun1.xruntime into.vc-config.jsoninstead of always using a Node runtime. - No hard-coded version table, per the review direction on the earlier #18235 (which this PR supersedes). Vercel resolves
bun1.xto its current Bun version (1.3.x today). - A user-facing
runtimeconfig option is left as a follow-up.
Testing
- Adds
test/units/runtime.test.tsfor the newgetRuntime()export: Bun build →bun1.x, Node build → unchangednodejs*.x.
Docs
- No docs update needed for this patch; the
runtimeoption follow-up would ship with its own docs.

Changes
- Fixes vercel redirects not matching under
trailingSlash: 'always':@vercel/routing-utilsemits the trailing-slash normalization redirect before redirect routes, so extensionless redirect sources are now generated with a trailing slash (static) or an optional trailing slash (dynamic/spread last segments) to match the normalized request path. - Also fixes legacy
.htmlURLs under dynamic/spread segments that a naive slash-append broke. - Supersedes
factory/fix-18073, whose fix skipped spread routes.
Testing
- Adds 7 unit tests in
test/units/redirects.test.tscovering static, dynamic, and spread sources undertrailingSlash: 'always'. - Updates existing
test/redirects.test.tsassertions for the new normalized source patterns.
Docs
- No docs update needed — internal fix to redirect route generation.

Changes
- Corrects a typo in the config validation error for font
cssVariablevalues — the message says a value must be a valid "indent" but means a valid CSSident. - Wording-only change; validation behavior is unchanged.
Testing
- Adds an assertion to
config-validate.test.tsverifying the corrected message.
Docs
- No docs update needed — only an error message wording fix.

Changes
Fixes #18377
- WebKit marks a history entry as created without user interaction when
pushStateruns without recent user activation, and apps built on WKWebView, including Chrome and Edge on iOS, hide those entries from the back button. In Chrome on iOS a tap only counts as activation while its event is being dispatched. The router callspushStateafter it has fetched the new page, so every entry it adds is hidden and Back leaves the site. - When a navigation starts with transient activation (
navigator.userActivation.isActive), the router pushes the history entry right away as a copy of the current one, then fills it in withreplaceStateonce the new page is swapped in. - If the router hands the navigation to the browser for a full page load, it uses
location.replace()so the entry doesn't stay behind as a duplicate. A navigation that interrupts a pending one reuses its entry, and Back or Forward drops it. - #15163 was closed because it relied on UA sniffing. This follows the approach suggested in the issue, which doesn't need any browser detection.
In every browser, pressing Back while a page is still loading now returns to the current page instead of the previous one, because the entry already exists by then. The workaround posted in the issue behaves the same way. I can handle that case in a follow-up if you think it's worth it.
Testing
- Added e2e tests to
view-transitions.test.ts:- the history entry is added while the click is handled (fails without this change)
- a navigation that interrupts another one doesn't add an extra entry
- a full page load doesn't leave an extra entry
- The view transitions e2e suite passes locally on Chrome and Firefox.
- Tested on an iPhone 12 Pro Max (iOS 26.6.2, Chrome 154.0.8037.55) with the view-transitions fixture: open
/onein a new tab by typing the address, go to/two, then press Back. Without this change Back leaves the site, with it Back goes to/one.
Before:
withoutfix.mov
After:
withfix.mov
Docs
No docs changes needed. This is a bug fix and doesn't change any API.

Changes
replaceDefineinvite-plugin-import-meta-env.tsnow passestsconfig: falsetotransformWithOxc, preventing Oxc from auto-discovering tsconfig files for each transformed file. Without this, Oxc could walk up to a parent-directorytsconfig.jsonwhoseextends(e.g.astro/tsconfigs/strict) can't be resolved in that directory, causing a fatalTSCONFIG_ERROR. This matches what Vite's own define plugin does for its equivalentlang: 'js'define-only transform.- tsconfig is irrelevant for the plain define-replacement this transform performs, so disabling discovery is safe and more robust than forwarding
config.tsconfig(which would still fall back to auto-discovery whenvite.tsconfigis unset).
Testing
- Unit test added in
packages/astro/test/units/env/vite-plugin-import-meta-env.test.tscovering the case wheretransformWithOxcis called withtsconfig: false, ensuring the option is forwarded correctly.
Docs
- No docs update needed; this is an internal build behavior fix with no user-facing API changes.
Closes #18404

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
astro@7.4.1
Patch Changes
-
#18425
6fdc36eThanks @astro-factory! - Preserves the last modified date of cached optimized images and incrementally restored build output when copying them into the build output on all platforms -
#18419
395d195Thanks @astro-factory! - Fixes a typo in the error message shown when a fontcssVariableis invalid -
#18401
484822fThanks @danielmlr! - Fixes a bug where projects whose path contains an apostrophe (') failed to load sessions, middleware, a cache provider, or asrc/fetch.tshandler -
#18407
a6e00beThanks @astro-factory! - Fixes aTSCONFIG_ERRORduringastro buildwhen a parent directory contains atsconfig.jsonthat cannot be resolved, such as one extendingastro/tsconfigs/strictwithout installed dependencies -
#18427
908f167Thanks @astro-factory! - Fixes anUnterminated stringbuild error when application code imports fromastro/config(for example,fontProvidersin a shared fonts module) -
#18428
40e7d54Thanks @astro-factory! - Fixes missing styles in production builds for conditionally rendered framework components (e.g. Svelte components inside{#if}blocks) imported by a hydrated island -
#18424
617ff59Thanks @astro-factory! - Fixes style-only HMR in.astrocomponents falling back to a full page reload when a PostCSS plugin (such as@unocss/postcss) lists the component as a dependency of its own style -
#18274
70834bbThanks @Princesseuh! - Fixes increasing memory usage when editing the Astro configuration while the dev server is running
@astrojs/cloudflare@14.4.1
Patch Changes
- #18351
9669d81Thanks @astro-factory! - FixesCannot find package 'prismjs'errors whenprismjsisn't hoisted, such as with pnpm's global virtual store orhoist=false - Updated dependencies []:
- @astrojs/underscore-redirects@1.0.4
@astrojs/node@11.1.9
Patch Changes
- #18382
c75e897Thanks @Llois41! - Fixes the standalone server not loggingServer listening on …whenHOSTis an IP address, which happens on Node.js 26.12 and later
@astrojs/vercel@11.0.16
Patch Changes
- #18411
48ec171Thanks @matthewp! - Uses the Vercel Bun runtime for serverless functions when the project is built with Bun (e.g.bunx --bun astro build)
@astrojs/vue@7.1.1
Patch Changes
- #18398
9731465Thanks @ump45nose! - Fixes Vue SSR concatenating Astro slot HTML character by character when the slot value is a String object (Astro's SlotString). StaticHtml now coerces the value withString(...)before passing it toinnerHTML.
@astrojs/check@0.9.11
Patch Changes
-
#18445
d736df7Thanks @astro-factory! - Fixes the--preserveWatchOutputhelp text, which described the opposite of the flag's behavior. Setting it totruekeeps output between checks in watch mode. -
#18444
c55134cThanks @astro-factory! - Fixesastro check --watchexiting immediately when the project path containsnode_modulesor.git

Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @vitest/snapshot (source) | 4.1.11 → 5.0.5 |
||
| vitest (source) | 4.1.11 → 5.0.5 |
||
| vitest (source) | ^4.1.11 → ^5.0.5 |
Release Notes
vitest-dev/vitest (@vitest/snapshot)
v5.0.5
🐞 Bug Fixes
- Keep vite default
fs.denywith api token file - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11578 (28dc1) - Handle quoted file names in
--changed- by @sheremet-va in #11583 (14921) - Add
datato theimport.meta.hotstub - by @sheremet-va in #11590 (3a828) - Set
skipinskipIf, ignoreundefinedoptions - by @sheremet-va in #11591 (d523a) - Skip builtin loading in async leak detector - by @sheremet-va in #11598 (fe86a)
- Keep the import frame in native loader errors - by @sheremet-va in #11599 (9697b)
- Run hook cleanups when a later hook fails - by @sheremet-va in #11605 (6c5a4)
- Release mocks of finished test files - by @sheremet-va in #11607 (e9c3d)
- Abort all running tests on cancel - by @sheremet-va in #11606 (6621a)
- browser:
- Ignore synthetic pagehide events - by @sheremet-va in #11582 (ca081)
- Run plugin buildStart on server creation - by @sheremet-va in #11593 (ea611)
- Drop late connections of closed sessions - by @sheremet-va in #11600 (f161e)
- Wait 30s for the browser to close - by @sheremet-va in #11601 (6498b)
- Run global setup once with instances - by @sheremet-va in #11596 (8dd67)
- reporter:
- End reason
&#​39;failed&#​39;on worker crash - by @AriPerkkio in #11568 (6ae8e)
- End reason
View changes on GitHub
v5.0.4
🚀 Features
- experimental:
- Tag cache directories with CACHEDIR.TAG - by @lifeiscontent in #11461 (a8ea3)
- Support
test.ui.themeoption - by @sheremet-va in #11499 (1da66) - Highlight selector multiple matches in trace view - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11489 (5abba)
- Print how many tests were affected and a total when running
--changed- by @sheremet-va in #11424 (a2336) - Add an option to cache dependencies instead of statically parsing them - by @sheremet-va in #11515 (c0601)
- Add fit and zoom controls to trace viewer - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11490 (f5dd9)
🐞 Bug Fixes
- Fail the run on git and location filter errors - by @sheremet-va in #11430 (30d03)
- Enable fsModuleCache by default - by @sheremet-va in #11435 (ad208)
- Track project files and mocks with --changed - by @sheremet-va in #11432 (b0f2b)
- Refactor caching, fix
:in project and change the shape ofresultscache - by @sheremet-va in #11453 (9673c) - Keep full
$string values whentaskTitleValueFormatTruncateis 0 - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11485 (4f7e1) - Resolve node builtins in client environments - by @sheremet-va in #11417 (56b31)
- Fix module graph builtin externals after #11421 - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11491 and #11421 (008e1)
- Wrap module mocks during in-source testing - by @sheremet-va in #11505 (36d19)
- Handle line endings in snapshot - by @sheremet-va in #11522 (4c468)
- Respect root in projects - by @sheremet-va in #11521 (26642)
- Resolve mocks in directories with spaces - by @sheremet-va in #11539 (caaef)
- api:
- Publish the api token atomically - by @umairnawaz333 in #11323 (6f990)
- browser:
- Close the mock route interception race - by @cplieger and @sheremet-va in #8339 and #11083 (d6620)
- Allow toHaveTextContent without arguments - by @nomadical in #11425 (8ebcf)
- Apply API options without browser config - by @sheremet-va in #10852 (ad055)
- Preserve undefined command arguments - by @sheremet-va and @AriPerkkio in #11497 (1576d)
- Wait for setup mocks before importing a test file - by @kasperpeulen in #11520 (b61d1)
- Avoid extra scroll outside the iframe - by @sheremet-va in #11523 (662e8)
- Run browser instances as workers - by @sheremet-va in #11525 (bf04b)
⚠️ This can degrade performance if you have a custommaxWorkerssetting. Previously, it was applied incorrectly and could lead to Vitest using too many resources. For example, a lower number would still open too many browsers. Fixing it means Vitest opens less instances by default now.
- Open one cdp session per tester - by @sheremet-va in #11542 (69e63)
- Clean up unmocked and pending mocks - by @sheremet-va in #11537 (5c955)
- coverage:
- V8 browser memory leak between test files - by @AriPerkkio in #11466 (2297d)
allowExternalfails to include uncovered files - by @AriPerkkio in #11513 (4ef00)- Filenames containing brackets incorrectly showing as uncovered - by @AriPerkkio in #11531 (0fa80)
- Istanbul coverage wrong when module transform warmups - by @AriPerkkio in #11529 (9f61d)
- deps:
- Update all non-major dependencies - by @sheremet-va in #11167 (c74e0)
- expect:
- Fix
MapandSetdeep equality in some assertions - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11402 (b4e79) - Check value in chai-style returned - by @sheremet-va in #11500 (1aca0)
- Fix
- mocker:
- Fix native loader mocking edge cases - by @sheremet-va in #11540 (cd423)
- pretty-format:
- reporters:
- Junit to strip ANSI sequences from all XML attributes - by @meganemura and Claude Opus 5.5 in #11407 (e1a73)
- runner:
- Don't cache failed fixture setups - by @hamed-bavar in #11237 and #11238 (4ee66)
- typecheck:
- Use typescript pool in toTestSpecification - by @sheremet-va in #11451 (5f273)
- ui:
- Remove duplicate browser-open call opening two tabs - by @feastyr69 in #11356 and #11358 (d7e13)
- Simplify explorer filtering + fix nested tests when search matches a suite - by @hi-ogawa, Hiroshi Ogawa, Codex and Claude Opus 5.5 in #11262 (a627b)
- Store module graph once per environment - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11421 (af903)
- Mount index.html handler on the ui base path - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11517 (1bc24)
- Center split pane resize handle - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11506 (e658b)
- vm:
- Bind
thistomodule.exports- by @sheremet-va in #11504 (b618a)
- Bind
🏎 Performance
- Reuse fsModuleCache when filtering by source - by @sheremet-va in #11428 (7ebd9)
- spy: Reset only mocks that were called or reconfigured - by @johan-gorter and Claude Opus 5.5 in #11197 (28ef9)
View changes on GitHub
v5.0.3
🐞 Bug Fixes
- Isolate
result.statusbetweenrepeatsruns - by @hi-ogawa, Hiroshi Ogawa and Codex (GPT-6) in #11218 (5dbeb) - Don't print an interceptor warning in browser mode - by @sheremet-va in #11377 (15cc0)
- Don't retry when
test.failsexpectedly failed - by @hi-ogawa, Hiroshi Ogawa and Codex (GPT-6) in #11219 (b2458) - Scope cache key generators to projects - by @ecoyoung in #11281 and #11301 (92ba7)
- browser:
- Delay server
listenuntil tests start running - by @sheremet-va in #11366 (7d8ed) - Check mock path boundaries - by @saryn17, Ryosei Sato and @sheremet-va in #11361 and #11362 (1c388)
- Keep config of browser-consumed environments - by @kasperpeulen and Claude in #11378 (aafc0)
- Ignore page crash while cancelling - by @sheremet-va in #11386 (7c367)
toMatchScreenshotuses wrong reference on retried tests - by @macarie in #11393 (c22ab)
- Delay server
- cache:
- Revalidate imports of cached modules - by @sheremet-va in #11381 (38f98)
- deps:
- Pin
why-is-node-runningto3.2.1to avoid users running intoERR_PNPM_TRUST_DOWNGRADE- by @AriPerkkio in #11403 (f6c9a)
- Pin
- expect:
- Pass current equality testers to
expect.extendasymmetric matchers - by @hi-ogawa, Hiroshi Ogawa and Claude in #11401 (3e794)
- Pass current equality testers to
- jsdom:
- Support Blob on jsdom 30.1 - by @sheremet-va in #11379 (6c49b)
- pool:
- ui:
- vitest:
- Remove root temp dir on close - by @abhinav-phi in #11248 (7c711)
- vm:
View changes on GitHub
v5.0.2
🐞 Bug Fixes
- Bind
processin case global is overwritten - by @AriPerkkio in #11343 (0b792) - detect-async-leaks:
- Ignore
process.stdiohandles - by @AriPerkkio in #11333 (0fd6b)
- Ignore
- expect:
- Fix
toMatchObjectwith asymmetric matchers - by @ShreeBohara, Claude Opus 5, @hi-ogawa, Hiroshi Ogawa and Codex (GPT-5) in #11100 (42523)
- Fix
- jsdom:
- Fix
RequestwithBlobbody on jsdom 28+ - by @harshit-d3v in #11295 (d1c3e)
- Fix
- reporter:
agentto respect--silent- by @Raj4478 and @AriPerkkio in #11271 (5b95e)
- reporters:
- spy:
- ui:
- Persist authentication cookie beyond current browser session - by @hi-ogawa, Hiroshi Ogawa and OpenCode (gpt-5.6-sol) in #11066 (f8819)
View changes on GitHub
v5.0.1
🚀 Features
- ui:
- Move trace attempts selector to viewer header - by @hi-ogawa, Hiroshi Ogawa and Codex in #11189 (5dc4b)
- Add focused trace view layout mode - by @hi-ogawa, Hiroshi Ogawa, OpenCode (gpt-5.6-sol) and Codex in #11190 (376dc)
🐞 Bug Fixes
- Exit 1 when vitest list fails collection - by @hamed-bavar in #11145 and #11146 (6108b)
- Keep parse error details in static collection - by @hamed-bavar in #11150 and #11151 (7c818)
- Avoid recursive prototype in automocking - by @sheremet-va in #11195 (99fc5)
- Prevent false Vitest import resolution - by @sheremet-va in #11196 (b426c)
- Keep metadata file when clearing the cache - by @sheremet-va in #11199 (73614)
- Correct typos in error message and comments - by @shinji00222 and Shinji in #11187 (115c3)
- Resolve ResolvedConfig exactOptionalPropertyTypes errors - by @LukeAbby in #11175 (498fb)
- Share the server on self-referencing
extends- by @sheremet-va in #11034 (23dda) - Warn when deprecated
deps.optimizer.webis used - by @im10furry in #11214 (2ce29) - browser:
- Avoid double quotes in
config.define- by @sheremet-va in #11198 (972e2)
- Avoid double quotes in
- doctor:
- Measure vm pools for custom environments - by @sheremet-va in #11212 (91ab1)
- expect:
- Correct return value in
toMatchAriaSnapshot- by @sheremet-va in #11208 (c119b)
- Correct return value in
- fakeTimers:
- Force
queueMicrotaskandnextTickintoNotFake- by @kingmakeruix, kingmakeruix, Hiroshi Ogawa, Codex and @hi-ogawa in #11261 (a47d7)
- Force
- snapshot:
- Report obsolete keys next to skipped tests - by @hamed-bavar, Hiroshi Ogawa and OpenCode (gpt-5.6-sol) in #11157 and #11158 (17e2b)
- types:
- Make public declarations self-contained - by @ZoeySigel in #11141 (45546)
- ui:
- Fix collapse/expand suite with file name search - by @hi-ogawa, Hiroshi Ogawa and Codex in #11260 (0a712)
- Fix explorer file summary count - by @hi-ogawa, Hiroshi Ogawa, OpenCode (gpt-5.6-sol) and Codex in #11125 (05982)
- utils:
- Fix
deepMergeto handle prototype - by @hi-ogawa, Hiroshi Ogawa and Codex in #11215 (4944c)
- Fix
View changes on GitHub
v5.0.0
Vitest 5 is officially out! This release focuses on performance and brings a lot of new features while fixing long-standing bugs. See our blog post for the official announcement.
🚨 Breaking Changes
- Replace
loupe.inspectwith pretty-format - by @hi-ogawa, Claude Opus 5 (1M context) and OpenAI Codex in #9609 (3f802) - Remove quotes from string values in
test.for/eachtitle$variable (take 2) - by @hi-ogawa in #10170 (04d37) - Default
attachmentsDirfrom.vitest-attachements/to.vitest/attachments/- by @MdSadiqMd in #10186 (1ba73) - Remove
sequentialtest/suite options in favor ofconcurrent- by @hi-ogawa and OpenAI Codex in #10198 (9229f) - Represent locator as an object instead of a string - by @sheremet-va in #10212 (80f07)
- Inline
expectpackage - by @sheremet-va in #10221 (ad162) - Remove deprecated entry points - by @sheremet-va in #10222 (994c6)
- Require Node.js 22 and Vite 6.4 - by @sheremet-va in #10178 (38762)
- Fail
expect.pollwhen function didn't resolve in time - by @hi-ogawa and OpenAI Codex in #10233 (4df04) - Throw an error if hoistable methods are outside the top level scope - by @sheremet-va in #10460 (d0b4f)
toHaveTextContentis strict, addtoMatchTextContentas alternative - by @sheremet-va in #10473 (18f30)- Don't lookup config file from ancestor directories - by @hi-ogawa, OpenAI Codex and Hiroshi Ogawa in #10428 (945d9)
- Inline
@vitest/runnerpackage, do not publish it anymore - by @sheremet-va in #10511 (6d6e4) - Allow mutating happy-dom/jsdom window object - by @hi-ogawa, Hiroshi Ogawa and OpenAI Codex in #10373 (206e8)
- Expose
concurrencyId/workerIdon TestModule's diagnostics, make id 1-based - by @sheremet-va in #10516 (bdd98) - Add
screenshotDirectoryconfig tobrowser.expect.toMatchScreenshot- by @macarie in #10592 (a60de) - Update
@sinonjs/fake-timersand support mockingTemporal- by @hi-ogawa, Hiroshi Ogawa and OpenCode (gpt-5.6-sol) in #10654 (f8b15) - Remove webdriverio package - by @sheremet-va in #10675 (5fed6)
- Clear mocks by default before each test - by @sheremet-va in #10613 (0f646)
- Don't emit localStorage warnings on Node 26, fail gracefully when worker fails to start - by @sheremet-va in #10293 (334ed)
- Separate config resolution from the server creation - by @sheremet-va in #10554 (1c0ec)
- Inline projects extend the root config by default - by @sheremet-va in #10750 (fec00)
- Enable mocking Temporal without fake timers - by @fabon-f, Hiroshi Ogawa and OpenCode (gpt-5.6-sol) in #10757 (ac2d4)
- Support nested projects - by @sheremet-va in #10846 (ec367)
- Use
>as separator in-t, calculateonlyonce - by @sheremet-va in #10686 (a0b20) - Fail the test when an asynchronous assertion is not awaited - by @sheremet-va in #10868 (86d4a)
- Share the Vite server between inline projects - by @sheremet-va in #10848 (d87c9)
- Parse files statically in vitest list by default - by @sheremet-va in #11088 (51e94)
- benchmark:
- Rewrite the public API - by @sheremet-va in #10113 (19f6e)
- browser:
- Iframe scale - by @macarie in #9745 (b6398)
- Enable
locators.exactby default - by @sheremet-va in #10430 (e2032) - Require
sessionIdfor orchestrator html request - by @hi-ogawa, Hiroshi Ogawa and OpenAI Codex in #10522 (79b7d) - Save failure screenshots in
attachmentsDir- by @macarie in #10917 (3b5bb)
- coverage:
include/excludeglobs too eager - by @AriPerkkio in #9818 (edacb)- Allow
thresholds.perFileto accept an object - by @vladlenskiy and @AriPerkkio in #10190 (13b78)
- expect:
- Fix
toThrow("")behavior by reverting #6710 - by @hi-ogawa in #9643 and #6710 (6c3e4)
- Fix
- mocker:
- Deserialize automock as automock - by @nami8824 in #10192 (2f892)
- reporters:
blobreporter and--merge-reportsdefault to.vitest/blob/- by @AriPerkkio in #10232 (d22b0)- Write json and junit reporter output files to
.vitestby default - by @hi-ogawa, Hiroshi Ogawa, OpenCode (gpt-5.6-sol) and @AriPerkkio in #10621 (58577)
- spy:
- Preserve class mock prototype methods on instances - by @sheremet-va in #10910 (6093d)
- types:
- Add better promise support in expects and matchers - by @samchungy and @sheremet-va in #8266 (41f55)
- ui:
- Harden UI API access - by @hi-ogawa, Hiroshi Ogawa and OpenAI Codex in #10583 (4c26d)
- Change html reporter default output to
.vitest- by @hi-ogawa and Hiroshi Ogawa in #10620 (29c36)
🚀 Features
- Add
createReportand.vitestreport directory convention - by @AriPerkkio in #9993 (72a6d) - Expose default reporters through
configDefaults.reporters- by @hi-ogawa and Claude Opus 5 (1M context) in #10219 (083f6) - Support merge reports for non-sharded multi-environment runs (take 2) - by @hi-ogawa, Claude Opus 5 (1M context), OpenAI Codex and @AriPerkkio in #10031 (e60b2)
- Add
logger.formatError- by @hi-ogawa and OpenAI Codex in #10268 (2c5f3) - Support typescript build mode - by @lishaduck in #9870 (106da)
- Add toggable
injectCjsGlobalsoption - by @sheremet-va in #10709 (82671) - Promote fsModuleCache to a top-level option - by @sheremet-va in #10734 (78ed7)
- Support non-ascii characters in
for/eachtitle placeholders - by @k-yle in #10773 (15e0a) - Report the duration breakdown as percentages - by @sheremet-va and @AriPerkkio in #10820 (c67d2)
- Promote parseSpecifications out of experimental - by @sheremet-va in #11087 (b628c)
- Promote clearCache out of experimental - by @sheremet-va in #11086 (d4fe1)
- api:
- Expose logs recorded during the test - by @sheremet-va in #10277 (cba20)
- benchmark:
- Add pluggable benchmark provider API - by @GuillaumeLagrange and @sheremet-va in #10799 (86c70)
- browser:
- Export aria tree utils - by @hi-ogawa in #10171 (c3423)
- Support dom snapshot trace view - by @hi-ogawa, Claude Opus 5 (1M context) and OpenAI Codex in #10102 (7eddd)
- Provide project reference in
ToMatchScreenshotResolvePath- by @macarie and @sheremet-va in #10138 (16654) - Show aria tree on locator element error - by @hi-ogawa and OpenAI Codex in #10257 (04f04)
- Support custom
kindinpage.mark- by @AriPerkkio in #10302 (053e8) - Live update trace view on watch UI - by @hi-ogawa and OpenAI Codex in #10296 (78c11)
- Add
context.markfor custom command tracing - by @AriPerkkio in #10329 (aa514) - Show trace view steps in editor panel - by @hi-ogawa and OpenAI Codex in #10404 [(8c4b6)](https:/
[!IMPORTANT]
✂ PR body was truncated to here.
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Changes
- Fixes a dev server 500 when the project path contains an apostrophe and a session driver is set, as
@astrojs/nodedoes by default. Astro writes the resolved driver path into the generatedvirtual:astro:session-drivermodule inside single quotes, so a path like~/arc's site/ends the string early and Vite can't parse the module. - The cache provider, middleware and
src/fetch.tsmodules break the same way. In dev,src/fetch.tsis then ignored without an error. - These import paths now go through
JSON.stringify(), as the content layer already does. Paths without special characters resolve to the same files.
Reproduction with Astro 7.4.0 and @astrojs/node 11.1.8:
npm create astro@latest "arc's site" -- --template minimal --install --no-git --yes
cd "arc's site"
npx astro add node --yes
npx astro devOpening / returns a 500 and logs:
Failed to parse source for import analysis because the content contains invalid JS syntax. If you are using JSX, make sure to name the file with the .jsx or .tsx extension.
Stack trace:
at \0virtual:astro:session-driver:1:208
With pnpm and an on-demand page, astro build fails at the same module.
Testing
- New
test/units/virtual-module-imports.test.tsloads each of the four modules with an apostrophe in the resolved path and checks that the generated imports point at it. Without the fix, each case fails with a parse error.
Docs
- None: bug fix, no API change.

Changes
- In dev, a
server:deferisland that importsastro:actionsorastro:config/serverwould 500 withCould not find server component nameif its page wasn't the first island page loaded after the server started.ensureModulesLoaded()in the CSS plugin was walking intovirtual:astro:server-island-manifestand re-fetching it on the server side before the module runner could, causing the runner to keep a stale island map that was missing the newly discovered island. ensureModulesLoaded()now skipsRESOLVED_SERVER_ISLAND_MANIFEST. The manifest contains no CSS, so CSS collection is unaffected. The non-cascading refresh introduced in #18166 is preserved.
Testing
- Added a dev-server integration test in
packages/astro/test/server-islands.test.tsusing a newtest/fixtures/server-islands/late-discoveryfixture. The test cold-starts the dev server, requests an island-free page first, then requests a second page whose island importsastro:actions, and asserts a 200 response (previously 500).
Docs
- No docs update needed; this is a dev-only bug fix with no user-facing API changes.
Closes #18387
Description
This PR updates the monorepo to pnpm 12.11.2 (latest tag).
- Use the
devEnginesfield to manage both the pnpm and Node.js versions. - Use Node.js 24.18.0 by default locally and in CI (
ci.ymlstill tests using the minimum Node.js major version supported by Astro). - Use
pnpm/setupin workflows. - Fix the devcontainer which was already broken before this PR and would have been even more after it. I tested locally that everything works as expected using the devcontainers CLI and Docker.
- Enable
minimumReleaseAgeExcludePrunewhich automatically prunes entries inminimumReleaseAgeExcludewhen running a resolving commands (pnpm install,pnpm update, etc.). Note that a specific version is pruned only when that version is no longer in the lockfile (this means that an entry no longer requiring to be inminimumReleaseAgeExcludebut still used would not be pruned automatically).

Changes
@astrojs/vue'sStaticHtmlnow coerces the slotvaluewithString(...)before passing it toinnerHTML.- Astro hands slots as
SlotString(aStringobject). Vue's SSR buffer treats non-primitives as nested buffers and builds the output one character at a time, which becomes costly for large slots (for example island markup).
Fixes #18392
Testing
- Added
packages/integrations/vue/test/static-html.test.ts: renders with aStringobject and with a primitive; empty value returns null. - Ran:
pnpm exec astro-scripts test "test/static-html.test.ts"(Node 22.20.0) → 2/2 pass. - Ablation bench (30× render of an 8k
Stringobject): coerced ~10ms vs uncoerced ~19ms locally; larger payloads widen the gap. - Did not run the full
@astrojs/vuefixture suite (needs a fullastropackage build on this machine).
Docs
No docs change — internal SSR performance fix; user-facing behavior is unchanged.
AI assistance disclosure
An AI coding agent (Grok Bot) drafted this change. I reviewed the diff, ran the tests above, and take responsibility for the PR.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| vitest (source) | ^5.0.3 → ^5.0.4 |
Release Notes
vitest-dev/vitest (vitest)
v5.0.4
🚀 Features
- experimental:
- Tag cache directories with CACHEDIR.TAG - by @lifeiscontent in #11461 (a8ea3)
- Support
test.ui.themeoption - by @sheremet-va in #11499 (1da66) - Highlight selector multiple matches in trace view - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11489 (5abba)
- Print how many tests were affected and a total when running
--changed- by @sheremet-va in #11424 (a2336) - Add an option to cache dependencies instead of statically parsing them - by @sheremet-va in #11515 (c0601)
- Add fit and zoom controls to trace viewer - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11490 (f5dd9)
🐞 Bug Fixes
- Fail the run on git and location filter errors - by @sheremet-va in #11430 (30d03)
- Enable fsModuleCache by default - by @sheremet-va in #11435 (ad208)
- Track project files and mocks with --changed - by @sheremet-va in #11432 (b0f2b)
- Refactor caching, fix
:in project and change the shape ofresultscache - by @sheremet-va in #11453 (9673c) - Keep full
$string values whentaskTitleValueFormatTruncateis 0 - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11485 (4f7e1) - Resolve node builtins in client environments - by @sheremet-va in #11417 (56b31)
- Fix module graph builtin externals after #11421 - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11491 and #11421 (008e1)
- Wrap module mocks during in-source testing - by @sheremet-va in #11505 (36d19)
- Handle line endings in snapshot - by @sheremet-va in #11522 (4c468)
- Respect root in projects - by @sheremet-va in #11521 (26642)
- Resolve mocks in directories with spaces - by @sheremet-va in #11539 (caaef)
- api:
- Publish the api token atomically - by @umairnawaz333 in #11323 (6f990)
- browser:
- Close the mock route interception race - by @cplieger and @sheremet-va in #8339 and #11083 (d6620)
- Allow toHaveTextContent without arguments - by @nomadical in #11425 (8ebcf)
- Apply API options without browser config - by @sheremet-va in #10852 (ad055)
- Preserve undefined command arguments - by @sheremet-va and @AriPerkkio in #11497 (1576d)
- Wait for setup mocks before importing a test file - by @kasperpeulen in #11520 (b61d1)
- Avoid extra scroll outside the iframe - by @sheremet-va in #11523 (662e8)
- Run browser instances as workers - by @sheremet-va in #11525 (bf04b)
⚠️ This can degrade performance if you have a custommaxWorkerssetting. Previously, it was applied incorrectly and could lead to Vitest using too many resources. For example, a lower number would still open too many browsers. Fixing it means Vitest opens less instances by default now.
- Open one cdp session per tester - by @sheremet-va in #11542 (69e63)
- Clean up unmocked and pending mocks - by @sheremet-va in #11537 (5c955)
- coverage:
- V8 browser memory leak between test files - by @AriPerkkio in #11466 (2297d)
allowExternalfails to include uncovered files - by @AriPerkkio in #11513 (4ef00)- Filenames containing brackets incorrectly showing as uncovered - by @AriPerkkio in #11531 (0fa80)
- Istanbul coverage wrong when module transform warmups - by @AriPerkkio in #11529 (9f61d)
- deps:
- Update all non-major dependencies - by @sheremet-va in #11167 (c74e0)
- expect:
- Fix
MapandSetdeep equality in some assertions - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11402 (b4e79) - Check value in chai-style returned - by @sheremet-va in #11500 (1aca0)
- Fix
- mocker:
- Fix native loader mocking edge cases - by @sheremet-va in #11540 (cd423)
- pretty-format:
- reporters:
- Junit to strip ANSI sequences from all XML attributes - by @meganemura and Claude Opus 5.5 in #11407 (e1a73)
- runner:
- Don't cache failed fixture setups - by @hamed-bavar in #11237 and #11238 (4ee66)
- typecheck:
- Use typescript pool in toTestSpecification - by @sheremet-va in #11451 (5f273)
- ui:
- Remove duplicate browser-open call opening two tabs - by @feastyr69 in #11356 and #11358 (d7e13)
- Simplify explorer filtering + fix nested tests when search matches a suite - by @hi-ogawa, Hiroshi Ogawa, Codex and Claude Opus 5.5 in #11262 (a627b)
- Store module graph once per environment - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11421 (af903)
- Mount index.html handler on the ui base path - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11517 (1bc24)
- Center split pane resize handle - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11506 (e658b)
- vm:
- Bind
thistomodule.exports- by @sheremet-va in #11504 (b618a)
- Bind
🏎 Performance
- Reuse fsModuleCache when filtering by source - by @sheremet-va in #11428 (7ebd9)
- spy: Reset only mocks that were called or reconfigured - by @johan-gorter and Claude Opus 5.5 in #11197 (28ef9)
View changes on GitHub
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| zod (source) | ^4.6.5 → ^4.6.6 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @cloudflare/workers-types | ^5.20261009.1 → ^5.20261012.1 |
||
| @vitejs/plugin-vue (source) | ^6.0.9 → ^6.0.10 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| zod (source) | ^4.6.5 → ^4.6.6 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| vite (source) | ^8.3.3 → ^8.3.4 |
Release Notes
vitejs/vite (vite)
v8.3.4
Features
Bug Fixes
- avoid mutating hmr defaults (fix #23575) (#23576) (574d5e3)
- build: correct preloads when chunkImportMap is enabled with non-root base (#23698) (2a8c0f0)
- build: wait for in-flight stylesheets in preload helper (fix #23652) (#23662) (036b745)
- bundled-dev: serve
/@vite/clientand stub@vite/env(#23664) (5afc5a8) - client: skip rewriting unchanged adopted styles (#23697) (fa71469)
- css: resolve imported preprocessors from their file path with lightningcss (#23688) (cf52011)
- deps: update all non-major dependencies (#23648) (8a4c19c)
- deps: update rolldown-related dependencies (#23649) (794516d)
- dev: a restart requested during a restart used to be dropped (fix #23392) (#23484) (70d56ea)
- don't treat modules ending with js-like query as js (#23687) (fcb6f12)
- html: avoid adding filesystem root to watcher (#23689) (3a7f2ae)
- html: skip caching CSS of chunks in a cycle (fix #23628) (#23636) (15d82f7)
- optimizer: scan deep imports with custom extensions (#23678) (8579189)
- remove input option unescaping for now (#23694) (facc2fb)
- server: match static aliases on path boundaries (#23643) (b28db28)
- watcher: normalize file before root check in
ensureWatchedFile(#23673) (12bb28c)
Performance Improvements
Code Refactoring
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Changes
isr.excludeentries are written to the Vercel config as exact routes with no trailing slash (/accountbecomes^/account$), but the ISR routes accept one (^(/([^/]+?)/?)$).- So a request for an excluded path with a trailing slash (
/account/) skips its exclusion. If a dynamic route like[slug].astroalso matches it, the request goes to the ISR function, and the response is cached and served to every visitor until it expires. For a page that depends on cookies, one visitor's page can be shown to others. - This allows an optional trailing slash on exclusion routes, the same way the ISR routes do. The edge-middleware path uses the same list (
isrExcludedRoutes), so it's fixed there too.
Seen on a live site: /projects was in isr.exclude. /projects returned x-vercel-cache: MISS, while /projects/ returned STALE and its links picked up x_astro_path from the ISR rewrite.
Testing
isr.test.ts: updated the expected exclusion routes, and added a test that/two/,/excluded/foo/,/excluded/foo/bar/,/api/and/api/foo/all reach_renderbefore any ISR route. The fixture's[a]/[b]route matches/excluded/foo/, which reproduces the bug.isr-edge-middleware.test.ts: updated the expected/liveroute, and added a check that the middleware sends/live/to_render./liveoverlaps the fixture's[slug]route.- Without the source change, these four tests fail. With it, the full
@astrojs/vercelsuite passes.
Docs
No docs change. This makes isr.exclude behave the way the docs already describe it.

This PR contains the following updates:
Release Notes
preactjs/signals (@preact/signals)
v2.11.3
Patch Changes
- #991
04445baThanks @JoviDeCroock! - Don't re-run auseSignalEffectfor a component that was unmounted by the same update. Preact 11 disposes it after paint, so the effect could otherwise run once more against an unmounted component.
sindresorhus/p-queue (p-queue)
v9.3.5
- Fix missed abort when the task aborts the signal while it starts
507e7ee
v9.3.4
- Count the running task before emitting active
22edad4
postcss/postcss (postcss)
v8.5.29
- Improved
</style>escaping (by @choudhryfrompak). - Fixed comments support in
list.comma()andlist.space()(by @00200200). - Fixed semicolon and custom property (by @wahidrizka).
csstools/postcss-plugins (postcss-preset-env)
v11.6.1
October 5, 2026
- Updated
@csstools/selector-specificityto6.0.1(patch)
v11.6.0
October 2, 2026
- Added
@csstools/postcss-custom-functionsCheck the plugin README for usage details. - Updated
@csstools/postcss-custom-functionsto1.0.1(patch)
v11.5.5
October 1, 2026
Notable changes:
postcss-mixinsnow implements more of the current spec- many plugins now have bounds to prevent CPU starvation or OOM
All updates plugins:
- Updated
@csstools/postcss-alpha-functionto2.0.15(patch) - Updated
@csstools/postcss-color-function-display-p3-linearto2.0.14(patch) - Updated
@csstools/postcss-color-functionto5.0.14(patch) - Updated
@csstools/postcss-color-mix-functionto4.0.14(patch) - Updated
@csstools/postcss-color-mix-variadic-function-argumentsto2.0.14(patch) - Updated
@csstools/postcss-container-rule-prelude-listto1.0.3(patch) - Updated
@csstools/postcss-content-alt-textto3.0.6(patch) - Updated
@csstools/postcss-contrast-color-functionto3.0.14(patch) - Updated
@csstools/postcss-exponential-functionsto3.0.8(patch) - Updated
@csstools/postcss-gamut-mappingto3.0.14(patch) - Updated
@csstools/postcss-gradients-interpolation-methodto6.0.14(patch) - Updated
@csstools/postcss-hwb-functionto5.0.14(patch) - Updated
@csstools/postcss-image-functionto1.0.5(patch) - Updated
@csstools/postcss-light-dark-functionto3.0.6(patch) - Updated
@csstools/postcss-media-minmaxto3.0.7(patch) - Updated
@csstools/postcss-media-queries-aspect-ratio-number-valuesto4.0.2(patch) - Updated
@csstools/postcss-mixinsto1.1.0(minor) - Updated
@csstools/postcss-oklab-functionto5.0.14(patch) - Updated
@csstools/postcss-property-rule-prelude-listto2.0.2(patch) - Updated
@csstools/postcss-random-functionto4.0.4(patch) - Updated
@csstools/postcss-relative-color-syntaxto4.0.14(patch) - Updated
@csstools/postcss-sign-functionsto2.0.8(patch) - Updated
@csstools/postcss-stepped-value-functionsto5.0.8(patch) - Updated
@csstools/postcss-system-ui-font-familyto2.0.2(patch) - Updated
@csstools/postcss-trigonometric-functionsto5.0.8(patch) - Updated
postcss-color-functional-notationto8.0.14(patch) - Updated
postcss-custom-mediato12.0.3(patch) - Updated
postcss-custom-propertiesto15.0.3(patch) - Updated
postcss-custom-selectorsto9.0.3(patch) - Updated
postcss-lab-functionto8.0.14(patch)
unjs/unifont (unifont)
v1.0.3
v1.0.3 is the next patch release.
👉 Changelog
🩹 Fixes
- confine font sources from providers + npm packages (#548)
💅 Refactors
- replace
ohashwithfnv1a-64(#549)
❤️ Contributors
- Daniel Roe (@danielroe)
colinhacks/zod (zod)
v4.6.6
Six malicious commits pushed to
mainon September 21 with a compromised git credential were reverted the same day in #6620 and have since been removed from the history ofmain. None were ever published to npm. The npm provenance for 4.6.6 names284243f, the pre-rewrite copy of9c21983with identical contents.
Commits:
0cd3af5docs: load the en locale directly in Zod Mini9d5e60fdocs: import locales from zod/locales, not z.locales34a626fdocs: tighten the z.locales tree-shaking note74304cerelease: stage npm versions instead of publishing them (#6622)b2ef983docs: add Code for Japan to bronze sponsors8fb2fafdocs: crop the Code for Japan logo and list it first in bronzebacad51docs: square the Code for Japan logo to match the other bronze tilesc42596brelease: hold the run on the release-approval environment until the staged versions are approved (#6638)a2ba4a6fix(types): declare record output and input as members, not base type arguments (#6645)a0ebf97fix(v4): check array, set and map size bounds before parsing elements (#6652)529f78d4.6.69c21983ci: stage at verbose so a failed OIDC token exchange says why
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| preact (source) | ^10.29.8 → ^11.0.1 |
Release Notes
preactjs/preact (preact)
v11.0.1
Fixes
- Keep suspended hydration within a component's own
$srange (#5300, thanks @JoviDeCroock) - Keep ref cleanups on the element instead of the ref function (#5290, thanks @JoviDeCroock)
- Unmount parked Suspense children when the boundary unmounts (#5295, thanks @gengjiawen)
DX
- Log the component stack of errors no boundary handles (#5297, thanks @JoviDeCroock)
Performance
- Key event listeners by prop name and stamp attach times per listener (#5272, thanks @JoviDeCroock)
Maintenance
- Change repository field to object format (#5292, thanks @piotr-cz)
- Fix the types of preact/compat/server and preact/compat/scheduler (#5282, thanks @JoviDeCroock)
v11.0.0
https://preactjs.com/blog/preact-11
Read the upgrade-guide over at https://preactjs.com/guide/v11/upgrade-guide
All other release notes can be seen at
- https://github.com/preactjs/preact/releases/tag/11.0.0-rc.2
- https://github.com/preactjs/preact/releases/tag/11.0.0-rc.1
- https://github.com/preactjs/preact/releases/tag/11.0.0-rc.0
- https://github.com/preactjs/preact/releases/tag/11.0.0-beta.2
- https://github.com/preactjs/preact/releases/tag/11.0.0-beta.1
- https://github.com/preactjs/preact/releases/tag/11.0.0-beta.0
Fixes
- Re-attach refs when a suspended subtree reveals (#5258, thanks @JoviDeCroock)
- Map imageRendering to image-rendering (#5270, thanks @kwy404)
- Append when the insertion reference node lives in another container (#5252, thanks @JoviDeCroock)
- Only drop the insertion cursor when it's detached (#5273, thanks @JoviDeCroock)
- Fall back to the global document for containers without an ownerDocument (#5274, thanks @JoviDeCroock)
- Check for moveBefore() on the container instead of globally (#5275, thanks @JoviDeCroock)
- Fix resuming into the DOM kept while a component was suspended (#5276, thanks @JoviDeCroock)
- Stop DOM nesting validation at portal boundaries (#5277, thanks @JoviDeCroock)
- Preserve the casing of camelCase custom event names (#5278, thanks @JoviDeCroock)
Performance
- Remove cloneNode for top-level Fragments (#5271, thanks @JoviDeCroock)
Maintenance
- Remove comment about building during prepare from compressed-size (#5255, thanks @JoviDeCroock)
- Fix compressed size comparison with pnpm (#5254, thanks @JoviDeCroock)
- Migrate dependency management to a root and demo pnpm workspace (#5246, thanks @JoviDeCroock)
- Pin terser to 5.16.0 (#5268, thanks @JoviDeCroock)
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| rolldown (source) | ^1.2.12 → ^1.2.13 |
||
| rolldown (source) | ^1.2.11 → ^1.2.13 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Refactor file system operations on cached build files to preserve accessed and modified timestamps during file copy on all systems. Previously, these timestamps would only be preserved on static builds on MacOS.
This allows for faster and leaner synchronization of cached assets (fonts, images, etc.), and is especially useful when propagating incremental builds with many cached files.
Changes
- Preserves last access and modified timestamps when copying files whenever
fs.promises.copyFileis called
Testing
All current tests pass.
Built astro package linked to local repository and used for build; cached assets now maintain their modified date.
Unsure how to build a new test for this case specifically.
Edit: test has been added confirming that built assets maintain their cached version's modified date
Docs
No changes to docs as this is purely a file system optimization

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| devalue | ^5.9.4 → ^6.0.2 |
Release Notes
sveltejs/devalue (devalue)
v6.0.2
Patch Changes
12ad9d6: chore: remove dts-buddy
v6.0.1
Patch Changes
c13cf6a: fix: populateerror.pathfor values reached through a promise instringifyAsync6156b2e: perf:stringifyandunevalskip per-character escaping for strings with nothing to escapee7a9a73: fix: throwInvalid inputinstead of a rawTypeErrorfor malformed typed array and boxed primitive payloads6156b2e: perf: only format path when an error is raised6156b2e: perf: cache quoted property names9e44253: Fixunevalfor typed array views whose backing buffer ends with a partial element
v6.0.0
Major Changes
afb3cb4: breaking: use tagged templatejsfor uneval replacers instead of nesteduneval3100507: breaking: require Node 22.17 or newer
Minor Changes
afb3cb4: feat: support cyclic custom objects
Patch Changes
ac295fb: fix: escape unpaired surrogates so uneval/stringify output survives UTF-8 transport
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| rolldown (source) | ^1.2.12 → ^1.2.13 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Changes
Integrations that overrides image services with undefined typically expect to implicitly reset the image service to whatever the user has, this stopped working with the two forms so this PR brings back that behavior. This was causing a crash in the Netlify adapter.
Testing
Tests!
Docs
N/A

Fixes #18381
Changes
logListeningOnwaited for thelisteningevent without checking whether it had already fired.standalone()calls it only afterapp.getLogger()resolves. For an IP literalHOSTno DNS lookup delayslisten(), so on Node 26.12 the event fires first and theServer listening on …line is never logged.- It now skips the wait when
server.listeningis alreadytrue:
export async function logListeningOn(logger, server, configuredHost) {
- await new Promise((resolve) => server.once('listening', resolve));
+ if (!server.listening) {
+ await new Promise((resolve) => server.once('listening', resolve));
+ }
…- Changeset:
@astrojs/nodepatch.
Testing
Added test/units/log-listening-on.test.ts. It calls logListeningOn on a server that already listens on 127.0.0.1, which is exactly the state standalone mode reaches on Node 26.12. The test does not depend on the Node version: it fails on 26.11 too without the fix.
- Before:
logs when the server is already listeningfails;logListeningOnnever settles ('timed out'instead of'logged'). - After: passes, and the full
@astrojs/nodesuite passes (194 passed, 2 skipped).
End to end with the reproduction from the issue (https://github.com//astro-node-listening-repro), patching the built entry.mjs:
| Node | HOST=127.0.0.1, before |
after |
|---|---|---|
| 26.11.1 | line logged | line logged |
| 26.12.0 | no line, HTTP 200 | line logged |
Docs
No docs change: this restores the documented startup message and changes no option or behaviour users configure.

Fixes #18343
On Linux, process.kill(pid, 0) succeeds for thread-ids, but ps -p <tid> returns no matching row. isLockFileProcessAlive was returning true (alive) when processInfo was undefined because processInfo?.cmd === undefined evaluates to true — so the function treated a thread-id lockfile entry as a live server.
This caused astro dev to refuse to start and, if the user force-cleared the lock, potentially send SIGTERM to an unrelated process that had recycled the same pid.
Fix: guard with an explicit undefined check — if ps returns no row the pid is not a running process, so the lock is stale.
// before
return processInfo?.cmd === undefined || isAstroCommand(processInfo.cmd)
// after
if (processInfo === undefined) return false
return isAstroCommand(processInfo.cmd)This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@astrojs/starlight@0.42.7
Patch Changes
-
#4264
94e0985Thanks @chrispezza! - Fixes a layout shift where the table of contents could be painted at the start of the content area and then jump to the end when a page's HTML arrived in several chunks -
#4285
6f22eddThanks @tunetheweb! - Improves hero image loading by addingfetchpriority="high"hint for browsers

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @qwik.dev/partytown | ^0.15.0 → ^1.0.0 |
Release Notes
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| rolldown (source) | ^1.2.12 → ^1.2.13 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @babel/core (source) | ^8.0.6 → ^8.0.7 |
Release Notes
babel/babel (@babel/core)
v8.0.7
🐛 Bug Fix
babel-helper-create-regexp-features-plugin,babel-plugin-transform-dotall-regex,babel-plugin-transform-unicode-sets-regex,babel-preset-envbabel-plugin-transform-for-of- #18292 Skip
for awaitintransform-for-of(@brunoborta)
- #18292 Skip
babel-helpers,babel-plugin-transform-async-generator-functions,babel-runtime-corejs3- #18283 Fix
asyncIteratorhelper forwarding.throw()to.return()(@brunoborta)
- #18283 Fix
babel-parserbabel-helpers,babel-plugin-transform-class-properties,babel-plugin-transform-modules-systemjs,babel-runtime-corejs3- #18284 Guard
@@toPrimitiveusage in toPrimitive helper (@nicolo-ribaudo)
- #18284 Guard
babel-plugin-transform-block-scoping- #18195 fix: closures in for-loop init capture wrong binding (@joelle-a-dev)
babel-helper-create-class-features-plugin,babel-plugin-transform-private-property-in-objectbabel-traverse- Other
- #18257 Fix eslint-parser AST definition of AccessorProperty (@jpradelle)
babel-core
🏠 Internal
babel-helpers,babel-plugin-transform-modules-commonjs,babel-runtime-corejs3- #18255 Simplify
interopRequireWildcardhelper (@nicolo-ribaudo)
- #18255 Simplify
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @qwik.dev/partytown | ^0.14.5 → ^0.15.0 |
Release Notes
QwikDev/partytown (@qwik.dev/partytown)
v0.15.0
Minor Changes
- ✨
mainElementPropertiesconfig: properties a worker script sets on DOM elements (such as a function an iframe's inlineonloadcalls) are also set on the real element, a function as a main thread function calling back into the worker. (by @Varixo in #776)
Patch Changes
-
🐞🩹
fetch(request)with aRequestobject keeps its method, headers, body and credentials instead of sending a GET to its URL (prebid's bid requests). (by @Varixo in #782) -
🐞🩹
postMessageon any iframe's window from the worker goes through its iframe element, also for about:blank frames the main thread has no partytown window for. (by @Varixo in #779) -
🐞🩹
hrefof<link>and<base>elements is read and set on the main thread again, so a stylesheet a worker script adds withlink.href = urlloads; the no-ophrefevery node has (for scripts walking up the tree) hid it. (by @Varixo in #780) -
🐞🩹 scripts loaded on the main thread via
loadScriptsOnMainThreadnow fire theload/errorhandlers registered on them in the worker (onload,onerror,addEventListener), so loaders that wait for them (e.g. gtag's Google Adsviewthroughconversion) complete (by @thegauravthakur in #771) -
🐞🩹 a worker
messagelistener can reply through theMessagePorts sent with the message (event.ports[0].postMessage), e.g. an ad library answering its creative's channel. (by @Varixo in #781) -
🐞🩹 in a worker
messagelistener,event.sourceof a message from one of the page's iframes is that iframe's window, so replies throughevent.source.postMessagereach it (e.g. a consent tool answering an ad's__tcfapicall). (by @Varixo in #779) -
🐞🩹 worker scripts can talk to a cross-origin iframe the browser loaded itself (no CORS):
iframe.contentWindow.postMessagereaches the frame, and the frame's reply toevent.sourcereaches the page'smessagelisteners instead of stopping at the partytown sandbox (e.g. a consent tool's consent store). (by @Varixo in #779) -
🐞🩹 window properties whose class partytown does not emulate, such as
cachesandscheduler, return the worker's own object instead of throwing "Illegal constructor". (by @Varixo in #778) -
🐞🩹 worker nodes get only the members every
Nodehas: elements no longer inheritTextmembers such assplitText, which made libraries that detect text nodes by it (preact) treat elements as text nodes. (by @Varixo in #777) -
🐞🩹 don't read partytown scripts before the window's environment has been sent to the worker. Scripts added during page load (e.g. by streaming SSR, picked up by the MutationObserver) or a
ptupdatebeforeloadwere sent to a worker with no environment for the window, failed, and were never run again (by @thegauravthakur in #767) -
🐞🩹 tabs that start Partytown in the same millisecond, e.g. waiting for the same service worker to activate, get different tab ids, so the service worker no longer sends one tab's requests to the other tab ("Error finding instance"). (by @gioboa in #783)
-
🐞🩹
window.eval(code)in a partytown script runs the code in the window's scope, like the script itself, instead of the worker's global scope wherewindow,documentand the page's globals are not defined (ad libraries run downloaded tags this way). (by @Varixo in #774) -
🐞🩹 define
CSSin the web worker:CSS.escape()runs in the worker, and every other member (CSS.supports(),CSS.registerProperty(), …) is forwarded to the main thread. Scripts like gtag that callCSS.escape()no longer throw (by @thegauravthakur in #773)
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| solid-js (source) | ^1.9.15 → ^1.9.17 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @vitejs/plugin-vue (source) | ^6.0.9 → ^6.0.10 |
Release Notes
vitejs/vite-plugin-vue (@vitejs/plugin-vue)
v6.0.10
Bug Fixes
- plugin-vue: compile transformed normal scripts outside vapor mode (#857) (7b63e3c)
- plugin-vue: correct AST reuse checks and allow Vue 3.6 RC (ccc06dd)
Documentation
- plugin-vue: clarify compiler initialization hooks (55d0cab)
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

tinyps does the same job as find-proc but slightly better as it looks up the exact process rather than doing a loose match.
Since it aims to be a process lookup toolkit rather than a single-use package like find-proc and find-process, it should de-dupe better over time too.
Testing
Existing lockfile tests pass.
Docs
No change to functionality.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| smol-toml | ^1.9.0 → ^1.9.1 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| rolldown (source) | ^1.2.12 → ^1.2.13 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| prettier (source) | ^3.9.9 → ^3.9.10 |
Release Notes
prettier/prettier (prettier)
v3.9.10
Markdown: Update micromark-extension-gfm-table to fix the table parse issue on performance (#20266 by @fisker)
See micromark/micromark-extension-gfm-table@4f43ead for details.
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
This moves the starlight-ai-actions entry from Community tools and integrations to the Community plugins section in the plugin showcase.
The package is a standard Starlight plugin (wired up via the plugins config, injecting components and routes), so it belongs with the other community plugins rather than the tools section (CLI tools/VS Code extensions). The initial PR #4254 landed it in the tools section — this PR only moves the entry without changing its href/title/description.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| svelte (source) | ^5.57.1 → ^5.57.2 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| CodSpeedHQ/action | action | patch | v5.4.0 → v5.4.2 |
Release Notes
CodSpeedHQ/action
v5.4.2
Bumps the CodSpeed runner to v5.4.2, including v5.4.1.
This release improves and adds support for memory flamegraphs in C++, Python and Node.js.
Fixes flamegraphs for Python in simulation mode in the exec CLI.
🚀 Features
- Name Python and Node.js frames in memory flamegraphs: emit their perf maps in memory mode, and harvest perf maps and JIT unwind data for memory tracking, by @not-matthias in #556
- Launch
nodewith the codspeed-node V8 flags for the current mode incodspeed exec, including through npm, npx and#!/usr/bin/env nodescripts, by @not-matthias in #556
🐛 Bug Fixes
- Always set
PYTHONPERFSUPPORT, so Pythoncodspeed exectargets keep their Python frames in simulation-mode flamegraphs, by @not-matthias in #577 - Fix memory flamegraph stacks: restore return addresses hijacked by uretprobes in nested allocator calls, compare mapped modules against their mapping, and keep every placement of a module mapped more than once, by @not-matthias in #564, #563 and #556
- Only pass
--interpreted-frames-native-stackto node in analysis mode by @not-matthias in #556 - Label dropped benchmarks in the comparison table by @adriencaccia in #570
⚙️ Internals
- Pin memtrack 1.6.1 and exec-harness 1.4.1, through 1.4.0, by @adriencaccia in #575 and #580
Full Runner Changelog:
https://github.com/CodSpeedHQ/codspeed/blob/main/CHANGELOG.md
What's Changed
- chore: bump runner version to 5.4.2 by @github-actions[bot] in #246
Full Changelog: CodSpeedHQ/action@v5.4.0...v5.4.2
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @fastify/middie | ^9.3.4 → ^9.3.5 |
||
| @fastify/static | ^10.1.5 → ^10.1.6 |
||
| express (source) | ^5.2.1 → ^5.3.0 |
Release Notes
fastify/middie (@fastify/middie)
v9.3.5
What's Changed
New Contributors
Full Changelog: fastify/middie@v9.3.4...v9.3.5
fastify/fastify-static (@fastify/static)
v10.1.6
What's Changed
Full Changelog: fastify/fastify-static@v10.1.5...v10.1.6
expressjs/express (express)
v5.3.0
=====
🐞 Bug fixes
-
Fixed HTTP header conflict between Content-Length and Transfer-Encoding in res.send - by @YuryShkoda in #4893
Fixed the behavior of
res.send()to prevent conflicts betweenContent-LengthandTransfer-EncodingHTTP headers in responses. TheContent-Lengthheader inres.send()is now only added when aTransfer-Encodingheader is not present, complying with the HTTP specification that states both headers should not coexist in the same response. ETag generation is unaffected by the presence of aTransfer-Encodingheader - by @cuishuang in #7459
-
Upgrade
qsto^6.16.0, which fixes CVE-2026-2391 (GHSA-w7fw-mjwx-w883), CVE-2026-82417 (GHSA-4mjr-xmp4-gh2g) and CVE-2026-82562 (GHSA-x5fp-wj9c-mxmx):arrayLimitbypasses in comma parsing and a denial of service via an attacker-controlledisBuffer- by @davetashner in #7057 and #7478, and @cyphercodes in #7305 -
Upgrade
proxy-addrto^2.0.8, which fixes CVE-2026-90711 - by @lazerg in #7474
🚀 Improvements
-
Allow conditional revalidation for QUERY requests.
req.freshpreviously only validated freshness for GET and HEAD requests, so QUERY responses never returned 304 despite a matching validator. Since QUERY is a safe, idempotent, and cacheable method that supports conditional requests, it is now included in the freshness check - by @Cherry in #7366// QUERY /reports with If-None-Match: "12345" app.query('/reports', (req, res) => { res.set('ETag', '"12345"'); res.send(results); // now responds 304 Not Modified });
-
Improve HTML structure in
res.redirect()responses when HTML format is accepted by adding<!DOCTYPE html>,<title>, and<body>tags for better browser compatibility - by @Bernice55231 in #5167 -
When calling
app.renderwith options set to null, the locals object is handled correctly, preventing unexpected errors and making the method behave the same as when options is omitted or an empty object is passed - by AkaHarshit in #6903app.render('index', null, callback); // now works as expected
-
Upgrade
content-typeto^2.0.0, bringing a faster parser (~1.5x quickerContent-Typeparsing/formatting inres.send()) along with a behavior change:res.send()now keeps any existing parameters when adding the charset and no longer throws on aContent-Typethat fails to parse.type-isis upgraded to^2.1.0as part of the same change - by @blakeembrey in #7234res.set('Content-Type', 'text/plain; foo=bar').send('hey'); // -> Content-Type: text/plain; foo=bar; charset=utf-8
-
The default error handler now logs the full error object instead of only its stack trace, so nested details such as
Error.causeand library-specific properties (e.g. Sequelize'sparent/original) are no longer swallowed - by @Nitin-Mohapatra in #6464 -
Upgrade
content-dispositionto^2.0.1, which changes theContent-Dispositionheader emitted byres.download(),res.attachment(), andres.sendFile(): file names that are valid HTTP tokens are no longer wrapped in quotes. This is equivalent per RFC 6266, but applications asserting on the exact header bytes should update their expectations - by @blakeembrey in #7233res.attachment('user.html'); // before -> Content-Disposition: attachment; filename="user.html" // after -> Content-Disposition: attachment; filename=user.html
-
Upgrade
body-parserto^2.3.0, which fixes CVE-2026-12590 (GHSA-v422-hmwv-36x6): an invalidlimitoption value caused request body size enforcement to be silently disabled (fail-open), allowing a denial of service via arbitrarily large payloads. Invalidlimitvalues now throw at parser initialization instead of being ignored - by @Mayvis in #7390
⚡ Performance
- Avoid duplicate Content-Type header processing in
res.send()when sending string responses without an explicit Content-Type header - by @bjohansebas in #6991
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Changes
- Fixes prerender errors being swallowed when a project has a custom
src/fetch.tsand the adapter prerenders in its own runtime renderForPrerendernow switches the app manifest's error strategy fromdefaulttobuild.- Found via withastro/astro.build#2762, where this hid a homepage prerender crash behind a green build.
Testing
- New Cloudflare fixture tests
Docs
- N/A, bug fix

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
astro@7.4.0
Minor Changes
-
#17894
b7a1bd9Thanks @Princesseuh! - Adds a new--timingsflag toastro buildto help you find what slows down your buildsWhen a build takes longer than expected, it can be hard to tell whether the cause is an integration, a Markdown processor plugin, image processing, or even syntax highlighting. Add the
--timingsflag to your build command to print a summary once the build finishes:astro build --timings
This is helpful to decide what to optimize first, or to compare build times before and after a change to your project.
-
#17830
a937b0dThanks @florian-lefebvre! - Adds a new optionalgetFontProperties()callback to font providersFont providers can now expose the weights, styles, subsets and formats a font family actually has. Astro uses it when resolving your font configuration to warn about values a provider cannot serve, for example a weight a font family does not offer.
All built-in providers implement it. If you maintain a custom font provider, implementing this callback is optional for now but it will be required in Astro 8:
import type { FontProvider } from 'astro'; const provider: FontProvider = { name: 'my-provider', resolveFont: ({ familyName }) => { // ... }, getFontProperties: ({ familyName }) => ({ weights: ['400', '700'], styles: ['normal', 'italic'], subsets: ['latin'], formats: ['woff2'], }), };
-
#17830
a937b0dThanks @florian-lefebvre! - Adds afetch()function to the font providerinit()contextThis function requests a provider API, retrying transient failures and more. It lets providers that wrap a 3rd-party unifont provider pass the context to it directly:
import type { FontProvider } from 'astro'; import type { InitializedProvider } from 'unifont'; import { acmeProvider } from '@acme/unifont-provider'; export function acmeFontProvider(): FontProvider { const provider = acmeProvider(); let initializedProvider: InitializedProvider | undefined; return { name: provider._name, async init(context) { initializedProvider = await provider(context); }, // ... }; }
-
#18015
0b30239Thanks @florian-lefebvre! - Addsexperimental.redirectPage, letting you provide your ownsrc/pages/3xx.astroin place of the redirect page Astro generates in static builds.A static site has no server to send an HTTP
Locationheader, so Astro generates a small HTML page with a<meta http-equiv="refresh">tag for each redirect it builds:- Your
redirectsentries Astro.redirect()calls in prerendered pages- i18n redirects
That page's markup, wording, and refresh delay were fixed, so you could not brand or translate it.
To enable this feature, add the experimental flag to your Astro config:
// astro.config.mjs import { defineConfig } from 'astro/config'; export default defineConfig({ experimental: { redirectPage: true, }, });
Then create
src/pages/3xx.astro. Astro renders it once per redirect, passing that redirect's details as props:--- // src/pages/3xx.astro import type { RedirectPageProps as Props } from 'astro'; const { from, to, status, delay } = Astro.props; --- <html lang="en"> <head> <meta http-equiv="refresh" content={`${delay};url=${to}`} /> <meta name="robots" content="noindex" /> <title>Redirecting…</title> </head> <body> <p>This page has moved. <a href={to}>Continue to {to}</a>.</p> </body> </html>
Your page must render a
<meta http-equiv="refresh">tag pointing atto, because in a static build that tag is the redirect. Astro logs a warning during the build if it is missing.See the experimental redirect page documentation for more information.
- Your
-
#18265
910ee69Thanks @astro-factory! - Adds anotFound()handler toastro/fetchandastro/honothat renders the custom 404 page when no route matches, including a prerendered404.astroAdd it before
pages()in a custom worker or server entrypoint that does not run insideApp.render, such as a Hono app used directly as a Cloudflare worker. Without it,pages()andmiddleware()return an empty 404 with an internalX-Astro-Errorheader for unmatched routes.astro()already includes this handling.import { Hono } from 'hono'; import { notFound, pages } from 'astro/hono'; import { cf } from '@astrojs/cloudflare/hono'; const app = new Hono(); app.use(cf()); app.use(notFound()); app.use(pages()); export default app;
-
#18177
7d814e5Thanks @Princesseuh! - Adds support for separatebuildandruntimeimage servicesimage.servicenow also accepts abuildand aruntimeservice. Thebuildservice optimizes images on prerendered pages when you build your site, and is also used during development. Theruntimeservice handles images on on-demand rendered pages and the image endpoint of your deployed site.The following example uses Sharp to optimize images on prerendered pages, and an image CDN for on-demand rendered pages:
// astro.config.mjs import { defineConfig } from 'astro/config'; export default defineConfig({ image: { service: { build: { entrypoint: 'astro/assets/services/sharp' }, runtime: { entrypoint: 'my-image-cdn-service' }, }, }, });
Changes for integration authors
config.image.servicekeeps the shape the user configured it with. When a project setsbuildandruntimeservices,config.image.service.entrypointandconfig.image.service.configareundefined.If your integration reads
image.service, check for theruntimeproperty to get the service you need:'astro:config:done': ({ config }) => { const { service } = config.image; const runtimeService = 'runtime' in service ? service.runtime : service; if (runtimeService.entrypoint === 'astro/assets/services/sharp') { // ... } },
Setting
image.servicewithupdateConfig()replaces the existing service instead of merging with it when the two use different shapes. For example, setting a single service in a project that usesbuildandruntimeservices replaces both. -
#18277
2715958Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0The minimum supported Node.js version is now 22.22.0, the latest Node.js 22 release supported by StackBlitz. This change is in line with Astro's Node.js support policy.
-
#18313
71e2b24Thanks @matthewp! - Allows integrations to control where Astro writes client, server, and prerender build output.Custom prerenderers can access the final output locations through the new
outputDirectoriescontext:setPrerenderer((defaultPrerenderer, { outputDirectories }) => { const { client, server, prerender } = outputDirectories return createPrerenderer({ defaultPrerenderer, client, server, prerender, }) })
-
#18177
7d814e5Thanks @Princesseuh! - Lets custom prerenderers report the images used on prerendered pagesAstro now generates images on prerendered pages from the image information that a prerenderer's
getStaticPaths()andrender()return. If your prerenderer wraps Astro's default one, pass this information through:setPrerenderer((defaultPrerenderer) => ({ name: 'my-prerenderer', async setup() { await defaultPrerenderer.setup?.(); }, async getStaticPaths() { const result = await defaultPrerenderer.getStaticPaths(); const { paths, metadata } = Array.isArray(result) ? { paths: result } : result; return { paths: paths.filter(({ pathname }) => !pathname.startsWith('/drafts')), metadata }; }, render(request, options) { return defaultPrerenderer.render(request, options); }, async teardown() { await defaultPrerenderer.teardown?.(); }, }));
Returning a plain array from
getStaticPaths()or a plainResponsefromrender()still works, but is deprecated: images used on those pages are not generated. -
#17932
b905ff1Thanks @Princesseuh! - Adds support for experimental parallel prerenderingThis experimental feature makes
astro buildrender your static pages in parallel, using multiple CPU cores at once instead of one. On sites with many pages, this can significantly reduce build times, at the cost of higher memory usage.To enable this feature, add the experimental flag in your Astro config:
// astro.config.mjs import { defineConfig } from 'astro/config'; export default defineConfig({ experimental: { parallelPrerender: true, }, });
By default, Astro uses all available CPU cores but one. Each additional worker increases the memory used by your build. If your build runs out of memory, or does not get faster, set
workersto a lower number:// astro.config.mjs import { defineConfig } from 'astro/config'; export default defineConfig({ experimental: { parallelPrerender: { workers: 4, }, }, });
Each worker renders as many pages at once as your
build.concurrencysetting allows.This feature has no effect when your adapter provides its own way of prerendering pages. Among official adapters, this only applies to
@astrojs/cloudflare. Astro logs a warning during the build when the flag is ignored.For more information on enabling and using this feature in your project, see the experimental parallel prerendering docs.
Patch Changes
-
#18313
71e2b24Thanks @matthewp! - Fixes deployment integrations being unable to use Vite manifests when preparing build output -
#18270
0c3bf11Thanks @ArmandPhilippot! - Fixes the JSDoc for CSP utilities to point to the render context reference in docs. -
#18368
1f04637Thanks @43081j! - Replaces internal use offind-procwithtinyps. -
#18355
59b9cc0Thanks @matthewp! - Fixes prerender errors being silently swallowed when using a customsrc/fetch.tswith an adapter that prerenders in its own runtime, such as@astrojs/cloudflare. Previously, a page that threw during prerendering was written as an empty HTML file and the build succeeded. The build now fails with the underlying error. -
#18177
7d814e5Thanks @Princesseuh! - Fixes original images being kept despite onlywidthorheightbeing read. -
#18353
af54bfaThanks @astro-factory! - Fixesglob()loader swallowing rendering errors during content sync, which allowedastro buildto exit successfully (code 0) even when a remark/rehype plugin threw an error -
#18271
23e8e28Thanks @ArmandPhilippot! - Fixes thesynccommand description inastro help, which only mentioned content collections. -
Updated dependencies [
b7a1bd9,2715958]:- @astrojs/internal-helpers@0.13.0
- @astrojs/markdown-satteri@0.4.4
- @astrojs/telemetry@3.4.0
@astrojs/prism@4.1.0
Minor Changes
-
#18277
2715958Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0The minimum supported Node.js version is now 22.22.0, the latest Node.js 22 release supported by StackBlitz. This change is in line with Astro's Node.js support policy.
create-astro@5.3.0
Minor Changes
-
#18277
2715958Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0The minimum supported Node.js version is now 22.22.0, the latest Node.js 22 release supported by StackBlitz. This change is in line with Astro's Node.js support policy.
Patch Changes
- #18218
acc0460Thanks @KTrain5169! -create-astrono longer places aCLAUDE.mdin projects, as Claude Code now supportsAGENTS.md.
@astrojs/cloudflare@14.4.0
Minor Changes
-
#18177
7d814e5Thanks @Princesseuh! - Reworks image processing on prerendered pages to use Astro's built-in image pipeline. Requiresastro@^7.4.0Images on prerendered pages now behave the same as on other adapters. Images optimized with the Cloudflare Images binding are now properly cached between builds, and image options such as
assetQueryParamsandbuild.assetsPrefixare applied the same way as everywhere else.
Patch Changes
- Updated dependencies [
b7a1bd9]:- @astrojs/internal-helpers@0.13.0
- @astrojs/underscore-redirects@1.0.4
@astrojs/markdoc@2.1.0
Minor Changes
-
#18177
7d814e5Thanks @Princesseuh! - Updates image handling for Astro 7.4. Requiresastro@^7.4.0 -
#18277
2715958Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0The minimum supported Node.js version is now 22.22.0, the latest Node.js 22 release supported by StackBlitz. This change is in line with Astro's Node.js support policy.
Patch Changes
@astrojs/mdx@8.1.0
Minor Changes
-
#18277
2715958Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0The minimum supported Node.js version is now 22.22.0, the latest Node.js 22 release supported by StackBlitz. This change is in line with Astro's Node.js support policy.
Patch Changes
- Updated dependencies [
b7a1bd9]:- @astrojs/internal-helpers@0.13.0
- @astrojs/markdown-satteri@0.4.4
@astrojs/preact@6.1.0
Minor Changes
-
#18389
c96d07eThanks @renovate! - Adds support for Preact v11 -
#18277
2715958Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0The minimum supported Node.js version is now 22.22.0, the latest Node.js 22 release supported by StackBlitz. This change is in line with Astro's Node.js support policy.
Patch Changes
- Updated dependencies [
b7a1bd9]:- @astrojs/internal-helpers@0.13.0
@astrojs/react@7.1.0
Minor Changes
-
#18277
2715958Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0The minimum supported Node.js version is now 22.22.0, the latest Node.js 22 release supported by StackBlitz. This change is in line with Astro's Node.js support policy.
Patch Changes
- Updated dependencies [
b7a1bd9]:- @astrojs/internal-helpers@0.13.0
@astrojs/solid-js@7.1.0
Minor Changes
-
#18277
2715958Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0The minimum supported Node.js version is now 22.22.0, the latest Node.js 22 release supported by StackBlitz. This change is in line with Astro's Node.js support policy.
@astrojs/svelte@9.1.0
Minor Changes
-
#18277
2715958Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0The minimum supported Node.js version is now 22.22.0, the latest Node.js 22 release supported by StackBlitz. This change is in line with Astro's Node.js support policy.
@astrojs/vue@7.1.0
Minor Changes
-
#18277
2715958Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0The minimum supported Node.js version is now 22.22.0, the latest Node.js 22 release supported by StackBlitz. This change is in line with Astro's Node.js support policy.
@astrojs/internal-helpers@0.13.0
Minor Changes
- #17894
b7a1bd9Thanks @Princesseuh! - Adds the measurements thatastro build --timingsreports for Markdown processing and syntax highlighting.
@astrojs/telemetry@3.4.0
Minor Changes
-
#18277
2715958Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0The minimum supported Node.js version is now 22.22.0, the latest Node.js 22 release supported by StackBlitz. This change is in line with Astro's Node.js support policy.
@astrojs/upgrade@0.8.0
Minor Changes
-
#18277
2715958Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0The minimum supported Node.js version is now 22.22.0, the latest Node.js 22 release supported by StackBlitz. This change is in line with Astro's Node.js support policy.
@astrojs/netlify@8.2.10
Patch Changes
- Updated dependencies [
b7a1bd9]:- @astrojs/internal-helpers@0.13.0
- @astrojs/underscore-redirects@1.0.4
@astrojs/node@11.1.8
Patch Changes
- #18335
7526077Thanks @lx3133584! - Fix silent exit with code 0 on EADDRINUSE in standalone mode - Updated dependencies [
b7a1bd9]:- @astrojs/internal-helpers@0.13.0
@astrojs/vercel@11.0.15
Patch Changes
- Updated dependencies [
b7a1bd9]:- @astrojs/internal-helpers@0.13.0
@astrojs/markdown-remark@7.3.3
Patch Changes
- #17894
b7a1bd9Thanks @Princesseuh! - Adds the measurements thatastro build --timingsreports for Markdown processing and syntax highlighting. - Updated dependencies [
b7a1bd9,2715958]:- @astrojs/internal-helpers@0.13.0
- @astrojs/prism@4.1.0
@astrojs/markdown-satteri@0.4.4
Patch Changes
- #17894
b7a1bd9Thanks @Princesseuh! - Adds the measurements thatastro build --timingsreports for Markdown processing and syntax highlighting. - Updated dependencies [
b7a1bd9,2715958]:- @astrojs/internal-helpers@0.13.0
- @astrojs/prism@4.1.0

Changes
astro buildnow exits with a non-zero status when a remark/rehype plugin throws during theglob()loader's eager rendering path. Previously the error was logged vialogger.error()but swallowed, allowing CI to treat a failed content render as a successful build.- The fix adds
throw errorafter thelogger.error()call in thesyncDatacatch block inpackages/astro/src/content/loaders/glob.ts, so the rejection propagates through thePromise.allchain and fails the build — consistent with the behavior already present whendeferRender: trueis used.
Testing
- Added a unit test in
packages/astro/test/units/content-layer/glob-loader.test.ts(propagates eager rendering errors so the build fails) that verifies the loader rejects when eager rendering throws, ensuring the build process receives the error.
Docs
- No docs update needed; this is a bug fix restoring expected error-propagation behavior with no API surface change.
Closes #18054

Changes
- After a client-side navigation, the router executes each new
<script src>and waits for it by settingonloadandonerroron the script, then copies the original attributes across. Anonloadoronerrorattribute sets the same handler, so whichever comes second replaces the other.srcbeforeonload: the page's handler replaces the router's, andastro:page-loadnever fires.onloadbeforesrc: the router's handler replaces the page's, and the page's handler never runs.
- The router now uses
addEventListenerforloadanderror, so both run.
Testing
Added an e2e test to view-transitions.test.ts with one script in each attribute order. It checks that astro:page-load fires and both onload handlers run. It fails without the fix and passes with it in Chrome and Firefox.
Docs
No docs needed. Nothing user-facing changes apart from the fix.

Changes
prismjsis moved fromdevDependenciestodependenciesin the Cloudflare adapter'spackage.json.vite-plugin-prism.tsimportsprismjs/components.jsat the top level, which means any consumer importing@astrojs/cloudflareneedsprismjsto be resolvable. Previously this worked only because pnpm's default hoisting made the copy bundled withastro(via@astrojs/prism) visible to the adapter — with hoisting disabled (pnpm global virtual store orhoist=false), the import fails withERR_MODULE_NOT_FOUND.- Declaring
prismjsas a direct dependency ensures it is always installed alongside the adapter regardless of the package manager's hoisting behaviour.
Testing
- No automated test was added. Inside the monorepo
prismjsis always resolvable via workspace hoisting, so a unit test would pass with or without the fix. The fix was verified end-to-end by packing the adapter as a tarball and importing it in a standalone project withhoist=false.
Docs
- No docs update needed; this is an internal dependency declaration with no user-facing API change.
Closes #18319

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @playwright/test (source) | 1.63.0 → 1.64.0 |
Release Notes
microsoft/playwright (@playwright/test)
v1.64.0
🧰 WebMCP
New page.webmcp and frame.webmcp give access to the tools that a page registers through the experimental WebMCP browser API, so you can test them like any other part of your app:
const browser = await chromium.launch({ args: ['--enable-features=WebMCP'] });
const page = await browser.newPage();
await page.goto('https://example.com');
for (const tool of await page.webmcp.tools())
console.log(tool.name, tool.description);
const result = await page.webmcp.callTool('add', { a: 2, b: 40 });
console.log(result.content[0].text); // "42"Playwright MCP also supports WebMCP by default, with page-defined tools offered to the agent as webmcp_<tool>. Pass --no-webmcp to opt out.
playwright-cli exposes them as well:
playwright-cli webmcp-list
playwright-cli webmcp-call search_catalog --params '{"query":"cats"}'🎬 Better videos
Videos can now be recorded at a custom frame rate, and the decorations for actions are styled with plain CSS:
// playwright.config.ts
import { defineConfig } from '@playwright/test';
export default defineConfig({
use: {
video: {
mode: 'on',
size: { width: 1920, height: 1080 },
fps: 60,
show: {
actions: {
style: {
point: 'width: 20px; height: 20px; border-radius: 50%; background: red',
highlight: 'outline: 2px solid #​333; background: rgba(0, 128, 255, .15)',
title: 'font-size: 16px',
},
},
},
},
},
});- New
fpsoption in testOptions.video,recordVideoand
screencast.start(). Firefox and WebKit currently capture up to 25 frames per second. - New
styleoption takes CSS declarations for thepointmarker, the target
highlightand the actiontitle. It replaces thefontSizeoption, which is now deprecated. - The cursor stays visible at the last action point, survives navigations and travels along a natural, eased path.
- Videos are encoded with VP9 instead of VP8, which takes less CPU and produces smaller files of the same or better
quality. - All video options are also available in Playwright MCP and
playwright-cli.
🎯 Test runner
-
New testProject.default option keeps a project in the config without running it by default. You can configure every browser you care about, and let a plain
npx playwright testrun just your favourite one:// playwright.config.ts import { defineConfig, devices } from '@playwright/test'; export default defineConfig({ projects: [ { name: 'chromium', use: devices['Desktop Chrome'] }, { name: 'firefox', use: devices['Desktop Firefox'], default: false }, { name: 'webkit', use: devices['Desktop Safari'], default: false }, ], });
npx playwright test # runs chromium only npx playwright test --project=firefox # runs firefox npx playwright test --project="*" # runs all three, for example on CI
-
New
--shufflecommand line option schedules tests in a random order, which helps to find tests that accidentally depend on each other.npx playwright test --shuffle # Running 42 tests using 4 workers, shuffle seed 271828182 # ... # Pass the seed to reproduce the same order. npx playwright test --shuffle 271828182
-
New
lockoption in test.describe.configure() adds test locks to all tests in a file or a group:test.describe.configure({ lock: 'user-settings' });
-
New
typeoption oftoHaveScreenshotin testConfig.expect stores all unnamed screenshots as WebP:// playwright.config.ts export default defineConfig({ expect: { toHaveScreenshot: { type: 'webp' }, }, });
🪆 Locator.within()
New locator.within() combines two locators that you already have, reading in the natural order —
"this button, within that dialog":
const saveButton = page.getByRole('button', { name: 'Save' });
const dialog = page.getByTestId('settings-dialog');
await saveButton.within(dialog).click();Relative locators such as locator.nth() or locator.first() are resolved inside each parent
separately, which makes column-like queries straightforward:
// The third cell of every row, not the third cell in the table.
const thirdColumn = page.getByRole('cell').nth(2).within(page.getByRole('row'));
await expect(thirdColumn).toHaveText(['Apple', 'Banana', 'Cherry']);New APIs
-
New page.getByRef() locates an element by its aria ref, such as
e2, reported by page.ariaSnapshot() in the'ai'mode. -
New option
includeShadowin page.content() and frame.content() serializes open shadow roots as declarative shadow DOM. -
New option
signCountsets the initial signature counter of a virtual credential. credentials.create() and credentials.get() return the currentsignCount, and it is saved and restored together with the credentials in the storage state. -
New fullConfig.filteredProjects lists the projects that were selected to run after applying the
--projectfilter. It is available in global setup and reporters. -
New apiRequestContext.addCookies(), apiRequestContext.cookies() and apiRequestContext.clearCookies() manage cookies of a request context, mirroring the BrowserContext methods:
await request.addCookies([{ name: 'session-id', value: '42', url: 'https://example.com' }]); console.log(await request.cookies('https://example.com')); await request.clearCookies({ name: 'session-id' });
Breaking changes ⚠️
-
screenproperty is now forwarded from the device descriptors. If you use...devices['Desktop Chrome']and alike,window.screenand media queries now see the emulated screen size. You can opt-out by explicitly settingscreentoundefined:// playwright.config.ts export default defineConfig({ use: { ...devices['Desktop Chrome'], screen: undefined, }, });
-
JSX in your test files now follows your
tsconfig.json. Playwright compiles JSX in test files according to thejsx,jsxFactory,jsxFragmentFactoryandjsxImportSourcetsconfig options, and defaults to the automatic runtime fromreact/jsx-runtime. -
--update-snapshots=missingnow passes the test run. Tests that only create missing snapshots now pass in the'missing'mode of testConfig.updateSnapshots, so that CI can generate new snapshots and verify the existing ones in a single run. The mode used when the option is not specified is now called'default'and behaves as before: missing snapshots are written and the test fails. -
Elements inside hidden iframes are considered hidden. Elements inside an iframe that is not visible, for example with
visibility: hidden, are now considered hidden by actions, locator.isVisible() and expect(locator).toBeVisible().
Browser Versions
- Chromium 156.0.8078.4
- Mozilla Firefox 157.0
- WebKit 27.2
This version was also tested against the following stable channels:
- Google Chrome 155
- Microsoft Edge 155
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| nanostores | ^1.5.4 → ^1.5.5 |
||
| solid-js (source) | ^1.9.15 → ^1.9.17 |
||
| svelte (source) | ^5.57.1 → ^5.57.2 |
Release Notes
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| actions/setup-node | action | minor | v7.0.0 → v7.1.0 |
Release Notes
actions/setup-node (actions/setup-node)
v7.1.0
What's Changed
Enhancements:
- Add support for mise.toml file by @gperdomor in #1421
- Support absolute paths in node-version-file by @v-mahabaleshwars in #1633
Bug fixes:
- Add Node version validation and manifest fetch retry by @v-jitenderpalsingh in #1580
Documentation updates:
- README.md: bump actions/checkout to latest version 7 by @deining in #1578
- docs: add V7 ESM migration and NODE_AUTH_TOKEN behavior change by @v-gowridurgad in #1593
- Fixed cache recommendation syntax by @SubJunk in #1603
Dependency updates:
- Update workflow pins and migrate Node matrices to modern versions by @v-HarithaVattikuti in #1583
- Upgrade @actions/cache to 6.2.0 by @philip-gai in #1584
- Pin @types/node to v24 by @v-priyagupta108 in #1585
- Override brace-expansion to 5.0.8 by @v-priyagupta108 with @Copilot in #1599
- Upgrade actions/checkout from 7.0.0 to 7.0.1 by @dependabot in #1598
- Upgrade prettier from 3.8.4 to 3.9.6 by @dependabot in #1590
- Upgrade @vercel/ncc from 0.44.0 to 0.45.0 by @dependabot in #1610
- Upgrade pnpm/action-setup from 6.0.9 to 6.0.10 by @dependabot in #1602
- Upgrade baseline-browser-mapping from 2.10.38 to 2.11.22 by @dependabot in #1629
- Upgrade @types/semver from 7.7.1 to 7.8.0 by @dependabot in #1616
- Upgrade @typescript-eslint/parser from 8.62.0 to 8.70.0 by @dependabot in #1615
- Upgrade pnpm/action-setup from 6.0.10 to 6.1.0 by @dependabot in #1631
- Upgrade jest-each from 30.4.1 to 30.5.2 by @dependabot in #1636
- Upgrade eslint-plugin-n from 18.1.0 to 18.3.0 by @dependabot in #1638
- Update dependencies and add license files by @v-HarithaVattikuti in #1642
- Upgrade eslint from 10.5.0 to 10.11.0 and package.json from 7.0.0 to 7.1.0 by @dependabot in #1635
New Contributors
- @v-jitenderpalsingh made their first contribution in #1580
- @philip-gai made their first contribution in #1584
- @gperdomor made their first contribution in #1421
- @SubJunk made their first contribution in #1603
Full Changelog: actions/setup-node@v7.0.0...v7.1.0
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @astrojs/language-server (source) | ^2.17.1 → ^2.17.2 |
||
| prettier-plugin-astro | ^1.1.0 → ^1.1.1 |
||
| rolldown (source) | ^1.2.12 → ^1.2.13 |
||
| svelte (source) | ^5.57.1 → ^5.57.2 |
Release Notes
withastro/astro (@astrojs/language-server)
v2.17.2
Patch Changes
- #18110
ffdf774Thanks @Princesseuh! - Fix organize imports for Astro files whose frontmatter ends with imports.
withastro/prettier-plugin-astro (prettier-plugin-astro)
v1.1.1
Patch Changes
ee01a5d: Fixes aTypeError("Cannot read properties of undefined (reading 'semi')") when a comment appears before a statement inside a template expression.
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Changes
- The documented opt-out for agent-inferred background mode (
ASTRO_DEV_BACKGROUND=0 astro dev,ASTRO_PREVIEW_BACKGROUND=0 astro preview, see "Build with AI → Background mode") correctly starts a foreground server, but the lock file recordedbackground: !!"0"=true. - As a result
astro dev statusreported the server as "background" andastro dev logsfailed with "No log file found." instead of pointing to the terminal. - Adds
isBackgroundEnvEnabled()so only a truthy value (1, as set on spawned background servers) marks the lock file as background. Any value still opts out of agent detection, so the opt-out itself is unchanged.
Testing
- Unit tests for
isBackgroundEnvEnabledintest/units/cli/agent.test.ts. - Manually on
examples/minimal: withASTRO_DEV_BACKGROUND=0,mainwritesbackground: trueandlogssays "No log file found."; with this fix it writesfalse,statusno longer says "background" andlogsexplains the server runs in the foreground. Same forastro preview.astro dev --backgroundstill recordstrueandlogs/stopwork.
Docs
No docs change needed: this makes the CLI match the already documented opt-out behavior.

Running astro add with a tagged official adapter, such as astro add @astrojs/cloudflare@beta, installs the requested package but leaves parts of the project setup incomplete. The install step resolves the tag to an official package, while later configuration still checks the original command input.
This uses the resolved package name throughout the official adapter setup. Tagged adapters are added to astro.config.* and keep their existing adapter-specific setup, including Cloudflare configuration and types, Node's standalone mode, and Vercel's .gitignore update.

Changes
Continuous benchmarkhas noconcurrencyblock, so a newer push to a PR leaves the older run finishing all four CodSpeed shards. In a 3.5-day sample, 14 of 46 PR benchmark runs were superseded this way, about 124 avoidable runner minutes.- Adds a per-PR concurrency group with
cancel-in-progress. Push andworkflow_dispatchruns key onrun_id, somainbaselines are never cancelled. - No changeset: CI-only change.
Testing
actionlint passes and zizmor reports no new findings; the cancellation behaviour can only be observed on the next superseded PR push.
Docs
N/A, CI-only change with no user-facing behaviour.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @netlify/blobs (source) | ^11.1.3 → ^11.1.4 |
||
| rolldown (source) | ^1.2.12 → ^1.2.13 |
Release Notes
rolldown/rolldown (rolldown)
v1.2.13
🚀 Features
- rolldown_plugin_vite_import_glob: follow file creation and deletion via hotUpdate (#10550) by @shulaoda
- inline-common-chunks: deduplicate shared code along known loading paths (#11093) by @hyfdev
- rolldown_plugin_vite_import_glob: record a matcher per glob call in dev (#10592) by @shulaoda
- rolldown_plugin_vite_import_glob: watch the directory each glob reads (#10549) by @shulaoda
- watch: hand watch.exclude to notify as its ignore filter (#11008) by @shulaoda
- dev: add
experimental.devMode.hotUpdateoption (#11123) by @h-a-n-a
🐛 Bug Fixes
- renamer: check the printed name of namespace-alias imports for captures (#11129) by @IWANABETHATGUY
- devtools: honor
devtools.sessionIdby @Brooooooklyn - renamer: keep a renamed nested binding off its module's top-level bindings (#11128) by @IWANABETHATGUY
- dev: keep
thisundefined when calling an imported function in HMR patches and lazy chunks (#11126) by @h-a-n-a - dev: read string-named imports correctly in HMR patches and lazy chunks (#11127) by @h-a-n-a
- sanitize preserveModules chunk names after resolving the relative path (#11087) by @waltuov
- keep the
withclause on bare external imports (#11100) by @IWANABETHATGUY - generator: filter DISABLE_JS_HOOK bits from generated HookUsage (#10346) by @Brooooooklyn
- dev: make the module factory async for top-level await (#11118) by @h-a-n-a
- node: give each renderChunk call its own meta object (#11115) by @Brooooooklyn
- honor
externalLiveBindingsfor imported exports (#11048) by @camc314 - dev: keep a late payload from replacing newer module code (#11030) by @h-a-n-a
- binding: use-after-free in async
transformwith aTsconfigCache(#11080) by @shulaoda - fail on chunk syntax errors and escape export names once (#11051) by @hyfdev
- dev: ship newly imported modules the client never received (#11029) by @h-a-n-a
- code-splitting: avoid cycles from redundant re-export initialization (#11073) by @hyfdev
- link: treat re-exports of the same external binding as one export (#11069) by @IWANABETHATGUY
- escape namespace properties in IIFE and UMD output (#11085) by @hyfdev
- escape dependency paths in CJS and UMD output (#11084) by @hyfdev
- use computed access for arbitrary import names (#11083) by @hyfdev
- generate valid bindings for shimmed exports (#11082) by @hyfdev
- dev: reload the page when an HMR update fails after merging its edit (#11031) by @h-a-n-a
- dev/lazy: ship the deps of a module that a patch shipped but never ran (#11028) by @h-a-n-a
- code-splitting: don't move init calls in front of unwrapped JSON modules (#11062) by @IWANABETHATGUY
- escape export names in
definePropertycalls (#11047) by @camc314
📚 Documentation
- say the CLI bundles multiple configs one after another (#11111) by @Brooooooklyn
- add
renderChunkhook filter docs (#11065) by @sapphi-red
⚡ Performance
- use
concat_string!instead offormat!for plain string joins (#11139) by @IWANABETHATGUY - utils: evaluate each
concat_string!argument once (#11105) by @IWANABETHATGUY - json: escape
JSON.parsestring withjson-escape-simd(#11104) by @IWANABETHATGUY - unwrap JSON modules with a non-object root (#11066) by @IWANABETHATGUY
🧪 Testing
⚙️ Miscellaneous Tasks
- deps: upgrade oxc to 0.153.0 (#11109) by @camc314
- update pnpm to v12 (#10876) by @btea
- deps: update pnpm to v11.28.0 (#11049) by @renovate[bot]
- deps: update rollup submodule for tests to v4.64.0 (#11116) by @rolldown-guard[bot]
- deps: update napi (#11137) by @renovate[bot]
- scripts: spawn the rolldown CLI without a shell in setup-vite (#10875) by @Brooooooklyn
- deps: bump
@napi-rs/wasm-runtimeto~1.2.5(#11117) by @shulaoda - deps: update napi (#11108) by @renovate[bot]
- deps: update taiki-e/install-action action to v2.87.22 (#11096) by @renovate[bot]
- deps: update npm packages (#11095) by @renovate[bot]
- deps: update rust crates (#11097) by @renovate[bot]
- deps: update napi (#11063) by @renovate[bot]
- deps: update dependency rust to v1.99.0 (#11071) by @renovate[bot]
- deps: update dependency vite-plus to v1 (#11056) by @renovate[bot]
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
Release Notes
cloudflare/workers-sdk (@cloudflare/vite-plugin)
v1.63.1
Patch Changes
-
#15617
93c1069Thanks @jpatel3! - Stop the update check from recommending deprecated versionsPreviously, the "update available" notice shown by
wranglerand@cloudflare/vite-pluginalways pointed at whichever version was taggedlateston npm, even after that version had been deprecated for shipping a bug. Deprecated versions are now never recommended: if the latest release has been deprecated, the newest non-deprecated stable release below it is suggested instead, or nothing at all if you are already on it.The check now reads the npm registry directly instead of going through the
update-checkpackage, which discarded the deprecation information. The on-disk cache location and one-hour refresh interval are unchanged. -
#16003
6947df3Thanks @oddharsh! - Shipusingandawait usingdeclarations to the runtime as writtenWorker builds no longer lower explicit resource management into helper code, so Workers that use it ship about 1.7 KB less. workerd supports the syntax natively. On Vite 8 the plugin builds Workers at an
es2026target, so Oxc leaves the syntax alone. On Vite 6 and 7, where esbuild has noes2026target, the Worker environments tell esbuild thatusingis supported instead. Client builds keep their own targets: the plugin changes only the Worker environments. -
#16145
e820406Thanks @cpojer! - Honor the source-map setting in release buildsOmit the plugin's JavaScript and declaration source maps when building with
SOURCEMAPS=false, reducing the installed package size. Normal development builds keep source maps, and application source-map settings are unchanged. -
Updated dependencies [
2d1d563,85b14e7,e6f7663,fe607f9,ad7ff45,8de6b3c,ae29445,757faa6,cc8e969,417b186,93c1069,6947df3,82acf3c,9a58244]:- miniflare@5.20261006.1-alpha
- wrangler@4.149.0
cloudflare/workers-sdk (@cloudflare/vitest-plugin)
v1.4.0
Minor Changes
-
#15591
e3d1867Thanks @dario-piotrowicz! - Support V8 code coverage in the Workers Vitest integrationVitest's default V8 coverage provider now collects and reports coverage for tests running locally in the Workers runtime.
-
#16132
08d694cThanks @edmundhung! - Add support for Vitest 5
Patch Changes
-
#16139
2d1d563Thanks @cpojer! - Update esbuild to 0.28.2Align esbuild dependency with tooling using the latest 0.28 patch so package managers can share one installation instead of downloading a second native binary.
-
#16140
aaa6a88Thanks @cpojer! - Update Zod to 4.6.5Align the published Zod dependencies in Cloudflare configuration and the Vitest plugin with other tools using Zod 4.6.5 so consumers can reuse one installation.
-
Updated dependencies [
2d1d563,85b14e7,e6f7663,fe607f9,ad7ff45,8de6b3c,ae29445,757faa6,cc8e969,417b186,93c1069,6947df3,82acf3c,9a58244]:- miniflare@5.20261006.1-alpha
- wrangler@4.149.0
v1.3.7
Patch Changes
sveltejs/svelte (svelte)
v5.57.2
Patch Changes
-
fix: don't create async deriveds for a component destroyed while waiting for its top-level
await(#18931) -
fix: prevent untracked derived reads from retaining disconnected dependencies (#18829)
-
fix: error if
{:else}is followed by another{:else}or{:else if ...}(#18900) -
fix: avoid tracking SvelteURLSearchParams during URL updates (#18791)
-
fix: restore hydration state when custom element attribute updates throw (#18467)
-
fix: attach event handlers that are assigned after a top-level
awaitin production (#18933) -
fix: flush anything pending before invoking flushSync callback function (#18878)
-
fix: preserve location information for
awaitwrappers (#18859) -
fix: keep a reactive assignment with no dependencies when
migratecannot turn it into a declaration (#18817) -
fix: don't hang
migrateon a declaration that shares a line with its script tag (#18816) -
fix: prevent duplicate subscriptions when reconnecting deriveds (#18899)
-
fix: recover when an unexpected node replaces a nested boundary comment during hydration (#18925)
-
fix: print
{#await}blocks that only have a pending branch (#18908) -
fix: don't warn about a redundant
linkrole on<area>elements without anhref(#18872) -
fix: don't throw
state_unsafe_mutationwhen the focused element is removed whilebind:activeElementis used (#18921) -
fix: don't overwrite an unchanged spread
value, preserving incomplete number input (#18864) -
fix: read batch-local array on each-block commit (#18879)
-
fix: error at compile time when a declaration in a snippet redeclares one of its parameters (#18842)
-
fix: error when using
let:directives on a component with achildrensnippet (#18873) -
fix: ignore stale boundary reset callbacks (#18886)
-
fix: handle deferred transitions aborted before initialization (#18776)
-
fix: prevent hydration mismatch recovery from being intercepted by error boundaries (#18841)
-
fix: preserve dynamic element connections during hydration (#18855)
cloudflare/workers-sdk (wrangler)
v4.149.0
Minor Changes
-
#16036
9a58244Thanks @edevil! - Support temporary event accounts in R2 and Containers commandswrangler r2andwrangler containerscommands now accept the hidden--temporaryflag, so accounts created for an event can manage buckets, objects and containers directly. Every command that supports--temporarynow also accepts a hidden--event-codeflag, so the first command a participant runs can create the event account:wrangler r2 bucket create my-bucket --temporary --event-code <code>R2 and Containers are only available on event accounts. R2 custom domains, Sippy, external container registries and
wrangler cloudchambercommands still require a logged-in account.
Patch Changes
-
#16139
2d1d563Thanks @cpojer! - Update esbuild to 0.28.2Align esbuild dependency with tooling using the latest 0.28 patch so package managers can share one installation instead of downloading a second native binary.
-
#15632
85b14e7Thanks @petebacondarwin! - Honor Retry-After directives during static asset uploadsStatic asset uploads now pause retries and pending uploads until the latest outstanding deadline requested by the API. A per-request limiter also keeps gateway retries at the reduced concurrency after the pause ends, preventing a deployment from immediately overloading a constrained asset service again.
-
#16098
fe607f9Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To sharp 0.35.4 0.35.5 -
#16093
ad7ff45Thanks @DiogoSantoss! - Document thataddressescatch-all entries must use the zone apexA
*@domainentry inaddressesmust use the zone apex, such as*@example.com. The zone catch-all also receives mail for every subdomain in the zone that has no literal rule. -
#16102
757faa6Thanks @tlq5l! - Keep Preview secrets when deploying to an existing PreviewSecrets added to a Preview with
wrangler preview secret putorwrangler preview secret bulkwere lost the next timewrangler previewran, because each new deployment was created from the Wrangler config,--varand--secrets-filevalues only.wrangler previewnow carries over the secrets of the Preview's latest deployment. A value passed in this deployment (--secrets-file,--varor apreviewsbinding with the same name) still replaces the existing secret, andwrangler preview secret deleteremoves one. -
#15617
93c1069Thanks @jpatel3! - Stop the update check from recommending deprecated versionsPreviously, the "update available" notice shown by
wranglerand@cloudflare/vite-pluginalways pointed at whichever version was taggedlateston npm, even after that version had been deprecated for shipping a bug. Deprecated versions are now never recommended: if the latest release has been deprecated, the newest non-deprecated stable release below it is suggested instead, or nothing at all if you are already on it.The check now reads the npm registry directly instead of going through the
update-checkpackage, which discarded the deprecation information. The on-disk cache location and one-hour refresh interval are unchanged. -
#16003
6947df3Thanks @oddharsh! - Shipusingandawait usingdeclarations to the runtime as written, for smaller Worker bundlesWorkers and Pages Functions that use explicit resource management no longer carry about 1 KB of bundled helper code to emulate it. workerd supports
usingandawait usingnatively at every compatibility date, sowrangler deploy,wrangler versions uploadand Pages Functions builds now leave these declarations untouched. -
#15958
82acf3cThanks @breken-ai! - Apply each action's own condition inwrangler r2 bucket lifecycle addWhen a lifecycle rule was added with both expiration and Infrequent Access transition flags, both actions read their condition from the same list of flags, which checked
--expire-daysfirst.--expire-days 365 --ia-transition-days 30therefore transitioned objects after 365 days instead of 30, and--expire-date 2027-01-01 --ia-transition-days 30deleted objects after 30 days instead of on the given date. Expiration now only reads--expire-days/--expire-date, and transition only reads--ia-transition-days/--ia-transition-date. -
Updated dependencies [
2d1d563,e6f7663,fe607f9,8de6b3c,ae29445,cc8e969,417b186]:
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Changes
- On-demand routes deployed with
@astrojs/vercelno longer crash with "Cannot find native binding" at startup. Since v11.0.13,middleware.tshad a top-levelimport { rolldown } from 'rolldown'that was transitively bundled into the serverlessentry.mjs; file tracing does not copy rolldown's platform-specific native binding, so the function failed immediately. - Shared header/param constants are extracted into a new zero-import module
src/serverless/constants.ts.entrypoint.tsandmiddleware.tsimport from it;index.tsre-exports the constants so the public API is unchanged.middleware.tsalso loads rolldown lazily insidegenerateEdgeMiddleware, restoring the pattern used in v11.0.12 with esbuild.
Testing
- Updated
packages/integrations/vercel/test/serverless-prerender.test.ts(fixture build test) to assert thatentry.mjsno longer containsimport "rolldown"orimport "@vercel/routing-utils", covering the regression directly.
Docs
- No docs update needed; this is a bug fix with no API or configuration changes.
Closes #18328
Description
-
Closes #4263
-
What does this PR change? It adds
margin-inline-start: autoto.right-sidebar-containerinTwoColumnContent.astro, inside the existing@media (min-width: 72rem)block.The table of contents
<aside>comes before.main-panein the DOM and is moved to the end of the row withorder: 2. If the browser paints after parsing the aside and before parsing the main pane, the aside is the row's only child, sits at the start, and jumps to the end when the main pane arrives. Lighthouse reports that as one layout shift of 0.423 ondiv.right-sidebar.With the auto margin, an aside that is alone in the row is already at the end. Once the main pane is present the two fill the row, so the margin resolves to 0 and the finished layout is the same as before.
-
Did you change something visual? Nothing in the finished page. Measured with this reproduction (stock template on 0.42.6, Lighthouse desktop preset, HTML sent in two parts with a 500 ms pause inside the aside):
Case CLS main, split inside the aside0.423 main, not split0.000 This change, split inside the aside 0.000 This change, not split 0.000 "This change" was tested by copying the patched component into the reproduction's installed
@astrojs/starlightand rebuilding. I did not run the repo's unit or e2e suites locally.One case I reasoned about but did not measure: a page with a table of contents and no left sidebar. There the main pane is
width: 100%and both items shrink, so the aside's width while alone can differ slightly from its final width. It still starts at the end of the row rather than the start.
🤖 Generated with Claude Code

Changes
- During
astro dev, inline<style data-vite-dev-id>tags for Vue components now contain the correctly scoped, transformed CSS instead of the raw SFC<style>block. Previously, Astro cached CSS before@vitejs/plugin-vuecould add[data-v-xxx]attribute selectors and convertv-bind()to CSS variables, causing a flash of unscoped styles and broken styling when JS is disabled. - The CSS content cache hook is extracted into a new dev-only plugin (
astroDevCssContentCachePlugin) and registered increate-vite.tsafter all user and integration Vite config. This guarantees it runs after framework plugins (e.g.vite:vue) transform the CSS but beforevite:css-postconverts it to JS.
Testing
- Adds a dev-server integration test in
packages/integrations/vue/test/basics.test.tsthat fetches the server-rendered HTML and asserts the inline style content matches the scoped, transformed output (attribute selectors and CSS variable form ofv-bind()).
Docs
- No docs update needed; this is an internal dev-server correctness fix with no API or configuration changes.
Closes #18333

Problem
When the port configured for @astrojs/node standalone mode is already occupied, the built server process exits with code 0 without logging any error message (#18282).
This happened because:
standalone()returns the server'sclosedpromise asdone, which rejects on the server'serrorevent.server.tsstarted the server but never handleddone, allowing the rejection to become unhandled.serve-app.tsregisters a process-levelunhandledRejectionlistener that silently returns whenrequestContext.getStore()is undefined (i.e. outside an active request). This swallowed the rejection at boot time. Because no socket remained listening, the event loop emptied and Node exited cleanly with code 0.
Solution
- In
packages/integrations/node/src/server.ts, catch errors onstartServer().done, log them, and exit with code 1. - In
packages/integrations/node/src/serve-app.ts, log rejections occurring outside a request context and setprocess.exitCode = 1rather than silently ignoring them. - Added a regression test in
packages/integrations/node/test/standalone-error.test.tsverifying that starting a standalone server when the port is occupied exits with code 1 and logs theEADDRINUSEerror. - Added patch changeset for
@astrojs/node.
Fixes #18282
Testing
- Ran
packages/integrations/node/test/standalone-error.test.tswith verified RED / GREEN mutation testing:- Without the fix: exited with code 0 and empty stderr.
- With the fix: exits with code 1 and logs the EADDRINUSE error.
- Ran all existing tests in
packages/integrations/node(Prerendering, Redirects, Aborted requests, etc.) to ensure no regressions.
🤖 Generated with Claude Code

Changes
- Fix unhandled rejection / server crash in dev mode when an injected route's entrypoint is deleted or renamed (#18325).
- In dev mode, when
createRoutesList()reads route component content for prerender options and encountersENOENT(e.g. when an integration injected route points to a file that was deleted or renamed during dev), catch the error and log a warning instead of throwing, allowing other routes to continue rebuilding and functioning normally. - In
rebuildRoutes()withinvite-plugin-routes, wrap the route rebuild in a try/catch block to ensure watcher event listeners do not emit unhandled promise rejections. - In build mode, missing route entrypoints continue to throw an error as expected.
- Added a patch changeset for
astro.
Fixes #18325
Testing
- Added unit tests in
packages/astro/test/units/routing/manifest.test.ts:in dev mode, does not throw when an injected route entrypoint does not existin build mode, throws when an injected route entrypoint does not exist
- Ran all 305 routing unit tests (
./node_modules/.bin/astro-scripts test "test/units/routing/*.test.ts" --strip-types) with 100% pass rate. - Verified monorepo typecheck passes (
pnpm run typecheck).
Docs
Bug fix only; does not change public documentation or API surface.
🤖 Generated with Claude Code

Fixes #18329.
Problem
In dev, getTemplates() inlines the full environment into the generated astro:env/server virtual module via:
server.replace('// @@GET_ENV@@', `return (${JSON.stringify(loadedEnv)})[key];`)Because the replacement is a string, $ patterns ($`, $&, $', $1, …) in any env var value are interpreted as replacement patterns, injecting template text into the middle of the env JSON and producing an unterminated string literal. Dev then fails with Failed to parse source for import analysis … at astro:env/server:17:…. This hits e.g. every Kitty terminal user (KITTY_PUBLIC_KEY commonly contains $ + backtick) importing astro:env/server in dev.
Fix
One line: pass a replacer function, which is immune to $ patterns.
Test
Added works in dev when an env variable contains \$` replacement patternstopackages/astro/test/env-secret.test.ts, covering `` $ ``, $&, `$'` and `$1`. Verified it fails without the fix (dev returns 500) and passes with it. Full env suites green: `env-secret` (5/5), `env-public` (4/4), `astro-envs` (13/13).
Changeset
Patch bump for astro included.

Changes
Makes the build dist/ directory portable. The built output can be moved to another machine or directory and run with node dist/server/entry.mjs without rebuilding.
deserializeManifestaccepts the server entry URL as a third argument and resolves relative directory paths against it. It falls back tofile:///on runtimes without a filesystem, such as Cloudflare Workers.- The
astro:build:ssrhook manifest keeps absolute paths. Relativization happens only when serializing the SSR and prerender bundles, so the public type and its meaning are unchanged. @astrojs/nodestores the session base relative to the project root and resolves it at runtime, and bakes folder names instead offile://URLs.@astrojs/mdxnormalizes compiled output paths to match the manifest keys.- Made with AI.
Testing
- Astro units (
manifest,build,app): 460 pass. - Astro integration subset (
serializeManifest,server-islands,sessions,ssr-preview,ssr-request,middleware,ssr-prerender): 75 pass. @astrojs/node: 192 pass.@astrojs/vercel: 84 pass.@astrojs/netlify: pass.@astrojs/cloudflare: 411 pass.
Only @astrojs/node has a moved-dist test (the image test). Vercel, Netlify, and Cloudflare are verified as non-breaking in place, not as movable. Follow-up tests per adapter would lock in real portability.
Docs
No new config option, so there is nothing new to document. Docs may want to mention that node_modules/ must be co-located with dist/ at the deployment target.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @cloudflare/workers-types | ^5.20261005.1 → ^5.20261006.1 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| vite (source) | ^8.3.2 → ^8.3.3 |
||
| vite (source) | ^8.3.1 → ^8.3.3 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @astrojs/language-server (source) | ^2.17.0 → ^2.17.1 |
||
| @astrojs/language-server (source) | ^2.16.7 → ^2.17.1 |
Release Notes
withastro/astro (@astrojs/language-server)
v2.17.1
Patch Changes
- #17578
7cc0b00Thanks @renovate! - Fixes a case where rich content diagnostics and snippet edits would not work
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Changes
- Changes, for example
^7.4.1to^7.0.0
This means that if you have a minimum release age, pnpm will autmoatically use the newest that's within your policy.
This fixes a bug where, after we do a release, running create-astro causes a project to not start without manually changing versions.
Testing
- Tests added
Docs
- N/A

Changes
- Adds an
issue-assign.ymlworkflow that assigns every newly opened issue to the next member of a fixed triage pool (matthewp,Princesseuh). - Rotation needs no stored state: the most recent pool-assigned issue acts as the pointer and each new issue goes to the next pool member. A manual pool assignment becomes the new pointer, and runs are queued (not cancelled) so simultaneously opened issues still alternate.
Testing
- Workflows have no test suite, so the selection logic was validated locally against mock issue payloads: alternation in both directions, first-run bootstrap with no pool history, and exclusion of PRs and non-pool assignees. YAML and shell syntax checked.
Docs
- No docs update needed — internal CI automation with no user-facing behavior.

Changes
- Factory preview releases now work for fixes in nested packages like
packages/language-tools/*andpackages/markdown/*. Before, the changed-package detection only knew aboutpackages/integrations/, so a fix to@astrojs/language-serverresolved topackages/language-toolsandpkg-pr-newfailed with "No packages" (seen on #18310). - Each changed file now walks up to its nearest
package.json, so any nesting depth works. Private packages (test fixtures,packages/astro/performance) are skipped. The charset guard on the directory is kept because the publish step word-splits$DIRS.
Testing
- No test changes. This is a CI workflow change.
Docs
- No docs update needed. This is internal CI used only by the factory bot.

ℹ️ Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @types/react (source) | ^18.3.31 → ^19.3.0 |
||
| @types/react-dom (source) | ^18.3.7 → ^19.3.0 |
||
| react (source) | ^18.3.1 → ^19.3.0 |
||
| react-dom (source) | ^18.3.1 → ^19.3.0 |
Release Notes
react/react (react)
v19.3.0
New React Features
<ViewTransition />: Adds<ViewTransition />andaddTransitionTypeAPIs to power View Transition animations in React (@sebmarkbage, @jackpope, @gaearon: #31975, #31987, #31996, #31999, #32001, #32002, #32028, #32029, #32031, #32034, #32038, #32041, #32050, #32090, #32105, #32254, #32379, #32422, #32462, #32540, #32545, #32585, #32599, #32611, #32612, #32617, #32651, #32653, #32656, #32664, #32699, #32723, #32734, #32751, #32752, #32760, #32761, #32764, #32772, #32790, #32819, #32820, #32822, #32833, #32849, #33094, #33191, #33200, #33206, #33293, #33330, #33331, #33332, #33357, #33362, #33433, #33576, #34374, #34450, #34481, #34500, #34502, #34510, #34511, #34539, #35567, #35564, #35485, #35380, #35063, #35060, #34676, #36917, #35337, #35520)- Fragment Refs: Add Refs to
<Fragment />to support composable platform behavior (@jackpope, @sebmarkbage, @eps1lon, @Dhakshin2007, @chirokas, @teamleaderleo, @fallintoplace: #32465, #32613, #32619, #32654, #32660, #32682, #32722, #32813, #32814, #33056, #33058, #33093, #34069, #34103, #34544, #34545, #37062, #37061, #37060, #36047, #36010, #35642, #35641, #35637, #35630, #34935, #37457, #37408, #37326, #37251, #37171, #37169, #37168, #37167, #37166, #37165, #37164, #37163, #37162, #37161, #37160, #37125, #37063)
New React DOM Features
browser(): a newreact-domAPI that returns a usable which errors during server rendering and resolves in the browser.use(browser())inside a<Suspense>boundary marks a subtree as browser-only without reporting a recoverable error (@gnoff: #37143, #37241)
Notable changes
- Enable Trusted Types API integration (@rickhanlonii #35816)
- Transitions now render independently instead of being entangled into a single render, so a slow transition no longer holds up unrelated ones (@acdlite #37290)
- Added a DEV-only warning when a component appears to have been unblocked by calling
use()conditionally (@hoxyq, @eps1lon: #37104, #37203, #37491)
All Changes
React
- Fast Refresh Fixes
- Fix Fast Refresh to find and remount edits to components wrapped behind
lazy()(@sophiebits #36965) - Fix Fast Refresh so edits to a
memo()comparison function take effect (@sophiebits #36964) - Fix Fast Refresh crash when an edit changes the kind of a component's type (@sophiebits #36963)
- Unify hot reload type resolution for Fast Refresh (@sophiebits #36962)
- Fix Fast Refresh to remount correctly when an edit changes the component kind (@sophiebits #36950)
- Double invoke effects in StrictMode after Fast Refresh (@eps1lon #35962)
- Fix Fast Refresh to find and remount edits to components wrapped behind
- Performance Track Fixes
- Prevent crash when accessing
$$typeofin Performance Tracks (@eps1lon #35679) - Handle non-string function names in Performance Tracks (@eps1lon #35659)
- Use minus (
-) instead of en dash for removed props in Performance Tracks (@eps1lon #35649) - Handle arrays with bigints in deep objects in Performance Tracks (@eps1lon #35648)
- Don't enumerate typed array props in Performance Tracks in DEV (@UditDewan #36913)
- Bail out of diffing wide objects and arrays in Performance Tracks (@eps1lon #34742)
- Clear potentially large performance measures in DEV (@hoxyq #34803)
- Fix missing else branch for renders with no props change in Performance Tracks (@hoxyq #34837)
- Prevent crash when accessing
- Activity Fixes
- Fix
useSyncExternalStoremissing store mutations that happened while an Activity tree was hidden (@sophiebits #36947) - Hide portal contents when an Activity is hidden (@acdlite #35091)
- Prevent metadata hoisting in hidden
<Activity>trees (@ronnakamoto #34983) - Prevent errors thrown inside a hidden Activity from escaping to the visible UI (@acdlite #35074)
- Don't unhide a node if a direct parent Offscreen is still hidden (@sebmarkbage #34821)
- Don't show internal
<Offscreen>component in error messages (@rickhanlonii #35763)
- Fix
- Warn in DEV when a component appears to have been unblocked by a conditional
use()(@hoxyq, @eps1lon: #37104, #37203, #37491) - Render transitions independently instead of entangling them into a single render (@acdlite #37290)
- Fix hang when updating a dehydrated boundary inside a hidden tree (@gaearon #37135)
- Don't reacquire Host Singletons during dev effect validation (@gnoff #37113)
- Only remove properties from Host Singletons on release (@gnoff #37112)
- Don't invoke effects on moved children in StrictMode (@sophiebits #36948)
- Throw a clearer error when a rejected Promise is incorrectly instrumented (@eps1lon #36328)
- Fix context propagation into Suspense fallbacks (@acdlite #36160)
- Fix context propagation through suspended Suspense boundaries (@acdlite #35839)
- Fix
useDeferredValuegetting stuck (@gaearon #36134) - Update
useActionStateerror message to say "action state" instead of "form state" (@rickhanlonii #35790) - Don't warn when rendering data block scripts (@eps1lon #35953)
- Treat fibers with alternates as mounted in
getNearestMountedFiber(@sebmarkbage #35578) - Always instrument the lazy initializer thenable (@gnoff #35521)
- Annotate cascading updates for DevTools performance tracks in DEV (@huntie #34961)
- Resolve the
.defaultexport of aReact.lazyas the canonical value (@sebmarkbage #34906) - Limit owner stacks to 10 frames (@eps1lon #34864)
- Ensure
useEffectEventreads latest values inforwardRefandmemo()components (@eps1lon #34831)
React DOM
- Copy
sourceonto the synthetictoggleevent (@lazerg #37389) - Update HTML parser rules for the new
<select>parser (@josepharhar #34804) - Update
defaultValuefortype="number"inputs to match other input types (@sophiebits #36980) - Avoid setting
innerHTMLwhen it hasn't changed (@sophiebits #36949) - Forward the
nonceoption inReactDOM.preloadModule()(@UditDewan #36851) - Support
fetchPriorityfor module resources (@TheAlexLichter #36835) - Track stylesheet preloads when explicitly preloaded to avoid unnecessary suspension (@gnoff #36386)
- Suggest correct casing for the misspelled
credentiallessiframe attribute (@vmx906 #36322) - Add
credentiallessas a recognized boolean attribute for iframes (@vmx906 #36148) - Prevent reentrant
finishedTaskfrom callingcompleteAllmultiple times (@gnoff #36287) - Update the CSS shorthand property list (@kidonng #35636)
- Support the
maskTypeSVG prop (@sleitor #35921) - Add support for
onFullscreenChangeandonFullscreenErrorevents (@chirokas #34621) - Include
submitterinsubmitevents (@eps1lon #35590) - Fire
onResetwhen automatically resetting forms (@eps1lon #35176) - Use the
FormDatasubmitterparameter (@jenseng #29028) - Fix form status reset when component state is updated (@eps1lon #34075)
- Batch updates from
resizeevents until the next frame (@eps1lon #35117)
React Server
- Add
nonceto rendered import maps (@mattcosta7 #37339) - Add an
onBrowserBailoutoption to observe subtrees that defer to the browser (@gnoff #37193) - Stop the caller's signal from retaining a finished render (@unstubbable #37315)
- Construct the render lifetime controller only when it is needed (@unstubbable #37357)
- Fix
react-dom/serverhanging on Deno (@fraidev #35235) - Extend stack overflow recovery to retries in SSR (@jackpope #36977)
- Fix false-positive hydration mismatch on
nonceattributes (@MaxwellCohen #37030) - Guard shell-error callbacks instead of nulling them out on the request (@eps1lon #36916)
- Stop firing
onAllReadyafter the shell errored (@eps1lon #36903) - Treat an incomplete tree as an error during error recovery (@acdlite #36911)
- Fix non-script
modulepreloadtracking (@fallintoplace #36564) - Finalize postponed
nextSegmentIdafter the prelude flush (@gaojude #36779) - Preserve
referrerPolicyin image preload headers (@ulises-jeremias #36803) - Allow pending work to specialize abort reasons (@gnoff #36586)
- Abort tasks that suspend after aborting during render (@gnoff #36585)
- Finish abort in a scheduled task (@gnoff #36580)
- Fix aborts during resumed rendering (@gnoff #36584)
- Track abort state on the request (@gnoff #36583)
- Model external work scheduling explicitly in the fb bundle (@gnoff #36576)
- Continue reporting aborted task errors after a fatal abort (@gnoff #36575)
- Disallow abort reentrancy (@gnoff #36574)
- Stop transpiling computed property names (@eps1lon #36542)
- Fix crash when capturing the callsite of a stalled
use()of a rejected Flight chunk (@lubieowoce #36544) - Double invoke effects in Strict Mode during hydration (@eps1lon #35961)
- Add additional task reentrancy protections in Fizz (@gnoff #36291)
- Don't outline Suspense boundaries with suspensey CSS during shell flush (@gnoff #35824)
- Push a stalled
use()to the owner stack and debug task (@eps1lon #35226) - Fix
useIdtracking on replay (@gnoff #35518) - Correctly handle replaying when hydrating (@gnoff #35494)
- Simplify the
createSuspenseBoundarypath (@sebmarkbage #35087) - Unify preamble-only fields to save a field on Suspense boundaries (@sebmarkbage #35068)
- Unify prerender-only fields to save a field on Suspense boundaries (@sebmarkbage #35067)
- Push halted awaits to the owner stack for late-arriving I/O info (@unstubbable #35019)
- Include all Node.js APIs in the Bun entrypoint for
react-dom/server(@RiskyMH #34193) - Detach a Suspense boundary after flushing its segment (@gnoff #34694)
React Server Components
- Keep an element pending while a referenced row is resolving (@unstubbable #37542)
- Fix
RangeErrorfrom exponential debug info growth (@unstubbable #37481) - Abort the cache signal when debug objects are retained (@unstubbable #37342)
- Transfer key validation of lazy nodes when they are unwrapped (@unstubbable #37258)
- Add
pending_weakto the Flight thenable protocol (@acdlite #37154) - Outline and dedupe repeated strings (@gaearon #37147)
- Port Reply Server traversal guards to the Flight Client (@eps1lon #37144)
- Define Flight chunk
.thenwithObject.defineProperty(@eps1lon #37109) - Support Turbopack's experimental array format for chunks (@sampoder #37095)
- Limit fake JSX call site stacks to 10 frames (@timneutkens #37086)
- Improve performance when decoding Flight replies (@gnoff #37090)
- Recognize Node 22+ V8 frames for
Promisestatics in debug info (@gaearon #36969) - Tailor the warning for binary data serialized through
toJSON(NodeBuffer) (@unstubbable #36873) - Resolve models before
JSON.stringifyfor faster serialization (@mhart #36795) - Prune debug info when chunks error (@gnoff #36782)
- Avoid main-thread stalls from large debug strings (@unstubbable #36570)
- Fix stranded row content under Node stream backpressure (@unstubbable #36516)
- Fix dropped
FormDataentries indecodeReplyFromBusboy(@unstubbable #36468) - Harden types and improve performance of Flight replies (@eps1lon #36425)
- Add more cycle protections to Flight replies (@eps1lon #36236)
- Transport
AggregateError.errors(@eps1lon #36156) - Bail out early when a backing entry for
Blobdeserialization is not aBlob(@eps1lon #36055) - Clear chunk reason after successful module initialization (@unstubbable #36024)
- Add support for transporting
Error.cause(@eps1lon #35810) - Walk parsed JSON instead of using a reviver for faster RSC payload parsing (@timneutkens #35776)
- Skip
transferReferencedDebugInfoduring debug info resolution (@unstubbable #35795) - Add
unstable_allowPartialStreamoption to Flight Client (@unstubbable #35731) - Fix
encodeReplyfor JSX with temporary references (@unstubbable #35730) - Fix debug channel flag in Node.js
renderToPipeableStream(@feedthejim #35724) - Fix stack overflow in
visitAsyncNodewith deep async chains (@unstubbable #35612) - Allow Server Components to render context providers from client modules (@rickhanlonii #35675)
- Allow overriding
request.timeOriginviaoptions.startTime(@lubieowoce #35598) - Warn once if
evalis disabled in the dev environment (@eps1lon #35661) - Restore original function name in dev server callstacks served with
unsafe-eval(@eps1lon #35650) - Fix
react-markuptypes for server references (@eps1lon #35634) - Add more DoS mitigations to Flight replies and harden Flight (@unstubbable #35632)
- Allow cyclic references to be serialized when unwrapping lazy elements (@unstubbable #35471)
- Improve cyclic thenable detection in Flight reply server (@cvan20191 #35369)
- Add extra loop protection to Flight reply server (@sebmarkbage #35351)
- Patch Promise cycles and
toStringon Server Functions (@sebmarkbage #35345) - Move
react-server-dom-webpack/*.unbundledto privatereact-server-dom-unbundled(@eps1lon #35290) - Never parse
thenfunctions in Flight replies (@sebmarkbage #35289) - Patch Flight reply server with fixes from Flight Client (@sebmarkbage #35277)
- Complete the list of Node.js internal Promise awaits (@eps1lon #35161)
- Reduce risk of maximum call stack exceeded when emitting async sequences (@eps1lon #35159)
- Fix pending chunks count for streams and async iterables in DEV (@unstubbable #35143)
- Fix broken byte stream parsing caused by buffer detachment (@unstubbable #35127)
- Fix
hasReadableflag in Node.js clients' debug channel (@unstubbable #35039) - Fix debug info filtering to include later resolved I/O (@unstubbable #35036)
- Cache the value when visiting the same I/O or Promise along different paths (@sebmarkbage #35005)
- Clone subsequent I/O nodes when resolved more than once (@sebmarkbage #35003)
- Fix hang after resolving cyclic references (@unstubbable #34988)
- Allow passing DEV-only
startTimeas an option (@sebmarkbage #34912) - Ignore bound-anonymous-fn resources as they're not considered I/O (@sebmarkbage #34911)
- Fix detached
ArrayBuffererror when streaming typed arrays (@unstubbable #34849) - Exclude RSC stream if the stream resolves in a task (@sebmarkbage #34838)
- Forward the current environment when forwarding I/O entries (@sebmarkbage #34836)
- Look for moved debug info when logging component performance track (@sebmarkbage #34839)
- Respect
displayNameof Promise instances on the server (@sebmarkbage #34825) - Avoid unnecessary indirection when serializing debug info (@unstubbable #34797)
- Fix preload
asattribute for stylesheets (@unstubbable #34760) - Don't serialize
toJSONin debug path and omit wide arrays (@sebmarkbage #34759) - Add support for
<Activity>(@eps1lon #34697)
v19.2.8: 19.2.8 (July 21st, 2026)
React Server Components
v19.2.7
React Server Components
- Fixed missing
FormDataentries in Server Actions which regressed in 19.2.6 (@unstubbable #36566)
v19.2.6
React Server Components
- Type hardening and performance improvements (@eps1lon, @unstubbable #36425)
v19.2.5
React Server Components
- Add more cycle protections (@eps1lon, @unstubbable #36236)
v19.2.4
React Server Components
- Add more DoS mitigations to Server Actions, and harden Server Components (@gnoff, @lubieowoce, @sebmarkbage, @unstubbable #35632)
v19.2.3
React Server Components
- Add extra loop protection to React Server Functions (@sebmarkbage #35351)
v19.2.2
React Server Components
- Move
react-server-dom-webpack/*.unbundledto privatereact-server-dom-unbundled(@eps1lon #35290) - Patch Promise cycles and toString on Server Functions (@sebmarkbage, @unstubbable #35289, #35345)
v19.2.1
React Server Components
- Bring React Server Component fixes to Server Actions (@sebmarkbage #35277)
v19.2.0
Below is a list of all new features, APIs, and bug fixes.
Read the React 19.2 release post for more information.
New React Features
<Activity>: A new API to hide and restore the UI and internal state of its children.useEffectEventis a React Hook that lets you extract non-reactive logic into an Effect Event.cacheSignal(for RSCs) lets your know when thecache()lifetime is over.- React Performance tracks appear on the Performance panel’s timeline in your browser developer tools
New React DOM Features
- Added resume APIs for partial pre-rendering with Web Streams:
resume: to resume a prerender to a stream.resumeAndPrerender: to resume a prerender to HTML.
- Added resume APIs for partial pre-rendering with Node Streams:
resumeToPipeableStream: to resume a prerender to a stream.resumeAndPrerenderToNodeStream: to resume a prerender to HTML.
- Updated
prerenderAPIs to return apostponedstate that can be passed to theresumeAPIs.
Notable changes
- React DOM now batches suspense boundary reveals, matching the behavior of client side rendering. This change is especially noticeable when animating the reveal of Suspense boundaries e.g. with the upcoming
<ViewTransition>Component. React will batch as much reveals as possible before the first paint while trying to hit popular first-contentful paint metrics. - Add Node Web Streams (
prerender,renderToReadableStream) to server-side-rendering APIs for Node.js - Use underscore instead of
:IDs generated by useId
All Changes
React
<Activity />was developed over many years, starting beforeClassComponent.setState(@acdlite @sebmarkbage and many others)- Stringify context as "SomeContext" instead of "SomeContext.Provider" (@kassens #33507)
- Include stack of cause of React instrumentation errors with
%oplaceholder (@eps1lon #34198) - Fix infinite
useDeferredValueloop in popstate event (@acdlite #32821) - Fix a bug when an initial value was passed to
useDeferredValue(@acdlite #34376) - Fix a crash when submitting forms with Client Actions (@sebmarkbage #33055)
- Hide/unhide the content of dehydrated suspense boundaries if they resuspend (@sebmarkbage #32900)
- Avoid stack overflow on wide trees during Hot Reload (@sophiebits #34145)
- Improve Owner and Component stacks in various places (@sebmarkbage, @eps1lon: #33629, #33724, #32735, #33723)
- Add
cacheSignal(@sebmarkbage #33557)
React DOM
- Block on Suspensey Fonts during reveal of server-side-rendered content (@sebmarkbage #33342)
- Use underscore instead of
:for IDs generated byuseId(@sebmarkbage, @eps1lon: #32001, facebook#33342#33099, #33422) - Stop warning when ARIA 1.3 attributes are used (@Abdul-Omira #34264)
- Allow
nonceto be used on hoistable styles (@Andarist #32461) - Warn for using a React owned node as a Container if it also has text content (@sebmarkbage #32774)
- s/HTML/text for for error messages if text hydration mismatches (@rickhanlonii #32763)
- Fix a bug with
React.useinsideReact.lazy-ed Component (@hi-ogawa #33941) - Enable the
progressiveChunkSizeoption for server-side-rendering APIs (@sebmarkbage #33027) - Fix a bug with deeply nested Suspense inside Suspense fallback when server-side-rendering (@gnoff #33467)
- Avoid hanging when suspending after aborting while rendering (@gnoff #34192)
- Add Node Web Streams to server-side-rendering APIs for Node.js (@sebmarkbage #33475)
React Server Components
- Preload
<img>and<link>using hints before they're rendered (@sebmarkbage #34604) - Log error if production elements are rendered during development (@eps1lon #34189)
- Fix a bug when returning a Temporary reference (e.g. a Client Reference) from Server Functions (@sebmarkbage #34084, @denk0403 #33761)
- Pass line/column to
filterStackFrame(@eps1lon #33707) - Support Async Modules in Turbopack Server References (@lubieowoce #34531)
- Add support for .mjs file extension in Webpack (@jennyscript #33028)
- Fix a wrong missing key warning (@unstubbable #34350)
- Make console log resolve in predictable order (@sebmarkbage #33665)
React Reconciler
- createContainer and createHydrationContainer had their parameter order adjusted after
on*handlers to account for upcoming experimental APIs
v19.1.9: 19.1.9 (July 21st, 2026)
React Server Components
v19.1.8
React Server Components
- Fixed missing
FormDataentries in Server Actions which regressed in 19.1.7 (@unstubbable #36567)
[`v1
❗ Important
✂ PR body was truncated to here.
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
Release Notes
vitest-dev/vitest (vitest)
v5.0.3
🐞 Bug Fixes
- Isolate
result.statusbetweenrepeatsruns - by @hi-ogawa, Hiroshi Ogawa and Codex (GPT-6) in #11218 (5dbeb) - Don't print an interceptor warning in browser mode - by @sheremet-va in #11377 (15cc0)
- Don't retry when
test.failsexpectedly failed - by @hi-ogawa, Hiroshi Ogawa and Codex (GPT-6) in #11219 (b2458) - Scope cache key generators to projects - by @ecoyoung in #11281 and #11301 (92ba7)
- browser:
- Delay server
listenuntil tests start running - by @sheremet-va in #11366 (7d8ed) - Check mock path boundaries - by @saryn17, Ryosei Sato and @sheremet-va in #11361 and #11362 (1c388)
- Keep config of browser-consumed environments - by @kasperpeulen and Claude in #11378 (aafc0)
- Ignore page crash while cancelling - by @sheremet-va in #11386 (7c367)
toMatchScreenshotuses wrong reference on retried tests - by @macarie in #11393 (c22ab)
- Delay server
- cache:
- Revalidate imports of cached modules - by @sheremet-va in #11381 (38f98)
- deps:
- Pin
why-is-node-runningto3.2.1to avoid users running intoERR_PNPM_TRUST_DOWNGRADE- by @AriPerkkio in #11403 (f6c9a)
- Pin
- expect:
- Pass current equality testers to
expect.extendasymmetric matchers - by @hi-ogawa, Hiroshi Ogawa and Claude in #11401 (3e794)
- Pass current equality testers to
- jsdom:
- Support Blob on jsdom 30.1 - by @sheremet-va in #11379 (6c49b)
- pool:
- ui:
- vitest:
- Remove root temp dir on close - by @abhinav-phi in #11248 (7c711)
- vm:
View changes on GitHub
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Backport of #18112 from next to main.
Changes
- Astro now uses Vite's resolved environment
outDirvalues as the source of truth for build output. Generated assets, build hookdirvalues, and SSR manifest paths use the resolved client, server, and prerender directories, so integrations and Vite plugins can control where output is written. - Custom prerenderer factories receive the resolved directories through a new context argument:
setPrerenderer((defaultPrerenderer, { outputDirectories }) => ...). The argument is additive, so existing factories keep working. - Cleanup of Vite's
.vitemanifests now waits until everybuildApphook has finished, so platform plugins can read the manifests. - The cherry-pick applied cleanly. The touched files are identical to
next.
Testing
- Adds
test/resolved-vite-output-directories.test.ts. A Vite plugin changes the environmentoutDirs, and the test asserts that hooks, the SSR manifest, and custom prerenderers see the resolved values while the Astro config stays unchanged. - Updates
units/build/generate.test.ts,units/build/preserve-build-client-dir.test.ts, andincremental-build-islands.test.tsto expect output paths from the resolved directories.
Docs
- Integration authors are affected: the new prerenderer
outputDirectoriescontext is covered by the minor changeset. Docs forsetPrerenderermay need a follow-up to document the context argument.

This PR contains the following updates:
Release Notes
mochajs/mocha (mocha)
v12.0.3
🩹 Fixes
- keep watching when the last test file is removed (#6355) (921c161)
- show require() error on unsupported directory import (#6354) (a68344f)
- support
--Xone-char aliases (#6391) (1227939)
📚 Documentation
🧹 Chores
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @vercel/functions (source) | ^3.9.9 → ^3.9.11 |
||
| rolldown (source) | ^1.2.11 → ^1.2.12 |
||
| vite (source) | ^8.3.1 → ^8.3.3 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| rolldown (source) | ^1.2.11 → ^1.2.12 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @vitejs/plugin-react (source) | ^6.1.1 → ^6.1.2 |
||
| oxc-transform-react (source) | ^0.150.0 → ^0.153.0 |
||
| vite (source) | ^8.3.0 → ^8.3.2 |
Release Notes
vitejs/vite-plugin-react (@vitejs/plugin-react)
v6.1.2
Fix HMR for compound components (#1484)
Adding or removing a component from a compound component was not handled, creating stale updates. Doing this now triggers hmr invalidate on the file and propagates the invalidation to importers.
Fix compiler.logDiagnostics option not working (#1483)
With oxc-transform-react >= 0.148, the logDiagnostics was not working. This version fixes it and requires oxc-transform-react >= 0.152 as a peer dependency if you are using the compiler option. compiler.logDiagnostics option is now deprecated and should be swapped for the builtin compiler.reportDiagnostics.
Disable refresh for non-jsx with compiler enabled (fix #1478) (#1485)
When the compiler was enabled, TS files could trigger fast refresh which would cause runtime errors. The logic now follows what the builtin oxc plugin in Vite does.
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @preact/signals (source) | ^2.11.2 → ^2.11.3 |
||
| preact-render-to-string | ^6.7.0 → ^6.8.0 |
||
| vite (source) | ^8.3.0 → ^8.3.2 |
Release Notes
preactjs/signals (@preact/signals)
v2.11.3
Patch Changes
- #991
04445baThanks @JoviDeCroock! - Don't re-run auseSignalEffectfor a component that was unmounted by the same update. Preact 11 disposes it after paint, so the effect could otherwise run once more against an unmounted component.
preactjs/preact-render-to-string (preact-render-to-string)
v6.8.0
Minor Changes
-
#472
2dff53dThanks @jacob-ebey! - Replaces the secondcontextargument in our streaming functions with anoptionsobject, thecontextmoves to the third position.Streaming is considered alpha so we're making this breaking change deliberately as part of a minor.
Patch Changes
-
#464
455daf5Thanks @JoviDeCroock! - Calloptions._rootbefore the render-to-string invocation -
#475
4e92059Thanks @JoviDeCroock! - Use Node'sWritabletype forrenderToPipeableStreamdestinations. -
#444
e5ff19fThanks @dsherret! - fix: use cjs types instead of esm for jsx export to fix default export from esm -
#477
4b80672Thanks @JoviDeCroock! - Preserve client-rendered content when delayed streaming chunks arrive after hydration. -
#471
0ce2b84Thanks @JoviDeCroock! - Keep Preact option hooks isolated for the lifetime of asynchronous renders. -
#476
5b1d509Thanks @JoviDeCroock! - Replace streamed Suspense fallbacks when the resolved content is empty.
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@astrojs/vercel@11.0.14
Patch Changes
- #18339
fcc050cThanks @astro-factory! - Fixes on-demand routes failing with "Cannot find native binding" on Vercel, caused by the serverless function loadingrolldownat runtime

ℹ️ Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
Release Notes
cloudflare/workers-sdk (@cloudflare/vite-plugin)
v1.62.5
Patch Changes
- Updated dependencies [
7f700ef,90e6a1b,7f57b1c,6a4b0fe]:- wrangler@4.147.0
- miniflare@5.20261001.0-alpha
v1.62.4
Patch Changes
- Updated dependencies [
b8e7cc3,b00ef4f,9d7b08e,464a582,aee2842,efd67e6]:- wrangler@4.146.0
- miniflare@5.20261001.0-alpha
v1.62.3
Patch Changes
- Updated dependencies [
b9f1cdc,ddaa558,8468487,a0712e5,a0712e5]:- miniflare@5.20260930.0-alpha
- wrangler@4.145.0
v1.62.2
Patch Changes
- Updated dependencies [
91a3606,2a15ae2]:- wrangler@4.144.0
- miniflare@5.20260926.1-alpha
v1.62.1
Patch Changes
-
#15938
62fd03aThanks @dieub! - Resolve the affected Undici dependency in new Wrangler and Vite plugin installsUndici 7.29.1 fixes GHSA-3wwx-pv8p-q78v. Update the shared dependency catalog and matching types used by Miniflare and Wrangler so downstream installs can resolve the patched runtime without an application-level override. A published release is still required for consumers; this changeset does not alter already published package metadata.
-
Updated dependencies [
7bb6eae,60ccdbd,62fd03a,06ed9c8,86211fe,c2bb4c8,eb1efe0,485cfb3]:- wrangler@4.143.1
- miniflare@5.20260926.1-alpha
v1.62.0
Minor Changes
-
#15914
7f0734cThanks @jamesopstad! - Usecf/configforcloudflare.config.tsauthoringExperimental
cloudflare.config.tsprojects must now importdefineConfig, bindings, triggers, and related helpers fromcf/config. Generated declarations from Wrangler and the Vite plugin also reference this package, so projects using the experimental configuration flow must addcfas a dependency.The Vite plugin no longer exports
@cloudflare/vite-plugin/experimental-config.wrangler/experimental-configremains available fordefineWranglerConfig, but no longer re-exports Cloudflare configuration helpers.
Patch Changes
-
#15878
e7915c1Thanks @dawNotPoi! - Keep dependency optimization caches stable on the first Vite dev server restart.The first dev server restart no longer re-optimizes unchanged dependencies, including in projects without Containers. Container images are still cleaned up when the server closes, even after a config reload removes the Cloudflare plugin.
-
Updated dependencies [
7f0734c]:- wrangler@4.143.0
v1.61.0
Minor Changes
-
#15856
4c2993bThanks @Naapperas! - Support Workflows declared inexportsonctx.exportsin local developmentA Workflow declared in a Worker's
exportsis now available onctx.exportsinwrangler dev, the Vite plugin and the Vitest plugin, with the same API as a Workflow binding:const instance = await ctx.exports.MyWorkflow.create({ params: { name: "World" }, });
ctx.exportsandworkflowsbindings with the same Workflownameshare their instances, including instances created before the Workflow was declared inexports. Two Workers can't export the same Workflow name, and a binding to an exported Workflow must refer to the Worker and class that export it.getPlatformProxy()ignores Workflows declared inexports, since it doesn't run the Worker's code.wrangler workflowscommands run with--localalso work with Workflows declared only inexports, without aworkflowsbinding.In the Vitest plugin,
introspectWorkflow()andintrospectWorkflowInstance()still need a Workflow binding, and now explain how to add one when passed a Workflow fromctx.exports. Instances created throughctx.exportsare introspected too. Aworkflowsbinding whosescript_nameis the Worker's own name now resolves to the Worker itself again.
Patch Changes
- Updated dependencies [
8dc53ae,4c2993b]:- miniflare@5.20260926.0-alpha
- wrangler@4.142.0
v1.60.2
Patch Changes
- Updated dependencies [
ee2b200,c91279b,8280086,bd56b98,805af2f]:- miniflare@5.20260925.0-alpha
- wrangler@4.141.0
v1.60.1
Patch Changes
- Updated dependencies [
8f7916c]:- wrangler@4.140.0
- miniflare@5.20260923.0-alpha
v1.60.0
Minor Changes
-
#15648
52c0e9fThanks @tpmmorris! - Advertise Local Explorer scheduled invocations to headless agentsThe Vite plugin's Local Explorer hint now documents how to invoke a Worker's scheduled handler and points agents to the OpenAPI schema for the complete request contract.
Patch Changes
- Updated dependencies [
52c0e9f,44f5295,be72815,479e1e8,940c692,52c0e9f,cd60c9c,15799d4,bdda4c3,fc3cbaa]:- miniflare@5.20260923.0-alpha
- wrangler@4.139.0
v1.59.0
Minor Changes
-
#15817
6e77c53Thanks @jamesopstad! - Allow framework commands to produce Preview Build Output with the experimental configWhen
cf previews deployinvokes a framework build command, Preview intent is now preserved. Function-basedcloudflare.config.tsfiles receiveisPreview: true, and generated Build Output is marked as a Preview build.
Patch Changes
-
#15806
8fade73Thanks @NuroDev! - Standardize Zod validation error outputFormat validation errors with Zod's built-in
prettifyError()helper so Miniflare, Wrangler, the Vite plugin, and the Vitest plugin show consistent messages and property paths. -
Updated dependencies [
a71237a,b03f960,8fade73,6e77c53]:- miniflare@5.20260921.1-alpha
- wrangler@4.138.0
v1.58.0
Minor Changes
-
#15778
cd7508cThanks @jamesopstad! - Generate types during development and supported builds with Vite'sexperimental.newConfigoption or Wrangler's--experimental-new-configflag (and--experimental-cf-build-outputfor builds)When Wrangler's
--experimental-new-configflag or Vite'sexperimental.newConfigoption is enabled, inferred configuration and runtime declarations are now kept in.cloudflare/types/index.d.ts. Vite refreshes them during development and production builds. Wrangler refreshes them during development and when building with both--experimental-new-configand--experimental-cf-build-output. In the experimentalwrangler.config.tsformat, thetypesoption is now top-level because it applies to both commands.
Patch Changes
-
#15765
1bdb96dThanks @th0m! - Prepare the required egress sidecar for local Containers without configured imagesWrangler dev and Vite dev/preview now pull the required sidecar for Durable Object-managed Containers that select their application image at start time. Previously, these Containers failed to start unless the sidecar image was already cached in Docker.
-
Updated dependencies [
1bdb96d,cd7508c,f5605f5]:- wrangler@4.137.0
v1.57.3
Patch Changes
- Updated dependencies [
59267fc,6906bf0,354ebdb]:- wrangler@4.136.3
- miniflare@5.20260921.0-alpha
v1.57.2
Patch Changes
- Updated dependencies [
ad20547,02c1d83,275184d,bd59eca]:- wrangler@4.136.2
- miniflare@5.20260921.0-alpha
v1.57.1
Patch Changes
- Updated dependencies [
0ed4c54,703922d,14d946d]:- wrangler@4.136.1
- @cloudflare/unenv-preset@2.16.2
v1.57.0
Minor Changes
-
#15713
3c75cadThanks @jamesopstad! - Identify experimental Build Output resource configs by filename and locationThe root remains
config.json, Worker configs are nowworker.config.json, and Container configs are nowcontainer.config.json. Resource configs no longer contain top-leveltypediscriminators, while settings and build context are stored together in the root config. -
#15713
3c75cadThanks @jamesopstad! - Define experimental Cloudflare configuration with a single default exportExperimental
cloudflare.config.tsfiles now define settings and resources together in a default-exporteddefineConfig()call. Add a Worker underworker, add Containers to thecontainersarray, or omit both to provide settings only.import * as entrypoint from "./src/index.ts" with { type: "cf-worker" }; export default defineConfig({ accountId: "...", complianceRegion: "public", worker: { name: "my-worker", compatibilityDate: "2026-09-18", entrypoint, }, });
Patch Changes
-
#15711
91e2f86Thanks @ghostwriternr! - Allow local Container images without exposed portsWrangler and the Cloudflare Vite plugin no longer reject images that omit Docker
EXPOSEmetadata. Local Containers can run command-only workloads or serve traffic through workerd without declaring an unused image port. -
Updated dependencies [
3c75cad,3c75cad,91e2f86,c5913a6,35668d7,3c75cad,45b3b81,8235e6a,0751490,43b1f85,731a2ee]:- wrangler@4.136.0
- miniflare@5.20260921.0-alpha
v1.56.0
Minor Changes
-
#15609
1f070c8Thanks @emily-shen! - Build Containers when emitting experimental Build OutputWrangler and the Cloudflare Vite plugin now build Dockerfile-backed Container images when experimental Build Output is enabled. Container configs are emitted under
.cloudflare/output/v0/containerswith local image references, while existing registry references pass through unchanged. -
#15329
c4c9b75Thanks @akshitsinha! - Evaluate Flagship flags locally during developmentFlagship bindings now use the local Miniflare store by default in Wrangler and the Vite plugin, keeping development offline and isolated from production flags. Set
remote: trueon a binding to continue using its remote app.Use
wrangler flagship flags pull <APP_ID>to seed the store from a remote app. Flag management commands also accept--localto read and update the local store directly. -
#15701
643e5ccThanks @WillTaylorDev! - Pass Preview intent todefineWorkerand upload its resolved configurationPreview builds now evaluate programmatic Worker configuration with
ctx.isPreviewset totrueand record that intent in Build Output. The shared Preview uploader deploys the resolved bindings and settings while preserving configured Preview base values when it creates a Preview.
Patch Changes
- Updated dependencies [
1f070c8,a0485d5,629ddef,c4c9b75,643e5cc]:- wrangler@4.135.0
- miniflare@5.20260918.0-alpha
v1.55.0
Minor Changes
-
#15674
a939a6cThanks @ghostwriternr! - Support explicit named Container image selection in local developmentThe Vite plugin builds or pulls named images from Wrangler configuration and exposes their local tags through
ctx.container.images. Pass one of those references toctx.container.start({ image })to select the image.This extends the experimental Durable Object-managed Containers interface.
Patch Changes
- Updated dependencies [
6874aa9,2298cf1,d96b319,876eea1,2b39fc2]:- wrangler@4.134.0
- miniflare@5.20260917.0-alpha
v1.54.11
Patch Changes
- Updated dependencies [
71b6f10,ad23e6e,bac0c6a,be2437a,bac0c6a,6f3d7b5]:- miniflare@5.20260916.0-alpha
- wrangler@4.133.0
v1.54.10
Patch Changes
-
#14775
1be7b97Thanks @dario-piotrowicz! - Sync Local Explorer endpoint lists across agent hintsThe Local Explorer endpoint list is now consistent across the three places it appears: the AGENTS.md template in
create-cloudflare, the runtime agent hint inwrangler dev, and the Vite plugin agent hint. All three now include theobservability/clearendpoint, use the canonical/cdn-cgi/local/explorerpath, and have cross-reference comments pointing to each other. -
#15399
982b806Thanks @tpmmorris! - Improve over-limitrun_worker_firsterrors when duplicate rules are presentThe error now reports distinct and duplicate-entry counts and lists duplicated rules, making it clear when removing redundant entries can bring the configuration within the limit.
Too many `run_worker_first` rules were provided; 105 rules provided (99 distinct, 6 duplicate entries) exceeds max of 100. Note: duplicate entries count towards the route limit. Ensure that no duplicate rules are present in your `run_worker_first` configuration. The duplicated rules found are: - "/rule/0" - "/rule/1" - "/rule/2" - "/rule/3" - "/rule/4" ...and 1 more duplicated rule. -
Updated dependencies [
1be7b97,b149147,7db596c,76c0ce6,a83d7ac,a0856da,e35c4a1,d3565a5,a83d7ac,cb0955f,fa79b26,16d1310,ca71205,1015cfb,982b806,ffabe74,7db596c,e03822a,a83d7ac,641df47,c4a6279]:- wrangler@4.132.0
- miniflare@5.20260915.0-alpha
v1.54.9
Patch Changes
-
#15574
164e4fbThanks @RealBhupesh! - Ignore.wranglerpersistence writes in Vite's file watcherMiniflare stores local D1, KV, R2, and observability state under
.wrangler/state. Those writes were watched as source changes on Linux and Windows, which fired every pluginhotUpdatehook and could make page loads take seconds. The plugin now ignores**/.wrangler/**while preserving anyserver.watch.ignoredpatterns already set by the user. -
Updated dependencies [
8997652]:- miniflare@5.20260911.1-alpha
- wrangler@4.131.2
v1.54.8
Patch Changes
- Updated dependencies [
945aaa3,945aaa3,47d906f,c2699bf,945aaa3,945aaa3]:- wrangler@4.131.1
- miniflare@5.20260911.0-alpha
v1.54.7
Patch Changes
-
#15432
f45b596Thanks @razethion! - Prevent delayed internal errors from fetch-only remote bindingsFetch-only remote bindings such as D1 and R2 previously opened an unused WebSocket RPC session. RPC sessions are now created only when an RPC method is called.
-
Updated dependencies [
0b43395,9d75006,b605aa6,f45b596,f69f95a,a549e58,36aed7f,493e635,bff525d,dbb3ff4,fea3cd0,96688b3,6bd7b6c,15cd6e1,be1caec,ed5797a,dbc9506,128235a,f8aea7e,24ef86b]:- wrangler@4.131.0
- miniflare@5.20260910.0-alpha
v1.54.6
Patch Changes
- Updated dependencies [
edb3631,dbf6aad,bcebf08,e20df20,e20df20,63c7ff1,a4e41df]:- miniflare@5.20260908.0-alpha
- wrangler@4.130.0
v1.54.5
Patch Changes
-
#15519
e004845Thanks @devaniketh! - Preserve HTTP/2:authorityheader and non-default port in dev server requestsWhen Vite runs over HTTPS with HTTP/2 enabled, browsers send authority via the
:authoritypseudo-header rather thanHost. Previously, pseudo-headers were omitted when creating Fetch requests, causing non-default ports to be dropped fromrequest.urlandX-Forwarded-Host. Authority and scheme are now preserved from HTTP/2 pseudo-headers and request properties. -
Updated dependencies [
8bbcb9f,2b42d6f,ea5634e,c0c6504,ffc7efd,682cd44]:- miniflare@5.20260907.0-alpha
- wrangler@4.129.1
v1.54.4
Patch Changes
-
#15407
7662118Thanks @xgame92! - Surface Worker export type fetch errors during developmentThe Vite plugin now reports the Worker name, HTTP status, and response body when fetching export types fails. This preserves the underlying error instead of replacing it with a JSON parsing error.
-
Updated dependencies [
00a9f2f,1dba24a,d40a634,7c1b2a6,93d72a5,f6fb347,f6fb347,dc24057,d2d8eea]:- miniflare@5.20260903.0-alpha
- wrangler@4.129.0
v1.54.3
Patch Changes
- Updated dependencies [
dbbb795,200780f,b3f2628,87a7acf,1809c5e,ea28cc3,b3fb2bf,707cb6f]:- wrangler@4.128.0
- miniflare@5.20260831.0-alpha
v1.54.2
Patch Changes
- Updated dependencies [
eb01850,e1df91a,b23de74,015550a,015550a,015550a,3650d29,b23de74]:- miniflare@5.20260828.0-alpha
- wrangler@4.127.1
v1.54.1
Patch Changes
- Updated dependencies [
71b6f10,ad23e6e,bac0c6a,be2437a,bac0c6a,6f3d7b5]:- miniflare@5.20260916.0-alpha
- wrangler@4.133.0
v1.54.0
Minor Changes
-
#15134
c66d2d5Thanks @gpanders! - Enable FUSE-capable local container developmentMiniflare now automatically passes the Docker privileges needed for FUSE to loc
❗ Important
✂ PR body was truncated to here.
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| vite (source) | ^8.3.0 → ^8.3.2 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| rolldown (source) | ^1.2.11 → ^1.2.12 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| acorn | ^8.18.0 → ^8.19.0 |
||
| es-module-lexer | ^3.0.2 → ^3.0.3 |
||
| rolldown (source) | ^1.2.11 → ^1.2.12 |
Release Notes
guybedford/es-module-lexer (es-module-lexer)
v3.0.3
What's Changed
- fix: handle TypeScript generic commas in exported bindings by @BridgeAR in #254
- fix: ASI and repeated non-null assertions in TypeScript export bindings by @guybedford in #257
Full Changelog: guybedford/es-module-lexer@3.0.2...3.0.3
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

ℹ️ Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
Release Notes
changesets/changesets (@changesets/cli)
v3.0.3
Patch Changes
-
#2297
3f163daThanks @Andarist! - Fixed semver ranges (such as>=1.0.0 <2.0.0) getting cut off (>=2.0.0) when updating internal dependencies. -
#2276
ca9d110Thanks @Andarist! - Fixed pnpm 10 compatibility with npm 12 when reading registry information, packing, and publishing packages. -
Updated dependencies [
3f163da,bfe9050,e522996]:- @changesets/apply-release-plan@8.1.1
- @changesets/config@4.0.1
CodSpeedHQ/codspeed-node (@codspeed/vitest-plugin)
v5.7.1
What's Changed
- fix: emit perf maps when not parsing the full inlining logs from V8 by @GuillaumeLagrange in #85
Full Changelog: CodSpeedHQ/codspeed-node@v5.7.0...v5.7.1
v5.7.0
Highlights
- Dump full inlining information for higher optimization tiers in walltime so we can show more functions on the profiler. To test it out, set
CODSPEED_WALLTIME_PROFILER=samplyenv variable in the codspeed action. - Added support for tinybench v5 and v6 in @codspeed/tinybench-plugin
What's Changed
- Add necessary flags to dump optimized inlining info and fix walltime marker placement by @GuillaumeLagrange in #83
Full Changelog: CodSpeedHQ/codspeed-node@v5.6.0...v5.7.0
v5.6.0
What's Changed
- feat: add MacOS support by @not-matthias in #81
Full Changelog: CodSpeedHQ/codspeed-node@v5.5.0...v5.6.0
v5.5.0
Highlights
We are introducing @codspeed/playwright, for walltime benchmarking and profiling of end to end browser applications through playwright.
Here's an example usage, but head to the docs for more information
import { bench, type Page } from "@codspeed/playwright-plugin";
import electronExecutable from "electron";
import path from "node:path";
import { fileURLToPath } from "node:url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const appRoot = path.resolve(__dirname, "..");
async function waitUntilSettled(page: Page): Promise<void> {
await page.waitForFunction(() => {
const main = document.getElementById("main");
return !!main && !main.classList.contains("loading");
});
}
await bench(
"inbox-search-archive-threads",
async ({ page }) => {
await page.fill("#search", "update");
await waitUntilSettled(page);
await page.click("#select-visible-btn");
await page.click("#archive-btn");
await waitUntilSettled(page);
await page.click('#sidebar nav button[data-view="threads"]');
await waitUntilSettled(page);
},
{
target: {
kind: "electron",
appPath: path.join(appRoot, "out/main/index.js"),
cwd: appRoot,
},
beforeRound: async ({ page }) => {
page.setDefaultTimeout(180_000);
await page.waitForSelector("#main");
await waitUntilSettled(page);
},
},
);Note: this plugin is only compatible with the walltime instrument.
What's Changed
- Add playwright profiling package by @GuillaumeLagrange in #80
Full Changelog: CodSpeedHQ/codspeed-node@v5.4.0...v5.5.0
v5.4.0
What's Changed
This release adds first support for macOS walltime.
Please note that profiling and other instruments are not yet available on macOS and will come in a later update.
- Support macos walltime without profiling in codspeed-node by @GuillaumeLagrange in #79
Full Changelog: CodSpeedHQ/codspeed-node@v5.3.0...v5.4.0
v5.3.0
What's Changed
We now collect buildtime and runtime environment data to warn users about differences in their runtime environment when comparing two runs against one another.
This data includes toolchain metadata like version and build options, as well as a list of dynamically loaded linked libraries.
- feat(fi): add memory profiling by @not-matthias in #73
- feat: dump node process information when running by @GuillaumeLagrange in #77
- chore: bump instrument-hooks to dump linked libraries by @GuillaumeLagrange in #78
Full Changelog: CodSpeedHQ/codspeed-node@v5.2.0...v5.3.0
earendil-works/pi (@earendil-works/pi-ai)
v0.99.2
Added
- Added the lightweight
@earendil-works/pi-ai/modelsentry point for model collections and provider construction without loading TypeBox, built-in catalogs, or provider SDKs. - Added Anthropic workload identity federation from the Anthropic SDK environment variables
ANTHROPIC_FEDERATION_RULE_ID,ANTHROPIC_ORGANIZATION_ID, andANTHROPIC_IDENTITY_TOKEN_FILE(plus optionalANTHROPIC_SERVICE_ACCOUNT_IDandANTHROPIC_WORKSPACE_ID). API keys andANTHROPIC_AUTH_TOKENtake precedence (#10177, #10242 by @philfreo)
Fixed
- Fixed context overflow detection for Z.AI CN endpoint
Prompt exceeds max lengtherrors (#10208) - Fixed Anthropic requests failing when a
strict: "prefer"tool schema uses keywords Anthropic strict tool use rejects, such asminimum/maximum; such tools are now sent non-strict (#9953) - Fixed provider retries firing immediately when a
Retry-Afterheader contains an unparseable date; they now use exponential backoff (#9571)
v0.99.1
Added
- Added GPT-6.1 Sol (
gpt-6.1-sol) to the OpenAI, Azure OpenAI Responses, and OpenAI Codex providers.
v0.99.0
Breaking Changes
- Unified image models into the regular
Provider/Modelssurface. The separateImagesModelscollection is removed:createImagesModels(),createImagesProvider(),ImagesProvider,openrouterImagesProvider(),builtinImagesProviders(), andbuiltinImagesModels()are gone. UsebuiltinModels(),models.getModelOfType("image", ...),models.generateImages(), andcreateProvider({ models, images })instead. Existing unqualified reads remain chat-only. - Image models are now
ImageModelwith a requiredtype: "image"and shareBaseModelwith chat models. The old plural image type names (ImagesModel,ImagesApi,KnownImagesApi,KnownImagesProvider, andImagesProviderId) are removed.generateImages()accepts only image models. Output modalities (output) remain on image models only. - Generated model data schema is now version 6: every entry carries
type, operation-specific catalogs include chat, image, and classifier models, and one upstream ID may have separate entries per type. OpenRouter image models live in theopenrouter-imagesapi group ofopenrouter.json;image-models.generated.tsandscripts/generate-image-models.tsare removed. Runnpm run hydrate:model-data.
Added
- Added
Models.generateImages()with provider-resolved auth,Provider.generateImages?, andcreateProvider({ images })keyed bymodel.api.createProvider()modelsandfetchModelsaccept models of every type, andapiis optional whenimagesorclassifiersis given. - Added an optional model
type("chat","image", or"classifier"). Chat models may omit it, so existing chat models, providers, and stores keep working unchanged. Narrow mixed lists with the newisModelType()guard or read the effective type withgetModelType(). - Added
getModelsOfType(),getModelOfType(),getAvailableOfType(),getAllModels(), andgetAllAvailable()onModels; optionalProvider.getAllModels()andProvider.filterAllModels(); corresponding generated-catalog accessors; and theAnyModelandModelTypeMaptypes.hasApi(),calculateCost(), andmodelsAreEqual()acceptAnyModel. - Added support for models of every type in
ModelsStoreEntry.models. Stored and fetched models of unknown types are dropped instead of failing a refresh. - Added classifier models and
Models.classify()with a provider-neutral JEV-stylechoice/score/boolcontract. The built-in TypeSafe provider exposes models.dev'sjev-latestthrough the System One API and translates publicboolquestions to TypeSafe'snoulwire format. - Added Jev classifier models on OpenRouter (
typesafe/jev-1.13,~typesafe/jev-latest) through its TypeSafe-compatible System One endpoint, and on Cloudflare Workers AI (typesafe/jev) through the newcloudflare-workers-ai-system-oneclassifier API. - Added Jev classifier models on Vercel AI Gateway (
typesafe-ai/jev, generated from its evaluation model catalog) and OpenCode Zen (jev-1.13,jev-1.13-free) through their TypeSafe-compatible System One endpoints. - Added
usagetoClassifierResult: System One classifications report token counts, priced from the model catalog like chat usage. - Added a runtime chat-model check to the
Modelsstream entry points so non-chat models fail with a clearModelsErrorinstead of a missing-api stream error. - Added array-based
models.all.jsonandproviders/{id}.all.jsonvariants to the generated and published JSON catalog, allowing the same upstream ID once per model type; the existing keyedmodels.jsonandproviders/{id}.jsonstay chat-only for released clients. - Added
onProviderStreamEventto observe parsed provider stream events before normalization, including provider-specific fields not retained in assistant messages (#9784, #9901 by @davidbrai). - Added Claude Sonnet 5.5 to the built-in Anthropic model catalog with adaptive thinking, mid-conversation effort, 1M context, and official pricing metadata.
- Added Sign in with ChatGPT to the
openaiprovider: an OAuth login that uses a ChatGPT subscription with the OpenAI API.Models.login()acceptsLoginOptionswithgetDeviceId(), which supplies a stable installation ID to login flows that need one. Subscription usage-limit errors are not retried and link to the ChatGPT usage page; temporary usage errors are retried. - Added the
llama-cpp-classifyclassifier API, which answers classifier questions from llama-server's next-token probabilities for single-token answer labels. - Added optional
AssistantMessage.thinkingLevel, which records the thinking level the agent loop requested for a response.
Changed
- Renamed the OpenAI Codex provider to "OpenAI Codex (legacy)"; Sign in with ChatGPT on the
openaiprovider supersedes it. - Unified the Anthropic, OpenAI Codex, OpenRouter, and Radius browser sign-in callback servers into one shared implementation with the same browser pages. The OAuth page helpers are now available as
@earendil-works/pi-ai/utils/oauth-page. - Changed Radius browser sign-in to exchange the authorization code before showing the browser page, so token exchange failures are shown in the browser.
Fixed
- Fixed 1-hour Anthropic cache writes reported by Vercel AI Gateway in streaming deltas being priced at the 5-minute rate (#9210).
- Fixed model-level
samplingParamsbeing dropped by directstream()/complete()calls on OpenAI-compatible APIs (#9506). - Fixed Mistral GLM models producing empty text blocks and split thinking blocks from empty content deltas, which could make later requests fail with "Expected at most one leading ThinkChunk" (#9674).
- Fixed OpenAI Fast mode requests being priced at the standard rate when the response reports
service_tier: "fast", as GPT-6 models do (#10034). - Fixed Mistral reasoning models ignoring the requested thinking level: GLM 5.3 now uses
reasoning_effortinstead ofprompt_mode, GLM 5.2 acceptsmax, and Mistral models only offer the effort levels the API supports (#9678). - Fixed OpenCode Zen and OpenCode Go
qwen3.8-flashthinking being replayed as plain text on later turns because the endpoint returns empty thinking signatures (#10047). - Fixed OpenAI Responses streams returning unfinished tool calls as runnable, which made servers that omit
output_index(such as llama.cpp) run mixed-up commands; such streams now end with an error (#9974). - Fixed Anthropic and OpenAI Codex browser sign-in waiting indefinitely after the provider redirected with an authorization error; sign-in now fails with the provider's error description.
- Fixed Anthropic browser sign-in failing when its callback port is in use; it now falls back to pasting the redirect URL.
- Fixed GitHub Copilot Claude Opus 5.5 offering unsupported thinking levels when upstream model metadata is incomplete; it now offers low through max.
v0.87.1
Added
- Added Claude Opus 5.5, GPT-6 Sol, and GPT-6 Luna to the GitHub Copilot catalog.
- Added GPT-6 Sol and GPT-6 Luna for OpenAI API keys and OpenAI Codex subscriptions, with full reasoning-effort, prompt-caching, tool-search, long-context pricing, and official cost metadata.
- Added Claude Opus 5.5 to the built-in Anthropic model catalog with adaptive thinking, 1M context, and official pricing metadata.
- Added Grok 4.7 to the built-in xAI model catalog with long-context pricing metadata.
Fixed
- Fixed image-only user messages being rejected by some OpenAI-compatible providers because they included an empty text part (#9797)
- Fixed Anthropic OAuth requests reporting an outdated Claude Code version.
v0.87.0
Added
- Added model image-input limit and cache-safe resize metadata to the generated catalog (#9631).
Fixed
- Fixed unknown OpenAI-compatible Chat Completions endpoints receiving strict tool schemas unless they explicitly advertise support, while preserving strict tools for capable built-in models (#9816).
v0.86.1
Added
- Added Meta provider (Model API key and Muse subscription OAuth) with Muse Spark models (#9096 by @xl0).
Fixed
- Fixed z.ai
Prompt too longerrors not being recognized as context overflow (#9805). - Fixed Cerebras models advertising unsupported strict tool schemas, which caused HTTP 400 errors when strict and non-strict tools were mixed (#9804 by @EdenGottlieb).
v0.86.0
Breaking Changes
- Changed provider-facing
ProviderStreamsandStreamFunctioninputs fromContextto normalizedTranscriptContextvalues. System prompts and tool declarations now live in transcript system messages; custom providers must read them withgetCurrentSystemPrompt()andgetCurrentTools(). See System Messages. - Restricted
ToolCall.argumentsandToolResultMessage.detailsto JSON-compatible values, changedToolResultMessageinto a conditional type, and madeJsonValuearrays readonly.
Added
- Added transcript-backed mid-conversation system prompt and tool changes, with native replay on supported models and automatic collapse for other providers. See System Messages (#9548).
- Added a generated public Radius model catalog for synchronous API lookup, with cached and live gateway catalogs overlaid at runtime.
- Enabled native deferred tool loading for Fireworks Messages models. Use
ToolSearchortool_searchas the loader name for prompt-prefix deferral (#9323). - Added
RetryPolicy.maxAgentDelayMssupport to cap shared assistant retry backoff for summarization calls (#8826). - Added
Model.promptCachelifetime metadata for short and long retention tiers to support prompt-cache warming decisions (#9668).
Fixed
- Fixed GitHub Copilot GPT models, including GPT-6 Astra, using the Chat Completions adapter instead of the required Responses adapter (#9253 by @petrroll).
- Fixed DeepSeek V4.1 thinking levels on OpenRouter and OpenCode Go preserving provider effort metadata (#9485).
- Fixed bodyless HTTP 400/413 errors from non-Cerebras providers being misclassified as context overflow (#9482).
- Fixed Vercel AI Gateway replaying unsigned thinking as assistant text (#9676).
- Fixed Google Generative AI and Vertex AI using unsupported thinking levels when reasoning is omitted or when model capabilities differ within a Gemini family (#9455).
- Fixed Anthropic-compatible relays breaking signed thinking replay when they report a different response model, while preserving fallback pricing (#9188).
- Fixed Amazon Bedrock one-hour cache writes being priced at the five-minute rate (#9457).
- Fixed quadratic CPU usage when draining buffered
EventStreamevents (#9055). - Fixed Mistral Medium reasoning requests to use
reasoning_effortfor all reasoning-capablemistral-medium-*model IDs instead of the unsupportedprompt_mode(#8700). - Fixed OpenCode and OpenCode Go requests to send
x-opencode-sessionfromsessionIdacross all supported API adapters (#9326). - Fixed OpenAI Codex requests to send the model's Off reasoning effort instead of omitting it, while respecting unsupported Off mappings (#9191).
- Fixed Fireworks unsigned thinking replay and reasoning effort selection using catalog metadata, with verified DeepSeek V4 and Qwen3.8 fallbacks and removal of redundant GLM 5.2 and Kimi K3 effort aliases (#9323).
- Fixed OpenRouter requests to send
x-session-idfromsessionIdfor Chat Completions and Anthropic Messages models when prompt caching is enabled (#9102). - Fixed the DeepSeek catalog to advertise
deepseek-flashfor DeepSeek V4.1 Flash instead of retired Flash aliases, and refreshed DeepSeek pricing metadata (#9423). - Fixed Mistral-hosted GLM-5.2 reasoning requests to use
reasoning_effortinstead of the ignoredprompt_mode(#9375). - Fixed OpenAI-compatible Responses errors to identify the actual provider instead of always labeling them as OpenAI errors (#9298).
- Fixed Baseten requests to send session-affinity headers from
sessionIdfor automatic prompt-cache routing (#9629). - Fixed retry classification for Cloudflare 520 responses (#9627).
- Fixed retry classification for transient Azure peak-load capacity errors (#9669).
Removed
- Removed GPT-5.4 and GPT-5.4 mini from the OpenAI Codex catalog after they became unavailable to ChatGPT accounts (#9394).
v0.85.1
Added
- Added GPT-6 Astra for OpenAI API keys and OpenAI Codex subscriptions.
Fixed
- Fixed long prompt-cache requests for GPT-5.6+ Responses models to use
prompt_cache_options.ttl: "30m"instead ofprompt_cache_retention: "24h".
v0.85.0
Breaking Changes
- Replaced
createGatewayBindingFetch()withcreateAiBindingFetch()for Cloudflare Workers AI bindings. Configure the model's Workers AI Gateway passthroughbaseUrldirectly; requests now pass through the binding unchanged (#8287 by @Maximo-Guk).
Added
- Added compact, persistable assistant-message frames with
AssistantMessageFrameEncoderandreduceAssistantMessageFrames(). - Added the
vllmPriorityOpenAI-compatible model setting for forwarding scheduler priority to vLLM (#9004 by @AppleDannyClegg). - Added the
supportsMaxOutputTokensOpenAI Responses compatibility setting (#8941 by @scturtle). - Added an optional timestamp argument to
uuidv7()for follower IDs. - Added narrow
api,providers, andutilssubpath exports for direct imports without loading the package barrel. - Added Anthropic per-turn effort persistence, deterministic historical effort markers, and signed-thinking mismatch recovery for supported Claude models across Anthropic Messages transports, including OpenRouter.
- Added Meta provider (Model API key and Muse subscription OAuth) with Muse Spark models.
Fixed
- Removed the unavailable Grok Build 0.1 model from the built-in xAI catalog (#9093 by @Jaaneek).
- Fixed assistant-message frames preserving the provider thinking level.
- Fixed simple provider streams to consistently emit standard stream events and custom tool-call deltas.
- Fixed the Qwen Token Plan Individual catalog to include Qwen3.8 Flash (#9021).
- Fixed Baseten GLM-5.2 models incorrectly advertising image input support (#8293 by @Panoplos).
- Fixed Fireworks GLM models using the wrong API adapter.
- Removed the unnecessary Chord dependency from pi-ai by defining its exported
JsonValuetype directly. - Fixed GitHub Copilot Claude Fable 5 requests to use the Anthropic Messages adapter so selected reasoning levels are sent (#8961).
- Fixed OpenAI Codex SSE parsing to process terminal events that are not followed by a blank line (#9047).
- Fixed
NO_PROXYmatching for both root domains and subdomains (#8737 by @MeiSiristhebest).
v0.84.4
Added
- Added the experimental vision-capable
deepseek-v4-flash-vision-expmodel to the DeepSeek catalog.
Fixed
- Fixed OpenAI-compatible Chat Completions ignoring an explicitly requested
toolChoicewhen no tools are defined. - Fixed thinking signature serialization to run once after the signature is complete (#8671).
- Fixed fragmented Mistral tool calls splitting when continuation chunks omit the tool-call ID (#8387).
- Fixed OpenAI-compatible reasoning replay to merge consecutive streamed text and summary
reasoning_detailsdeltas. - Fixed the Cloudflare AI Gateway catalog to include supported
workers-ai/*passthrough models omitted by models.dev. - Fixed OpenRouter reasoning controls by deriving
offsupport and available effort levels from OpenRouter's model metadata, preventing reasoning-mandatory models from receivingeffort: "none"(#8614 by @davidbrai).
v0.84.3
Breaking Changes
- Renamed
GoogleThinkingLeveltoGoogleApiThinkingLeveland addedResolvedGoogleThinkingLevelfor normalized adapter levels.
Added
- Added provider-neutral
toolChoicesupport to simple stream requests. - Added automatic Anthropic server-side refusal fallback for supported first-party models, including returned-model usage pricing (#8017).
- Added configurable OpenAI-compatible thinking-token budget fields for vLLM, Qwen/SGLang, and llama.cpp servers (#8275 by @bnsd55).
- Added China-specific ZAI Coding Plan models, including GLM-4.6V vision support, and API-equivalent usage cost estimates for models with published PAYG prices (#8220).
- Added
deepseek-v4-pro-0813to the Qwen Token Plan Individual catalog (#8194).
Changed
- Changed built-in xAI models to use the Responses API with encrypted reasoning replay and made Grok 4.6 the default xAI model (#8124 by @Jaaneek).
- Changed the Anthropic, Azure OpenAI, Google Generative AI, Google Vertex, Mistral, OpenAI Chat Completions, and OpenAI Responses adapters to send Pi's default
User-Agentunless overridden (#8305).
Fixed
- Fixed OpenAI-compatible Chat Completions reasoning replay to preserve and resend assistant-level
reasoning_details(reasoning.text,reasoning.summary, andreasoning.encrypted) verbatim and in order (#7994). - Fixed Anthropic server-side fallback responses being priced with the requested model instead of the returned fallback model (#8285).
- Fixed GitHub Copilot login triggering model-policy rate limits by limiting policy updates, retrying model discovery once, and honoring server retry delays (#7850).
- Fixed Amazon Bedrock dropping and failing to replay opaque redacted reasoning from non-Anthropic models (#8314 by @seiji).
- Fixed Z.AI Coding Plan models deriving incomplete reasoning-effort metadata, including missing GLM-5.3 low, high, and max levels (#8336).
- Fixed DeepSeek V4 Flash on OpenCode and OpenCode Go omitting its supported low thinking level (#8181 by @tianshuang).
- Fixed Azure OpenAI Responses ignoring
toolChoicein provider-specific stream requests. - Fixed Amazon Bedrock
after_provider_response/onResponseto forward the raw response headers instead of only the synthesized request id header (#8234). - Fixed Kimi OpenAI-compatible usage reporting so top-level
cached_tokenscount as cache reads instead of normal input tokens (#8075). - Fixed Google Generative AI and Vertex AI custom models ignoring
thinkingLevelMap, which dropped extended thinking controls (#8135). - Fixed Xiaomi model catalog generation retaining shut-down MiMo V2 model names after models.dev marked them deprecated (#8187).
- Fixed OpenRouter reasoning controls by deriving
offsupport and available effort levels from OpenRouter's model metadata, preventing reasoning-mandatory models from receivingeffort: "none"(#8454).
v0.84.2
Added
- Added
createGatewayBindingFetch()for routing Cloudflare AI Gateway requests through a Workers AI binding without an API token (#7901 by @Maximo-Guk). - Added
AssistantMessage.endTurnto preserve OpenAI Codex's terminalend_turnsignal for diagnostics (#7766).
Changed
- Changed Kimi Coding requests to use pi's runtime
User-Agentheader. - Automatically converted supported strict tool schemas to provider-compatible closed objects with required nullable optional fields while preserving original tool definitions, and treated
nullvalues for optional non-nullable tool arguments as omitted. - Changed OpenAI Responses deferred tool loading to prefer message-anchored
additional_toolswhere supported while retaining tool-search and top-level fallbacks (#7709). - Replaced the Mistral SDK transport with a native Chat Completions HTTP stream, eliminating its generated client and schema runtime overhead.
Fixed
- Fixed GitHub Copilot login triggering API rate limits while enabling model policies by limiting concurrent policy updates (#6187).
- Fixed GitHub Copilot login still triggering API rate limits by updating only account models with unconfigured policies and honoring server retry delays (#7850).
- Fixed upstream request buffer limit failures to trigger automatic assistant retries.
- Fixed OpenAI Responses function and custom tool calls to preserve namespaces during streaming, proxying, and replay (#7709).
- Fixed built-in and custom DeepSeek API models to send output limits through the supported
max_tokensfield. - Fixed Google Generative AI and Vertex AI responses with tool calls incorrectly treating output-limit or provider-error stops as normal tool use (#8059).
- Fixed Amazon Bedrock replay rejecting tool arguments that contain empty object keys while preserving all valid nested values (#7882 by @muyiyr).
- Fixed DeepSeek compatibility detection for base URLs whose hostname contains uppercase letters (#7933 by @yearth).
v0.84.1
Added
- Added Qwen Token Plan Individual as a built-in provider with its documented subscription model catalog and the shared international
QWEN_TOKEN_PLAN_API_KEY(#7659 by @arasovic).
v0.84.0
Breaking Changes
-
Renamed the exported
ModelsStreamTransformsinterface toModelsRequestTransformsbecause its header transformation now applies to all authenticated provider requests. -
Required dynamic model providers to accept a concrete
RefreshModelsContext.signal;Models.refresh()remains unbounded when callers omit its optional signal. -
Required provider login, API-key check/resolution, and OAuth refresh implementations to accept a concrete abort signal; public auth and credential operations remain unbounded when callers omit their optional signal.
-
Replaced raw
RefreshModelsContext.storeaccess with the read-onlycontext.storedsnapshot and generation-checkedcontext.publish()transaction.createProvider({ fetchModels }): no catalog-publication migration is required. Before and after, return the fetched list;createProvider()restores stored models and publishes and persists refreshed models itself.signalis now guaranteed to be present.// Before const beforeProvider = createProvider({ // ... fetchModels: async ({ signal }) => { const response = await fetch(catalogUrl, { signal }); return parseModels(await response.json()); }, }); // After: unchanged const afterProvider = createProvider({ // ... fetchModels: async ({ signal }) => { const response = await fetch(catalogUrl, { signal }); return parseModels(await response.json()); }, });
Handwritten
Provider.refreshModels(): replace direct store access and pre-publication mutation with generation-guarded publications.// Before refreshModels: async (context) => { const stored = await context.store.read(); if (stored) currentModels = stored.models; if (!context.allowNetwork) return; const refreshed = await fetchModels(context.signal); currentModels = refreshed; await context.store.write({ models: refreshed, checkedAt: Date.now() }); }, // After refreshModels: async (context) => { if (context.stored) { const restored = context.stored.models; if (!(await context.publish({ update: () => { currentModels = restored; }, }))) return; } if (!context.allowNetwork) return; const refreshed = await fetchModels(context.signal); if (context.signal.aborted) return; await context.publish({ persist: { models: refreshed, checkedAt: Date.now() }, update: () => { currentModels = refreshed; }, }); },
In
publish(), omitpersistto leave storage unchanged, pass aModelsStoreEntryto write it, or passpersist: nullto delete it. Omitupdatefor metadata-only persistence; omitpersistfor an ephemeral in-memory publication.
Added
- Added optional
OAuthAuth.isSubscriptionmetadata for distinguishing subscription-backed authentication from generic OAuth sign-in. - Added explicit
TelemetryContextpropagation across stream, deferred, and image request options using the vendor-neutral@earendil-works/pi-telemetrycontract. - Added deferred provider request contracts, durable response handles, authenticated fetch/cancel dispatch, and faux-provider support for pending, ready, failed, and cancelled responses (#7339 by @davidbrai).
- Added Baseten as a built-in OpenAI-compatible provider with models.dev catalog generation and native
chat_template_argsreasoning controls. - Added arbitrary OpenAI-compatible sampling parameters through
Model.samplingParamsandStreamOptions.samplingParams, including per-request overrides (#7568 by @mrexodia). - Added opt-in vLLM
thinking_token_budgetsupport for OpenAI-compatible models, reserving output tokens for the final answer (#7638 by @bnsd55). - Added
OpenAICompletionsCompat.supportsFinishReasonfor providers that omit streamedfinish_reasonvalues, inferring normal and tool-use stops when the stream ends. - Added structured Amazon Bedrock failure diagnostics with HTTP status, modeled error code, and AWS request id when available (#7286 by @brianstanley).
Changed
- Added optional cancellation to
ModelsStorereads, writes, and deletions; catalog orchestration binds these waits to the provider refresh signal.
Fixed
- Fixed GitHub Copilot Grok 4.5 requests to use the supported Responses API (#7560).
- Bounded OAuth token refreshes so stalled requests release the credential-store lock (#7508).
- Fixed tool argument validation to preserve values that already match an
anyOf/oneOfunion arm before attempting coercion, avoiding nullable unions convertingnullto another primitive value (#7328). - Fixed cancellation of model catalog refreshes so callers stop waiting even when a custom provider ignores its abort signal (#7027).
- Fixed auth resolution, availability checks, OAuth refreshes, provider login, and in-memory credential queue waits to honor caller cancellation.
- Fixed newer provider refreshes being blocked by or overwritten by an older stalled generation, including persisted catalog publication.
- Updated GPT-5.6 Terra and Luna pricing across OpenAI and passthrough model catalogs.
- Fixed Fireworks Kimi K3 models to use the OpenAI-compatible API with native reasoning-effort levels and deferred tools (#7199, #7230 by @XBeg9).
- Fixed Fireworks GLM 5.2 models sending the unsupported
prompt_cache_retentionfield when long cache retention is enabled, and enabled session affinity for automatic prompt caching (#7676). - Updated Groq's Qwen reasoning override for the replacement
qwen/qwen3.6-27bmodel. - Fixed the OpenCode Go provider display name.
- Fixed provider error normalization treating arrays and class instances as structured response bodies instead of preserving their original errors (#7205 by @erikogenvik).
- Fixed Anthropic streams dropping text or thinking included in the initial content-block event (#7358 by @davidbrai).
- Fixed Google history conversion dropping signed empty text and thinking blocks required for replay (#7362 by @jingtao-wisdomgraph).
- Fixed OpenAI Codex cached WebSocket sessions being shared across different account credentials (#7364).
- Fixed transient Google Generative AI and Vertex AI provider errors bypassing automatic retries (#7471 by @vish-pr).
- Fixed Gemini 3 tool call ids being discarded during history conversion, breaking signed multi-turn replay (#7494 by @muyiyr).
- Fixed OpenAI Responses incomplete reasons so only
max_output_tokensis treated as a length stop, and exposed bounded recovery detection for responses truncated below their intended output limit (#7540 by @davidbrai). - Restored GitHub Copilot models returned through account-specific policy responses (#7672 by @muyiyr).
- Replaced the retired Qwen Token Plan
qwen3.8-max-previewmodel withqwen3.8-max(#7670 by @QuintinShaw).
withastro/flue (@flue/runtime)
v2.2.2
Patch Changes
2cb57be: Fix Claude models on thecloudflare-ai-gatewayprovider failing with404 not_found_error: model: claude-sonnet-4.6 was not found. Since Pi 0.84.3 the gateway catalog lists Claude models with dotted versions (claude-sonnet-4.6), but the gateway's native Anthropic endpoint forwards the model ID to Anthropic, which only accepts dashed IDs. Flue now registers these models under Anthropic's IDs (cloudflare-ai-gateway/claude-sonnet-4-6); dotted specifiers still resolve to them. Thecloudflarebinding provider, which uses Cloudflare's dotted catalog names, is unchanged.
v2.2.1
Patch Changes
548937e: Fix model specifiers that stopped resolving after the Pi 0.87.1 up
❗ Important
✂ PR body was truncated to here.
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| vite (source) | ^8.3.0 → ^8.3.2 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| package-manager-detector | ^1.8.0 → ^1.9.0 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Changes
- Fixes
astro addwiping existingallowBuildsapprovals inpnpm-workspace.yamlon pnpm v11.0–v11.22 when an integration needs a build script approved (currentlyworkerdfor Cloudflare), a regression from #18287. On those versions--allow-buildreplaces the whole map, so later installs fail withERR_PNPM_IGNORED_BUILDSfor previously approved packages. - The packages are now merged into the existing map before installing now
Testing
- Updated
test/units/cli/add-pnpm.test.ts
Docs
- N/A, bug fix

This PR contains the following updates:
Release Notes
NaturalIntelligence/fast-xml-parser (fast-xml-parser)
v5.11.2
What's Changed
- fix: decode Uint8Array XML input as UTF-8 by @emme1t in #875
- fix: type EntityDecoderOptions.setXmlVersion's version as a number by @YevheniiKotyrlo in #880
New Contributors
- @emme1t made their first contribution in #875
- @YevheniiKotyrlo made their first contribution in #880
Full Changelog: NaturalIntelligence/fast-xml-parser@v5.11.1...v5.11.2
v5.11.1
What's Changed
- Bump actions/checkout from 7.0.0 to 7.0.1 by @dependabot[bot] in #858
- Bump zizmorcore/zizmor-action from 0.5.7 to 0.6.1 by @dependabot[bot] in #856
- Bump actions/setup-node from 6.4.0 to 7.0.0 by @dependabot[bot] in #854
- docs: fix two 404 documentation links by @rajanpanth in #862
New Contributors
- @rajanpanth made their first contribution in #862
Full Changelog: NaturalIntelligence/fast-xml-parser@v5.11.0...v5.11.1
v5.11.0
What's Changed
- add support for endIndex in node metadata (5.x edition) by @Wain-PC in #850
- fix: don't crash on a closing tag with no matching opening tag by @hdimer in #861
New Contributors
Full Changelog: NaturalIntelligence/fast-xml-parser@v5.10.1...v5.11.0
v5.10.1
Full Changelog: NaturalIntelligence/fast-xml-parser@v5.10.0...v5.10.1
v5.10.0
What's Changed
- Bump actions/checkout from 6.0.3 to 7.0.0 by @dependabot[bot] in #849
- Bump zizmorcore/zizmor-action from 0.5.6 to 0.5.7 by @dependabot[bot] in #848
Full Changelog: NaturalIntelligence/fast-xml-parser@v5.9.3...v5.10.0
v5.9.3
What's Changed
- Harden GitHub Actions workflows by @martincostello in #841
- GitHub Actions workflow fixes by @martincostello in #844
New Contributors
- @martincostello made their first contribution in #841
Full Changelog: NaturalIntelligence/fast-xml-parser@v5.9.2...v5.9.3
v5.9.2
Full Changelog: NaturalIntelligence/fast-xml-parser@v5.9.1...v5.9.2
v5.9.1
Full Changelog: NaturalIntelligence/fast-xml-parser@v5.9.0...v5.9.1
v5.9.0: update strnum, use is-unsafe
- update strnum to 2.3.0
- you can set hex, binary, enotation, infinity, unicode
- validate unsafe HTML or XML data in doctype entities unsing 'is-unsafe' library. User can override rules by overriding EntityDecoder.
antfu-collective/package-manager-detector (package-manager-detector)
v1.9.0
🚀 Features
- Add
ignoreWorkspaceRootCheckoption for pnpm/yarn v1 - by @danielroe in #83 (8bb98) - Why command - by @himynameisdave and @antfu in #79 (d52fb)
- Add support for upm package manager - by @iiio2, Claude Opus 5.5 and @antfu in #80 (bff26)
- Prefix bare package names with npm: for deno add - by @antfubot in #84 (55b09)
- Expose agent construction logic - by @josh-hemphill and @antfubot in #65 (03a5e)
- Add
minimumReleaseAgeoption toresolveCommand- by @antfubot in #85 (3106c)
View changes on GitHub
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| vite (source) | ^8.3.0 → ^8.3.2 |
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @qwik.dev/partytown | ^0.14.4 → ^0.14.5 |
Release Notes
QwikDev/partytown (@qwik.dev/partytown)
v0.14.5
Patch Changes
-
🐞🩹 fall back right away when
navigator.serviceWorker.register()fulfills without a registration (e.g. Playwright'sserviceWorkers: 'block'), instead of throwingCannot read properties of undefined (reading 'active')(by @MFA-G in #764) -
🐞🩹 read scroll offsets from the main thread instead of caching them, so scripts such as GA4 observe scrolling after their initial read. (by @Niek in #766)
-
🐞🩹 define
HTMLCollectionin the web worker sox instanceof HTMLCollectionno longer throws (e.g. gtag's user-provided-data DOM scan) (by @gioboa in #762)
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @fastify/static | ^10.1.4 → ^10.1.5 |
Release Notes
fastify/fastify-static (@fastify/static)
v10.1.5
What's Changed
New Contributors
Full Changelog: fastify/fastify-static@v10.1.4...v10.1.5
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Changes
Astro.cachewasundefinedwhen the 404 or 500 page was rendered throughrenderDefaultError(production) orrenderDevError(dev), because those handlers created a newFetchStatewithout callingprovideCache(). AnyAstro.cache.set()in an error page or its shared layout would throw mid-stream, discarding the rendered body and returningInternal server errorinstead.- Both error handlers now call
await provideCache(errorState), the same way the normal rendering pipeline does. With no cache provider configured, the disabled no-op shim is used. Error pages still do not go throughhandleCache, socache.set()there sets no CDN headers.
Testing
- Added
packages/astro/test/units/cache/app-cache.test.tscovering the case whereAstro.cacheis present and non-undefined when a 404 is rendered via the error handler path (method-mismatch on an API route).
Docs
- No docs update needed; this restores behavior that was already guaranteed by the non-optional
cache: CacheLiketype signature.
Closes #18275

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
astro@7.3.8
Patch Changes
-
#18293
28e7410Thanks @astro-factory! - FixesAstro.cachebeingundefinedwhen a custom 404 or 500 page is rendered by the error handler, for example after a request to an API route with an HTTP method the route doesn't export -
#18298
0e9e857Thanks @matthewp! - Fixesastro addremoving existingallowBuildsapprovals frompnpm-workspace.yamlwith pnpm v11.0–v11.22 -
#18263
882dd98Thanks @florian-lefebvre! - Refactors internal bundling and code transforms to use Vite's Oxc-basedtransformWithOxcand Rolldown instead of esbuild. These packages no longer depend on esbuild directly. -
#18290
31f13c3Thanks @astro-factory! - Fixes theglob()loader not reloading changed files in dev when the pattern starts with an extglob such as!(drafts)/**/*.md
create-astro@5.2.6
Patch Changes
- #18263
882dd98Thanks @florian-lefebvre! - Removes the automaticallowScriptsandallowBuildspre-approval from generated projects. Astro's dependencies no longer run install scripts, so the workaround is no longer needed.
@astrojs/markdoc@2.0.11
Patch Changes
- #18263
882dd98Thanks @florian-lefebvre! - Refactors internal bundling and code transforms to use Vite's Oxc-basedtransformWithOxcand Rolldown instead of esbuild. These packages no longer depend on esbuild directly.
@astrojs/netlify@8.2.9
Patch Changes
- #18263
882dd98Thanks @florian-lefebvre! - Refactors internal bundling and code transforms to use Vite's Oxc-basedtransformWithOxcand Rolldown instead of esbuild. These packages no longer depend on esbuild directly. - Updated dependencies []:
- @astrojs/underscore-redirects@1.0.4
@astrojs/vercel@11.0.13
Patch Changes
- #18263
882dd98Thanks @florian-lefebvre! - Refactors internal bundling and code transforms to use Vite's Oxc-basedtransformWithOxcand Rolldown instead of esbuild. These packages no longer depend on esbuild directly.
astro-vscode@2.17.2
Patch Changes
- #18263
882dd98Thanks @florian-lefebvre! - Refactors internal bundling and code transforms to use Vite's Oxc-basedtransformWithOxcand Rolldown instead of esbuild. These packages no longer depend on esbuild directly.

Changes
- Workers Cache reports a refused purge, including one over the rate limit, as
success: falsein the result ofcache.purge()(docs). The provider dropped that result, socache.invalidate()resolved and the pages stayed cached with nothing logged. Workers Cache purges always use the Free-tier limit of 5 per minute per account, with a bucket of 25 (limits), which a site that purges on every content save can reach. - The provider throws when
successisfalse, with Cloudflare'serrorsas the error'scause, asinvalidate()already does on Netlify when its purge request fails. Successful purges are unchanged. Callers that awaitinvalidate()after a write start seeing rejections; EmDash is guarding its calls in emdash-cms/emdash#3987.
Testing
- New
test/units/cache-purge.test.tscovers the purge step with a stand-incacheobject, sincecloudflare:workersdoes not load in Node: an accepted purge passes the tags through and resolves, a refused one rejects with the returned errors ascause.
Docs
- None needed: the route caching guide does not describe what
invalidate()does when a purge fails, for any provider.

Changes
- The dev-server watcher filter in the glob loader no longer misclassifies extglob patterns like
!(hidden|_docs)/**/*.{md,mdx}as exclusions. Previously, any pattern starting with!was treated as a negation, leavingpositivePatternsempty and causing allchange,add, andunlinkevents to be silently ignored. The fix mirrors tinyglobby's own rule: a pattern is an exclusion only when it starts with!and the next character is not(. This restores live-reload for these patterns without affecting plain negations like!drafts/**. - First load was unaffected because tinyglobby already applied this distinction; only the watcher path was wrong.
Testing
- New unit test added in
packages/astro/test/units/content-layer/glob-loader.test.tscovering a glob collection configured with an extglob exclusion pattern; the test verifies that file-change events are forwarded to the loader. The test fails without the fix and passes with it.
Docs
- No docs update needed — this is a bug fix restoring already-documented behaviour; the glob loader API itself is unchanged.
Closes #18289

Changes
astro add cloudflarenow succeeds on the first run when using pnpm v11 or newer. pnpm v11+ enablesstrictDepBuildsby default, which causespnpm addto exit withERR_PNPM_IGNORED_BUILDSwhen a transitive dependency (workerd, via wrangler/miniflare) has an unapproved build script. The install was silently counted as failed andastro.config.*was never updated.- When pnpm v11+ is detected,
astro addnow appends--allow-build=workerdto the generatedpnpm addcommand for the Cloudflare adapter. pnpm then writesworkerd: trueintoallowBuildsinpnpm-workspace.yamlautomatically. The install-failure log also now includes stderr so the real error is visible on the first failed run.
Testing
- Added
packages/astro/test/units/cli/add-pnpm.test.tscovering the--allow-build=workerdflag injection for the Cloudflare adapter under pnpm v11+, and confirming that older pnpm versions and other adapters are unaffected.
Docs
- No docs update needed; this is a CLI behavior fix with no user-facing API change.
Closes #18286
Description
While reviewing and doing some tests for #4218, I noticed some Failed to resolve dependency warnings being logged when running the development server in projects using the Cloudflare adapter.
These dependencies were actually never dependencies of Expressive Code but of Starlight itself and were removed in #4134. This now causes the warning. I guess these directives were working previously due to pnpm hoisting behavior and Vite does not care about the exact path but if it can resolve the dependency or not.
To test, I ran:
cd packages/starlightpnpm build && pnpm pack --out /tmp/sl-cloudflare-test.tgz
In a new directory, I then ran the following commands:
pnpm create astro@latest . -- --template starlight --install --no-gitpnpm astro add cloudflarepnpm add /tmp/sl-cloudflare-test.tgzpnpm dev
Here is a comparison before and after the changes:
| Before | After |
|---|---|
![]() |
![]() |

Changes
- Restores the Deno 2.9.5 pin for the integrations test suite. Renovate bumped
deno-versionto 2.9.6 in #18279, and Deno 2.9.6 dropped--allow-scriptsfromdeno eval, which@netlify/edge-functions-devpasses to boot its dev server. - Ignores the
denodependency in.github/renovate.json5so Renovate stops updating thedeno-versioninput ofdenoland/setup-deno. - Made with AI
Testing
- N/A
Docs
- N/A

This PR contains the following updates:
Release Notes
shikijs/shiki (@shikijs/rehype)
v4.5.0
🚀 Features
- Emit an explicit color level from codeToANSI - by @EvanProgramming in #1320 (b968e)
- transformers:
- Add classActiveCode option to transformerNotationWordHighlight - by @curiouscoder-cmd in #1201 (1e968)
- Add transformerRenderLineNumber - by @Divyapahuja31 and DIVYA PAHUJA in #1238 (02f05)
🐞 Bug Fixes
- cli:
- Fall back to 'text' when file/URL has no extension and no -… - by @VeerShah41 in #1248 (c00e5)
- Fall back to plaintext for unknown languages - by @Jinjiang and @antfubot in #1319 (4eb7c)
- primitive:
- Dispose wasm memory for lazily embedded langs - by @rgodha24 in #1322 (b5423)
- Dedupe grammar injections on repeated language loads - by @antlio and @antfubot in #1318 (33678)
- stream:
- Compile Solid renderer with babel-preset-solid - by @BetterAndBetterII and @antfu in #1309 (8724e)
- transformers:
- Keep notations on content comment lines - by @tianrking in #1308 (d25ab)
- Handle split
#and--comments in rose-pine theme - by @anandghegde in #1317 (63e6d)
- twoslash:
- Avoid crash when @errors nodes land past EOF - by @Yahiro025, @cursoragent and @antfubot in #1316 (5c919)
🏎 Performance
- engine-js: Reuse each regex's last search while tokenizing a line - by @issacgerges and @antfu in #1314 (2ef5e)
- stream: Group tokens by line in the React renderer - by @CNSeniorious000 in #1311 (81200)
- vitepress-twoslash: Replace lz-string with lz-string-es - by @antfubot in #1324 (2e170)
View changes on GitHub
v4.4.3
🚀 Features
🐞 Bug Fixes
- vitepress-twoslash: Delay twoslash tooltip show by 200ms - by @antfubot in #1306 (9f2aa)
View changes on GitHub
v4.4.2
🐞 Bug Fixes
- Unbreak CI after vite 8 bump and grammar/deps updates - by @antfubot in #1300 (c5d31)
🏎 Performance
View changes on GitHub
v4.4.1
🚀 Features
View changes on GitHub
v4.4.0
🚀 Features
🐞 Bug Fixes
- core: Guess yaml from frontmatter segments - by @antfubot in #1299 (1b8b6)
View changes on GitHub
v4.3.1
🚀 Features
View changes on GitHub
v4.3.0
🚀 Features
- stream: Add svelte renderer - by @CNSeniorious000 and Anthony Fu (via agent) in #1291 (2d18a)
View changes on GitHub
v4.2.0
🚀 Features
- Add @shikijs/stream and @shikijs/magic-move packages - by @antfu in #1283 (d031f)
🐞 Bug Fixes
- transformers: Handle YAML comment prefixes correctly for v3 - by @AkaHarshit in #1266 (f694a)
- vitepress-twoslash: Scroll blocking on mobile viewports - by @micaiguai in #1262 (9e0e8)
View changes on GitHub
v4.1.0
🐞 Bug Fixes
- twoslash: Forward
tsModuletocreateTwoslasher- by @arthurfiorette in #1271 (be89a)
View changes on GitHub
rehype-pretty/rehype-pretty-code (rehype-pretty-code)
v0.14.5
Patch Changes
- fix: detect
showLineNumberswherever it appears in the meta string, not only before the highlight annotations, while ignoring the word when it is part of a character highlight such as/foo showLineNumbers bar/(#204) - fix: stop character-highlight ranges leaking across patterns, so an id-only annotation like
/foo/#ano longer makes a later pattern inherit the previous pattern's range, and a range-ignored occurrence no longer consumes the whole token it lives in (#169)
Range-excluded occurrences are counted without changing the token tree, so unhighlighted markup remains intact.
Partial highlights contained within a transformer-generated element preserve that surrounding semantic element instead of cloning it.
v0.14.4
Patch Changes
- fix: prevent an infinite loop in inline character highlighting when a pattern matches text that spans multiple syntax tokens and occurs more than once on the same line (#185)
silvenon/remark-smartypants (remark-smartypants)
v3.0.3
- Fix quote direction at the start of headings and table cells by @geraschenko in #103
bruits/satteri (satteri)
v0.10.5
Patch changes
- Updated dependencies: satteri-mdxjs (Cargo)@0.3.13
v0.10.4
Patch changes
- Updated dependencies: satteri-mdxjs (Cargo)@0.3.13
mozilla/source-map (source-map)
v0.8.0
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Type | Update | Change | Age | Confidence |
|---|---|---|---|---|---|
| CodSpeedHQ/action | action | minor | v5.2.1 → v5.4.0 |
||
| changesets/action | action | patch | v2.1.1 → v2.1.2 |
||
| deno (source) | uses-with | patch | v2.9.5 → 2.9.6 |
||
| node | uses-with | minor | 24.15.0 → 24.21.0 |
||
| node | uses-with | minor | 24.18.0 → 24.21.0 |
||
| pnpm/action-setup | action | minor | v6.0.8 → v6.1.0 |
||
| zizmorcore/zizmor-action | action | minor | v0.5.6 → v0.6.4 |
Release Notes
CodSpeedHQ/action (CodSpeedHQ/action)
v5.4.0
Bumps the CodSpeed runner to v5.4.0, including v5.3.0 and v5.3.1.
The Memory instrument now tracks physical (resident) memory and captures allocation call stacks to build memory flamegraphs. Both are enabled by default and can be turned off with the new disable-memory-track-physical and disable-memory-capture-stack inputs. Serialization is also faster on large memory benchmarks.
The action now exposes the id of the CodSpeed run as a run-id output, and CodSpeed now works on non-Ubuntu/Debian distributions such as Arch Linux.
🚀 Features
- Track physical memory and capture allocation call stacks for memory flamegraphs, both enabled by default by @not-matthias in #529, #522 and #553
- Expose the run id as a GitHub Actions step output by @moha-bekh in #551
- Add an
--experimental-disable-pythonmalloc-overrideflag (CODSPEED_EXPERIMENTAL_DISABLE_PYTHONMALLOC_OVERRIDE) to stop overriding the Python allocator, which can break free-threaded Python in simulation mode, by @not-matthias in #539 - Apply kernel memory tunables before memory-mode runs, and fail early when the kernel has no BTF by @not-matthias in #507 and #524
- Pause producers under ring buffer pressure in memory mode, and log process stops per reason by @not-matthias in #543
- Log which authentication method the run uses by @fargito in #521
🐛 Bug Fixes
- Support distributions CodSpeed publishes no valgrind package for (Arch, rolling releases) by @moha-bekh in #525
- Error out when the profile archive exceeds the upload size limit by @lvaroqui in #557
- Detect free-threaded Python from venv and uv before setting
PYTHONMALLOCby @not-matthias in #539 - Honor deprecated experimental flags, including their falsey values, instead of ignoring them by @not-matthias in #532 and #553
- Fix memory tracking edge cases: reused pids, stack-ring overflow, BPF links held by forked processes, and allocator symbols aliased at an attached offset by @not-matthias in #522 and #543
- Attach memory tracking hooks without
perf_event_openby @GuillaumeLagrange in #536 - Restore profiling sysctls in walltime mode by @not-matthias in #507
⚡ Performance
- Speed up memory serialization and reduce the tracker's memory usage on large memory benchmarks by @not-matthias in #522, #537, #548, #558 and #560
⚙️ Internals
- Pin memtrack to 1.6.0, through 1.5.0 and 1.5.1, by @adriencaccia in #530, #541 and #561
- Keep mmap/munmap/brk as deprecated memtrack artifact variants by @GuillaumeLagrange in #538
Full Runner Changelog:
https://github.com/CodSpeedHQ/codspeed/blob/main/CHANGELOG.md
What's Changed
- chore: bump runner version to 5.3.0 by @github-actions[bot] in #239
- feat: add memory-track-physical experimental input by @not-matthias in #238
- chore: bump runner version to 5.3.1 by @github-actions[bot] in #240
- feat: add a run-id output by @moha-bekh in #243
- chore: bump runner version to 5.4.0 by @github-actions[bot] in #244
- feat: add disable-memory-capture-stack and disable-memory-track-physical inputs by @not-matthias in #242
New Contributors
- @moha-bekh made their first contribution in #243
Full Changelog: CodSpeedHQ/action@v5.2.1...v5.4.0
changesets/action (changesets/action)
v2.1.2
Patch Changes
denoland/deno (deno)
v2.9.6
- feat(compressible): add support for 'text/x-component' content type (#36450)
- feat(desktop): clipboard api (#35750)
- feat(desktop): support checked, icon, and tooltip on menu items (#36649)
- fix(bundle): isolate esbuild downloads from workspace registries (#36467)
- fix(cache): combine duplicate headers for Vary matching (#36476)
- fix(cli_parser): remove orphaned sync-types parser
- fix(core): cap adaptive buffer initial allocations (#36432)
- fix(core): make Unix pipe fd ownership explicit (#36353)
- fix(core): make user timer waker state thread-safe (#36495)
- fix(coverage): compare a range against a line in V8's units (#36613)
- fix(crypto): preserve RSA-OAEP label bytes (#36441)
- fix(desktop): keep dots in the app name when resolving the runtime library
(#36006) - fix(desktop): keep the macOS bundle signature valid unless an update is
applied (#36574) - fix(desktop): never block the JS thread on the error-report dialog (#36575)
- fix(desktop): propagate deno.json version and license into packaged installers
(#36577) - fix(desktop): run Vite-based HMR dev servers inside the desktop runtime
(#36488) - fix(desktop): transport binding args and results as DesktopValue so Uint8Array
survives (#36573) - fix(ext/fetch): enforce permissions for proxy transports (#36217)
- fix(ext/fetch): only retry transport errors on pooled connections (#36415)
- fix(ext/fetch): raise default HTTP/2 SETTINGS_MAX_HEADER_LIST_SIZE to 256KB
(#36558) - fix(ext/http): keep request body readable after response is sent (#36629)
- fix(ext/http): route invalid async responses to onError (#36437)
- fix(ext/napi): don't invoke napi_wrap finalizer twice at teardown (#36556)
- fix(ext/napi): run JS-calling finalizers safely, NULL string result, and
Float16Array (#36572) - fix(ext/napi): surface OS error and path on addon load failure (#36630)
- fix(ext/napi): track pending finalizers by identity (#36551)
- fix(ext/napi): wake the event loop at the next uv_timer deadline (#36559)
- fix(ext/net): skip unsupported DNS records in ANY queries (#36650)
- fix(ext/node): accept string ports in dns.lookupService (#36546)
- fix(ext/node): build the proxied request target with the URL parser (#36557)
- fix(ext/node): do not resume client TLS sessions unless requested (#36592)
- fix(ext/node): fix perf_hooks detail.req.url proxied path duplication (#36407)
- fix(ext/node): handle readv short reads (#36211)
- fix(ext/node): require sys permission for inspector.open (#36465)
- fix(ext/node_sqlite): invalidate sessions on database close (#36633)
- fix(ext/tls): avoid panic for mismatched client certificate and key (#36457)
- fix(ext/web): clean up abort handlers when listeners are removed (#36226)
- fix(ext/web): close transfer MessagePort when a transferred readable is
cancelled (#36270) - fix(ext/web): snapshot SharedArrayBuffer input in TextDecoder.decode()
(#36611) - fix(fetch): require an initial multipart boundary (#36470)
- fix(ffi): validate struct return buffers (#36373)
- fix(fmt): honor .editorconfig when formatting from stdin (#36267)
- fix(fs): require write permission for creating opens (#36497)
- fix(fs): use a private FsFile constructor token (#36439)
- fix(glob): retain valid gitignore rules after parse errors (#36478)
- fix(http): preserve keep-alive after reading request body (#36690)
- fix(http): truncate streaming responses to content length (#36496)
- fix(lsp): restrict registry completion endpoint schemes (#36477)
- fix(node): check reads during require resolution (#36461)
- fix(node): match domain uncaught exception handling (#36475)
- fix(node): preserve v8 deserializer view offsets (#36460)
- fix(node): validate Brotli encoder operations (#36530)
- fix(node): validate raw outgoing HTTP headers (#36471)
- fix(node/crypto): preserve binary key export passphrases (#36443)
- fix(node_crypto): apply RFC 7748 scalar decoding for X448 (#36466)
- fix(node_crypto): size cipher updates by byte length (#36459)
- fix(node_shim): preserve explicit argument delimiters (#36435)
- fix(npm): flatten single-resolution peers when building package ids (#36608)
- fix(npm): match peer fallbacks when checking peer resolution cache (#36607)
- fix(npm): remove arrayref dependency (#36653)
- fix(npm): resolve bare npm specifier when latest is too new for min dependency
age (#36619) - fix(npm): use cached abbreviated metadata under --cached-only (#36526)
- fix(npm): validate tar paths before extraction (#36468)
- fix(os): serialize process environment updates (#36074)
- fix(permissions): check resolved IP against import deny list (#36486)
- fix(process): reject NULs in Windows arguments (#36436)
- fix(process): validate whitespace-only loader environment values (#36431)
- fix(publish): authenticate the package existence check so private packages
work (#36656) - fix(publish): memoize publish order depth (#36215)
- fix(publish): reject invalid JSR package names (#36474)
- fix(repl): skip regex literals when validating input (#36375)
- fix(runtime): unregister dropped signal resources (#36213)
- fix(web): keep MessagePort resource identifiers private (#36440)
- fix: bugs in primordials related to
ObjectCreateand
ObjectDefineProperties(#36541) - fix: prevent threadpool starvation with concurrent file locks (#32789)
- perf(core): grow the op driver's future arena on demand (#36678)
- perf(core): uncontended-borrow fast path for AsyncRefCell (#36679)
- perf(core): use index-based
SafeArrayIteratorin primordials (#36543) - perf(core): zero-copy snapshot rehydration, drop bincode (#36680)
- perf(ext/web): apply the base64url op design to standard base64 (#36422)
- perf(ext/websocket): shrink the op_ws_create future (#36681)
actions/node-versions (node)
v24.21.0: 24.21.0
Node.js 24.21.0
v24.20.0: 24.20.0
Node.js 24.20.0
v24.19.0: 24.19.0
Node.js 24.19.0
v24.18.1: 24.18.1
Node.js 24.18.1
v24.18.0: 24.18.0
Node.js 24.18.0
v24.17.0: 24.17.0
Node.js 24.17.0
v24.16.0: 24.16.0
Node.js 24.16.0
pnpm/action-setup (pnpm/action-setup)
v6.1.0
What's Changed
Full Changelog: pnpm/action-setup@v6.0.10...v6.1.0
v6.0.10
What's Changed
- docs(README): point users to the successor pnpm/setup action by @BlackHole1 in #282
- refactor: introduce restore keys for cache by @SukkaW in #280
- ci: use pnpm 11 for
pr-checkby @jamietanna in #284 - fix: update pnpm to v11.19.0 by @jamietanna in #283
- docs: update README to include devEngines.packageManager by @nemchik in #273
New Contributors
- @jamietanna made their first contribution in #284
- @nemchik made their first contribution in #273
Full Changelog: pnpm/action-setup@v6...v6.0.10
v6.0.9
What's Changed
Full Changelog: pnpm/action-setup@v6...v6.0.9
zizmorcore/zizmor-action (zizmorcore/zizmor-action)
v0.6.4
zizmor 1.30.1 is now the default version.
Release notes: https://docs.zizmor.sh/release-notes/#1301
v0.6.3
zizmor 1.30.0 is now the default version.
Release notes: https://docs.zizmor.sh/release-notes/#1300
v0.6.2
zizmor 1.29.0 is now the default version.
v0.6.1
zizmor 1.28.0 is now the default version used by the action.
v0.6.0
zizmor 1.27.0 is now the default version used by the action.
What's Changed
- Fold Docker image pull output into a collapsed Actions log group by @woodruffw with @Copilot in #132
- Readme: document missing inputs by @staabm in #130
- ci: block version sync workflow on forks by @shaanmajid in #129
- Sync zizmor versions by @github-actions[bot] in #137
- Add
collectinput by @woodruffw in #139
New Contributors
- @woodruffw with @Copilot made their first contribution in #132
- @staabm made their first contribution in #130
- @shaanmajid made their first contribution in #129
Full Changelog: zizmorcore/zizmor-action@v0.5.7...v0.6.0
v0.5.7
1.26.1 is now available via the action
1.26.1 is now the default version of zizmor used by the action
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
Release Notes
sveltejs/vite-plugin-svelte (@sveltejs/vite-plugin-svelte)
v7.3.1
Patch Changes
- fix: inject the inspector into the client under Vite+ on pnpm, where the realpathed client module has no
vite/segment beforedist/(#1373)
v7.3.0
Minor Changes
- feat: pass environment to
dynamicCompileOptions(#1386)
Patch Changes
- fix: don't log inline config when encountering unexpected options (#1376)
v7.2.0
Minor Changes
- feat(inspector): add a context menu with current component stack (#1370)
v7.1.4
Patch Changes
- fix: enforce ltr styles for inspector (#1324)
v7.1.3
Patch Changes
- fix: ensure the inspector is injected into the client correctly for Vite+ projects (#1355)
testing-library/svelte-testing-library (@testing-library/svelte)
v5.4.2
@testing-library/svelte 5.4.2 (2026-06-23)
Bug Fixes
Dependencies
- @testing-library/svelte-core: upgraded to 1.1.3
v5.4.1
@testing-library/svelte 5.4.1 (2026-06-21)
Dependencies
- @testing-library/svelte-core: upgraded to 1.1.2
v5.4.0
@testing-library/svelte 5.4.0 (2026-06-20)
Features
Dependencies
- @testing-library/svelte-core: upgraded to 1.1.0
sveltejs/language-tools (svelte2tsx)
v0.7.61
Patch Changes
- fix: handle SvelteKit 3 changed imports for zero types feature (#3106)
v0.7.60
Patch Changes
- fix: remove type dependency on
magic-string(#3101)
v0.7.59
Patch Changes
- fix: throw a friendly error for TypeScript 7 stable (#3073)
v0.7.58
Patch Changes
- feat: zero-config
+error.svelteprops (#3076)
v0.7.57
Patch Changes
- fix: don't crash on array binding holes in destructured exports (e.g.
export let { d: [a, , c] } = obj) (#3058)
v0.7.56
Patch Changes
-
fix: properly handle props with the name
slotinside Svelte 5 snippets (#3030) -
fix: take into account component references when calculating snippet hoistabilty (#3032)
-
fix: use local name for marking bindable props used (#3017)
-
feat: support Svelte 5 declaration tags (#3033)
-
fix: drop declarations emitted outside declarationDir (#2965)
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Changes
- Raises the minimum supported Node.js version to 22.22.0 in all packages
- Pins the floor to the latest Node.js 22 release that StackBlitz supports, so 22.22 instead of 22.23
- Made with AI
Testing
- N/A
Docs
- Changeset

Changes
Clear out a few Vite things that were kept up between reloads.
Fixes #18178
Testing
Added tests
Docs
N/A

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
astro@7.3.7
Patch Changes
-
#18266
cba76ccThanks @astro-factory! - Fixes a build error when a Markdown content collection entry loaded withglob({ deferRender: true })has alayoutfrontmatter property.layoutis now ignored for content collection entries, as documented. -
#18287
38f6793Thanks @astro-factory! - Fixesastro add cloudflarefailing to install dependencies with pnpm v11+ by approving theworkerdbuild script, and shows the package manager's error output whenastro addfails to install dependencies -
#18222
fcf6ed6Thanks @mingjunlu! - Fixes an issue where AVIF images were served asimage/heifinstead ofimage/avifin the dev server. -
#18240
de4df06Thanks @astro-factory! - Fixes thecache()handler fromastro/honoandastro/fetchthrowing aTypeErrorwhen a cache provider is configured. It now registers the cache provider before rendering, soAstro.cacheis available to downstream handlers likepages(). -
#18268
547b572Thanks @astro-factory! - Fixessecurity.checkOriginrejecting cross-origin requests with non-form content types such asapplication/json. As documented, the check only applies to unsafe requests that have nocontent-typeheader or one ofapplication/x-www-form-urlencoded,multipart/form-data, ortext/plain.
@astrojs/netlify@8.2.8
Patch Changes
- #18180
6fb83daThanks @matthewp! - Fixes Netlify Image CDN patterns generated fromimage.remotePatternspathnames ending in/**so they only match paths below that directory, consistent with Astro's own pattern matching. Previously, a pattern like/public/**also matched sibling paths sharing the prefix, such as/public-assets/. - Updated dependencies []:
- @astrojs/underscore-redirects@1.0.4
@astrojs/language-server@2.17.2
Patch Changes
- #18110
ffdf774Thanks @Princesseuh! - Fix organize imports for Astro files whose frontmatter ends with imports.

Changes
Replaces the description for the sync command in astro help to match:
- the description of its help flag
- what we currently have in docs: the CLI reference (third code snippet) and the
syncdescription
Testing
N/A
Docs
This is docs. I added a changeset as this kinda fix docs.

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to next, this PR will be updated.
next is currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, run changeset pre exit on next.
Releases
@astrojs/cloudflare@15.0.0-beta.2
Patch Changes
-
#18450
2938cdbThanks @ematipico! - Updates the peer dependency ofastroto7.4.0. You no longer need to install7.4.0-betaanymore. -
#18450
2938cdbThanks @ematipico! - Updates@cloduflare/vite-pluginto2.0.0-beta.v.1. -
#18196
e6a2e90Thanks @swissky! - Fails the build with a migration hint when a project has awrangler.json,wrangler.jsonc, orwrangler.tomlfile but nocloudflare.config.ts. Previously the build succeeded and the Worker name, bindings, and entrypoint from the Wrangler file were silently ignored. Runnpx cf migrate --bundler viteto generatecloudflare.config.tsfrom your existing Wrangler configuration.

Changes
- Restores the documented
security.checkOrigincontract:isForbiddenCrossOriginRequestnow skips the CSRF check when the request carries a non-formContent-Type(e.g.application/json). This was accidentally broken in 7.3.6 by #15595, which ported Go'sCrossOriginProtectionand dropped thecontent-typecheck entirely — causing any cross-origin JSONPOST/PATCH/PUT/DELETEto receive a403, contrary to docs. - The new
Sec-Fetch-Site/Originlogic introduced in 7.3.6 is kept intact for requests with noContent-Typeor a form-like one (application/x-www-form-urlencoded,multipart/form-data,text/plain).FORM_CONTENT_TYPESandhasFormLikeHeader, which were left with no callers after #15595, are now used again.
Testing
- Extended
packages/astro/test/units/app/csrf.test.tswith cases coveringapplication/json,application/json; charset=utf-8, andApplication/JSON(case-insensitive) — all should pass through, matching 7.3.5 behavior. - Existing cases for form-like content types and missing
Content-Typeare unchanged, confirming no regression.
Docs
- No docs update needed; the existing
security.checkOriginJSDoc and configuration reference already describe the correct (form-only) scope that this fix restores.
Closes #18267

Changes
- Markdown files loaded through a content collection with
deferRender: trueno longer treatlayoutas a special frontmatter key. Previously, the?astroPropagatedAssetswrapper imported the bare.mdpath, causingastro:markdownto emit an unresolvableimport Layout from "<value>"— contradicting the documented behavior thatlayoutis ignored inside content collections. - The assets wrapper now requests
.mdfiles with a?astroMarkdownContentEntryquery flag.astro:markdownskipslayoutprocessing when that flag is present, leaving Markdown pages and direct.mdimports unaffected.
Testing
- Added
packages/astro/test/units/vite-plugin-markdown/layout.test.tscovering the case where a Markdown content entry with alayoutfrontmatter key anddeferRender: truebuilds without error.
Docs
- No docs update needed; the existing docs already state that
layoutis not a special property when using content collections.
Closes #18169

Changes
- When a Hono worker entry uses
cf()+pages()without going throughApp.render, an unmatched request returned an empty 404 with an internalX-Astro-Error: trueheader instead of serving the prerendered404.astro. This adds a newnotFound()middleware toastro/hono(and its underlying fetch handler inastro/fetch) that callsrenderErrorFromStatewithstatus: 404when no route matched, mirroring whatastro()(handleRequest) already does internally. astro()now delegates to the same shared helper, so the behavior is consistent across both usage styles. Users with a customcf()+pages()chain can addnotFound()between them to serve the prerendered 404 page.
Testing
- New unit tests in
packages/astro/test/units/fetch/index.test.tscover thenotFound()handler returning the prerendered 404 throughprerenderedErrorPageFetchand passing through when a route does match. - New unit tests in
packages/astro/test/units/hono/index.test.tscover the HononotFound()middleware under the same conditions.
Docs
Closes #18232

Changes
Replaces direct esbuild usage with Vite and Rolldown APIs and removes the esbuild dependency from the affected packages:
astrousestransformWithOxcfor env replacement and Rolldown for client directive bundling.@astrojs/netlify,@astrojs/vercel, and@astrojs/markdocbundle with Rolldown.astro-scriptsandastro-vscodebuild with Rolldown.create-astrono longer writesallowScriptsorallowBuilds, and the example projects drop their stale entries.
Made with AI
Testing
pnpm run build:cibuilds every package.- The
astrounit suite and the affected integration suites pass.
Docs
Changesets

Changes
- Paths not in the static route table (e.g.
/en/aboutrewritten by middleware to/about) no longer receive a forcedstatus: 404from Vercel's platform routing layer when the 404 page is server-rendered. Previously, the catch-all route in.vercel/output/config.jsonunconditionally includedstatus: 404regardless of destination, causing middleware-rewritten routes to return 404 even though the render function produced a valid 200 response. status: 404is now only set when the catch-all destination is the static/404.html(i.e.fourOhFourRoute.isPrerenderedis true). When the 404 page is server-rendered,statusis omitted so the function returns the real HTTP status — 200 for middleware-rewritten valid routes, 404 from404.astrofor genuinely missing pages.
Testing
- Adds a test case in
packages/integrations/vercel/test/server-rendered-error-pages.test.tscovering the catch-all route config emitted when the 404 page is server-rendered, asserting thatstatusis absent from the route entry.
Docs
- No docs update needed; this is a bug fix in generated Vercel routing config with no API surface change.
Closes #18134

Changes
- In dev mode, CSS from unrelated pages was leaking into a route's
<head>whenever the route (or anything it imported) reachedvirtual:astro:manifest→virtual:astro:pages. That virtual module dynamically imports every page in the app, so the CSS graph walk continued into every other page's import graph and attached all of their styles. - Adds page-boundary checks to
ensureModulesLoadedandcollectCSSWithOrderinvite-plugin-css/index.ts, skipping modules whose ID starts with\0virtual:astro:page:. This mirrors the build-modeisBuildCssBoundaryapproach introduced for the same bug class in #16116, now applied to the dev pipeline.
Testing
- No new automated test was added in this PR (sandbox infrastructure prevented fixture creation during triage). An integration test modelled on
i18n-css-leak.test.ts— which covers the build-mode counterpart — should follow.
Docs
- No docs update needed; this is a bug fix with no API or configuration changes.
Closes #18060

Changes
- Content collection edits are now picked up after a config-triggered dev server restart (
Configuration file updated. Restarting...). Previously,viteServer.restart()replaced Vite's file watcher but the globalContentLayerwas never re-initialized, leaving loaders subscribed to the closed watcher and ignoring all subsequent file changes. - After a successful in-place restart,
handleChangeRestartnow re-createsglobalContentLayerwith the new settings and the new Vite watcher, reuses the existing data store (exposed via a newstoregetter onContentLayer), and re-runswatchContentConfig()andsync(). This restores the behavior that existed before the in-place restart path was introduced in #16059.
Testing
- Added
packages/astro/test/content-layer-dev-restart.test.ts, an integration test that starts the dev server, triggers an in-place config restart, then edits a content entry and asserts the change is reflected — covering the exact regression path.
Docs
- No docs update needed; this is a bug fix restoring previously expected dev-server behavior with no API changes.
Closes #18216

Changes
- The
fontsource()provider now accepts font family names with a " Variable" suffix (e.g."Inter Variable"), matching the naming convention used on fontsource.org and in@fontsource-variable/*npm packages. Previously, specifyingname: "Inter Variable"produced warnings and loaded no font because the fontsource API uses"Inter"as the canonical family name with no "Variable" suffix. - When a lookup returns no data, the provider retries with the " Variable" suffix stripped. This is safe because none of the ~2100 families in the fontsource API include "Variable" in their name.
Testing
- Added a unit test in
packages/astro/test/units/assets/fonts/e2e.test.ts(resolves fontsource fonts with "Variable" suffix (#18143)) that confirmsname: "Inter Variable"resolves correctly through the provider pipeline.
Docs
- No docs update needed; this is a bug fix restoring behavior that users already expected based on fontsource's own documentation.
Closes #18143

Changes
- When
astro:rollup-plugin-build-cssdeletes a client CSS asset because the SSR/prerender build already bundled all of its CSS modules, the asset's filename was left inviteMetadata.importedCssof the chunks that import it. Vite'svite:build-import-analysisthen wrote that deleted filename into__vite__mapDeps, causing the browser to preload a file that doesn't exist indist/(404). - At the end of
generateBundleinplugin-css.ts, any CSS asset that was deleted and not restored is now also removed from every client chunk'simportedCssset, matching the behavior already used by the inline-stylesheets plugin in the same file.
Testing
- Extended the
css-dangling-referencesintegration test with ahydrated-islandfixture page that exercises the exact scenario: a component is both aclient:loadisland and reachable through a dynamic import on the same page. The test asserts that no CSS filename in any chunk's__vite__mapDepsis missing fromdist/. - Also fixed the hash regex in that test (updated from
[\da-f]{8}to match Vite 8's base64-like hashes) so the assertion can actually catch regressions.
Docs
- No docs update needed; this is a build-output correctness fix with no user-facing API change.
Closes #18191

Changes
- Integration-injected page routes (tagged
origin: 'external') no longer receive a 404 fromfinalizeI18nwheni18n.routing.prefixDefaultLocale: trueis set. Previously,I18nRouter.matchPrefixAlwaysreturnednotFoundfor any path without a locale segment, replacing the already-rendered page response with a 404. - The fix checks
state.routeData?.origin === 'external'and skips the locale-prefix routing check (step 1) for those routes. The i18n fallback logic (step 2) still runs, so integrations that inject locale-aware routes retain their fallback handling. All project-owned routes are unaffected.
Testing
- Added a unit test in
packages/astro/test/units/i18n/i18n-middleware.test.tscovering anexternal-origin page route underprefixDefaultLocale: true, asserting it returns the rendered response instead of a 404.
Docs
- No docs update needed. This restores expected behavior for an existing API (
injectRoute) and does not introduce new configuration surface.
Closes #18223

Changes
- Malformed JSON request bodies and percent-encoded action names that cannot be decoded no longer produce a 500 error. They now return
BAD_REQUEST(400) andNOT_FOUND(404) respectively, consistent with how the actions system already handles other invalid-request scenarios (unknown action → 404, wrong content type → 415). - The
getActioncatch block is extended to treatURIError(thrown bydecodeURIComponentfor malformed percent-encoding) as aNOT_FOUND, and theparseRequestBodycatch block is extended to treatSyntaxError(thrown byJSON.parse/Request.json()for invalid JSON) as aBAD_REQUESTwith a fixed message. This prevents adversarial or scanner-generated requests from polluting server error logs with unhandled exceptions.
Testing
- Two new unit tests added to
packages/astro/test/units/actions/actions-app.test.tsin a new "Actions malformed request handling" block: one covering a malformed JSON body returning 400, and one covering an undecodable action name returning 404 on both the RPC and form paths.
Docs
- No docs update needed; this is an internal error-handling correction with no new user-facing API.
Closes #18142

Changes
- Content files with
#or?in their name or path are now loaded correctly by the glob loader. Previously,encodeURIleft those characters unescaped, causing the WHATWG URL parser to treat them as hash/query delimiters and truncate the path — leading to anENOENTerror and a silently dropped collection entry. - Introduces a small
resolveEntryUrl()helper that percent-encodes#and?afterencodeURI. All three affected call sites inglob.ts(generateIdDefault,syncData,isConfigFile) now use it, keeping the./prefix established by #17762 for:handling.
Testing
- Added unit test cases in
packages/astro/test/units/content-layer/glob-loader.test.tscovering files named with#and?to ensure they resolve to the correct path and are not dropped from the collection.
Docs
- No docs update needed; this is a bug fix restoring expected behavior for file naming that was already implicitly supported.
Closes #18199

Changes
trailingSlash(),middleware(), andpages()now return an empty 400 for paths with too many layers of percent-encoding, matching the behaviour ofastro(). Previously those handlers routed the partly-decoded path, producing a 404 and allowing user middleware to run on the invalid request.- A shared helper
rejectInvalidEncoding(state)incore/routing/invalid-encoding.tsencapsulates the check.handleRequest,handleTrailingSlash,handleMiddlewareWithErrorFallback, andhandlePagesWithErrorFallbackeach call it first, so the rejection holds regardless of how the pipeline is composed.
Testing
- Extended
packages/astro/test/units/fetch/index.test.tsto coverpages()andtrailingSlash()+middleware()+pages()pipelines receiving a multi-level encoded path (/api/%2525252525252525252561dmin), asserting a 400 with an empty body and no middleware execution.
Docs
- No docs update needed; this restores an existing security behaviour to composable handlers with no new public API.
Closes #18233

Changes
- Localized error routes (e.g.
/pt/404,/pt/500) now return the correct HTTP status code when rendered through the composablepages()handler (astro/hono,astro/fetch). Previously,handlePagesWithErrorFallbacknever calledgetDefaultStatusCode, soFetchState.statusstayed at its default of200and that value was copied onto the response. The fix callsgetDefaultStatusCodeinhandlePagesWithErrorFallbackbefore delegating tohandlePages, matching whatrender()already does on theastro()path. - Root
/404and/500were already handled by a hardcoded override inrenderPage; this change extends correct status-code behavior to any locale-prefixed error route recognized byisLocalizedErrorRoute.
Testing
- New unit tests added in
packages/astro/test/units/fetch/index.test.tscoveringpages()requests to localized error routes (e.g./pt/404,/pt/500) and verifying the response carries the correct non-200 status code.
Docs
- No docs update needed; this is a bug fix restoring already-documented behavior to a code path that was missing the call.
Closes #18230

Changes
FetchState.getAPIContext()now defers caching the context object until after props are resolved. Calls made beforegetProps()returns still get a valid context, and the next call (aftergetProps()) fills inpropson the same object. This means endpoints and middleware always see the resolvedpropsvalue instead of the pre-computednull.handlePagesWithErrorFallbacknow awaitsgetProps()before dispatching, so thepages()composable no longer exposesprops: nullto endpoints whenmiddleware()is absent.
Testing
- Extended
packages/astro/test/units/fetch/index.test.tswith a case coveringactions()mounted beforemiddleware(), asserting that endpoints and middleware both see the resolved props instead ofnull.
Docs
- No docs update needed; this is a bug fix restoring already-documented behavior of
context.props.
Closes #18229

Changes
annotateSourceFileis now disabled when Vite is running in test mode (viteConfig.mode === 'test'), preventingdata-astro-source-file/data-astro-source-locattributes from appearing in HTML rendered byexperimental_AstroContainerunder Vitest. These annotations are only useful for the dev toolbar in a browser context and have no value in test pipelines.@astrojs/compiler-rsis bumped to^0.5.1, which is the first version that actually implementsannotateSourceFile; the regression was invisible on0.5.0because the option was a stub.
Testing
- Added
packages/astro/test/units/compile/annotate-source-file.test.ts, which asserts that theannotateSourceFileflag isfalsewhenviteConfig.modeis'test'andtruewhen it is'development'with the dev toolbar enabled.
Docs
- No docs update needed. The
annotateSourceFileoption is an internal compiler detail; the fix restores existing behavior for the experimental Container API with no API surface change.
Closes #18162

Changes
- The composable
cache()handler fromastro/honoandastro/fetchnow callsprovideCache(state)beforehandleCache, matching the behavior of theastro()path. Previously,state.resolve('cache')returnedundefinedwhen a cache provider was configured, causingapplyCacheHeadersto throwCannot use 'in' operator to search for 'Symbol(astro:cache:apply)' in undefinedand a 500 response. - Adds a
provideAndHandleCache()helper inpackages/astro/src/core/cache/handler.tsthat awaitsprovideCache(state)then runshandleCache. The publiccache()composable delegates to it; theastro()path is unchanged.
Testing
- New unit test in
packages/astro/test/units/hono/index.test.tscovering thecache()composable with a configured cache provider, asserting that a successful response is returned instead of a 500.
Docs
- No docs update needed; this is a bug fix restoring already-documented behavior for the
cache()composable.
Closes #18227
The starlight-theme-large-print demo site moved from the workers.dev subdomain to its own domain: https://starlight.xianmi.co/
The old URL keeps serving the same site (both run on the same Worker), so nothing breaks — this PR only points the community themes listing at the new canonical address. Verified live: HTTP 200, valid TLS, same content as before.
Only the href of the Large Print entry is changed (en/de/ko/ru); titles, descriptions and preview images are untouched.
Description
- Closes #
- What does this PR change? Give us a brief description.
- Did you change something visual? A before/after screenshot can be helpful.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @netlify/blobs (source) | ^11.1.1 → ^11.1.3 |
||
| @netlify/functions (source) | ^6.0.0 → ^6.0.2 |
||
| vite (source) | ^8.3.1 → ^8.3.2 |
Release Notes
netlify/primitives (@netlify/blobs)
v11.1.3
Bug Fixes
Dependencies
- The following workspace dependencies were updated
- dependencies
- @netlify/dev-utils bumped from 6.0.2 to 6.0.3
- @netlify/otel bumped from ^7.0.3 to ^7.0.4
- dependencies
v11.1.2
Dependencies
- The following workspace dependencies were updated
- dependencies
- @netlify/dev-utils bumped from 6.0.1 to 6.0.2
- @netlify/otel bumped from ^7.0.2 to ^7.0.3
- dependencies
netlify/primitives (@netlify/functions)
v6.0.2
Dependencies
- The following workspace dependencies were updated
- dependencies
- @netlify/types bumped from 3.1.0 to 3.2.0
- dependencies
v6.0.1
Dependencies
- The following workspace dependencies were updated
- dependencies
- @netlify/types bumped from 3.0.0 to 3.1.0
- dependencies
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @types/alpinejs (source) | ^3.13.11 → ^3.17.0 |
||
| alpinejs (source) | ^3.15.8 → ^3.17.4 |
||
| vite (source) | ^8.0.13 → ^8.3.2 |
Release Notes
vitejs/vite (vite)
v8.3.2
Bug Fixes
- build: preload CSS correctly when
renderBuiltUrlreturns URLs with queries (#23611) (64e0a21) - bundled-dev: serve lazy chunk sourcemaps (#23026) (eb7aa9a)
- bundled-dev: serve the rolldown runtime from the installed rolldown (#23568) (bc598a6)
- deps: update all non-major dependencies (#23601) (9944fa6)
- deps: update rolldown-related dependencies (#23602) (88c1741)
- html: resolve percent-encoded srcset urls (#23609) (53f1ce7)
- limit size of object and array printing via
forwardConsole(#23565) (e64a587) - merge
build.rolldownOptions.output.minifycorrectly (#23536) (bba3bb8) - optimize-deps: avoid "unsupported" warnings for browser:false mappings (#23590) (5e4b9ca)
- optimizer: preserve excluded optional peer require fallbacks (#23600) (a2bd6fa)
- pass queries to
renderBuiltUrl(#23586) (744269e) - server: handle file watcher errors without crashing (#23503) (6894f5c)
- server: release previous environments after initialization (#23499) (5a3a010)
- ssr: encode whitespace in module runner sourceURL (#23513) (bbc8812)
- worker: align worker urls in client and server when using terser (#23614) (24bd331)
Performance Improvements
- avoid encoding intermediate source maps (#23461) (89574f6)
- build: avoid quadratic link scan in the preload helper (#23510) (cf5c028)
- only register time middleware when debug logging is enabled (#23621) (94d0080)
Documentation
Miscellaneous Chores
Code Refactoring
Tests
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Changes
Fixes #18225
Fixes Astro.cookies.get() returning undefined for an incoming cookie with an empty value. For Cookie: foo=, has('foo') already returns true, but get('foo') cannot read the value.
Empty values now go through the same decoding path as other request cookies, including a custom decoder.
Testing
- Added four regression cases covering a single empty cookie, an empty value between other cookies, a custom decoder, and an endpoint reading the cookie.
- All four fail without the source change; the other 25 tests in those two files pass.
- All 59 cookie tests pass with the fix.
- Full core unit suite: 3,586 passed, one existing skip.
- Workspace build, formatting,
pnpm lint:ai, andpnpm typecheckpassed. - A local
astro devendpoint reproduced{"present":true}on unchanged source and{"present":true,"value":""}with the fix, both with HTTP 200.
Docs
No documentation change needed. This restores reading the raw value of an existing cookie. A patch changeset is included.

Changes
- Fixes an issue where AVIF images were served as
image/heifinstead ofimage/avifin the dev server - Root cause: Sharp reports AVIF output as
heif(see: lovell/sharp#3053), and Astro used that as the response format - Closes #18214
Testing
- Added a unit test for AVIF output format
- Verified manually in the dev server
Docs
- No docs needed, bug fix only.

Changes
Font.astronow importscomponentDataByCssVariablefrom a new internal module (src/assets/fonts/component-data.ts) whose types are included in the published package, instead of fromvirtual:astro:assets/fonts/internalwhich was declared only in the unpublisheddev-only.d.ts. This eliminates the TS2307 error consumers see whentscfollows theastro:assetsre-export intonode_modules.Picture.astronow narrows with'inferSize' in propsbefore accessing the property, fixing TS2339 errors caused by reading a field that doesn't exist on every member of theLocalImageProps | RemoteImagePropsunion.
Testing
No new automated tests were added — the bug only surfaces when TypeScript 7.1 with @astrojs/ts-content-mapper type-checks the published .astro files, a workflow the monorepo doesn't exercise. The 33 existing tests in the fonts, fontsource, infersize, and picture emit-file suites continue to pass.
Docs
No docs update needed — this is a type-correctness fix with no user-facing API change.
Closes #18219

Changes
- What does this change?
chunkHasDynamicImports only looked at output.dynamicImports and at getModuleInfo(id).dynamicallyImportedIds. Rolldown records neither for an import annotated with /* @vite-ignore */, which is the only way to import a URL that only exists at runtime (e.g. a file an integration copies into the output). Such a chunk was therefore inlined into the HTML with Vite's raw __VITE_PRELOAD__ helper reference still in it, throwing ReferenceError: __VITE_PRELOAD__ is not defined at runtime.
Vite injects its preload helper whenever the chunk has a dynamic import and leaves it in the chunk, so this adds output.moduleIds.includes('\0vite/preload-helper.js') as a third signal. That is exactly what was suggested in the older report of the same family (#17265), and it also covers the module-info gap the existing check still has.
- Minimal repro from #18181 (
src/pages/index.astrowithawait import(/* @vite-ignore */ "/external.js"),public/external.js): before,dist/index.htmlcontains__VITE_PRELOAD__; after, the chunk is not inlined and the helper is replaced. - Fixes #18181. Changeset added.
Testing
Added it('detects dynamic imports skipped by \/* @vite-ignore */`')topackages/astro/test/units/build/plugin-scripts.test.ts, which asserts both chunkHasDynamicImportsandshouldInlineScriptChunk` for a chunk whose only trace is the preload helper.
Verified:
- The new test fails on
mainwith the reported symptom and passes with the fix (rebuiltdistbetween runs, since this suite imports fromdist). test/units/build/**— 37 suites, 135 tests pass.test/units/**— 3584 tests, 3581 pass. The 2 failures (test/units/assets/fonts/e2e.test.ts: "works", "merges families when possible") are pre-existing: they fail identically with this change stashed, and they compare a fetchedcdn.jsdelivr.netURL, so they are environment/network dependent and unrelated to script inlining.pnpm build --filter=astroexits 0.biome formatandbiome ci --formatter-enabled=falsereport no issues on the changed files.- Not verified: an actual
astro build+ browser run of the repro, because that needs a pnpm-built workspace browser target I have no browser for here.
Docs
No docs change needed. This restores the documented meaning of inlined scripts rather than changing a documented behaviour; the bug is that a @vite-ignore script silently shipped broken HTML. If you disagree, flag it and I will add an entry.

Changes
- The Cloudflare adapter's
globalThis.process ??= {}; globalThis.process.env ??= {};banner is now set on thessrandprerenderVite environments instead of the top-levelvite.build.rolldownOptions.output. With Vite 8's multi-environment build, the top-levelbuildconfig was inherited by theclientenvironment, causing the banner to be prepended to every browser chunk and inlined<script>, adding unnecessary bytes to all client assets. - Only the worker environments (SSR and prerender) receive the banner, as intended. Client output is unaffected. If the user has already set a top-level banner, the adapter leaves it alone.
Testing
- Added a test case in
packages/integrations/cloudflare/test/static.test.tsthat verifies client chunks do not contain the banner after a build, while server chunks still do.
Docs
- No docs update needed; this is a bug fix with no new APIs or configuration options.
Closes #18182

Changes
- Adds the
headingoffsetandheadingresetglobal attributes toHTMLAttributesinastro-jsx.d.tsheadingoffsetaccepts0–8(as a number or numeric string), matching the spec's allowed rangeheadingresetis typed like other boolean attributes such asinert
- Adds
headingresettohtmlBooleanAttributes, so dynamic values render as a boolean attribute:headingreset={true}→headingreset(previouslyheadingreset="true")headingreset={false}→ omitted (previouslyheadingreset="false", which enabled the reset)
References:
- Spec: https://html.spec.whatwg.org/multipage/sections.html#heading-levels-&-offsets
- WHATWG PR: whatwg/html#11086
- MDN: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/headingoffset
- MDN: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/headingreset
Testing
Added headingreset cases (true, false, and empty string) to test/units/app/astro-attrs.test.ts, following the existing boolean attribute cases
Docs
No docs change needed
This only adds types for standard HTML attributes and renders headingreset like the other boolean attributes

This is a follow-up to #18206.
While working on that PR, I noticed the existing parsing for package names with tags and assumed astro add @astrojs/cloudflare@beta would work. When I tested it after the release, I realized the validation added in #15419 rejects the full specifier before that parsing logic runs.
This updates the validation to accept an optional version or tag while continuing to reject invalid specifiers.

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to next, this PR will be updated.
next is currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, run changeset pre exit on next.
Releases
astro@7.4.0-beta.1
Minor Changes
- #18206
db00242Thanks @edmundhung! - Updatesastro add @astrojs/cloudflare@betato installcf, scaffoldcloudflare.config.ts, and generate types withcf
@astrojs/cloudflare@15.0.0-beta.1
Patch Changes
- #18205
7a519a7Thanks @ematipico! - Upgrades the@cloudflare/vite-pluginto the latest. - Updated dependencies []:
- @astrojs/underscore-redirects@1.0.4

Changes
This updates astro add cloudflare to scaffold a Cloudflare config for cf.
Testing
Added unit coverage for beta adapter resolution.
Docs
No documentation changes. This updates the prerelease integration setup before it becomes stable.


This PR contains the following updates:
Release Notes
alpinejs/alpine (alpinejs)
v3.17.4
What's Changed
- Fix mutation observer recovery after errors by @BillyNoyes in #4908
- Add viewport modifier to resize plugin by @BillyNoyes in #4910
New Contributors
- @BillyNoyes made their first contribution in #4908
Full Changelog: alpinejs/alpine@v3.17.3...v3.17.4
v3.17.3
What's Changed
- Bump js-yaml from 3.14.1 to 3.15.2 by @dependabot[bot] in #4896
- Change x-for to allow loops like
(foo)in(bar)by @ColonelThirtyTwo in #4897 - Fix(CspParser): accept reserved words as property/method names and object keys by @MaxencePaulin in #4905
- Fix:
$watchandx-modelablecan fire after being unwatched/released by @MaxencePaulin in #4903 - Fix: skip init() in x-data during clone, matching x-init behavior by @MaxencePaulin in #4901
- Bump @vitest/mocker and vitest by @dependabot[bot] in #4898
- Stop x-on and x-model's own modifiers from being read as key names by @dylanpulver in #4891
- Fix CI compatibility after the Vitest 5 upgrade by @calebporzio in #4906
New Contributors
- @ColonelThirtyTwo made their first contribution in #4897
- @MaxencePaulin made their first contribution in #4905
- @dylanpulver made their first contribution in #4891
Full Changelog: alpinejs/alpine@v3.17.2...v3.17.3
v3.17.2
What's Changed
- Fix decode-uri-component Dependabot alert by @calebporzio in #4889
- Bump browserslist from 4.21.5 to 4.28.8 by @dependabot[bot] in #4890
- Fix CSP initialization in sandboxed iframes by @calebporzio in #4893
Full Changelog: alpinejs/alpine@v3.17.1...v3.17.2
v3.17.1
What's Changed
- Add dwell timing to the intersect plugin by @cyppe in #4884
- Bump brace-expansion from 1.1.11 to 1.1.18 by @dependabot[bot] in #4882
- Docs: clarify how Alpine effects track reactive dependencies by @MuslumYilmaz in #4883
New Contributors
- @cyppe made their first contribution in #4884
- @MuslumYilmaz made their first contribution in #4883
Full Changelog: alpinejs/alpine@v3.17.0...v3.17.1
v3.17.0
What's Changed
- Fix Unicode escapes in CSP string literals by @dawNotPoi in #4881
- Add Alpine.deferInit() — suspend a tree until an async prerequisite settles by @calebporzio in #4887
New Contributors
- @dawNotPoi made their first contribution in #4881
Full Changelog: alpinejs/alpine@v3.16.3...v3.17.0
v3.16.3
What's Changed
- docs: clarify x-modelable value support by @pooridev in #4880
- Fix
x-maskattribute changes onx-modelinputs by @joshhanley in #4852 - Bump postcss from 8.5.6 to 8.5.26 by @dependabot[bot] in #4871
New Contributors
- @pooridev made their first contribution in #4880
Full Changelog: alpinejs/alpine@v3.16.2...v3.16.3
v3.16.2
What's Changed
- Fix fallback storage returning undefined for missing keys by @hamdyelbatal122 in #4867
- fix(persist): don't persist undefined values by @Xuepoo in #4876
- Run structural effects before dependent effects by @calebporzio in #4878
- Upgrade
@vue/reactivityto Vue 3.5 by @oddvalue in #4861
New Contributors
- @hamdyelbatal122 made their first contribution in #4867
- @Xuepoo made their first contribution in #4876
- @oddvalue made their first contribution in #4861
Full Changelog: alpinejs/alpine@v3.16.1...v3.16.2
v3.16.1
What's Changed
- Fix Persist compatibility with older Alpine versions by @calebporzio in #4875
Full Changelog: alpinejs/alpine@v3.16.0...v3.16.1
v3.16.0
What's Changed
- Fix data loss when binding objects to regular attributes by @daftspunk in #4826
- Fix mask resurrecting key in object when it is cleared by @danharrin in #4812
- Fix x-if and x-for content duplicating during morph by @ganyicz in #4785
- fix: sync x-model select value after x-for renders options by @ljk0071 in #4769
- Fix
x-bind:valueon<option>losing attribute when value is an empty string by @joshhanley in #4831 - Fix
:valuebindings not updating custom elements when bound object data mutates by @joshhanley in #4833 - Add
.parentmodifier forx-intersectby @kevinruscoe in #4839 - Upgrade Cypress by @joshhanley in #4849
- Preserve x-data scope when its expression changes by @calebporzio in #4868
- Fix persisted single-value stores by @joshhanley in #4859
- Pass cleanup callback to direct store interceptors by @calebporzio in #4869
- Split draft and npm release workflows by @calebporzio in #4870
- Use Node 24 for release workflows by @calebporzio in #4872
New Contributors
- @daftspunk made their first contribution in #4826
- @ljk0071 made their first contribution in #4769
- @kevinruscoe made their first contribution in #4839
Full Changelog: alpinejs/alpine@v3.15.12...v3.16.0
v3.15.12
What's Changed
- Add .fixed positioning modifier to x-anchor by @nicolagianelli in #4773
- fix(csp): support MemberExpression assignments in evaluator by @dasm in #4807
- Fix
x-forcrashing on null-prototype objects likeObject.groupBy()results by @joshhanley in #4825 - Fix
&&and||not short-circuiting in CSP evaluator by @joshhanley in #4823 - Fix
x-sortcrash when container has a<template>with no.contentby @joshhanley in #4819 - Add minified ESM build output for each package by @joshhanley in #4820
- Fix
x-idevaluation order so$idresolves consistently insidex-databy @joshhanley in #4821 - Fix
@teleportleaking detached nodes on every Livewire render by @joshhanley in #4822
New Contributors
Full Changelog: alpinejs/alpine@v3.15.11...v3.15.12
v3.15.11
What's Changed
- fix(csp): skip sharedStorage when enumerating globalThis properties by @PierreBultez in #4787
- Fix x-trap.noscroll layout shift conflict with scrollbar-gutter by @dotfrag in #4512
- Add support for [x-sort:handle] attributes defined in template tags by @SimoTod in #4483
- Add
x-anchor.noflipmodifier by @calebporzio in #4791 - Warn when x-for template has multiple root elements by @calebporzio in #4752
- Fix $refs unavailable during morph (v3.15.9 regression) by @calebporzio in #4793
New Contributors
- @PierreBultez made their first contribution in #4787
- @dotfrag made their first contribution in #4512
Full Changelog: alpinejs/alpine@v3.15.10...v3.15.11
v3.15.10
Fixed
- Fix x-anchor crash during wire:navigate cleanup #4790
v3.15.9
What's Changed
- fix(morph): close dialogs properly when removing open attribute by @calebporzio in #4739
- Update
tabbableandfocus-trapdependencies in focus plugin by @joshhanley in #4737 - feat(x-anchor): allow dynamic reference to be used with x-anchor by @maximbelyayev in #4735
- Handle all types of whitespace in class lists, not just spaces by @calebporzio in #4743
- docs: clearer variable name in x-bind example by @calebporzio in #4742
- Fix
x-model.parentwhen inside ofx-teleportby @willrowe in #4676 - feat:
x-on.passive.falsemodifier by @hirasso in #4610 - Add support for Set objects in x-for loop function by @alfanzain in #4672
- Add support for custom options and cancelable
$dispatchby @nicolagianelli in #4608 - Fix how
x-htmlhandlesundefinedby @willrowe in #4555 - move dependencies from monorepo root to correct packages by @Igloczek in #4550
- Don't assign the normalEvaluator per default by @JeroenBoersma in #4548
- Fix class setters invocation on nested
x-databy @helio3197 in #4528 - 🐛 Masks model updates by @ekwoka in #4175
- Allow debouncing/throttling x-model when using x-modelable by @Spitfire972 in #4186
- UI x-radio: fix keyboard navigation when value of first/last radio option is null by @gdebrauwer in #4308
- Improve handling of autocomplete values in X-Mask by @robertmarney in #4260
- ⚡ Improves x-for performance by @ekwoka in #4361
- Fix x-ref crash during child-element morph by @calebporzio in #4748
- Fix $watch oldValue for objects by @calebporzio in #4749
- Escape attribute values in morph
setAttributepatch by @joshhanley in #4770 - Fix x-model setting .value instead of .checked on checkboxes by @ganyicz in #4779
- Fix
x-model.blurcrash when input is removed from a form by @joshhanley in #4783
New Contributors
- @maximbelyayev made their first contribution in #4735
- @hirasso made their first contribution in #4610
- @alfanzain made their first contribution in #4672
- @nicolagianelli made their first contribution in #4608
- @Igloczek made their first contribution in #4550
- @JeroenBoersma made their first contribution in #4548
- @helio3197 made their first contribution in #4528
- @Spitfire972 made their first contribution in #4186
- @robertmarney made their first contribution in #4260
Full Changelog: alpinejs/alpine@v3.15.8...v3.15.9
nanostores/nanostores (nanostores)
v1.5.4
- Fixed
listenKeysfordeepMap(by @tiagovilasboas). - Fixed listener calls lost after unbind and inside
batch()(by @psd-coder). - Fixed tasks during cleaning up (by @lprnmns).
- Fixed
listenKeyswith non-string map keys (by @lprnmns). - Fixed
listenKeysto useObject.is(by @lprnmns). - Fixed
effect()on an error during subscription (by @lprnmns).
v1.5.3
- Fixed using
Store#eqincomputed(by @lprnmns). - Throw an error on
Object.prototypekeys inmapCreator(by @lprnmns). - Fixed
batch()inside a listener (by @lenamonj). - Fixed calling unbind twice (by @lenamonj).
- Fixed
cleanTasks()for completions tasks (by @lenamonj).
v1.5.2
- Fixed types (by @edloidas).
v1.5.1
- Fixed types (by @edloidas).
- Fixed
listenKeyswhen old value is not available (by @edloidas).
v1.5.0
- Added
eqandeqKeyfor custom value comparison (by @psd-coder). - Fixed calling other listeners if one of them throws (by @psd-coder).
- Fixed
listenKeysdeep paths on whole store set (by @ankit1324).
v1.4.2
- Fixed
batch()conflict with builder (by @psd-coder). - Added new tools to docs (by @firatciftci & @alexcarpenter).
v1.4.1
- Fixed
task()for synchronous callbacks (by @rajanpanth). - Fixed docs (by @maxtaran2010 & @VdustR).
v1.4.0
- Added
batchto run one re-render on many stores changes (by @psd-coder). - Added listening base key for nested mutation to
listenKeys(by @ifo123). - Fixed
getPaththrowing onnullintermediate values (by @chatman-media). - Fixed
listenKeyson the whole set changes (by @LeSingh1). - Fixed resetting
computedcache oncleanStores(by @ATOM00blue).
v1.3.0
- Added
globalThis.nanostoresGlobalto sync stores in JS bundles (by @afurm).
v1.2.0
vitest-dev/vitest (vitest)
v5.0.2
🐞 Bug Fixes
- Bind
processin case global is overwritten - by @AriPerkkio in #11343 (0b792) - detect-async-leaks:
- Ignore
process.stdiohandles - by @AriPerkkio in #11333 (0fd6b)
- Ignore
- expect:
- Fix
toMatchObjectwith asymmetric matchers - by @ShreeBohara, Claude Opus 5, @hi-ogawa, Hiroshi Ogawa and Codex (GPT-5) in #11100 (42523)
- Fix
- jsdom:
- Fix
RequestwithBlobbody on jsdom 28+ - by @harshit-d3v in #11295 (d1c3e)
- Fix
- reporter:
agentto respect--silent- by @Raj4478 and @AriPerkkio in #11271 (5b95e)
- reporters:
- spy:
- ui:
- Persist authentication cookie beyond current browser session - by @hi-ogawa, Hiroshi Ogawa and OpenCode (gpt-5.6-sol) in #11066 (f8819)
View changes on GitHub
v5.0.1
🚀 Features
- ui:
- Move trace attempts selector to viewer header - by @hi-ogawa, Hiroshi Ogawa and Codex in #11189 (5dc4b)
- Add focused trace view layout mode - by @hi-ogawa, Hiroshi Ogawa, OpenCode (gpt-5.6-sol) and Codex in #11190 (376dc)
🐞 Bug Fixes
- Exit 1 when vitest list fails collection - by @hamed-bavar in #11145 and #11146 (6108b)
- Keep parse error details in static collection - by @hamed-bavar in #11150 and #11151 (7c818)
- Avoid recursive prototype in automocking - by @sheremet-va in #11195 (99fc5)
- Prevent false Vitest import resolution - by @sheremet-va in #11196 (b426c)
- Keep metadata file when clearing the cache - by @sheremet-va in #11199 (73614)
- Correct typos in error message and comments - by @shinji00222 and Shinji in #11187 (115c3)
- Resolve ResolvedConfig exactOptionalPropertyTypes errors - by @LukeAbby in #11175 (498fb)
- Share the server on self-referencing
extends- by @sheremet-va in #11034 (23dda) - Warn when deprecated
deps.optimizer.webis used - by @im10furry in #11214 (2ce29) - browser:
- Avoid double quotes in
config.define- by @sheremet-va in #11198 (972e2)
- Avoid double quotes in
- doctor:
- Measure vm pools for custom environments - by @sheremet-va in #11212 (91ab1)
- expect:
- Correct return value in
toMatchAriaSnapshot- by @sheremet-va in #11208 (c119b)
- Correct return value in
- fakeTimers:
- Force
queueMicrotaskandnextTickintoNotFake- by @kingmakeruix, kingmakeruix, Hiroshi Ogawa, Codex and @hi-ogawa in #11261 (a47d7)
- Force
- snapshot:
- Report obsolete keys next to skipped tests - by @hamed-bavar, Hiroshi Ogawa and OpenCode (gpt-5.6-sol) in #11157 and #11158 (17e2b)
- types:
- Make public declarations self-contained - by @ZoeySigel in #11141 (45546)
- ui:
- Fix collapse/expand suite with file name search - by @hi-ogawa, Hiroshi Ogawa and Codex in #11260 (0a712)
- Fix explorer file summary count - by @hi-ogawa, Hiroshi Ogawa, OpenCode (gpt-5.6-sol) and Codex in #11125 (05982)
- utils:
- Fix
deepMergeto handle prototype - by @hi-ogawa, Hiroshi Ogawa and Codex in #11215 (4944c)
- Fix
View changes on GitHub
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

ℹ️ Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
Release Notes
withastro/compiler-rs (@astrojs/compiler-rs)
v0.5.1
Patch Changes
b48eac6: Fixes missingdata-astro-source-fileanddata-astro-source-locattributes when source annotation is enabled.afa7276: Fixes aReferenceErrorwhen a slot's name is computed inside a loop, e.g.{items.map((item, i) => <div slot={item-${i}}>{item}</div>)}. Computed slot names now render into their matching named slot.afa7276: Removes a strayslot="…"attribute the compiler left on elements passed to a component with a computed slot name.- Updated dependencies [
b48eac6]
seek-oss/capsize (@capsizecss/unpack)
v4.0.1
Patch Changes
- #262
640357cThanks @michaeltaranto! - unpack: EnsurefromUrlandfromBlobwork in the browser
bombshell-dev/clack (@clack/prompts)
v1.8.1
Patch Changes
-
8bd9129Thanks @gameroman! - Return type for prompts now correctly specifiesCANCEL_SYMBOLinstead ofsymbol -
Updated dependencies [
8bd9129]:- @clack/core@1.5.1
v1.8.0
Minor Changes
-
#592
caa32e8Thanks @gameroman! - ExportCANCEL_SYMBOLconstant from@clack/coreand@clack/prompts -
#594
37fca4eThanks @dreyfus92! - Add tab-completion to thepathprompt: pressing Tab fills the input with the focused suggestion, so you can quickly descend into deep directories (type/and Tab again). Powered by a new opt-incompleteOnTaboption onautocomplete, which also shows aTab: completehint in the instructions footer. Defaultautocompletebehavior is unchanged. -
#583
ae636ddThanks @43081j! - Add async validation support to prompts, and validation state rendering to text prompts.
Patch Changes
-
#588
6506135Thanks @danielroe! - Style the guide bar rendered bybox({ withGuide: true })in grey so it matches the gutter drawn bylog,noteand the spinner -
#599
0547d6fThanks @43081j! - Fixes a withGuide rendering issue leaving extra spaces in text prompts. -
Updated dependencies [
227583e,caa32e8,37fca4e,ae636dd,b20fa2b]:- @clack/core@1.5.0
microsoft/playwright (@playwright/test)
v1.63.0
v1.62.1
v1.62.0
🧱 New component testing model
Component testing moves to a stories and galleries model.
A story wraps your component in one specific scenario — hard-coded props, mock data, providers — and a
gallery page that you serve renders stories on demand. The new fixtures.mount() fixture navigates
to the gallery, mounts a story by id, and returns a Locator scoped to the story's root element:
test('click should expand', async ({ mount }) => {
const component = await mount('components/Expandable/Stateful');
await component.getByRole('button').click();
await expect(component.getByTestId('expanded')).toHaveValue('true');
});Pass a story type as a template argument to type-check its props, and use update(props) /
unmount() on the returned locator to re-render or tear down within a test.
🛑 Cancel operations with AbortSignal
Most operations and web-first assertions now accept a signal option that takes an
AbortSignal, letting you
cancel long-running actions, navigations, waits, and assertions:
const controller = new AbortController();
setTimeout(() => controller.abort(), 1000);
await page.getByRole('button', { name: 'Submit' }).click({ signal: controller.signal });
await expect(page.getByText('Done')).toBeVisible({ signal: controller.signal });Providing a signal does not disable the default timeout; pass timeout: 0 to disable it.
🖼️ WebP screenshots
expect(page).toHaveScreenshot() and expect(locator).toHaveScreenshot()
can now store snapshots in the WebP format — just give the snapshot a .webp name:
// Visual comparisons store the golden snapshot as lossless WebP.
await expect(page).toHaveScreenshot('homepage.webp');
// Standalone screenshots can trade quality for size with lossy WebP.
await page.screenshot({ path: 'homepage.webp', quality: 50 });page.screenshot() and locator.screenshot() also accept webp as a type,
where quality 100 (the default) is lossless and lower values use lossy compression.
🧩 Custom test filtering with Reporter.preprocess()
New reporter.preprocess() hook runs after the configuration is resolved and before
reporter.onBegin(), letting a reporter mark individual tests as skipped, excluded,
fixed, or failing through a TestRun object:
class MyReporter {
async preprocess({ config, suite, testRun }) {
for (const test of suite.allTests()) {
if (shouldSkip(test))
testRun.skip(test);
}
}
}🔁 Isolated retries
New testConfig.retryStrategy controls when failed tests are retried. The default
'immediate' retries as soon as a worker is free; 'isolated' runs all retries at the end,
one by one in a single worker, to minimize interference with the rest of the suite:
// playwright.config.ts
export default defineConfig({
retries: 2,
retryStrategy: 'isolated',
});New APIs
Browser and Context
- New option
credentialsincludes the context's virtual WebAuthn Credentials (passkeys) in the storage state, so they can be persisted and re-seeded into later contexts.
Actions
- New
scrolloption ("auto"|"none") on actions to opt out of Playwright's automatic scroll-into-view.
Network
- New apiResponse.timing() returns resource timing information for an API response.
Evaluation
- New locator.waitForFunction() waits until a function — called with the matching element — returns a truthy value.
- page.evaluate() and related methods now accept functions as evaluate arguments.
- page.addInitScript() / browserContext.addInitScript() now accept functions as init-script arguments.
Command line & MCP
- Playwright now bundles the Playwright MCP server and
playwright-cli, runnable vianpx playwright mcpandnpx playwright cli.
Reporters
- The HTML report's Merge files grouping — previously only a UI toggle — can now be enabled from the config with the new
mergeFilesreporter option:
// playwright.config.ts
export default defineConfig({
reporter: [['html', { mergeFiles: true }]],
});Announcements
⚠️ Debian 11 is not supported anymore.
Browser Versions
- Chromium 151.0.7922.34
- Mozilla Firefox 153.0
- WebKit 26.5
This version was also tested against the following stable channels:
- Google Chrome 151
- Microsoft Edge 151
v1.61.1
v1.61.0
🔑 WebAuthn passkeys
New Credentials virtual authenticator, available via browserContext.credentials, lets tests register passkeys and answer navigator.credentials.create() / navigator.credentials.get() ceremonies in the page — no real hardware key required, works in all browsers:
const context = await browser.newContext();
// Seed a passkey your backend provisioned for a test user.
await context.credentials.create('example.com', {
id: credentialId,
userHandle,
privateKey,
publicKey,
});
await context.credentials.install();
const page = await context.newPage();
await page.goto('https://example.com/login');
// The page's navigator.credentials.get() is answered with the seeded passkey.You can also let the app register a passkey once in a setup test, read it back with credentials.get(), and seed it into later tests — see Credentials for details.
🗃️ Web Storage
New WebStorage API, available via page.localStorage and page.sessionStorage, reads and writes the page's storage for the current origin:
await page.localStorage.setItem('token', 'abc');
const token = await page.localStorage.getItem('token');
const items = await page.sessionStorage.items();New APIs
Network
- apiResponse.securityDetails() and apiResponse.serverAddr() mirror the browser-side response.securityDetails() and response.serverAddr().
Browser and Screencast
- New option
artifactsDirin browserType.connectOverCDP() controls where artifacts such as traces and downloads are stored when attached to an existing browser. - New option
cursorin screencast.showActions() controls the cursor decoration rendered for pointer actions. - The
onFramecallback in screencast.start() now receives atimestampof when the frame was presented by the browser.
Test runner
- The testOptions.video option now supports the same set of modes as
trace: new'on-all-retries','retain-on-first-failure'and'retain-on-failure-and-retries'values. See the video modes table for which runs are recorded and kept in each mode. - Supported
expect.soft.poll(...). - New fullConfig.argv — a snapshot of
process.argvfrom the runner process, handy for reading custom arguments passed after the--separator. - New fullConfig.failOnFlakyTests mirrors the config option, so reporters can explain why a flaky run failed.
- testInfo.errors now lists each sub-error of an
AggregateErroras a separate entry. - New
-Gcommand line shorthand for--grep-invert.
🛠️ Other improvements
- Playwright now supports Ubuntu 26.04.
- HAR and trace recordings now include WebSocket requests.
Browser Versions
- Chromium 149.0.7827.55
- Mozilla Firefox 151.0
- WebKit 26.5
This version was also tested against the following stable channels:
- Google Chrome 149
- Microsoft Edge 149
v1.60.0
🌐 HAR recording on Tracing
tracing.startHar() / tracing.stopHar() expose HAR recording as a first-class tracing API, with the same content, mode and urlFilter options as recordHar. The returned Disposable makes it easy to scope a recording with await using:
await using har = await context.tracing.startHar('trace.har');
const page = await context.newPage();
await page.goto('https://playwright.dev');
// HAR is finalized when `har` goes out of scope.🪝 Drop API
New locator.drop() simulates an external drag-and-drop of files or clipboard-like data onto an element. Playwright dispatches dragenter, dragover, and drop with a synthetic [DataTransfer] in the page context — works cross-browser and is great for testing upload zones:
await page.locator('#dropzone').drop({
files: { name: 'note.txt', mimeType: 'text/plain', buffer: Buffer.from('hello') },
});
await page.locator('#dropzone').drop({
data: {
'text/plain': 'hello world',
'text/uri-list': 'https://example.com',
},
});🎯 Aria snapshots
- expect(page).toMatchAriaSnapshot() now works on a Page, in addition to a Locator — equivalent to asserting against
page.locator('body'). - New
boxesoption on locator.ariaSnapshot() / page.ariaSnapshot() appends each element's bounding box as[box=x,y,width,height], useful for AI consumption.
🛑 test.abort()
New test.abort() aborts the currently running test from a fixture, hook, or route handler with an optional message. Use it when you have detected an unrecoverable misuse and want to fail the test right away:
test('does not publish to the shared page', async ({ page }) => {
await page.route('**/publish', route => {
test.abort('Tests must not publish to the shared page. Use the `clone` option.');
return route.abort();
});
// ...
});New APIs
Browser, Context and Page
- Event browser.on('context') — fired when a new context is created on the browser.
- BrowserContext now mirrors lifecycle events from its pages: browserContext.on('download'), browserContext.on('frameattached'), browserContext.on('framedetached'), browserContext.on('framenavigated'), browserContext.on('pageclose'), browserContext.on('pageload').
Locators and Assertions
- New option
descriptionin page.getByRole() / locator.getByRole() / frame.getByRole() / frameLocator.getByRole() for matching the accessible description. - New option
pseudoin expect(locator).toHaveCSS() reads computed styles from::beforeor::after. - New option
stylein locator.highlight() applies extra inline CSS to the highlight overlay, plus new page.hideHighlight() to clear all highlights.
Network
- webSocketRoute.protocols() returns the WebSocket subprotocols requested by the page.
- New option
noDefaultsin browserType.connectOverCDP() disables Playwright's default overrides on the default context (download behavior, focus emulation, media emulation), so attaching to a user's daily-driver browser doesn't disturb its state.
Errors and Reporting
- New webError.location() mirrors consoleMessage.location().
- consoleMessage.location() now exposes
line/columnproperties (lineNumber/columnNumberare deprecated). - New testInfoError.errorContext surfaces additional diagnostic context, such as the aria snapshot of the receiver at the time of an
expect(...)matcher failure. - reporter.onError() now receives a
workerInfoargument with details about the worker for fixture teardown errors.
Test runner
- New
{testFileBaseName}token in testProject.snapshotPathTemplate — file name without extension. - Test runner now errors when a config tries to override a non-option fixture, and rejects
workers: 0or negative values.
🛠️ Other improvements
- HTML reporter:
npx playwright show-reportaccepts.zipfiles directly — no need to unzip first.- Steps that contain attachments inside nested children show an indicator on the parent step.
- The
repeatEachIndexis shown in the test header when non-zero.
- Trace Viewer adds a pretty-print toggle for JSON / form request and response bodies in the network details panel.
Breaking Changes ⚠️
- Removed long-deprecated APIs:
Locator.ariaRef()— use the standard locator.ariaSnapshot() pipeline.handleoption onBrowserContext.exposeBindingandPage.exposeBinding.loggeroption onBrowserType.connectandBrowserType.connectOverCDP— use tracing instead.- Context options
videosPath/videoSize— userecordVideoinstead.
Browser Versions
- Chromium 148.0.7778.96
- Mozilla Firefox 150.0.2
- WebKit 26.4
This version was also tested against the following stable channels:
- Google Chrome 147
- Microsoft Edge 147
v1.59.1
Bug Fixes
- [Windows] Reverted hiding console window when spawning browser processes, which caused regressions including broken
codegen,--uiandshowcommands (#39990)
v1.59.0
🎬 Screencast
New page.screencast API provides a unified interface for capturing page content with:
- Screencast recordings
- Action annotations
- Visual overlays
- Real-time frame capture
- Agentic video receipts
Screencast recording — record video with precise start/stop control, as an alternative to the recordVideo option:
await page.screencast.start({ path: 'video.webm' });
// ... perform actions ...
await page.screencast.stop();Action annotations — enable built-in visual annotations that highlight interacted elements and display action titles during recording:
await page.screencast.showActions({ position: 'top-right' });screencast.showActions() accepts position ('top-left', 'top', 'top-right', 'bottom-left', 'bottom', 'bottom-right'), duration (ms per annotation), and fontSize (px). Returns a disposable to stop showing actions.
Action annotations can also be enabled in test fixtures via the video option:
// playwright.config.ts
export default defineConfig({
use: {
video: {
mode: 'on',
show: {
actions: { position: 'top-left' },
test: { position: 'top-right' },
},
},
},
});Visual overlays — add chapter titles and custom HTML overlays on top of the page for richer narration:
await page.screencast.showChapter('Adding TODOs', {
description: 'Type and press enter for each TODO',
duration: 1000,
});
await page.screencast.showOverlay('<div style="color: red">Recording</div>');Real-time frame capture — stream JPEG-encoded frames for custom processing like thumbnails, live previews, AI vision, and more:
await page.screencast.start({
onFrame: ({ data }) => sendToVisionModel(data),
size: { width: 800, height: 600 },
});Agentic video receipts — coding agents can produce video evidence of their work. After completing a task, an agent can record a walkthrough video with rich annotations for human review:
await page.screencast.start({ path: 'receipt.webm' });
await page.screencast.showActions({ position: 'top-right' });
await page.screencast.showChapter('Verifying checkout flow', {
description: 'Added coupon code support per ticket #​1234',
});
// Agent performs the verification steps...
await page.locator('#coupon').fill('SAVE20');
await page.locator('#apply-coupon').click();
await expect(page.locator('.discount')).toContainText('20%');
await page.screencast.showChapter('Done', {
description: 'Coupon applied, discount reflected in total',
});
await page.screencast.stop();The resulting video serves as a receipt: chapter titles provide context, action annotations highlight each interaction, and the visual walkthrough is faster to review than text logs.
🔗 Interoperability
New browser.bind() API makes a launched browser available for playwright-cli, @playwright/mcp, and other clients to connect to.
Bind a browser — start a browser and bind it so others can connect:
const { endpoint } = await browser.bind('my-session', {
workspaceDir: '/my/project',
});Connect from playwright-cli — connect to the running browser from your favorite coding agent.
playwright-cli attach my-session
playwright-cli -s my-session snapshotConnect from @playwright/mcp — or point your MCP server to the running browser.
@playwright/mcp --endpoint=my-sessionConnect from a Playwright client — use API to connect to the browser. Multiple clients at a time are supported!
const browser = await chromium.connect(endpoint);Pass host and port options to bind over WebSocket instead of a named pipe:
const { endpoint } = await browser.bind('my-session', {
host: 'localhost',
port: 0,
});
// endpoint is a ws:// URLCall browser.unbind() to stop accepting new connections.
📊 Observability
Run playwright-cli show to open the Dashboard that lists all the bound browsers, their statuses, and allows interacting with them:
- See what your agent is doing on the background browsers
- Click into the sessions for manual interventions
- Open DevTools to inspect pages from the background browsers.
- `playwright-cli` binds all of its browsers automatically, so you can see what your agents are doing.
- Pass `PLAYWRIGHT_DASHBOARD=1` env variable to see all `@playwright/test` browsers in the dashboard.
🐛 CLI debugger for agents
Coding agents can now run npx playwright test --debug=cli to attach and debug tests over playwright-cli — perfect for automatically fixing tests in agentic workflows:
$ npx playwright test --debug=cli
### Debugging Instructions
- Run "playwright-cli attach tw-87b59e" to attach to this test
$ playwright-cli attach tw-87b59e
### Session `tw-87b59e` created, attached to `tw-87b59e`.
Run commands with: playwright-cli --session=tw-87b59e <command>
### Paused
- Navigate to "/" at output/tests/example.spec.ts:4
$ playwright-cli --session tw-87b59e step-over
### Page
- Page URL: https://playwright.dev/
- Page Title: Fast and reliable end-to-end testing for modern web apps | Playwright
### Paused
- Expect "toHaveTitle" at output/tests/example.spec.ts:7📋 CLI trace analysis for agents
Coding agents can run npx playwright trace to explore Playwright Trace and understand failing or flaky tests from the command line:
$ npx playwright trace open test-results/example-has-title-chromium/trace.zip
Title: example.spec.ts:3 › has title
$ npx playwright trace actions --grep="expect"
# Time Action Duration
──── ───────── ─────────────────────────────────────────────────────── ────────
9. 0:00.859 Expect "toHaveTitle" 5.1s ✗
$ npx playwright trace action 9
Expect "toHaveTitle"
Error: expect(page).toHaveTitle(expected) failed
Expected pattern: /Wrong Title/
Received string: "Fast and reliable end-to-end testing for modern web apps | Playwright"
Timeout: 5000ms
Snapshots
available: before, after
usage: npx playwright trace snapshot 9 --name <before|after>
$ npx playwright trace snapshot 9 --name after
### Page
- Page Title: Fast and reliable end-to-end testing for modern web apps | Playwright
$ npx playwright trace close♻️ await using
Many APIs now return async disposables, enabling the await using syntax for automatic cleanup:
await using page = await context.newPage();
{
await using route = await page.route('**/*', route => route.continue());
await using script = await page.addInitScript('console.log("init script here")');
await page.goto('https://playwright.dev');
// do something
}
// route and init script have been removed at this point🔍 Snapshots and Locators
❗ Important
✂ PR body was truncated to here.
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.

Changes
- Root cause: the comparator in
HostRoutes.add()in@astrojs/underscore-redirectsonly compares weights when both are truthy (if (a.weight && b.weight)). A weight of0is falsy, so any comparison involving it returnsfalseand the definition is inserted before the existing ones.createRedirectsFromAstroRoutes()gives the/*404 fallback a weight of0so that it ends up last, but it is inserted at the top instead, above the weight 2 rules. Definitions added after it can also land above higher weighted ones, because comparing against the weight 0 entry returnsfalsetoo. - Fix: compare the weights whenever both are defined (
!== undefined), so0is treated as the lowest weight. Definitions without a weight keep their current behavior. - Added a changeset.
Testing
Added a test in packages/underscore-redirects/test/weight.test.ts that adds definitions with weights 2, 0 and 1 and checks they are ordered 2, 1, 0. Before the fix it fails with the order ['/c', '/*', '/a']. After the fix it passes, along with the rest of the package tests.
Docs
No docs needed, this is a bug fix with no change to the API.

Fixes #18195
Changes
@astrojs/cloudflarenow fails inastro:config:setupwhen the project root has awrangler.json,wrangler.jsonc, orwrangler.tomlbut nocloudflare.config.ts.- The error names the file it found and tells the user to run
npx cf migrate --bundler vite. - Before this change, such a project built without any warning. The generated Worker config used the
package.jsonname and lost the Wrangler file's compatibility date and flags, vars, bindings, and custom entrypoint. A follow-upcf deploywould publish that broken Worker. - Projects that already have
cloudflare.config.ts, with or without a leftover Wrangler file, are unaffected.
Testing
- Added unit tests in
test/cloudflare-config.test.ts: each Wrangler file name withoutcloudflare.config.tsthrows, a Wrangler file next tocloudflare.config.tspasses, and an empty root passes. With the check disabled, the three throw cases fail. - Ran the full
@astrojs/cloudflaretest suite: 387 passing, 0 failing. No adapter fixture has a Wrangler file withoutcloudflare.config.ts;vitest-actionshas one but doesn't use the adapter. - Built the reproduction from #18195 with the patched adapter: it now stops with the migration message, and builds normally after adding a
cloudflare.config.ts.
Docs
No docs change in this PR. The new Cloudflare adapter page from withastro/docs#14614 removes the wrangler.jsonc examples but doesn't mention cf migrate; a short upgrade note pointing to npx cf migrate --bundler vite would help. --bundler vite matters because cf migrate otherwise picks the Wrangler bundler for Astro projects, since @cloudflare/vite-plugin is only a transitive dependency.
/cc @withastro/maintainers-docs for feedback!
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@astrojs/starlight@0.42.6
Patch Changes
-
#4252
40a2584Thanks @olafur-andri! - Adds Icelandic language support -
#4229
e4a3d82Thanks @HiDeoo! - Fixes a potential issue with icons being cut off in Firefox when pinch-zooming. -
#4226
fb562ddThanks @HiDeoo! - Fixes an issue where pages not importing components from@astrojs/starlight/componentsincluded styles of Starlight components used on other pages. -
#4250
531af7dThanks @HiDeoo! - FixesFailed to resolve dependencywarnings logged when running the development server in projects using the Cloudflare adapter. -
#4229
e4a3d82Thanks @HiDeoo! - Fixes thecodePenandnodeicons slightly extending beyond their bounding box.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@astrojs/starlight@0.42.5
Patch Changes

Changes
- The
fixWinEPERMSynchelper inpackages/astro/src/core/fs/index.tscalledfs.rmdirSync(p, options)withrecursive: trueas a fallback whenfs.rmSyncthrew EPERM on Windows. Node.js 25 removed support forrecursiveonrmdirSync(DEP0147), so that fallback threwERR_INVALID_ARG_VALUEinstead of recovering, causingastro buildto fail whenever another process briefly held a file indist/. The directory branch now callsfs.rmSync(p, options), which accepts the same options and is the modern replacement. - The parameter type of
fixWinEPERMSyncchanges fromfs.RmDirOptionstofs.RmOptionsto reflect the corrected API.
Testing
- Added
packages/astro/test/units/fs/empty-dir.test.ts, which fakesprocess.platform = 'win32', makesfs.rmSyncthrow EPERM once, and asserts thatemptyDirstill clears the directory. The test fails without the fix and passes with it on both Node 22 and Node 26.
Docs
- No docs update needed; this is an internal Windows/Node compatibility fix with no user-facing API change.
Closes #18170
Last fetched: | Scheduled refresh: Every Saturday
See Customizing GitHub Activity Pages to configure your own
Inspired by prs.atinux.com

