Skip to content

AstroEco is Contributing…

Display your GitHub pull requests using astro-loader-github-prs

withastro/astro

Changes

  • astro:content builds render with a factory call since #17818 (7.3.0): export const render = createRenderEntry({ logger }). The bundler keeps unannotated calls, so renderEntry stays in every server bundle that imports astro:content. Its dynamic import('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 call render(), every entry rendered by prerendered pages is still compiled into the server output. In 7.2, renderEntry was a plain exported function and was tree-shaken.
  • This marks the factory call /* @__PURE__ */, so an unused render is dropped again. Bundles that do use render() 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.ts with a fixture that has two MDX entries, a prerendered page that renders them with render(), and an on-demand page that only calls getCollection(). The test asserts that no server chunk contains an entry's compiled body, and that both pages render. The fixture uses retainBody: 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_*.mjs contains the entry.
    • With the change, it passes.
  • test/content*.test.ts, test/ssr-prerender*.test.ts, test/server-islands.test.ts, test/csp-server-islands.test.ts and test/live-*.test.ts all pass (80/80).

Docs

No docs needed: this is a bundle-size fix with no API or behavior change.

Made with AI.

withastro/astro

Changes

  • Fixes #18418 by preserving component-rendered <link> tags (such as stylesheets and preconnect hints) in @astrojs/react island 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 including stylesheet and preconnect, 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.ts to 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/react test 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.

withastro/astro

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 as matchRoute.
withastro/astro

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.ts covering post-[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.
withastro/astro

Changes

  • Fixes an unhandled TypeError: Cannot convert undefined or null to object when calling route.generate() or getRouteGenerator()(/* no args */) on static routes without arguments (fixes #18528).
  • Defaults params to {} in getRouteGenerator and safely coalesces params ?? {} when passing to sanitizeParams.
  • Added patch changeset .changeset/quiet-routes-generate.md.

Testing

  • Added unit tests in packages/astro/test/units/routing/generator.test.ts verifying generator() and generator(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.

withastro/astro

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 caused ReferenceError: process is not defined in the browser for any code that reads process.env at import time (e.g. @vuetify/v0).
  • The define is now applied only to the ssr and prerender Vite environments, mirroring how the globalThis.process banner 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.ts that builds a fixture containing a client-only component that references process.env.* and asserts the output chunk does not contain a bare process.env reference.

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

withastro/astro

Changes

  • astro info no longer triggers the DEP0190 Node.js deprecation warning on Node 24+. The warning was caused by passing an args array to tinyexec with shell: true, which Node 24 flags as a security risk. Removing shell: true is safe because tinyexec already handles Windows .cmd shims without it, matching how astro add already invokes package managers.
  • Drops the now-unused shell option from CommandExecutorOptions and TinyexecCommandExecutor.

Testing

  • Adds packages/astro/test/units/cli/info.test.ts covering that the npm, pnpm, and yarn package-manager executors do not pass shell: true to the underlying command executor.

Docs

  • No docs update needed; this is an internal implementation fix with no user-facing API change.

Closes #18485

withastro/astro

Changes

  • Astro's bundled .astro components (ClientRouter.astro, Code.astro, Debug.astro, Image.astro, Picture.astro) now compile cleanly under every option in astro/tsconfigs/strictest. With @astrojs/ts-content-mapper, tsc type-checks .astro source files in node_modules using the project's own compiler options — meaning skipLibCheck does not apply — so projects extending strictest previously saw 9 unavoidable errors they could not fix.
  • The two strictest options responsible were exactOptionalPropertyTypes (7 errors across Code.astro, Image.astro, Picture.astro) and noUncheckedIndexedAccess (2 errors in ClientRouter.astro, Debug.astro). Each component was updated to satisfy those constraints.

Testing

  • No dedicated test files were added; the correctness is verified by tsc itself passing on the fixed components under strictest. The existing component type-check coverage in CI did not previously include packages/astro/components/*.astro under the strictest preset, 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

withastro/astro

Changes

  • Cached 404/500 responses with a null body are no longer stored in the memory provider. Previously, serializeResponse() converted the null body to an empty ArrayBuffer, so cache hits returned an empty response body instead of the rendered error page (which the router could only produce when response.body === null).
  • Adds an isErrorPageReroute() guard in core/cache/memory-provider.ts that skips caching (and deletes any stale SWR entry) when the response has a reroutable status (404 or 500) and a null body. One trade-off: endpoints that return an empty 404/500 with skipErrorReroute will 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.ts covering 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

withastro/astro

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() threw DataCollectionEntryParseError ("Unexpected token ... is not valid JSON", the token being the invisible BOM) and file() logged "Error reading data" and dropped the whole collection.
  • Strip a leading BOM before JSON.parse in the .json data entry type, and when the file() 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.

withastro/astro

Changes

  • String tag names (.astro dynamic 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.
withastro/astro

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 age confidence

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

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

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

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

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

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

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

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

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

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Release Notes

nodejs/undici (undici)

v8.12.2

Compare Source

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

Compare Source

What's Changed

New Contributors

Full Changelog: nodejs/undici@v8.12.0...v8.12.1

v8.12.0

Compare Source

What's Changed

New Contributors

Full Changelog: nodejs/undici@v8.11.2...v8.12.0

v8.11.2

Compare Source

What's Changed

New Contributors

Full Changelog: nodejs/undici@v8.11.1...v8.11.2

v8.11.1

Compare Source

What's Changed

Full Changelog: nodejs/undici@v8.11.0...v8.11.1

v8.11.0

Compare Source

What's Changed

[!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.

withastro/astro

Changes

  • Passes the issue author login to the needs-repro step through env: and reads it as $USER_LOGIN in the script.

Testing

  • None, CI-only change.

Docs

  • Not needed.
withastro/astro

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.

withastro/astro

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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@netlify/blobs (source) ^11.1.4 → ^11.1.6 age confidence
@netlify/functions (source) ^6.0.2 → ^6.0.3 age confidence
devalue ^6.0.2 → ^6.0.3 age confidence

Release Notes

netlify/primitives (@​netlify/blobs)

v11.1.6

Compare Source

Dependencies
  • The following workspace dependencies were updated

v11.1.5

Compare Source

Dependencies
netlify/primitives (@​netlify/functions)

v6.0.3

Compare Source

Dependencies
  • The following workspace dependencies were updated

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
devalue ^6.0.2 → ^6.0.3 age confidence
linkedom ^0.18.13 → ^0.18.14 age confidence
preact (source) ^11.0.1 → ^11.0.2 age confidence

Release Notes

WebReflection/linkedom (linkedom)

v0.18.14

Compare Source

preactjs/preact (preact)

v11.0.2

Compare Source

Fixes

Types

Performance

Maintenance


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

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:

  1. The head writes a placeholder comment where the CSP <meta> tag belongs.
  2. After rendering completes, renderPage replaces 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.

withastro/astro

Changes

  • In astro dev, view-transition-name styles generated by transition:name are 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 stay propagation: 'none' because Dot.astro's metadata wasn't available yet at resolveId time, causing the transition scope style to arrive too late and be dropped from <head>.
  • The transform hook in packages/astro/src/vite-plugin-head/index.ts now walks a module's importers (and their ancestors) and marks them in-tree when the transformed module carries self/in-tree propagation. This mirrors the full-graph analysis that astro build already performs, making dev behaviour consistent.

Testing

  • New unit test added in packages/astro/test/units/vite-plugin-head/head-metadata.test.ts covering the case where a transition:name component is reached only through a non-propagating parent — verifying that the parent is correctly promoted to in-tree propagation 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

withastro/astro

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 .tif and renders it with <Image>. In dev, the test checks that format is 'tiff', that width/height are read from the file, and that the optimized src loads.
  • Unit (test/units/assets/utils.test.ts): imageSrcToImportId (used for content collection images) returns an import ID for ./photo.tif, where it previously returned undefined.

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.

withastro/astro

Changes

  • <ClientRouter /> now passes behavior: 'instant' to all scroll-restore scrollTo calls in moveToLocation() and on page reload. Previously, omitting behavior caused these calls to inherit CSS scroll-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 these scrollTo calls.

Testing

  • Added an e2e test in packages/astro/e2e/view-transitions.test.ts covering back/forward scroll restoration with scroll-behavior: smooth applied to html. The test asserts that scrollY reaches 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

withastro/astro

Changes

  • <Picture> no longer emits a duplicate 1x candidate in <source> srcset when densities includes 1. Previously, the component always prepended a plain (descriptorless, implicitly 1x) image.src to the srcset, and then getSrcSet would also produce an explicit 1x entry 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 1x entry. This preserves existing behavior for densities={[2]} (the base candidate is still included as the implicit 1x fallback) while eliminating the duplicate when densities={[1, 2]}.

Testing

  • Added a fixture case in packages/astro/test/core-image.test.ts asserting that densities={[1, 2]} produces exactly 1x, 2x in 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

withastro/astro

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: Added copyTimestamps(srcDir, destDir). It walks srcDir recursively and for each file calls fs.promises.utimes(destFile, atime, mtime) to copy the timestamp from the source tree. Files missing in destDir (e.g. files filtered by Vite) are silently skipped via ENOENT handling.

  • packages/astro/src/core/build/static-build.ts: After the client bundle build, calls copyTimestamps(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 call fontFetcher.fetch() (which populates the disk cache), then copyCachedFile(cacheFile, destFile) instead of writeFileSync(destFile, data). copyCachedFile already calls utimes after copying, so the cache mtime is preserved end-to-end. Dropped the unused writeFileSync import.

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

withastro/starlight

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

  • #4295 af9557e Thanks @delucis! - Fixes a formatting issue in some error messages impacting projects with Zod ≥4.5 installed

  • #4299 a103f38 Thanks @clean99! - Fixes empty sidebars when autogenerating entries from the docs root directory using directory: ''

withastro/astro

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 the widths branch 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.ts covering 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

withastro/starlight

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.

withastro/astro

Changes

  • Failed fetch() calls in the generated server island client script no longer surface as Uncaught (in promise) TypeError. Previously, when a fetch rejected (network drop, aborted navigation, blocked cross-origin redirect), the top-level await in 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(() => {}), and replaceServerIsland returns early on a missing response or a failed r.text() read, keeping the fallback silently.
  • The return statement 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.ts to cover the case where fetch rejects, 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

withastro/astro

Changes

  • Astro 7.4.2 raised the Node.js minimum to >=22.23.4 for a security patch release, which broke StackBlitz WebContainers (stuck on Node 22.22.3 with no user control). Every astro command 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.webcontainer is set, the CLI uses >=22.22.0 instead 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.mjs with no importable surface, and CI's Node versions (22.23.4 and 24) can't reproduce the failure path. The fix was verified by simulating process.versions.webcontainer against the version satisfier.

Docs

  • No docs update needed; this is a CLI compatibility guard with no user-facing API change.

Closes #18492

withastro/astro

Changes

  • Unused Astro components imported through a barrel file no longer contribute their scoped CSS to the bundle. In Rolldown (Astro 7), $$createComponent calls were not treated as pure, so Rolldown marked the component's default export as rendered even when nothing on the page actually used it — causing Vite's cssScopeTo tree-shaking to keep the associated CSS. Setting treeshake.manualPureFunctions: ['$$createComponent'] in the Rolldown options lets Rolldown drop those unused exports and Vite then drops their scoped styles.
  • User-supplied treeshake options are merged in so custom configurations are preserved; treeshake: false is left untouched.

Testing

  • A new unit test in packages/astro/test/units/build/vite-build-config.test.ts checks that $$createComponent appears in manualPureFunctions in the generated Rolldown options.
  • The existing barrel-styles integration fixture (packages/astro/test/fixtures/0-css/.../barrel-styles) gains a new assertion in packages/astro/test/0-css.test.ts covering components whose frontmatter references Astro.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

withastro/astro

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.sarif

Supported 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 reporters array in the JavaScript API, plus reporter/reporterFile for a single output. Include a minor changeset for @astrojs/check and 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.

withastro/astro

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
withastro/starlight

Description

  • Closes #4289
  • With lastUpdated enabled, production builds read file names from git 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" for café.md. These names never matched the page file paths, so pages such as zh-cn/指南.md rendered without a last updated date. The development server was not affected.
  • This PR runs the command with -c core.quotePath=false so git prints these file names verbatim.
  • The existing getAllNewestCommitDate tests now include a file with non-ASCII characters in its name. Both tests fail without the fix and pass with it.
  • No visual changes.
withastro/astro

Summary

  • Apply host validation to Astro development request handling.
  • Fall back to the local host when allowedDomains is 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.

withastro/astro

Changes

  • Fixes duplicate React.useId() values when experimentalDisableStreaming is enabled. renderToString was called without the per-component identifierPrefix, so every component started from the same id, and islands hydrated with a prefix the server HTML did not have.
  • Passes the existing renderOptions to renderToString, as the streaming paths already do. #6976 added the prefix for #6849 before the option from #13036 existed.

Testing

  • Adds react-disable-streaming.test.ts with a fixture that renders a useId component twice statically and twice with client:idle. It checks that the ids are unique and that each island id contains the island's prefix.

Docs

  • No docs update needed, because the option and its documented behavior do not change.

Fixes #18498

withastro/astro

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

withastro/astro

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 e4e25fa Thanks @umeraamir69! - CSP no longer hashes empty children on external stylesheets and scripts, which was inserting the SHA-256 of the empty string into script-src and style-src.

  • #18500 e5a3a1b Thanks @astro-factory! - Fixes <Image> and <Picture> emitting duplicate srcset candidates when densities contains equivalent values such as 1 and '1x'

  • #18517 c3185b7 Thanks @okxint! - Fix unhandled AbortError rejection when ClientRouter skips a pending view transition

  • #18497 c712113 Thanks @astro-factory! - Fixes an uncaught TypeError in the browser when a server:defer island request fails due to a network error. The fallback content is kept, as it is for non-200 responses.

  • #18525 d0240b9 Thanks @astro-factory! - Fixes a DEP0190 deprecation warning printed by astro info on Node.js 24 and later

  • #18511 d060ff9 Thanks @astro-factory! - Fixes transition:name styles missing in dev when the element is inside a component that is only rendered through another component with no styles or scripts

  • #18494 5fe699c Thanks @astro-factory! - Fixes the astro CLI refusing to run on StackBlitz by allowing Node.js >=22.22.0 inside WebContainers, whose Node.js version users cannot change

  • #18506 bf43a60 Thanks @astro-factory! - Fixes <ClientRouter /> animating scroll restoration on back/forward navigation when scroll-behavior: smooth is set. Saved scroll positions are now restored instantly, matching the browser's native behavior.

  • #18476 8ea79a2 Thanks @astro-factory! - Fixes a DataCloneError crash when building pages that render SVG imports with <Image /> or getImage() while experimental.parallelPrerender is enabled.

  • #18504 6dbd737 Thanks @astro-factory! - Fixes <Picture> emitting a duplicate 1x candidate in <source> srcset when densities includes 1

  • #18524 7524889 Thanks @astro-factory! - Fixes type errors reported in Astro's built-in <Image />, <Picture />, <Code />, <Debug /> and <ClientRouter /> components when type-checking a project that extends astro/tsconfigs/strictest with tsc and @astrojs/ts-content-mapper

  • #18493 3773941 Thanks @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 1151b9e Thanks @jp-knj! - Fixes CSP hashes added with Astro.csp from 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

  • edfbf4a Thanks @matthewp! - Fixes Prism code blocks for languages Prism doesn't support, such as vue or svelte. Their code is now displayed as plain text instead of being rendered as HTML. Also correctly escapes the code block language in the generated class and data-language attributes.

@astrojs/cloudflare@14.4.3

Patch Changes

  • #18526 d0504c2 Thanks @astro-factory! - Fixes process is not defined errors in client-side scripts and islands that reference process.env. The adapter's process.env define 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

  • edfbf4a Thanks @matthewp! - Fixes Prism code blocks for languages Prism doesn't support, such as vue or svelte. Their code is now displayed as plain text instead of being rendered as HTML. Also correctly escapes the code block language in the generated class and data-language attributes.
  • 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 9c88994 Thanks @wrostomMM! - Fixes duplicate React.useId() values across components when experimentalDisableStreaming is enabled

@astrojs/solid-js@7.1.2

Patch Changes

  • 290b196 Thanks @matthewp! - Escapes slot names when rendering the slot wrapper elements for Solid components

@astrojs/svelte@9.1.2

Patch Changes

  • 5e47636 Thanks @matthewp! - Escapes slot names when rendering the slot wrapper elements for Svelte components

@astrojs/vercel@11.0.17

Patch Changes

  • #18085 785473b Thanks @nikolas-sapa! - Fix redirects never matching on Vercel when trailingSlash: '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

  • edfbf4a Thanks @matthewp! - Fixes Prism code blocks for languages Prism doesn't support, such as vue or svelte. Their code is now displayed as plain text instead of being rendered as HTML. Also correctly escapes the code block language in the generated class and data-language attributes.
  • Updated dependencies [edfbf4a]:
    • @astrojs/prism@4.1.2

@astrojs/markdown-satteri@0.4.6

Patch Changes

  • edfbf4a Thanks @matthewp! - Fixes Prism code blocks for languages Prism doesn't support, such as vue or svelte. Their code is now displayed as plain text instead of being rendered as HTML. Also correctly escapes the code block language in the generated class and data-language attributes.
  • Updated dependencies [edfbf4a]:
    • @astrojs/prism@4.1.2

@astrojs/telemetry@3.4.2

Patch Changes

  • #18481 6cf3423 Thanks @Princesseuh! - Avoids blocking Astro commands while looking up the anonymous project ID, by running git asynchronously. Events recorded at the same time now share a single lookup.
withastro/astro

Changes

  • SVG imports are Astro component functions with image metadata attached. When experimental.parallelPrerender is on, the prerender worker sends collected static-image transforms to the main thread via postMessage, which uses structured cloning — functions cannot be cloned, causing a DataCloneError. resolveStaticImage() now detects when transform.src is 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.ts covering the case where an SVG component function is passed as src, 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

withastro/astro

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

withastro/docs#14761

withastro/astro

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 high reports no findings.
  • Biome and Prettier checks pass.

Docs

No documentation changes. This is repository automation.

AI was used to write this change.

withastro/astro

Changes

  • Running astro sync, astro check, or astro build while astro dev is active no longer wipes out the running dev server's node_modules/.vite/deps_ssr, preventing 500 errors on the next HMR reload.
  • cfPrismPlugin now checks the adapter's isTypeGenPhase flag before appending include: ['prismjs/components/prism-*.js'] to the SSR environment's optimizeDeps. During type generation, the Prism glob is omitted so Vite honours the noDiscovery: 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 that cfPrismPlugin does not inject the Prism include entries when isTypeGenPhase is 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

withastro/astro

Changes

  • @astrojs/upgrade [version] now pins packages to the requested exact version instead of silently falling back to latest. resolveTargetVersion() previously only checked the argument against npm dist-tags; an exact semver like 7.3.8 never matched, so the CLI always resolved to latest with no warning.
  • The fix consults the versions map 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.ts covering: exact version resolves correctly, unknown version falls back to latest, 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

withastro/astro

Changes

  • Fixes astro dev rendering prerendered pages through productionEnvironment (instead of the dev render environment) when a custom src/fetch.ts is used with @astrojs/cloudflare and prerenderEnvironment: "node". This caused pages with hoisted <script> tags or hydrated islands to be truncated with Unable to resolve [...] errors.
  • The Cloudflare adapter no longer adds Astro core packages (astro, astro/fetch, astro/app, etc.) to optimizeDeps.include for the Node prerender environment. Previously those entries caused Vite to bundle a separate copy of those modules in node_modules/.vite/deps_prerender, giving new FetchState(request) its own empty copy of the environments WeakMap and making it fall back to productionEnvironment. The workerd prerender environment retains its include list unchanged.

Testing

  • Adds a test in packages/integrations/cloudflare/test/typegen-phase.test.ts covering the case where prerenderEnvironment: "node" is combined with a custom src/fetch.ts, asserting that the dev server renders the full page without Unable to resolve errors.

Docs

  • No docs update needed; this is a dev-server rendering correctness fix with no change to public API or configuration options.

Closes #18457

withastro/astro

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 f170236 Thanks @ematipico! - Updates the @cloudflare/vite-plugin to the latest. The dependency isn't pinned anymore.
withastro/astro

Changes

  • sharpImageService({ ...options }) options are now preserved when the Cloudflare adapter's imageService: 'compile' mode replaces the build service. Previously, hasUserImageService() returned false for Sharp (no runtime key), causing the adapter to substitute a bare { entrypoint: 'astro/assets/services/sharp' } build service with no config, silently dropping user-supplied options like avif.effort.
  • The fix copies the user's Sharp config into 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.ts covering the case where sharpImageService() is configured with options and imageService: 'compile' is set, asserting that the resolved build service retains the user's config.

Docs

  • No docs update needed; this is a bug fix restoring previously documented behaviour, with no API changes.

Closes #18437

withastro/astro

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

withastro/astro

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 dda9ec3 Thanks @Abhirup-99! - Speeds up content sync with experimental.collectionStorage: "chunked" by computing each character's UTF-8 width from its code point instead of encoding every character through TextEncoder. 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 5e0eaa4 Thanks @astro-factory! - Fixes astro dev with @astrojs/cloudflare failing with Calling `require` for "node-fetch" when a server dependency such as cross-fetch requires node-fetch

  • #18376 a4e201d Thanks @okxint! - Fixes astro dev treating 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, preventing astro dev stop and astro dev --force from killing the unrelated process that owns the thread.

  • #18467 d1fb7d3 Thanks @astro-factory! - Fixes the defineConfig() types for i18n.defaultLocale, i18n.fallback, and i18n.domains so they accept a custom locale's path instead of its codes, matching how Astro validates and uses these values

  • #18475 cf27e70 Thanks @ematipico! - Bumps the minimum supported Node.js version to 22.23.4, which includes the fixes from the October 2026 Node.js security releases

    This 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 7a0ba6f Thanks @DenisCDev! - Fixes astro sync, astro check and astro build replacing 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 e943003 Thanks @astro-factory! - Fixes inline styles in dev so that framework-transformed CSS is used, such as scoped styles and v-bind() in Vue single-file components

  • #18399 829fc00 Thanks @astro-factory! - Fixes a dev server error (Could not find server component name) for a server:defer island that imports astro:actions or astro:config/server, when its page was not the first island page loaded after starting the server

  • #18330 4db9e0d Thanks @Samuteg! - Fixes the astro:env/server virtual 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 to String.replace, so e.g. the KITTY_PUBLIC_KEY value set by default in Kitty terminals corrupted the module and broke dev with Failed 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

create-astro@5.3.1

Patch Changes

@astrojs/cloudflare@14.4.2

Patch Changes

  • #18422 07700d4 Thanks @cyface! - Fixes the /_image endpoint returning a 500 error when href points to a missing file or a file that isn't an image. It now responds with a 404 or 400 instead.

  • #18465 f31f143 Thanks @astro-factory! - Fixes a custom src/fetch.ts rendering truncated pages without islands or hoisted scripts in astro dev when prerenderEnvironment: 'node' is set

  • #18461 8b77891 Thanks @astro-factory! - Fixes options passed to sharpImageService() being ignored when generating images at build time with imageService: 'compile'

  • #18468 119263a Thanks @astro-factory! - Fixes astro sync, astro check, and astro build overwriting the dependency cache of a running astro dev server, 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

@astrojs/mdx@8.1.1

Patch Changes

@astrojs/partytown@2.1.9

Patch Changes

  • #18439 3e80f04 Thanks @hanford! - Updates Partytown to 1.0.1, which preserves queued events when falling back to the main thread with dataLayer.push forwarded using preserveBehavior.

@astrojs/preact@6.1.1

Patch Changes

@astrojs/react@7.1.1

Patch Changes

@astrojs/solid-js@7.1.1

Patch Changes

@astrojs/svelte@9.1.1

Patch Changes

@astrojs/vue@7.1.2

Patch Changes

@astrojs/check@0.9.12

Patch Changes

  • #18455 7af66fc Thanks @astro-factory! - Fixes the astro-check binary ignoring its first two command-line arguments, so flags such as --help, --root, --watch, and --tsconfig are 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 044148d Thanks @Princesseuh! - Speeds up astro check by 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

@astrojs/upgrade@0.8.1

Patch Changes

withastro/astro

Changes

  • bin/astro-check.js was passing process.argv.slice(2) to parseArgsAsCheckConfig(), 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 --help ran diagnostics instead of printing help, and astro-check --root src ignored --root). The binary now passes the full process.argv, matching how parseArgsAsCheckConfig() is documented and how the astro check CLI caller works.
  • The packages/astro build script used astro-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 --help and 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

withastro/starlight

Description

  • Closes #
  • Manual sidebar links such as { label: 'Tabs', link: '/guides/components/#tabs' } are run through formatPath(), which adds the trailing slash or .html extension to the end of the whole string. With trailingSlash: 'always' this produces /guides/components/#tabs/, and with build.format: 'file' it produces /guides/components/#tabs.html, so the link no longer targets the section.
  • formatPath() now splits off any ?query or #hash suffix, 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.ts covering hashes and query strings for directory with always and never, and for file. They fail on main and pass with this change. The full packages/starlight unit suite passes.
  • Includes a patch changeset.

Fixes #4286

withastro/starlight

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.

withastro/astro

Changes

  • astro sync (also run by astro check and astro build) creates a temporary Vite server with optimizeDeps: { noDiscovery: true }. Astro itself (dev toolbar deps) and integrations such as @astrojs/react and @astrojs/preact add optimizeDeps.include entries, 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 running astro dev reads from. The dev server's optimized dependencies were replaced with ones built by the temporary server, for example React's production jsx-dev-runtime where jsxDEV is undefined, and islands broke with _jsxDEV is not a function or Invalid hook call until the dev server was restarted with --force.
  • The temporary server now uses its own Vite cacheDir, <cacheDir>/vite-sync/ under Astro's cacheDir. 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 placeholder node_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 in sync/index.ts it 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): with astro dev running, node_modules/.vite/deps is no longer modified by astro sync, astro check or astro build, and sync's output goes to node_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.

withastro/astro

Changes

  • The --preserveWatchOutput description in @astrojs/check previously 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 is false (default) and preserves output when true, so only the help string was wrong. Changed "false" to "true" in the description.
  • No behavior change; only the text shown by astro check --help is affected.

Testing

  • No test changes. The existing test/parseArgs.test.ts already 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

withastro/astro

Changes

  • astro check --watch no longer exits immediately when the project is located in a directory whose name contains node_modules or .git. Previously, chokidar's ignored callback 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_modules and <root>/.git sub-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 contains node_modules and that actual node_modules/.git sub-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

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@playwright/test (source) 1.64.0 → 1.64.1 age confidence

Release Notes

microsoft/playwright (@​playwright/test)

v1.64.1

Compare Source

Bug Fixes
  • #​43247 [Bug]: _electron.launch intermittently loses a packaged app's first window since 1.64.0
  • #​43242 [Regression]: Chromium 155+ aborts a preflighted cross-origin redirect whenever any route is registered (net::ERR_ABORTED)

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
devalue ^6.0.2 → ^6.0.3 age confidence
fastify (source) ^5.12.5 → ^5.12.7 age confidence

Release Notes

sveltejs/devalue (devalue)

v6.0.3

Compare Source

Patch Changes
  • 5cd712a: perf: use native JSON.stringify for strings that need escaping, instead of a per-character loop
  • b49ae34: chore: lower required node version to >=18
  • c411e5e: fix: use explicit .js extension in type imports for nodenext compatibility
fastify/fastify (fastify)

v5.12.7

Compare Source

Full Changelog: fastify/fastify@v5.12.6...v5.12.7

v5.12.6

Compare Source

⚠️ Security Release
What's Changed

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)
  • 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.

withastro/astro

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-scripts
  • pnpm 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 publint
  • pnpm format and pnpm lint:ai — passed; the existing language-server test fixture still emits its noConsole warning.
  • pnpm exec changeset status confirms 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.

withastro/astro

Changes

  • astro dev with the Cloudflare adapter no longer crashes with Calling \require` for "node-fetch"when a CJS dependency (e.g.cross-fetch) requires node-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-coded optimizeDeps.exclude list 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 client optimizeDeps config and was never intended for workerd ssr environments.

Testing

  • Adds a unit test in packages/astro/test/units/vite-plugin-environment/server-entries.test.ts covering that node-fetch is no longer excluded from optimizeDeps for 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

withastro/astro

Changes

  • @astrojs/upgrade now reads the package manager's release age policy (npm min-release-age, pnpm minimum-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 minimumReleaseAge error message in install.ts is unchanged. It remains as a fallback for cases where detection misses the policy. It matches on a plain MINIMUM_RELEASE_AGE substring without checking the package manager name. That is pre-existing and left alone here; a ctx.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 or null values, a failing config command, and unsupported package managers.
Screenshot 2026-10-18 at 14 28 45 Screenshot 2026-10-18 at 14 21 43

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.

withastro/astro

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.domains and image.remotePatterns. Both fail without the fix. All 12 tests in test/units/assets/remote.test.ts pass 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 entry without the stale-cache warning.

Docs

No documentation changes are needed, as this fix corrects existing behavior without introducing new configuration options.

withastro/starlight

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

withastro/astro

Changes

  • loadSharp() threw MissingSharp for any failed import('sharp'), dropping the original error. It's now passed as the cause, 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 microarchitecture when 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 under qemu-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 MissingSharp error 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.

withastro/astro

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.

withastro/astro

Changes

Fixes #18429.

  • getChunkEnd() in data-store-writer.ts called TextEncoder.encode() once per character of the serialized store, only to learn that character's UTF-8 byte width. With experimental.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-prof on astro sync).
  • The width is fully determined by the code point, so compute it arithmetically: < 0x80 → 1, < 0x800 → 2, < 0x10000 → 3, else 4. Lone surrogates fall in the 3-byte branch, which matches the U+FFFD (3 bytes) that TextEncoder substitutes for them, so the two agree on every input.
  • Output is byte-identical: endIndex and bytes are 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 chunkString tests unchanged and pass.
  • Differential fuzz of the original vs. the arithmetic getChunkEnd on ~25M cases (ASCII, 2/3-byte BMP, boundary values, astral pairs, lone/reversed surrogates, U+FFFD, NUL; maxBytes 1–1000; arbitrary start offsets including mid-pair), comparing both return values and the full chunkString() 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

withastro/astro

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 the bundle object inside generateBundle, which caused the cssScopeTo recovery path in astro:rollup-plugin-build-css to 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 to bundle.

Testing

  • Re-enabled the existing integration test packages/integrations/svelte/test/conditional-rendering.test.ts, which had been skipped with a TODO(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

withastro/astro

Changes

  • renderChunk in vite-plugin-server-islands now returns early unless chunk.moduleIds includes \0virtual:astro:server-island-manifest. Previously the hook ran on every chunk containing the $$server-islands-map$$ marker. When a page imported astro/config, Rolldown bundled the server-islands plugin's own source into chunks/create-vite_*.mjs, the hook rewrote the plugin's serverIslandPlaceholderMap string 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.ts to 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

withastro/astro

Changes

  • Cached image files copied into dist/ now keep the source file's mtime on all platforms. Previously, Node's copyFile reset the timestamp to the current time on Linux and Windows; only macOS happened to preserve it via clonefile(2) when COPYFILE_FICLONE was used.
  • A new copyCachedFile helper in packages/astro/src/core/fs/index.ts wraps copyFile (with COPYFILE_FICLONE) and immediately applies the source atime/mtime via stat + 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's mtime matches the source file's mtime to the millisecond after copyCachedFile runs.

Docs

  • No docs update needed; this is an internal build-time behaviour fix with no user-facing API change.

Closes #18402

withastro/astro

Changes

  • Style-only HMR in .astro components now correctly hot-updates CSS instead of falling back to a full page reload when a PostCSS plugin (e.g. @unocss/postcss with @apply) lists the processed file as a dependency of itself.
  • The first loop in handleHotUpdate now skips the case where astroFile === ctx.file. Previously, when a component's own CSS dependency list included itself, the loop would delete the component's compile metadata, causing isStyleOnlyChanged to 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.ts covering 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

withastro/astro

Changes

Fixes #18421

  • transform(): a local href whose ASSETS fetch isn't ok now returns 404, 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 returns 400 instead 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.ok check in transform() has no unit test. That module imports astro:assets, which is why the existing tests target transformStream directly. 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 test in packages/integrations/cloudflare: 403/417 pass. The 1 failure (server-island / framework dev tests) also fails on main without 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

withastro/astro

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.ts that 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

withastro/astro

Changes

  • Fixes the @astrojs/node standalone startup log being skipped on Node 26.12 when HOST is an IP literal: the log handler waits for the listening event 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 logListeningOn covering the already-listening case; hardened so the server is closed in an after() hook (the previous version hung the test runner when the assertion failed).

Docs

  • No docs update needed — startup log behavior only.
withastro/astro

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 variable warning).
  • 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.
withastro/astro

Changes

  • Fixes a build failure ("Unterminated string") when a page imports astro/config: the server-islands renderChunk rewrite could run on the bundled plugin source itself, leaving a quoted placeholder unterminated in a create-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 renderChunk covering chunks that do not contain the manifest module.

Docs

  • No docs update needed — build-internal fix.
withastro/astro

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 via utimes; 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.ts verifying copied contents and restored mtime.

Docs

  • No docs update needed — internal build-output behavior only.
withastro/astro

Changes

  • Fixes @astrojs/vue SSR 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.
  • StaticHtml now converts slot content with String() before setting innerHTML, making Vue SSR render it as one string. Output markup is unchanged.

Testing

  • Adds test/units/static-html.test.ts verifying slot HTML is rendered as a single string.

Docs

  • No docs update needed — no user-facing behavior or markup change.
withastro/astro

Changes

  • Stops style-only HMR from falling back to a full page reload when a PostCSS plugin (e.g. @unocss/postcss with @apply) lists the component as its own dependency.
  • handleHotUpdate now 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.ts covering style-only updates when the CSS dependency list contains the file itself.

Docs

  • No docs update needed — dev-mode HMR behavior only.
withastro/astro

Changes

  • Deploys with Vercel's Bun runtime when the project is built with Bun: the adapter reads process.versions.bun and writes a bun1.x runtime into .vc-config.json instead 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.x to its current Bun version (1.3.x today).
  • A user-facing runtime config option is left as a follow-up.

Testing

  • Adds test/units/runtime.test.ts for the new getRuntime() export: Bun build → bun1.x, Node build → unchanged nodejs*.x.

Docs

  • No docs update needed for this patch; the runtime option follow-up would ship with its own docs.
withastro/astro

Changes

  • Fixes vercel redirects not matching under trailingSlash: 'always': @vercel/routing-utils emits 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 .html URLs 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.ts covering static, dynamic, and spread sources under trailingSlash: 'always'.
  • Updates existing test/redirects.test.ts assertions for the new normalized source patterns.

Docs

  • No docs update needed — internal fix to redirect route generation.
withastro/astro

Changes

  • Corrects a typo in the config validation error for font cssVariable values — the message says a value must be a valid "indent" but means a valid CSS ident.
  • Wording-only change; validation behavior is unchanged.

Testing

  • Adds an assertion to config-validate.test.ts verifying the corrected message.

Docs

  • No docs update needed — only an error message wording fix.
withastro/astro

Changes

Fixes #18377

  • WebKit marks a history entry as created without user interaction when pushState runs 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 calls pushState after 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 with replaceState once 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 /one in 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.

withastro/astro

Changes

  • replaceDefine in vite-plugin-import-meta-env.ts now passes tsconfig: false to transformWithOxc, preventing Oxc from auto-discovering tsconfig files for each transformed file. Without this, Oxc could walk up to a parent-directory tsconfig.json whose extends (e.g. astro/tsconfigs/strict) can't be resolved in that directory, causing a fatal TSCONFIG_ERROR. This matches what Vite's own define plugin does for its equivalent lang: '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 when vite.tsconfig is unset).

Testing

  • Unit test added in packages/astro/test/units/env/vite-plugin-import-meta-env.test.ts covering the case where transformWithOxc is called with tsconfig: 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

withastro/astro

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 6fdc36e Thanks @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 395d195 Thanks @astro-factory! - Fixes a typo in the error message shown when a font cssVariable is invalid

  • #18401 484822f Thanks @danielmlr! - Fixes a bug where projects whose path contains an apostrophe (') failed to load sessions, middleware, a cache provider, or a src/fetch.ts handler

  • #18407 a6e00be Thanks @astro-factory! - Fixes a TSCONFIG_ERROR during astro build when a parent directory contains a tsconfig.json that cannot be resolved, such as one extending astro/tsconfigs/strict without installed dependencies

  • #18427 908f167 Thanks @astro-factory! - Fixes an Unterminated string build error when application code imports from astro/config (for example, fontProviders in a shared fonts module)

  • #18428 40e7d54 Thanks @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 617ff59 Thanks @astro-factory! - Fixes style-only HMR in .astro components 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 70834bb Thanks @Princesseuh! - Fixes increasing memory usage when editing the Astro configuration while the dev server is running

@astrojs/cloudflare@14.4.1

Patch Changes

  • #18351 9669d81 Thanks @astro-factory! - Fixes Cannot find package 'prismjs' errors when prismjs isn't hoisted, such as with pnpm's global virtual store or hoist=false
  • Updated dependencies []:
    • @astrojs/underscore-redirects@1.0.4

@astrojs/node@11.1.9

Patch Changes

  • #18382 c75e897 Thanks @Llois41! - Fixes the standalone server not logging Server listening on … when HOST is an IP address, which happens on Node.js 26.12 and later

@astrojs/vercel@11.0.16

Patch Changes

  • #18411 48ec171 Thanks @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 9731465 Thanks @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 with String(...) before passing it to innerHTML.

@astrojs/check@0.9.11

Patch Changes

  • #18445 d736df7 Thanks @astro-factory! - Fixes the --preserveWatchOutput help text, which described the opposite of the flag's behavior. Setting it to true keeps output between checks in watch mode.

  • #18444 c55134c Thanks @astro-factory! - Fixes astro check --watch exiting immediately when the project path contains node_modules or .git

withastro/astro

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 age confidence
vitest (source) 4.1.11 → 5.0.5 age confidence
vitest (source) ^4.1.11 → ^5.0.5 age confidence

Release Notes

vitest-dev/vitest (@​vitest/snapshot)

v5.0.5

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v5.0.4

Compare Source

   🚀 Features
   🐞 Bug Fixes
   🏎 Performance
    View changes on GitHub

v5.0.3

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v5.0.2

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v5.0.1

Compare Source

   🚀 Features
   🐞 Bug Fixes
    View changes on GitHub

v5.0.0

Compare Source

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
   🚀 Features

[!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)
  • 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.

withastro/astro

Changes

  • Fixes a dev server 500 when the project path contains an apostrophe and a session driver is set, as @astrojs/node does by default. Astro writes the resolved driver path into the generated virtual:astro:session-driver module 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.ts modules break the same way. In dev, src/fetch.ts is 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 dev

Opening / 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.ts loads 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.
withastro/astro

Changes

  • In dev, a server:defer island that imports astro:actions or astro:config/server would 500 with Could not find server component name if its page wasn't the first island page loaded after the server started. ensureModulesLoaded() in the CSS plugin was walking into virtual:astro:server-island-manifest and 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 skips RESOLVED_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.ts using a new test/fixtures/server-islands/late-discovery fixture. The test cold-starts the dev server, requests an island-free page first, then requests a second page whose island imports astro: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

withastro/starlight

Description

This PR updates the monorepo to pnpm 12.11.2 (latest tag).

  • Use the devEngines field to manage both the pnpm and Node.js versions.
  • Use Node.js 24.18.0 by default locally and in CI (ci.yml still tests using the minimum Node.js major version supported by Astro).
  • Use pnpm/setup in 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 minimumReleaseAgeExcludePrune which automatically prunes entries in minimumReleaseAgeExclude when 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 in minimumReleaseAgeExclude but still used would not be pruned automatically).
withastro/astro

Changes

  • @astrojs/vue's StaticHtml now coerces the slot value with String(...) before passing it to innerHTML.
  • Astro hands slots as SlotString (a String object). 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 a String object 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 String object): coerced ~10ms vs uncoerced ~19ms locally; larger payloads widen the gap.
  • Did not run the full @astrojs/vue fixture suite (needs a full astro package 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
vitest (source) ^5.0.3 → ^5.0.4 age confidence

Release Notes

vitest-dev/vitest (vitest)

v5.0.4

Compare Source

   🚀 Features
   🐞 Bug Fixes
   🏎 Performance
    View changes on GitHub

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
zod (source) ^4.6.5 → ^4.6.6 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@cloudflare/workers-types ^5.20261009.1 → ^5.20261012.1 age confidence
@vitejs/plugin-vue (source) ^6.0.9 → ^6.0.10 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
zod (source) ^4.6.5 → ^4.6.6 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
vite (source) ^8.3.3 → ^8.3.4 age confidence

Release Notes

vitejs/vite (vite)

v8.3.4

Compare Source

Features
Bug Fixes
Performance Improvements
  • module-runner: skip cloning call sites that have no source map (#​23646) (3d67486)
Code Refactoring

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

Changes

  • isr.exclude entries are written to the Vercel config as exact routes with no trailing slash (/account becomes ^/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].astro also 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 _render before any ISR route. The fixture's [a]/[b] route matches /excluded/foo/, which reproduces the bug.
  • isr-edge-middleware.test.ts: updated the expected /live route, and added a check that the middleware sends /live/ to _render. /live overlaps the fixture's [slug] route.
  • Without the source change, these four tests fail. With it, the full @astrojs/vercel suite passes.

Docs

No docs change. This makes isr.exclude behave the way the docs already describe it.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@preact/signals (source) 2.11.2 → 2.11.3 age confidence
@vitejs/plugin-vue (source) ^6.0.9 → ^6.0.10 age confidence
es-module-lexer ^3.0.2 → ^3.0.3 age confidence
hono (source) ^4.13.11 → ^4.13.13 age confidence
http-cache-semantics ^4.2.0 → ^4.3.0 age confidence
magic-string ^1.4.2 → ^1.4.3 age confidence
oxc-transform-react (source) ^0.151.0 → ^0.153.0 age confidence
p-queue ^9.3.3 → ^9.3.5 age confidence
package-manager-detector ^1.8.0 → ^1.9.0 age confidence
postcss (source) ^8.5.28 → ^8.5.29 age confidence
postcss-preset-env (source) ^11.5.4 → ^11.6.1 age confidence
sass ^1.105.0 → ^1.105.1 age confidence
shiki (source) ^4.4.3 → ^4.5.0 age confidence
smol-toml ^1.9.0 → ^1.9.1 age confidence
solid-js (source) ^1.9.15 → ^1.9.17 age confidence
svelte (source) ^5.57.1 → ^5.57.2 age confidence
unifont ^1.0.2 → ^1.0.3 age confidence
zod (source) ^4.6.5 → ^4.6.6 age confidence

Release Notes

preactjs/signals (@​preact/signals)

v2.11.3

Compare Source

Patch Changes
  • #​991 04445ba Thanks @​JoviDeCroock! - Don't re-run a useSignalEffect for 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.
kornelski/http-cache-semantics (http-cache-semantics)

v4.3.0

Compare Source

Rich-Harris/magic-string (magic-string)

v1.4.3

Compare Source

Bug Fixes
oxc-project/oxc (oxc-transform-react)

v0.152.0

🚀 Features
  • 3255b89 transform-react: Add reportDiagnostics option to expose recoverable React Compiler diagnostics (#​26624) (Jack)
  • f585cb4 napi: Add threadless WASI builds (#​26898) (Boshen)
sindresorhus/p-queue (p-queue)

v9.3.5

Compare Source

  • Fix missed abort when the task aborts the signal while it starts 507e7ee

v9.3.4

Compare Source

  • Count the running task before emitting active 22edad4

postcss/postcss (postcss)

v8.5.29

Compare Source

csstools/postcss-plugins (postcss-preset-env)

v11.6.1

Compare Source

October 5, 2026

v11.6.0

Compare Source

October 2, 2026

v11.5.5

Compare Source

October 1, 2026

Notable changes:

  • postcss-mixins now implements more of the current spec
  • many plugins now have bounds to prevent CPU starvation or OOM

All updates plugins:

unjs/unifont (unifont)

v1.0.3

Compare Source

v1.0.3 is the next patch release.

👉 Changelog

compare changes

🩹 Fixes
  • confine font sources from providers + npm packages (#​548)
💅 Refactors
  • replace ohash with fnv1a-64 (#​549)
❤️ Contributors
colinhacks/zod (zod)

v4.6.6

Compare Source

Six malicious commits pushed to main on September 21 with a compromised git credential were reverted the same day in #​6620 and have since been removed from the history of main. None were ever published to npm. The npm provenance for 4.6.6 names 284243f, the pre-rewrite copy of 9c21983 with identical contents.

Commits:

  • 0cd3af5 docs: load the en locale directly in Zod Mini
  • 9d5e60f docs: import locales from zod/locales, not z.locales
  • 34a626f docs: tighten the z.locales tree-shaking note
  • 74304ce release: stage npm versions instead of publishing them (#​6622)
  • b2ef983 docs: add Code for Japan to bronze sponsors
  • 8fb2faf docs: crop the Code for Japan logo and list it first in bronze
  • bacad51 docs: square the Code for Japan logo to match the other bronze tiles
  • c42596b release: hold the run on the release-approval environment until the staged versions are approved (#​6638)
  • a2ba4a6 fix(types): declare record output and input as members, not base type arguments (#​6645)
  • a0ebf97 fix(v4): check array, set and map size bounds before parsing elements (#​6652)
  • 529f78d 4.6.6
  • 9c21983 ci: 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)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
preact (source) ^10.29.8 → ^11.0.1 age confidence

Release Notes

preactjs/preact (preact)

v11.0.1

Compare Source

Fixes

DX

Performance

Maintenance

v11.0.0

Compare Source

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

Fixes

Performance

Maintenance


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
rolldown (source) ^1.2.12 → ^1.2.13 age confidence
rolldown (source) ^1.2.11 → ^1.2.13 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

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.copyFile is 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

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
devalue ^5.9.4 → ^6.0.2 age confidence

Release Notes

sveltejs/devalue (devalue)

v6.0.2

Compare Source

Patch Changes

v6.0.1

Compare Source

Patch Changes
  • c13cf6a: fix: populate error.path for values reached through a promise in stringifyAsync
  • 6156b2e: perf: stringify and uneval skip per-character escaping for strings with nothing to escape
  • e7a9a73: fix: throw Invalid input instead of a raw TypeError for malformed typed array and boxed primitive payloads
  • 6156b2e: perf: only format path when an error is raised
  • 6156b2e: perf: cache quoted property names
  • 9e44253: Fix uneval for typed array views whose backing buffer ends with a partial element

v6.0.0

Compare Source

Major Changes
  • afb3cb4: breaking: use tagged template js for uneval replacers instead of nested uneval
  • 3100507: 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)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
rolldown (source) ^1.2.12 → ^1.2.13 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

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

withastro/astro

Fixes #18381

Changes

  • logListeningOn waited for the listening event without checking whether it had already fired. standalone() calls it only after app.getLogger() resolves. For an IP literal HOST no DNS lookup delays listen(), so on Node 26.12 the event fires first and the Server listening on … line is never logged.
  • It now skips the wait when server.listening is already true:
 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/node patch.

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 listening fails; logListeningOn never settles ('timed out' instead of 'logged').
  • After: passes, and the full @astrojs/node suite 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.

withastro/astro

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)
withastro/starlight

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 94e0985 Thanks @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 6f22edd Thanks @tunetheweb! - Improves hero image loading by adding fetchpriority="high" hint for browsers

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@qwik.dev/partytown ^0.15.0 → ^1.0.0 age confidence

Release Notes

QwikDev/partytown (@​qwik.dev/partytown)

v1.0.0

Compare Source

Major Changes

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
rolldown (source) ^1.2.12 → ^1.2.13 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@babel/core (source) ^8.0.6 → ^8.0.7 age confidence

Release Notes

babel/babel (@​babel/core)

v8.0.7

Compare Source

🐛 Bug Fix
  • babel-helper-create-regexp-features-plugin, babel-plugin-transform-dotall-regex, babel-plugin-transform-unicode-sets-regex, babel-preset-env
  • babel-plugin-transform-for-of
  • babel-helpers, babel-plugin-transform-async-generator-functions, babel-runtime-corejs3
  • babel-parser
  • babel-helpers, babel-plugin-transform-class-properties, babel-plugin-transform-modules-systemjs, babel-runtime-corejs3
  • babel-plugin-transform-block-scoping
  • babel-helper-create-class-features-plugin, babel-plugin-transform-private-property-in-object
  • babel-traverse
  • Other
  • babel-core
🏠 Internal
  • babel-helpers, babel-plugin-transform-modules-commonjs, babel-runtime-corejs3

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@qwik.dev/partytown ^0.14.5 → ^0.15.0 age confidence

Release Notes

QwikDev/partytown (@​qwik.dev/partytown)

v0.15.0

Compare Source

Minor Changes
  • ✨ mainElementProperties config: properties a worker script sets on DOM elements (such as a function an iframe's inline onload calls) 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 a Request object keeps its method, headers, body and credentials instead of sending a GET to its URL (prebid's bid requests). (by @​Varixo in #​782)

  • 🐞🩹 postMessage on 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)

  • 🐞🩹 href of <link> and <base> elements is read and set on the main thread again, so a stylesheet a worker script adds with link.href = url loads; the no-op href every node has (for scripts walking up the tree) hid it. (by @​Varixo in #​780)

  • 🐞🩹 scripts loaded on the main thread via loadScriptsOnMainThread now fire the load/error handlers registered on them in the worker (onload, onerror, addEventListener), so loaders that wait for them (e.g. gtag's Google Ads viewthroughconversion) complete (by @​thegauravthakur in #​771)

  • 🐞🩹 a worker message listener can reply through the MessagePorts 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 message listener, event.source of a message from one of the page's iframes is that iframe's window, so replies through event.source.postMessage reach it (e.g. a consent tool answering an ad's __tcfapi call). (by @​Varixo in #​779)

  • 🐞🩹 worker scripts can talk to a cross-origin iframe the browser loaded itself (no CORS): iframe.contentWindow.postMessage reaches the frame, and the frame's reply to event.source reaches the page's message listeners 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 caches and scheduler, return the worker's own object instead of throwing "Illegal constructor". (by @​Varixo in #​778)

  • 🐞🩹 worker nodes get only the members every Node has: elements no longer inherit Text members such as splitText, 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 ptupdate before load were 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 where window, document and the page's globals are not defined (ad libraries run downloaded tags this way). (by @​Varixo in #​774)

  • 🐞🩹 define CSS in 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 call CSS.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)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
solid-js (source) ^1.9.15 → ^1.9.17 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@vitejs/plugin-vue (source) ^6.0.9 → ^6.0.10 age confidence

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)
  • 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.

withastro/astro

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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
smol-toml ^1.9.0 → ^1.9.1 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
rolldown (source) ^1.2.12 → ^1.2.13 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
prettier (source) ^3.9.9 → ^3.9.10 age confidence

Release Notes

prettier/prettier (prettier)

v3.9.10

Compare Source

diff

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)
  • 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.

withastro/starlight

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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
svelte (source) ^5.57.1 → ^5.57.2 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

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

Compare Source

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 node with the codspeed-node V8 flags for the current mode in codspeed exec, including through npm, npx and #!/usr/bin/env node scripts, by @​not-matthias in #​556
🐛 Bug Fixes
  • Always set PYTHONPERFSUPPORT, so Python codspeed exec targets 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-stack to node in analysis mode by @​not-matthias in #​556
  • Label dropped benchmarks in the comparison table by @​adriencaccia in #​570
⚙️ Internals

Full Runner Changelog:
https://github.com/CodSpeedHQ/codspeed/blob/main/CHANGELOG.md

What's Changed

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)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@fastify/middie ^9.3.4 → ^9.3.5 age confidence
@fastify/static ^10.1.5 → ^10.1.6 age confidence
express (source) ^5.2.1 → ^5.3.0 age confidence

Release Notes

fastify/middie (@​fastify/middie)

v9.3.5

Compare Source

What's Changed

New Contributors

Full Changelog: fastify/middie@v9.3.4...v9.3.5

fastify/fastify-static (@​fastify/static)

v10.1.6

Compare Source

What's Changed

Full Changelog: fastify/fastify-static@v10.1.5...v10.1.6

expressjs/express (express)

v5.3.0

Compare Source

=====

🐞 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 between Content-Length and Transfer-Encoding HTTP headers in responses. The Content-Length header in res.send() is now only added when a Transfer-Encoding header 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 a Transfer-Encoding header - by @​cuishuang in #​7459

🚀 Improvements

  • Allow conditional revalidation for QUERY requests. req.fresh previously 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.render with 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 #​6903

    app.render('index', null, callback); // now works as expected
  • Upgrade content-type to ^2.0.0, bringing a faster parser (~1.5x quicker Content-Type parsing/formatting in res.send()) along with a behavior change: res.send() now keeps any existing parameters when adding the charset and no longer throws on a Content-Type that fails to parse. type-is is upgraded to ^2.1.0 as part of the same change - by @​blakeembrey in #​7234

    res.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.cause and library-specific properties (e.g. Sequelize's parent/original) are no longer swallowed - by @​Nitin-Mohapatra in #​6464

  • Upgrade content-disposition to ^2.0.1, which changes the Content-Disposition header emitted by res.download(), res.attachment(), and res.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 #​7233

    res.attachment('user.html');
    // before -> Content-Disposition: attachment; filename="user.html"
    // after  -> Content-Disposition: attachment; filename=user.html
  • Upgrade body-parser to ^2.3.0, which fixes CVE-2026-12590 (GHSA-v422-hmwv-36x6): an invalid limit option value caused request body size enforcement to be silently disabled (fail-open), allowing a denial of service via arbitrarily large payloads. Invalid limit values 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)
  • 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.

withastro/astro

Changes

  • Fixes prerender errors being swallowed when a project has a custom src/fetch.ts and the adapter prerenders in its own runtime
  • renderForPrerender now switches the app manifest's error strategy from default to build.
  • 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
withastro/astro

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 b7a1bd9 Thanks @Princesseuh! - Adds a new --timings flag to astro build to help you find what slows down your builds

    When 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 --timings flag 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 a937b0d Thanks @florian-lefebvre! - Adds a new optional getFontProperties() callback to font providers

    Font 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 a937b0d Thanks @florian-lefebvre! - Adds a fetch() function to the font provider init() context

    This 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 0b30239 Thanks @florian-lefebvre! - Adds experimental.redirectPage, letting you provide your own src/pages/3xx.astro in place of the redirect page Astro generates in static builds.

    A static site has no server to send an HTTP Location header, so Astro generates a small HTML page with a <meta http-equiv="refresh"> tag for each redirect it builds:

    • Your redirects entries
    • 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 at to, 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.

  • #18265 910ee69 Thanks @astro-factory! - Adds a notFound() handler to astro/fetch and astro/hono that renders the custom 404 page when no route matches, including a prerendered 404.astro

    Add it before pages() in a custom worker or server entrypoint that does not run inside App.render, such as a Hono app used directly as a Cloudflare worker. Without it, pages() and middleware() return an empty 404 with an internal X-Astro-Error header 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 7d814e5 Thanks @Princesseuh! - Adds support for separate build and runtime image services

    image.service now also accepts a build and a runtime service. The build service optimizes images on prerendered pages when you build your site, and is also used during development. The runtime service 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.service keeps the shape the user configured it with. When a project sets build and runtime services, config.image.service.entrypoint and config.image.service.config are undefined.

    If your integration reads image.service, check for the runtime property 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.service with updateConfig() 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 uses build and runtime services replaces both.

  • #18277 2715958 Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0

    The 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 71e2b24 Thanks @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 outputDirectories context:

    setPrerenderer((defaultPrerenderer, { outputDirectories }) => {
      const { client, server, prerender } = outputDirectories
    
      return createPrerenderer({
        defaultPrerenderer,
        client,
        server,
        prerender,
      })
    })
  • #18177 7d814e5 Thanks @Princesseuh! - Lets custom prerenderers report the images used on prerendered pages

    Astro now generates images on prerendered pages from the image information that a prerenderer's getStaticPaths() and render() 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 plain Response from render() still works, but is deprecated: images used on those pages are not generated.

  • #17932 b905ff1 Thanks @Princesseuh! - Adds support for experimental parallel prerendering

    This experimental feature makes astro build render 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 workers to 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.concurrency setting 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 71e2b24 Thanks @matthewp! - Fixes deployment integrations being unable to use Vite manifests when preparing build output

  • #18270 0c3bf11 Thanks @ArmandPhilippot! - Fixes the JSDoc for CSP utilities to point to the render context reference in docs.

  • #18368 1f04637 Thanks @43081j! - Replaces internal use of find-proc with tinyps.

  • #18355 59b9cc0 Thanks @matthewp! - Fixes prerender errors being silently swallowed when using a custom src/fetch.ts with 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 7d814e5 Thanks @Princesseuh! - Fixes original images being kept despite only width or height being read.

  • #18353 af54bfa Thanks @astro-factory! - Fixes glob() loader swallowing rendering errors during content sync, which allowed astro build to exit successfully (code 0) even when a remark/rehype plugin threw an error

  • #18271 23e8e28 Thanks @ArmandPhilippot! - Fixes the sync command description in astro 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 2715958 Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0

    The 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 2715958 Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0

    The 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 acc0460 Thanks @KTrain5169! - create-astro no longer places a CLAUDE.md in projects, as Claude Code now supports AGENTS.md.

@astrojs/cloudflare@14.4.0

Minor Changes

  • #18177 7d814e5 Thanks @Princesseuh! - Reworks image processing on prerendered pages to use Astro's built-in image pipeline. Requires astro@^7.4.0

    Images 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 assetQueryParams and build.assetsPrefix are 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

Patch Changes

  • Updated dependencies [b7a1bd9, 2715958]:
    • @astrojs/internal-helpers@0.13.0
    • @astrojs/prism@4.1.0

@astrojs/mdx@8.1.0

Minor Changes

  • #18277 2715958 Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0

    The 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

Patch Changes

  • Updated dependencies [b7a1bd9]:
    • @astrojs/internal-helpers@0.13.0

@astrojs/react@7.1.0

Minor Changes

  • #18277 2715958 Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0

    The 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 2715958 Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0

    The 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 2715958 Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0

    The 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 2715958 Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0

    The 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 b7a1bd9 Thanks @Princesseuh! - Adds the measurements that astro build --timings reports for Markdown processing and syntax highlighting.

@astrojs/telemetry@3.4.0

Minor Changes

  • #18277 2715958 Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0

    The 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 2715958 Thanks @florian-lefebvre! - Increases the minimum Node.js version to 22.22.0

    The 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 7526077 Thanks @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 b7a1bd9 Thanks @Princesseuh! - Adds the measurements that astro build --timings reports 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 b7a1bd9 Thanks @Princesseuh! - Adds the measurements that astro build --timings reports for Markdown processing and syntax highlighting.
  • Updated dependencies [b7a1bd9, 2715958]:
    • @astrojs/internal-helpers@0.13.0
    • @astrojs/prism@4.1.0
withastro/astro

Changes

  • astro build now exits with a non-zero status when a remark/rehype plugin throws during the glob() loader's eager rendering path. Previously the error was logged via logger.error() but swallowed, allowing CI to treat a failed content render as a successful build.
  • The fix adds throw error after the logger.error() call in the syncData catch block in packages/astro/src/content/loaders/glob.ts, so the rejection propagates through the Promise.all chain and fails the build — consistent with the behavior already present when deferRender: true is 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

withastro/astro

Changes

  • After a client-side navigation, the router executes each new <script src> and waits for it by setting onload and onerror on the script, then copies the original attributes across. An onload or onerror attribute sets the same handler, so whichever comes second replaces the other.
    • src before onload: the page's handler replaces the router's, and astro:page-load never fires.
    • onload before src: the router's handler replaces the page's, and the page's handler never runs.
  • The router now uses addEventListener for load and error, 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.

withastro/astro

Changes

  • prismjs is moved from devDependencies to dependencies in the Cloudflare adapter's package.json. vite-plugin-prism.ts imports prismjs/components.js at the top level, which means any consumer importing @astrojs/cloudflare needs prismjs to be resolvable. Previously this worked only because pnpm's default hoisting made the copy bundled with astro (via @astrojs/prism) visible to the adapter — with hoisting disabled (pnpm global virtual store or hoist=false), the import fails with ERR_MODULE_NOT_FOUND.
  • Declaring prismjs as 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 prismjs is 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 with hoist=false.

Docs

  • No docs update needed; this is an internal dependency declaration with no user-facing API change.

Closes #18319

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@playwright/test (source) 1.63.0 → 1.64.0 age confidence

Release Notes

microsoft/playwright (@​playwright/test)

v1.64.0

Compare Source

🧰 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 #&#8203;333; background: rgba(0, 128, 255, .15)',
            title: 'font-size: 16px',
          },
        },
      },
    },
  },
});
  • New fps option in testOptions.video, recordVideo and
    screencast.start(). Firefox and WebKit currently capture up to 25 frames per second.
  • New style option takes CSS declarations for the point marker, the target
    highlight and the action title. It replaces the fontSize option, 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 test run 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 --shuffle command 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 lock option in test.describe.configure() adds test locks to all tests in a file or a group:

    test.describe.configure({ lock: 'user-settings' });
  • New type option of toHaveScreenshot in 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

Breaking changes ⚠️

  • screen property is now forwarded from the device descriptors. If you use ...devices['Desktop Chrome'] and alike, window.screen and media queries now see the emulated screen size. You can opt-out by explicitly setting screen to undefined:

    // 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 the jsx, jsxFactory, jsxFragmentFactory and jsxImportSource tsconfig options, and defaults to the automatic runtime from react/jsx-runtime.

  • --update-snapshots=missing now 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)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
nanostores ^1.5.4 → ^1.5.5 age confidence
solid-js (source) ^1.9.15 → ^1.9.17 age confidence
svelte (source) ^5.57.1 → ^5.57.2 age confidence

Release Notes

nanostores/nanostores (nanostores)

v1.5.5

Compare Source

  • Added comments for LLM to improve LLM code.

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

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

Compare Source

What's Changed
Enhancements:
Bug fixes:
Documentation updates:
Dependency updates:
New Contributors

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)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@astrojs/language-server (source) ^2.17.1 → ^2.17.2 age confidence
prettier-plugin-astro ^1.1.0 → ^1.1.1 age confidence
rolldown (source) ^1.2.12 → ^1.2.13 age confidence
svelte (source) ^5.57.1 → ^5.57.2 age confidence

Release Notes

withastro/astro (@​astrojs/language-server)

v2.17.2

Compare Source

Patch Changes
withastro/prettier-plugin-astro (prettier-plugin-astro)

v1.1.1

Compare Source

Patch Changes
  • ee01a5d: Fixes a TypeError ("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)
  • 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.

withastro/astro

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 recorded background: !!"0" = true.
  • As a result astro dev status reported the server as "background" and astro dev logs failed 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 isBackgroundEnvEnabled in test/units/cli/agent.test.ts.
  • Manually on examples/minimal: with ASTRO_DEV_BACKGROUND=0, main writes background: true and logs says "No log file found."; with this fix it writes false, status no longer says "background" and logs explains the server runs in the foreground. Same for astro preview. astro dev --background still records true and logs/stop work.

Docs

No docs change needed: this makes the CLI match the already documented opt-out behavior.

withastro/astro

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.

withastro/astro

Changes

  • Continuous benchmark has no concurrency block, 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 and workflow_dispatch runs key on run_id, so main baselines 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@netlify/blobs (source) ^11.1.3 → ^11.1.4 age confidence
rolldown (source) ^1.2.12 → ^1.2.13 age confidence

Release Notes

netlify/primitives (@​netlify/blobs)

v11.1.4

Compare Source

Bug Fixes
  • blobs: cancel response bodies the client does not read (#​802) (6d62ac9)
rolldown/rolldown (rolldown)

v1.2.13

Compare Source

🚀 Features
🐛 Bug Fixes
📚 Documentation
⚡ Performance
🧪 Testing
  • inline-common-chunks: fix flaky inlineCommonChunks concurrent imports (#​11088) by @​hyfdev
⚙️ Miscellaneous Tasks

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@cloudflare/vite-plugin (source) ^1.62.5 → ^1.63.1 age confidence
@cloudflare/vitest-plugin (source) 1.3.6 → 1.4.0 age confidence
@cloudflare/workers-types ^5.20261006.1 → ^5.20261009.1 age confidence
solid-js (source) ^1.9.15 → ^1.9.17 age confidence
svelte (source) ^5.57.1 → ^5.57.2 age confidence
wrangler (source) ^4.147.0 → ^4.149.0 age confidence

Release Notes

cloudflare/workers-sdk (@​cloudflare/vite-plugin)

v1.63.1

Compare Source

Patch Changes
  • #​15617 93c1069 Thanks @​jpatel3! - Stop the update check from recommending deprecated versions

    Previously, the "update available" notice shown by wrangler and @cloudflare/vite-plugin always pointed at whichever version was tagged latest on 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-check package, which discarded the deprecation information. The on-disk cache location and one-hour refresh interval are unchanged.

  • #​16003 6947df3 Thanks @​oddharsh! - Ship using and await using declarations to the runtime as written

    Worker 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 es2026 target, so Oxc leaves the syntax alone. On Vite 6 and 7, where esbuild has no es2026 target, the Worker environments tell esbuild that using is supported instead. Client builds keep their own targets: the plugin changes only the Worker environments.

  • #​16145 e820406 Thanks @​cpojer! - Honor the source-map setting in release builds

    Omit 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]:

cloudflare/workers-sdk (@​cloudflare/vitest-plugin)

v1.4.0

Compare Source

Minor Changes
Patch Changes

v1.3.7

Compare Source

Patch Changes
cloudflare/workerd (@​cloudflare/workers-types)

v5.20261009.1

Compare Source

solidjs/solid (solid-js)

v1.9.16

Compare Source

sveltejs/svelte (svelte)

v5.57.2

Compare Source

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 await in production (#​18933)

  • fix: flush anything pending before invoking flushSync callback function (#​18878)

  • fix: preserve location information for await wrappers (#​18859)

  • fix: keep a reactive assignment with no dependencies when migrate cannot turn it into a declaration (#​18817)

  • fix: don't hang migrate on 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 link role on <area> elements without an href (#​18872)

  • fix: don't throw state_unsafe_mutation when the focused element is removed while bind:activeElement is 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 a children snippet (#​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

Compare Source

Minor Changes
  • #​16036 9a58244 Thanks @​edevil! - Support temporary event accounts in R2 and Containers commands

    wrangler r2 and wrangler containers commands now accept the hidden --temporary flag, so accounts created for an event can manage buckets, objects and containers directly. Every command that supports --temporary now also accepts a hidden --event-code flag, 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 cloudchamber commands still require a logged-in account.

Patch Changes
  • #​16139 2d1d563 Thanks @​cpojer! - Update esbuild to 0.28.2

    Align 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 85b14e7 Thanks @​petebacondarwin! - Honor Retry-After directives during static asset uploads

    Static 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 fe607f9 Thanks @​dependabot! - Update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    sharp 0.35.4 0.35.5
  • #​16093 ad7ff45 Thanks @​DiogoSantoss! - Document that addresses catch-all entries must use the zone apex

    A *@domain entry in addresses must 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 757faa6 Thanks @​tlq5l! - Keep Preview secrets when deploying to an existing Preview

    Secrets added to a Preview with wrangler preview secret put or wrangler preview secret bulk were lost the next time wrangler preview ran, because each new deployment was created from the Wrangler config, --var and --secrets-file values only.

    wrangler preview now carries over the secrets of the Preview's latest deployment. A value passed in this deployment (--secrets-file, --var or a previews binding with the same name) still replaces the existing secret, and wrangler preview secret delete removes one.

  • #​15617 93c1069 Thanks @​jpatel3! - Stop the update check from recommending deprecated versions

    Previously, the "update available" notice shown by wrangler and @cloudflare/vite-plugin always pointed at whichever version was tagged latest on 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-check package, which discarded the deprecation information. The on-disk cache location and one-hour refresh interval are unchanged.

  • #​16003 6947df3 Thanks @​oddharsh! - Ship using and await using declarations to the runtime as written, for smaller Worker bundles

    Workers and Pages Functions that use explicit resource management no longer carry about 1 KB of bundled helper code to emulate it. workerd supports using and await using natively at every compatibility date, so wrangler deploy, wrangler versions upload and Pages Functions builds now leave these declarations untouched.

  • #​15958 82acf3c Thanks @​breken-ai! - Apply each action's own condition in wrangler r2 bucket lifecycle add

    When 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-days first. --expire-days 365 --ia-transition-days 30 therefore transitioned objects after 365 days instead of 30, and --expire-date 2027-01-01 --ia-transition-days 30 deleted 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)
  • 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.

withastro/astro

Changes

  • On-demand routes deployed with @astrojs/vercel no longer crash with "Cannot find native binding" at startup. Since v11.0.13, middleware.ts had a top-level import { rolldown } from 'rolldown' that was transitively bundled into the serverless entry.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.ts and middleware.ts import from it; index.ts re-exports the constants so the public API is unchanged. middleware.ts also loads rolldown lazily inside generateEdgeMiddleware, 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 that entry.mjs no longer contains import "rolldown" or import "@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

withastro/starlight

Description

  • Closes #4263

  • What does this PR change? It adds margin-inline-start: auto to .right-sidebar-container in TwoColumnContent.astro, inside the existing @media (min-width: 72rem) block.

    The table of contents <aside> comes before .main-pane in the DOM and is moved to the end of the row with order: 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 on div.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 aside 0.423
    main, not split 0.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/starlight and 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

withastro/astro

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-vue could add [data-v-xxx] attribute selectors and convert v-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 in create-vite.ts after all user and integration Vite config. This guarantees it runs after framework plugins (e.g. vite:vue) transform the CSS but before vite:css-post converts it to JS.

Testing

  • Adds a dev-server integration test in packages/integrations/vue/test/basics.test.ts that fetches the server-rendered HTML and asserts the inline style content matches the scoped, transformed output (attribute selectors and CSS variable form of v-bind()).

Docs

  • No docs update needed; this is an internal dev-server correctness fix with no API or configuration changes.

Closes #18333

withastro/astro

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:

  1. standalone() returns the server's closed promise as done, which rejects on the server's error event. server.ts started the server but never handled done, allowing the rejection to become unhandled.
  2. serve-app.ts registers a process-level unhandledRejection listener that silently returns when requestContext.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

  1. In packages/integrations/node/src/server.ts, catch errors on startServer().done, log them, and exit with code 1.
  2. In packages/integrations/node/src/serve-app.ts, log rejections occurring outside a request context and set process.exitCode = 1 rather than silently ignoring them.
  3. Added a regression test in packages/integrations/node/test/standalone-error.test.ts verifying that starting a standalone server when the port is occupied exits with code 1 and logs the EADDRINUSE error.
  4. Added patch changeset for @astrojs/node.

Fixes #18282

Testing

  • Ran packages/integrations/node/test/standalone-error.test.ts with 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

withastro/astro

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 encounters ENOENT (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() within vite-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 exist
    • in 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

withastro/astro

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.

withastro/astro

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.

  • deserializeManifest accepts the server entry URL as a third argument and resolves relative directory paths against it. It falls back to file:/// on runtimes without a filesystem, such as Cloudflare Workers.
  • The astro:build:ssr hook manifest keeps absolute paths. Relativization happens only when serializing the SSR and prerender bundles, so the public type and its meaning are unchanged.
  • @astrojs/node stores the session base relative to the project root and resolves it at runtime, and bakes folder names instead of file:// URLs.
  • @astrojs/mdx normalizes compiled output paths to match the manifest keys.
  • Made with AI.

Ref: withastro/roadmap#1286

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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@cloudflare/workers-types ^5.20261005.1 → ^5.20261006.1 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
vite (source) ^8.3.2 → ^8.3.3 age confidence
vite (source) ^8.3.1 → ^8.3.3 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@astrojs/language-server (source) ^2.17.0 → ^2.17.1 age confidence
@astrojs/language-server (source) ^2.16.7 → ^2.17.1 age confidence

Release Notes

withastro/astro (@​astrojs/language-server)

v2.17.1

Compare Source

Patch Changes

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

Changes

  • Changes, for example ^7.4.1 to ^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
withastro/astro

Changes

  • Adds an issue-assign.yml workflow 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.
withastro/astro

Changes

  • Factory preview releases now work for fixes in nested packages like packages/language-tools/* and packages/markdown/*. Before, the changed-package detection only knew about packages/integrations/, so a fix to @astrojs/language-server resolved to packages/language-tools and pkg-pr-new failed 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.
withastro/astro

ℹ️ 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 age confidence
@types/react-dom (source) ^18.3.7 → ^19.3.0 age confidence
react (source) ^18.3.1 → ^19.3.0 age confidence
react-dom (source) ^18.3.1 → ^19.3.0 age confidence

Release Notes

react/react (react)

v19.3.0

Compare Source

New React Features
New React DOM Features
  • browser(): a new react-dom API 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)
    • Added an onBrowserBailout option to the react-dom/server APIs to observe when a subtree defers to the browser (@​gnoff #​37193)
Notable changes
All Changes
React
React DOM
React Server
React Server Components

v19.2.8: 19.2.8 (July 21st, 2026)

Compare Source

React Server Components

v19.2.7

Compare Source

React Server Components

v19.2.6

Compare Source

React Server Components

v19.2.5

Compare Source

React Server Components

v19.2.4

Compare Source

React Server Components

v19.2.3

Compare Source

React Server Components

v19.2.2

Compare Source

React Server Components

v19.2.1

Compare Source

React Server Components

v19.2.0

Compare Source

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.
  • useEffectEvent is a React Hook that lets you extract non-reactive logic into an Effect Event.
  • cacheSignal (for RSCs) lets your know when the cache() 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:
  • Added resume APIs for partial pre-rendering with Node Streams:
  • Updated prerender APIs to return a postponed state that can be passed to the resume APIs.
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
React DOM
React Server Components
React Reconciler

v19.1.9: 19.1.9 (July 21st, 2026)

Compare Source

React Server Components

v19.1.8

Compare Source

React Server Components

[`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)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@nanostores/preact ^1.1.0 → ^1.1.1 age confidence
@preact/signals (source) ^2.11.2 → ^2.11.3 age confidence
hono (source) ^4.13.11 → ^4.13.13 age confidence
sass ^1.105.0 → ^1.105.1 age confidence
vite (source) ^8.3.1 → ^8.3.3 age confidence
vitest (source) ^5.0.2 → ^5.0.3 age confidence

Release Notes

nanostores/preact (@​nanostores/preact)

v1.1.1

Compare Source

sass/dart-sass (sass)

v1.105.1

Compare Source

  • Improve error messages for @extends across different media queries.
vitejs/vite (vite)

v8.3.3

Compare Source

Bug Fixes
vitest-dev/vitest (vitest)

v5.0.3

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

Backport of #18112 from next to main.

Changes

  • Astro now uses Vite's resolved environment outDir values as the source of truth for build output. Generated assets, build hook dir values, 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 .vite manifests now waits until every buildApp hook 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 environment outDirs, 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, and incremental-build-islands.test.ts to expect output paths from the resolved directories.

Docs

  • Integration authors are affected: the new prerenderer outputDirectories context is covered by the minor changeset. Docs for setPrerenderer may need a follow-up to document the context argument.
withastro/astro

This PR contains the following updates:

Package Change Age Confidence
mocha (source) ^12.0.2 → ^12.0.3 age confidence
prettier (source) ^3.9.6 → ^3.9.9 age confidence
rolldown (source) ^1.2.11 → ^1.2.12 age confidence
svelte (source) ^5.55.7 → ^5.57.1 age confidence
tsx (source) ^4.23.13 → ^4.23.15 age confidence
tsx (source) ^4.22.0 → ^4.23.15 age confidence
vscode-jsonrpc (source) ^9.0.1 → ^9.0.3 age confidence
vscode-languageserver-protocol (source) ^3.18.3 → ^3.18.4 age confidence
vscode-languageserver-textdocument (source) ^1.0.14 → ^1.0.15 age confidence
yargs (source) ^18.1.0 → ^18.2.0 age confidence

Release Notes

mochajs/mocha (mocha)

v12.0.3

Compare Source

🩹 Fixes
📚 Documentation
🧹 Chores
yargs/yargs (yargs)

v18.2.0

Compare Source

Features
Bug Fixes
  • completion: remove spurious single-quote in zsh loadautofunc detection (#​2548) (224e285)

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@vercel/functions (source) ^3.9.9 → ^3.9.11 age confidence
rolldown (source) ^1.2.11 → ^1.2.12 age confidence
vite (source) ^8.3.1 → ^8.3.3 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
rolldown (source) ^1.2.11 → ^1.2.12 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@vitejs/plugin-react (source) ^6.1.1 → ^6.1.2 age confidence
oxc-transform-react (source) ^0.150.0 → ^0.153.0 age confidence
vite (source) ^8.3.0 → ^8.3.2 age confidence

Release Notes

vitejs/vite-plugin-react (@​vitejs/plugin-react)

v6.1.2

Compare Source

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.

oxc-project/oxc (oxc-transform-react)

v0.152.0

🚀 Features
  • 3255b89 transform-react: Add reportDiagnostics option to expose recoverable React Compiler diagnostics (#​26624) (Jack)
  • f585cb4 napi: Add threadless WASI builds (#​26898) (Boshen)

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@preact/signals (source) ^2.11.2 → ^2.11.3 age confidence
preact-render-to-string ^6.7.0 → ^6.8.0 age confidence
vite (source) ^8.3.0 → ^8.3.2 age confidence

Release Notes

preactjs/signals (@​preact/signals)

v2.11.3

Compare Source

Patch Changes
  • #​991 04445ba Thanks @​JoviDeCroock! - Don't re-run a useSignalEffect for 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

Compare Source

Minor Changes
  • #​472 2dff53d Thanks @​jacob-ebey! - Replaces the second context argument in our streaming functions with an options object, the context moves to the third position.

    Streaming is considered alpha so we're making this breaking change deliberately as part of a minor.

Patch Changes

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

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 fcc050c Thanks @astro-factory! - Fixes on-demand routes failing with "Cannot find native binding" on Vercel, caused by the serverless function loading rolldown at runtime
withastro/astro

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence
@cloudflare/vite-plugin (source) ^1.53.0 → ^1.62.5 age confidence
@cloudflare/vitest-plugin (source) 1.2.2 → 1.3.6 age confidence
@cloudflare/workers-types ^5.20260820.1 → ^5.20261005.1 age confidence
@tailwindcss/vite (source) ^4.2.1 → ^4.3.3 age confidence
@types/react (source) ^19.0.0 → ^19.3.0 age confidence
@types/react-dom (source) ^19.0.0 → ^19.3.0 age confidence
@vitejs/plugin-vue (source) ^6.0.4 → ^6.0.9 age confidence
devalue ^5.8.1 → ^5.9.4 age confidence
hono (source) ^4.13.7 → ^4.13.13 age confidence
react (source) ^19.2.4 → ^19.3.0 age confidence
react (source) ^19.0.0 → ^19.3.0 age confidence
react-dom (source) ^19.2.4 → ^19.3.0 age confidence
react-dom (source) ^19.0.0 → ^19.3.0 age confidence
solid-js (source) ^1.9.11 → ^1.9.15 age confidence
svelte (source) ^5.55.7 → ^5.57.1 age confidence
tailwindcss (source) ^4.2.1 → ^4.3.3 age confidence
tinyglobby (source) ^0.2.15 → ^0.2.17 age confidence
vite (source) ^8.0.13 → ^8.3.2 age confidence
vue (source) ^3.5.29 → ^3.5.43 age confidence
wrangler (source) ^4.83.0 → ^4.147.0 age confidence
wrangler (source) ^4.125.0 → ^4.147.0 age confidence

Release Notes

cloudflare/workers-sdk (@​cloudflare/vite-plugin)

v1.62.5

Compare Source

Patch Changes

v1.62.4

Compare Source

Patch Changes

v1.62.3

Compare Source

Patch Changes

v1.62.2

Compare Source

Patch Changes

v1.62.1

Compare Source

Patch Changes

v1.62.0

Compare Source

Minor Changes
  • #​15914 7f0734c Thanks @​jamesopstad! - Use cf/config for cloudflare.config.ts authoring

    Experimental cloudflare.config.ts projects must now import defineConfig, bindings, triggers, and related helpers from cf/config. Generated declarations from Wrangler and the Vite plugin also reference this package, so projects using the experimental configuration flow must add cf as a dependency.

    The Vite plugin no longer exports @cloudflare/vite-plugin/experimental-config. wrangler/experimental-config remains available for defineWranglerConfig, but no longer re-exports Cloudflare configuration helpers.

Patch Changes
  • #​15878 e7915c1 Thanks @​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

Compare Source

Minor Changes
  • #​15856 4c2993b Thanks @​Naapperas! - Support Workflows declared in exports on ctx.exports in local development

    A Workflow declared in a Worker's exports is now available on ctx.exports in wrangler 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.exports and workflows bindings with the same Workflow name share their instances, including instances created before the Workflow was declared in exports. 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 in exports, since it doesn't run the Worker's code.

    wrangler workflows commands run with --local also work with Workflows declared only in exports, without a workflows binding.

    In the Vitest plugin, introspectWorkflow() and introspectWorkflowInstance() still need a Workflow binding, and now explain how to add one when passed a Workflow from ctx.exports. Instances created through ctx.exports are introspected too. A workflows binding whose script_name is the Worker's own name now resolves to the Worker itself again.

Patch Changes

v1.60.2

Compare Source

Patch Changes

v1.60.1

Compare Source

Patch Changes

v1.60.0

Compare Source

Minor Changes
  • #​15648 52c0e9f Thanks @​tpmmorris! - Advertise Local Explorer scheduled invocations to headless agents

    The 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

v1.59.0

Compare Source

Minor Changes
  • #​15817 6e77c53 Thanks @​jamesopstad! - Allow framework commands to produce Preview Build Output with the experimental config

    When cf previews deploy invokes a framework build command, Preview intent is now preserved. Function-based cloudflare.config.ts files receive isPreview: true, and generated Build Output is marked as a Preview build.

Patch Changes

v1.58.0

Compare Source

Minor Changes
  • #​15778 cd7508c Thanks @​jamesopstad! - Generate types during development and supported builds with Vite's experimental.newConfig option or Wrangler's --experimental-new-config flag (and --experimental-cf-build-output for builds)

    When Wrangler's --experimental-new-config flag or Vite's experimental.newConfig option 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-config and --experimental-cf-build-output. In the experimental wrangler.config.ts format, the types option is now top-level because it applies to both commands.

Patch Changes
  • #​15765 1bdb96d Thanks @​th0m! - Prepare the required egress sidecar for local Containers without configured images

    Wrangler 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

Compare Source

Patch Changes

v1.57.2

Compare Source

Patch Changes

v1.57.1

Compare Source

Patch Changes

v1.57.0

Compare Source

Minor Changes
  • #​15713 3c75cad Thanks @​jamesopstad! - Identify experimental Build Output resource configs by filename and location

    The root remains config.json, Worker configs are now worker.config.json, and Container configs are now container.config.json. Resource configs no longer contain top-level type discriminators, while settings and build context are stored together in the root config.

  • #​15713 3c75cad Thanks @​jamesopstad! - Define experimental Cloudflare configuration with a single default export

    Experimental cloudflare.config.ts files now define settings and resources together in a default-exported defineConfig() call. Add a Worker under worker, add Containers to the containers array, 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

v1.56.0

Compare Source

Minor Changes
  • #​15609 1f070c8 Thanks @​emily-shen! - Build Containers when emitting experimental Build Output

    Wrangler 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/containers with local image references, while existing registry references pass through unchanged.

  • #​15329 c4c9b75 Thanks @​akshitsinha! - Evaluate Flagship flags locally during development

    Flagship 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: true on 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 --local to read and update the local store directly.

  • #​15701 643e5cc Thanks @​WillTaylorDev! - Pass Preview intent to defineWorker and upload its resolved configuration

    Preview builds now evaluate programmatic Worker configuration with ctx.isPreview set to true and 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

v1.55.0

Compare Source

Minor Changes
  • #​15674 a939a6c Thanks @​ghostwriternr! - Support explicit named Container image selection in local development

    The Vite plugin builds or pulls named images from Wrangler configuration and exposes their local tags through ctx.container.images. Pass one of those references to ctx.container.start({ image }) to select the image.

    This extends the experimental Durable Object-managed Containers interface.

Patch Changes

v1.54.11

Compare Source

Patch Changes

v1.54.10

Compare Source

Patch Changes
  • #​14775 1be7b97 Thanks @​dario-piotrowicz! - Sync Local Explorer endpoint lists across agent hints

    The Local Explorer endpoint list is now consistent across the three places it appears: the AGENTS.md template in create-cloudflare, the runtime agent hint in wrangler dev, and the Vite plugin agent hint. All three now include the observability/clear endpoint, use the canonical /cdn-cgi/local/explorer path, and have cross-reference comments pointing to each other.

  • #​15399 982b806 Thanks @​tpmmorris! - Improve over-limit run_worker_first errors when duplicate rules are present

    The 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]:

v1.54.9

Compare Source

Patch Changes
  • #​15574 164e4fb Thanks @​RealBhupesh! - Ignore .wrangler persistence writes in Vite's file watcher

    Miniflare 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 plugin hotUpdate hook and could make page loads take seconds. The plugin now ignores **/.wrangler/** while preserving any server.watch.ignored patterns already set by the user.

  • Updated dependencies [8997652]:

v1.54.8

Compare Source

Patch Changes

v1.54.7

Compare Source

Patch Changes

v1.54.6

Compare Source

Patch Changes

v1.54.5

Compare Source

Patch Changes
  • #​15519 e004845 Thanks @​devaniketh! - Preserve HTTP/2 :authority header and non-default port in dev server requests

    When Vite runs over HTTPS with HTTP/2 enabled, browsers send authority via the :authority pseudo-header rather than Host. Previously, pseudo-headers were omitted when creating Fetch requests, causing non-default ports to be dropped from request.url and X-Forwarded-Host. Authority and scheme are now preserved from HTTP/2 pseudo-headers and request properties.

  • Updated dependencies [8bbcb9f, 2b42d6f, ea5634e, c0c6504, ffc7efd, 682cd44]:

v1.54.4

Compare Source

Patch Changes

v1.54.3

Compare Source

Patch Changes

v1.54.2

Compare Source

Patch Changes

v1.54.1

Compare Source

Patch Changes

v1.54.0

Compare Source

Minor Changes
  • #​15134 c66d2d5 Thanks @​gpanders! - Enable FUSE-capable local container development

    Miniflare 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)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
vite (source) ^8.3.0 → ^8.3.2 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
rolldown (source) ^1.2.11 → ^1.2.12 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
acorn ^8.18.0 → ^8.19.0 age confidence
es-module-lexer ^3.0.2 → ^3.0.3 age confidence
rolldown (source) ^1.2.11 → ^1.2.12 age confidence

Release Notes

acornjs/acorn (acorn)

v8.19.0

Compare Source

guybedford/es-module-lexer (es-module-lexer)

v3.0.3

Compare Source

What's Changed

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)
  • 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.

withastro/astro

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence
@changesets/cli (source) ^3.0.2 → ^3.0.3 age confidence
@codspeed/vitest-plugin (source) 5.2.0 → 5.7.1 age confidence
@earendil-works/pi-ai (source) ^0.83.0 → ^0.99.2 age confidence
@flue/runtime (source) ^2.0.3 → ^2.2.2 age confidence
bgproc ^0.2.0 → ^0.3.0 age confidence
eslint (source) ^10.4.0 → ^10.12.0 age confidence
eslint-plugin-regexp ^3.1.0 → ^3.3.1 age confidence
p-limit ^7.3.0 → ^7.3.3 age confidence
pkg-pr-new (source) ^0.0.71 → ^0.0.88 age confidence
pnpm (source) 11.27.0 → 11.28.4 age confidence
prettier (source) ^3.9.0 → ^3.9.9 age confidence
pretty-bytes ^7.1.0 → ^7.2.0 age confidence
publint (source) ^0.3.17 → ^0.3.25 age confidence
rolldown (source) ^1.2.11 → ^1.2.12 age confidence
tinyexec ^1.0.2 → ^1.3.1 age confidence
tinyglobby (source) ^0.2.16 → ^0.2.17 age confidence
tsx (source) ^4.22.0 → ^4.23.15 age confidence
turbo (source) ^2.10.2 → ^2.11.7 age confidence
typescript-eslint (source) ^8.59.1 → ^8.71.0 age confidence
valibot (source) ^1.2.0 → ^1.5.0 age confidence

Release Notes

changesets/changesets (@​changesets/cli)

v3.0.3

Compare Source

Patch Changes
CodSpeedHQ/codspeed-node (@​codspeed/vitest-plugin)

v5.7.1

Compare Source

What's Changed

Full Changelog: CodSpeedHQ/codspeed-node@v5.7.0...v5.7.1

v5.7.0

Compare Source

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=samply env variable in the codspeed action.
  • Added support for tinybench v5 and v6 in @​codspeed/tinybench-plugin

What's Changed

Full Changelog: CodSpeedHQ/codspeed-node@v5.6.0...v5.7.0

v5.6.0

Compare Source

What's Changed

Full Changelog: CodSpeedHQ/codspeed-node@v5.5.0...v5.6.0

v5.5.0

Compare Source

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

Full Changelog: CodSpeedHQ/codspeed-node@v5.4.0...v5.5.0

v5.4.0

Compare Source

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.

Full Changelog: CodSpeedHQ/codspeed-node@v5.3.0...v5.4.0

v5.3.0

Compare Source

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.

Full Changelog: CodSpeedHQ/codspeed-node@v5.2.0...v5.3.0

earendil-works/pi (@​earendil-works/pi-ai)

v0.99.2

Compare Source

Added
  • Added the lightweight @earendil-works/pi-ai/models entry 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, and ANTHROPIC_IDENTITY_TOKEN_FILE (plus optional ANTHROPIC_SERVICE_ACCOUNT_ID and ANTHROPIC_WORKSPACE_ID). API keys and ANTHROPIC_AUTH_TOKEN take precedence (#​10177, #​10242 by @​philfreo)
Fixed
  • Fixed context overflow detection for Z.AI CN endpoint Prompt exceeds max length errors (#​10208)
  • Fixed Anthropic requests failing when a strict: "prefer" tool schema uses keywords Anthropic strict tool use rejects, such as minimum/maximum; such tools are now sent non-strict (#​9953)
  • Fixed provider retries firing immediately when a Retry-After header contains an unparseable date; they now use exponential backoff (#​9571)

v0.99.1

Compare Source

Added
  • Added GPT-6.1 Sol (gpt-6.1-sol) to the OpenAI, Azure OpenAI Responses, and OpenAI Codex providers.

v0.99.0

Compare Source

Breaking Changes
  • Unified image models into the regular Provider/Models surface. The separate ImagesModels collection is removed: createImagesModels(), createImagesProvider(), ImagesProvider, openrouterImagesProvider(), builtinImagesProviders(), and builtinImagesModels() are gone. Use builtinModels(), models.getModelOfType("image", ...), models.generateImages(), and createProvider({ models, images }) instead. Existing unqualified reads remain chat-only.
  • Image models are now ImageModel with a required type: "image" and share BaseModel with chat models. The old plural image type names (ImagesModel, ImagesApi, KnownImagesApi, KnownImagesProvider, and ImagesProviderId) 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 the openrouter-images api group of openrouter.json; image-models.generated.ts and scripts/generate-image-models.ts are removed. Run npm run hydrate:model-data.
Added
  • Added Models.generateImages() with provider-resolved auth, Provider.generateImages?, and createProvider({ images }) keyed by model.api. createProvider() models and fetchModels accept models of every type, and api is optional when images or classifiers is 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 new isModelType() guard or read the effective type with getModelType().
  • Added getModelsOfType(), getModelOfType(), getAvailableOfType(), getAllModels(), and getAllAvailable() on Models; optional Provider.getAllModels() and Provider.filterAllModels(); corresponding generated-catalog accessors; and the AnyModel and ModelTypeMap types. hasApi(), calculateCost(), and modelsAreEqual() accept AnyModel.
  • 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-style choice/score/bool contract. The built-in TypeSafe provider exposes models.dev's jev-latest through the System One API and translates public bool questions to TypeSafe's noul wire 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 new cloudflare-workers-ai-system-one classifier 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 usage to ClassifierResult: System One classifications report token counts, priced from the model catalog like chat usage.
  • Added a runtime chat-model check to the Models stream entry points so non-chat models fail with a clear ModelsError instead of a missing-api stream error.
  • Added array-based models.all.json and providers/{id}.all.json variants to the generated and published JSON catalog, allowing the same upstream ID once per model type; the existing keyed models.json and providers/{id}.json stay chat-only for released clients.
  • Added onProviderStreamEvent to 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 openai provider: an OAuth login that uses a ChatGPT subscription with the OpenAI API. Models.login() accepts LoginOptions with getDeviceId(), 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-classify classifier 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 openai provider 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 samplingParams being dropped by direct stream()/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_effort instead of prompt_mode, GLM 5.2 accepts max, and Mistral models only offer the effort levels the API supports (#​9678).
  • Fixed OpenCode Zen and OpenCode Go qwen3.8-flash thinking 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

Compare Source

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

Compare Source

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

Compare Source

Added
  • Added Meta provider (Model API key and Muse subscription OAuth) with Muse Spark models (#​9096 by @​xl0).
Fixed
  • Fixed z.ai Prompt too long errors 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

Compare Source

Breaking Changes
  • Changed provider-facing ProviderStreams and StreamFunction inputs from Context to normalized TranscriptContext values. System prompts and tool declarations now live in transcript system messages; custom providers must read them with getCurrentSystemPrompt() and getCurrentTools(). See System Messages.
  • Restricted ToolCall.arguments and ToolResultMessage.details to JSON-compatible values, changed ToolResultMessage into a conditional type, and made JsonValue arrays 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 ToolSearch or tool_search as the loader name for prompt-prefix deferral (#​9323).
  • Added RetryPolicy.maxAgentDelayMs support to cap shared assistant retry backoff for summarization calls (#​8826).
  • Added Model.promptCache lifetime 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 EventStream events (#​9055).
  • Fixed Mistral Medium reasoning requests to use reasoning_effort for all reasoning-capable mistral-medium-* model IDs instead of the unsupported prompt_mode (#​8700).
  • Fixed OpenCode and OpenCode Go requests to send x-opencode-session from sessionId across 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-id from sessionId for Chat Completions and Anthropic Messages models when prompt caching is enabled (#​9102).
  • Fixed the DeepSeek catalog to advertise deepseek-flash for 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_effort instead of the ignored prompt_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 sessionId for 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

Compare Source

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 of prompt_cache_retention: "24h".

v0.85.0

Compare Source

Breaking Changes
  • Replaced createGatewayBindingFetch() with createAiBindingFetch() for Cloudflare Workers AI bindings. Configure the model's Workers AI Gateway passthrough baseUrl directly; requests now pass through the binding unchanged (#​8287 by @​Maximo-Guk).
Added
  • Added compact, persistable assistant-message frames with AssistantMessageFrameEncoder and reduceAssistantMessageFrames().
  • Added the vllmPriority OpenAI-compatible model setting for forwarding scheduler priority to vLLM (#​9004 by @​AppleDannyClegg).
  • Added the supportsMaxOutputTokens OpenAI Responses compatibility setting (#​8941 by @​scturtle).
  • Added an optional timestamp argument to uuidv7() for follower IDs.
  • Added narrow api, providers, and utils subpath 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 JsonValue type 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_PROXY matching for both root domains and subdomains (#​8737 by @​MeiSiristhebest).

v0.84.4

Compare Source

Added
  • Added the experimental vision-capable deepseek-v4-flash-vision-exp model to the DeepSeek catalog.
Fixed
  • Fixed OpenAI-compatible Chat Completions ignoring an explicitly requested toolChoice when 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_details deltas.
  • Fixed the Cloudflare AI Gateway catalog to include supported workers-ai/* passthrough models omitted by models.dev.
  • Fixed OpenRouter reasoning controls by deriving off support and available effort levels from OpenRouter's model metadata, preventing reasoning-mandatory models from receiving effort: "none" (#​8614 by @​davidbrai).

v0.84.3

Compare Source

Breaking Changes
  • Renamed GoogleThinkingLevel to GoogleApiThinkingLevel and added ResolvedGoogleThinkingLevel for normalized adapter levels.
Added
  • Added provider-neutral toolChoice support 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-0813 to 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-Agent unless overridden (#​8305).
Fixed
  • Fixed OpenAI-compatible Chat Completions reasoning replay to preserve and resend assistant-level reasoning_details (reasoning.text, reasoning.summary, and reasoning.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 toolChoice in provider-specific stream requests.
  • Fixed Amazon Bedrock after_provider_response/onResponse to forward the raw response headers instead of only the synthesized request id header (#​8234).
  • Fixed Kimi OpenAI-compatible usage reporting so top-level cached_tokens count 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 off support and available effort levels from OpenRouter's model metadata, preventing reasoning-mandatory models from receiving effort: "none" (#​8454).

v0.84.2

Compare Source

Added
  • Added createGatewayBindingFetch() for routing Cloudflare AI Gateway requests through a Workers AI binding without an API token (#​7901 by @​Maximo-Guk).
  • Added AssistantMessage.endTurn to preserve OpenAI Codex's terminal end_turn signal for diagnostics (#​7766).
Changed
  • Changed Kimi Coding requests to use pi's runtime User-Agent header.
  • Automatically converted supported strict tool schemas to provider-compatible closed objects with required nullable optional fields while preserving original tool definitions, and treated null values for optional non-nullable tool arguments as omitted.
  • Changed OpenAI Responses deferred tool loading to prefer message-anchored additional_tools where 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_tokens field.
  • 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

Compare Source

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

Compare Source

Breaking Changes
  • Renamed the exported ModelsStreamTransforms interface to ModelsRequestTransforms because 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.store access with the read-only context.stored snapshot and generation-checked context.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. signal is 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(), omit persist to leave storage unchanged, pass a ModelsStoreEntry to write it, or pass persist: null to delete it. Omit update for metadata-only persistence; omit persist for an ephemeral in-memory publication.

Added
  • Added optional OAuthAuth.isSubscription metadata for distinguishing subscription-backed authentication from generic OAuth sign-in.
  • Added explicit TelemetryContext propagation across stream, deferred, and image request options using the vendor-neutral @earendil-works/pi-telemetry contract.
  • 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_args reasoning controls.
  • Added arbitrary OpenAI-compatible sampling parameters through Model.samplingParams and StreamOptions.samplingParams, including per-request overrides (#​7568 by @​mrexodia).
  • Added opt-in vLLM thinking_token_budget support for OpenAI-compatible models, reserving output tokens for the final answer (#​7638 by @​bnsd55).
  • Added OpenAICompletionsCompat.supportsFinishReason for providers that omit streamed finish_reason values, 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 ModelsStore reads, 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/oneOf union arm before attempting coercion, avoiding nullable unions converting null to 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_retention field 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-27b model.
  • 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_tokens is 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-preview model with qwen3.8-max (#​7670 by @​QuintinShaw).
withastro/flue (@​flue/runtime)

v2.2.2

Compare Source

Patch Changes
  • 2cb57be: Fix Claude models on the cloudflare-ai-gateway provider failing with 404 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. The cloudflare binding provider, which uses Cloudflare's dotted catalog names, is unchanged.

v2.2.1

Compare Source

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)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
vite (source) ^8.3.0 → ^8.3.2 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
package-manager-detector ^1.8.0 → ^1.9.0 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

Changes

  • Fixes astro add wiping existing allowBuilds approvals in pnpm-workspace.yaml on pnpm v11.0–v11.22 when an integration needs a build script approved (currently workerd for Cloudflare), a regression from #18287. On those versions --allow-build replaces the whole map, so later installs fail with ERR_PNPM_IGNORED_BUILDS for 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
withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@types/hast (source) ^3.0.4 → ^3.0.5 age confidence
@types/picomatch (source) ^4.0.2 → ^4.0.3 age confidence
fast-xml-parser ^5.5.7 → ^5.11.2 age confidence
package-manager-detector ^1.6.0 → ^1.9.0 age confidence
picomatch ^4.0.4 → ^4.0.7 age confidence
shiki (source) ^4.0.2 → ^4.5.0 age confidence
smol-toml ^1.8.0 → ^1.9.0 age confidence
zod (source) ^4.5.4 → ^4.6.5 age confidence

Release Notes

NaturalIntelligence/fast-xml-parser (fast-xml-parser)

v5.11.2

Compare Source

What's Changed

New Contributors

Full Changelog: NaturalIntelligence/fast-xml-parser@v5.11.1...v5.11.2

v5.11.1

Compare Source

What's Changed

New Contributors

Full Changelog: NaturalIntelligence/fast-xml-parser@v5.11.0...v5.11.1

v5.11.0

Compare Source

What's Changed

New Contributors

Full Changelog: NaturalIntelligence/fast-xml-parser@v5.10.1...v5.11.0

v5.10.1

Compare Source

Full Changelog: NaturalIntelligence/fast-xml-parser@v5.10.0...v5.10.1

v5.10.0

Compare Source

What's Changed

Full Changelog: NaturalIntelligence/fast-xml-parser@v5.9.3...v5.10.0

v5.9.3

Compare Source

What's Changed

New Contributors

Full Changelog: NaturalIntelligence/fast-xml-parser@v5.9.2...v5.9.3

v5.9.2

Compare Source

Full Changelog: NaturalIntelligence/fast-xml-parser@v5.9.1...v5.9.2

v5.9.1

Compare Source

Full Changelog: NaturalIntelligence/fast-xml-parser@v5.9.0...v5.9.1

v5.9.0: update strnum, use is-unsafe

Compare Source

  • 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

Compare Source

   🚀 Features
    View changes on GitHub

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
vite (source) ^8.3.0 → ^8.3.2 age confidence

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@qwik.dev/partytown ^0.14.4 → ^0.14.5 age confidence

Release Notes

QwikDev/partytown (@​qwik.dev/partytown)

v0.14.5

Compare Source

Patch Changes
  • 🐞🩹 fall back right away when navigator.serviceWorker.register() fulfills without a registration (e.g. Playwright's serviceWorkers: 'block'), instead of throwing Cannot 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 HTMLCollection in the web worker so x instanceof HTMLCollection no 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)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@fastify/static ^10.1.4 → ^10.1.5 age confidence

Release Notes

fastify/fastify-static (@​fastify/static)

v10.1.5

Compare Source

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)
  • 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.

withastro/astro

Changes

  • Astro.cache was undefined when the 404 or 500 page was rendered through renderDefaultError (production) or renderDevError (dev), because those handlers created a new FetchState without calling provideCache(). Any Astro.cache.set() in an error page or its shared layout would throw mid-stream, discarding the rendered body and returning Internal server error instead.
  • 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 through handleCache, so cache.set() there sets no CDN headers.

Testing

  • Added packages/astro/test/units/cache/app-cache.test.ts covering the case where Astro.cache is 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: CacheLike type signature.

Closes #18275

withastro/astro

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 28e7410 Thanks @astro-factory! - Fixes Astro.cache being undefined when 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 0e9e857 Thanks @matthewp! - Fixes astro add removing existing allowBuilds approvals from pnpm-workspace.yaml with pnpm v11.0–v11.22

  • #18263 882dd98 Thanks @florian-lefebvre! - Refactors internal bundling and code transforms to use Vite's Oxc-based transformWithOxc and Rolldown instead of esbuild. These packages no longer depend on esbuild directly.

  • #18290 31f13c3 Thanks @astro-factory! - Fixes the glob() 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 882dd98 Thanks @florian-lefebvre! - Removes the automatic allowScripts and allowBuilds pre-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 882dd98 Thanks @florian-lefebvre! - Refactors internal bundling and code transforms to use Vite's Oxc-based transformWithOxc and Rolldown instead of esbuild. These packages no longer depend on esbuild directly.

@astrojs/netlify@8.2.9

Patch Changes

  • #18263 882dd98 Thanks @florian-lefebvre! - Refactors internal bundling and code transforms to use Vite's Oxc-based transformWithOxc and 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 882dd98 Thanks @florian-lefebvre! - Refactors internal bundling and code transforms to use Vite's Oxc-based transformWithOxc and Rolldown instead of esbuild. These packages no longer depend on esbuild directly.

astro-vscode@2.17.2

Patch Changes

  • #18263 882dd98 Thanks @florian-lefebvre! - Refactors internal bundling and code transforms to use Vite's Oxc-based transformWithOxc and Rolldown instead of esbuild. These packages no longer depend on esbuild directly.
withastro/astro

Changes

  • Workers Cache reports a refused purge, including one over the rate limit, as success: false in the result of cache.purge() (docs). The provider dropped that result, so cache.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 success is false, with Cloudflare's errors as the error's cause, as invalidate() already does on Netlify when its purge request fails. Successful purges are unchanged. Callers that await invalidate() after a write start seeing rejections; EmDash is guarding its calls in emdash-cms/emdash#3987.

Testing

  • New test/units/cache-purge.test.ts covers the purge step with a stand-in cache object, since cloudflare:workers does not load in Node: an accepted purge passes the tags through and resolves, a refused one rejects with the returned errors as cause.

Docs

  • None needed: the route caching guide does not describe what invalidate() does when a purge fails, for any provider.
withastro/astro

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, leaving positivePatterns empty and causing all change, add, and unlink events 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.ts covering 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

withastro/astro

Changes

  • astro add cloudflare now succeeds on the first run when using pnpm v11 or newer. pnpm v11+ enables strictDepBuilds by default, which causes pnpm add to exit with ERR_PNPM_IGNORED_BUILDS when a transitive dependency (workerd, via wrangler/miniflare) has an unapproved build script. The install was silently counted as failed and astro.config.* was never updated.
  • When pnpm v11+ is detected, astro add now appends --allow-build=workerd to the generated pnpm add command for the Cloudflare adapter. pnpm then writes workerd: true into allowBuilds in pnpm-workspace.yaml automatically. 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.ts covering the --allow-build=workerd flag 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

withastro/starlight

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:

  1. cd packages/starlight
  2. pnpm build && pnpm pack --out /tmp/sl-cloudflare-test.tgz

In a new directory, I then ran the following commands:

  1. pnpm create astro@latest . -- --template starlight --install --no-git
  2. pnpm astro add cloudflare
  3. pnpm add /tmp/sl-cloudflare-test.tgz
  4. pnpm dev

Here is a comparison before and after the changes:

Before After
SCR-20261007-153402@2x SCR-20261007-154011@2x
withastro/astro

Changes

  • Restores the Deno 2.9.5 pin for the integrations test suite. Renovate bumped deno-version to 2.9.6 in #18279, and Deno 2.9.6 dropped --allow-scripts from deno eval, which @netlify/edge-functions-dev passes to boot its dev server.
  • Ignores the deno dependency in .github/renovate.json5 so Renovate stops updating the deno-version input of denoland/setup-deno.
  • Made with AI

Testing

  • N/A

Docs

  • N/A
withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@shikijs/rehype (source) ^4.0.2 → ^4.5.0 age confidence
@shikijs/twoslash (source) ^4.0.2 → ^4.5.0 age confidence
@types/estree (source) ^1.0.8 → ^1.0.9 age confidence
@types/hast (source) ^3.0.4 → ^3.0.5 age confidence
acorn ^8.16.0 → ^8.18.0 age confidence
linkedom ^0.18.12 → ^0.18.13 age confidence
preact (source) ^10.29.0 → ^10.29.8 age confidence
react (source) ^19.0.0 → ^19.3.0 age confidence
react-dom (source) ^19.0.0 → ^19.3.0 age confidence
rehype-pretty-code (source) ^0.14.3 → ^0.14.5 age confidence
remark-smartypants ^3.0.2 → ^3.0.3 age confidence
satteri ^0.10.3 → ^0.10.5 age confidence
shiki (source) ^4.0.0 → ^4.5.0 age confidence
shiki (source) ^4.0.2 → ^4.5.0 age confidence
source-map ^0.7.6 → ^0.8.0 age confidence
vite (source) ^8.0.13 → ^8.3.2 age confidence

Release Notes

shikijs/shiki (@​shikijs/rehype)

v4.5.0

Compare Source

   🚀 Features
   🐞 Bug Fixes
   🏎 Performance
    View changes on GitHub

v4.4.3

Compare Source

   🚀 Features
   🐞 Bug Fixes
    View changes on GitHub

v4.4.2

Compare Source

   🐞 Bug Fixes
   🏎 Performance
    View changes on GitHub

v4.4.1

Compare Source

   🚀 Features
    View changes on GitHub

v4.4.0

Compare Source

   🚀 Features
   🐞 Bug Fixes
    View changes on GitHub

v4.3.1

Compare Source

   🚀 Features
    View changes on GitHub

v4.3.0

Compare Source

   🚀 Features
    View changes on GitHub

v4.2.0

Compare Source

   🚀 Features
   🐞 Bug Fixes
    View changes on GitHub

v4.1.0

Compare Source

   🐞 Bug Fixes
    View changes on GitHub
rehype-pretty/rehype-pretty-code (rehype-pretty-code)

v0.14.5

Compare Source

Patch Changes
  • fix: detect showLineNumbers wherever 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/#a no 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

Compare Source

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

Compare Source

bruits/satteri (satteri)

v0.10.5

Compare Source

Patch changes
  • Updated dependencies: satteri-mdxjs (Cargo)@​0.3.13

v0.10.4

Compare Source

Patch changes
  • Updated dependencies: satteri-mdxjs (Cargo)@​0.3.13
mozilla/source-map (source-map)

v0.8.0

Compare Source


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Type Update Change Age Confidence
CodSpeedHQ/action action minor v5.2.1 → v5.4.0 age confidence
changesets/action action patch v2.1.1 → v2.1.2 age confidence
deno (source) uses-with patch v2.9.5 → 2.9.6 age confidence
node uses-with minor 24.15.0 → 24.21.0 age confidence
node uses-with minor 24.18.0 → 24.21.0 age confidence
pnpm/action-setup action minor v6.0.8 → v6.1.0 age confidence
zizmorcore/zizmor-action action minor v0.5.6 → v0.6.4 age confidence

Release Notes

CodSpeedHQ/action (CodSpeedHQ/action)

v5.4.0

Compare Source

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-override flag (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
⚡ Performance
⚙️ Internals

Full Runner Changelog:
https://github.com/CodSpeedHQ/codspeed/blob/main/CHANGELOG.md

What's Changed

New Contributors

Full Changelog: CodSpeedHQ/action@v5.2.1...v5.4.0

changesets/action (changesets/action)

v2.1.2

Compare Source

Patch Changes
denoland/deno (deno)

v2.9.6

Compare Source

  • 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 ObjectCreate and
    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 SafeArrayIterator in 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

Compare Source

Node.js 24.21.0

v24.20.0: 24.20.0

Compare Source

Node.js 24.20.0

v24.19.0: 24.19.0

Compare Source

Node.js 24.19.0

v24.18.1: 24.18.1

Compare Source

Node.js 24.18.1

v24.18.0: 24.18.0

Compare Source

Node.js 24.18.0

v24.17.0: 24.17.0

Compare Source

Node.js 24.17.0

v24.16.0: 24.16.0

Compare Source

Node.js 24.16.0

pnpm/action-setup (pnpm/action-setup)

v6.1.0

Compare Source

What's Changed

Full Changelog: pnpm/action-setup@v6.0.10...v6.1.0

v6.0.10

Compare Source

What's Changed
New Contributors

Full Changelog: pnpm/action-setup@v6...v6.0.10

v6.0.9

Compare Source

What's Changed

Full Changelog: pnpm/action-setup@v6...v6.0.9

zizmorcore/zizmor-action (zizmorcore/zizmor-action)

v0.6.4

Compare Source

Sponsorship is appreciated!

zizmor 1.30.1 is now the default version.

Release notes: https://docs.zizmor.sh/release-notes/#​1301

v0.6.3

Compare Source

zizmor 1.30.0 is now the default version.

Release notes: https://docs.zizmor.sh/release-notes/#​1300

v0.6.2

Compare Source

zizmor 1.29.0 is now the default version.

v0.6.1

Compare Source

zizmor 1.28.0 is now the default version used by the action.

v0.6.0

Compare Source

zizmor 1.27.0 is now the default version used by the action.

What's Changed

New Contributors

Full Changelog: zizmorcore/zizmor-action@v0.5.7...v0.6.0

v0.5.7

Compare Source

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)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@sveltejs/vite-plugin-svelte (source) ^7.1.0 → ^7.3.1 age confidence
@testing-library/svelte (source) ^5.3.1 → ^5.4.2 age confidence
svelte (source) ^5.55.7 → ^5.57.1 age confidence
svelte2tsx (source) ^0.7.55 → ^0.7.61 age confidence
vite (source) ^8.0.13 → ^8.3.2 age confidence
vitefu ^1.1.2 → ^1.1.3 age confidence

Release Notes

sveltejs/vite-plugin-svelte (@​sveltejs/vite-plugin-svelte)

v7.3.1

Compare Source

Patch Changes
  • fix: inject the inspector into the client under Vite+ on pnpm, where the realpathed client module has no vite/ segment before dist/ (#​1373)

v7.3.0

Compare Source

Minor Changes
  • feat: pass environment to dynamicCompileOptions (#​1386)
Patch Changes
  • fix: don't log inline config when encountering unexpected options (#​1376)

v7.2.0

Compare Source

Minor Changes
  • feat(inspector): add a context menu with current component stack (#​1370)

v7.1.4

Compare Source

Patch Changes
  • fix: enforce ltr styles for inspector (#​1324)

v7.1.3

Compare Source

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

Compare Source

@​testing-library/svelte 5.4.2 (2026-06-23)

Bug Fixes
Dependencies

v5.4.1

Compare Source

@​testing-library/svelte 5.4.1 (2026-06-21)

Dependencies

v5.4.0

Compare Source

@​testing-library/svelte 5.4.0 (2026-06-20)

Features
Dependencies
sveltejs/language-tools (svelte2tsx)

v0.7.61

Compare Source

Patch Changes
  • fix: handle SvelteKit 3 changed imports for zero types feature (#​3106)

v0.7.60

Compare Source

Patch Changes
  • fix: remove type dependency on magic-string (#​3101)

v0.7.59

Compare Source

Patch Changes
  • fix: throw a friendly error for TypeScript 7 stable (#​3073)

v0.7.58

Compare Source

Patch Changes
  • feat: zero-config +error.svelte props (#​3076)

v0.7.57

Compare Source

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

Compare Source

Patch Changes
  • fix: properly handle props with the name slot inside 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)
  • 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.

withastro/astro

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
withastro/astro

Changes

Clear out a few Vite things that were kept up between reloads.

Fixes #18178

Testing

Added tests

Docs

N/A

withastro/astro

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 cba76cc Thanks @astro-factory! - Fixes a build error when a Markdown content collection entry loaded with glob({ deferRender: true }) has a layout frontmatter property. layout is now ignored for content collection entries, as documented.

  • #18287 38f6793 Thanks @astro-factory! - Fixes astro add cloudflare failing to install dependencies with pnpm v11+ by approving the workerd build script, and shows the package manager's error output when astro add fails to install dependencies

  • #18222 fcf6ed6 Thanks @mingjunlu! - Fixes an issue where AVIF images were served as image/heif instead of image/avif in the dev server.

  • #18240 de4df06 Thanks @astro-factory! - Fixes the cache() handler from astro/hono and astro/fetch throwing a TypeError when a cache provider is configured. It now registers the cache provider before rendering, so Astro.cache is available to downstream handlers like pages().

  • #18268 547b572 Thanks @astro-factory! - Fixes security.checkOrigin rejecting cross-origin requests with non-form content types such as application/json. As documented, the check only applies to unsafe requests that have no content-type header or one of application/x-www-form-urlencoded, multipart/form-data, or text/plain.

@astrojs/netlify@8.2.8

Patch Changes

  • #18180 6fb83da Thanks @matthewp! - Fixes Netlify Image CDN patterns generated from image.remotePatterns pathnames 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

withastro/astro

Changes

Replaces the description for the sync command in astro help to match:

Testing

N/A

Docs

This is docs. I added a changeset as this kinda fix docs.

withastro/astro

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 2938cdb Thanks @ematipico! - Updates the peer dependency of astro to 7.4.0. You no longer need to install 7.4.0-beta anymore.

  • #18450 2938cdb Thanks @ematipico! - Updates @cloduflare/vite-plugin to 2.0.0-beta.v.1.

  • #18196 e6a2e90 Thanks @swissky! - Fails the build with a migration hint when a project has a wrangler.json, wrangler.jsonc, or wrangler.toml file but no cloudflare.config.ts. Previously the build succeeded and the Worker name, bindings, and entrypoint from the Wrangler file were silently ignored. Run npx cf migrate --bundler vite to generate cloudflare.config.ts from your existing Wrangler configuration.

withastro/astro

Changes

  • Restores the documented security.checkOrigin contract: isForbiddenCrossOriginRequest now skips the CSRF check when the request carries a non-form Content-Type (e.g. application/json). This was accidentally broken in 7.3.6 by #15595, which ported Go's CrossOriginProtection and dropped the content-type check entirely — causing any cross-origin JSON POST/PATCH/PUT/DELETE to receive a 403, contrary to docs.
  • The new Sec-Fetch-Site/Origin logic introduced in 7.3.6 is kept intact for requests with no Content-Type or a form-like one (application/x-www-form-urlencoded, multipart/form-data, text/plain). FORM_CONTENT_TYPES and hasFormLikeHeader, which were left with no callers after #15595, are now used again.

Testing

  • Extended packages/astro/test/units/app/csrf.test.ts with cases covering application/json, application/json; charset=utf-8, and Application/JSON (case-insensitive) — all should pass through, matching 7.3.5 behavior.
  • Existing cases for form-like content types and missing Content-Type are unchanged, confirming no regression.

Docs

  • No docs update needed; the existing security.checkOrigin JSDoc and configuration reference already describe the correct (form-only) scope that this fix restores.

Closes #18267

withastro/astro

Changes

  • Markdown files loaded through a content collection with deferRender: true no longer treat layout as a special frontmatter key. Previously, the ?astroPropagatedAssets wrapper imported the bare .md path, causing astro:markdown to emit an unresolvable import Layout from "<value>" — contradicting the documented behavior that layout is ignored inside content collections.
  • The assets wrapper now requests .md files with a ?astroMarkdownContentEntry query flag. astro:markdown skips layout processing when that flag is present, leaving Markdown pages and direct .md imports unaffected.

Testing

  • Added packages/astro/test/units/vite-plugin-markdown/layout.test.ts covering the case where a Markdown content entry with a layout frontmatter key and deferRender: true builds without error.

Docs

  • No docs update needed; the existing docs already state that layout is not a special property when using content collections.

Closes #18169

withastro/astro

Changes

  • When a Hono worker entry uses cf() + pages() without going through App.render, an unmatched request returned an empty 404 with an internal X-Astro-Error: true header instead of serving the prerendered 404.astro. This adds a new notFound() middleware to astro/hono (and its underlying fetch handler in astro/fetch) that calls renderErrorFromState with status: 404 when no route matched, mirroring what astro() (handleRequest) already does internally.
  • astro() now delegates to the same shared helper, so the behavior is consistent across both usage styles. Users with a custom cf() + pages() chain can add notFound() between them to serve the prerendered 404 page.

Testing

  • New unit tests in packages/astro/test/units/fetch/index.test.ts cover the notFound() handler returning the prerendered 404 through prerenderedErrorPageFetch and passing through when a route does match.
  • New unit tests in packages/astro/test/units/hono/index.test.ts cover the Hono notFound() middleware under the same conditions.

Docs

Closes #18232

withastro/astro

Changes

Replaces direct esbuild usage with Vite and Rolldown APIs and removes the esbuild dependency from the affected packages:

  • astro uses transformWithOxc for env replacement and Rolldown for client directive bundling.
  • @astrojs/netlify, @astrojs/vercel, and @astrojs/markdoc bundle with Rolldown.
  • astro-scripts and astro-vscode build with Rolldown.
  • create-astro no longer writes allowScripts or allowBuilds, and the example projects drop their stale entries.

Made with AI

Testing

  • pnpm run build:ci builds every package.
  • The astro unit suite and the affected integration suites pass.

Docs

Changesets

withastro/astro

Changes

  • Paths not in the static route table (e.g. /en/about rewritten by middleware to /about) no longer receive a forced status: 404 from Vercel's platform routing layer when the 404 page is server-rendered. Previously, the catch-all route in .vercel/output/config.json unconditionally included status: 404 regardless of destination, causing middleware-rewritten routes to return 404 even though the render function produced a valid 200 response.
  • status: 404 is now only set when the catch-all destination is the static /404.html (i.e. fourOhFourRoute.isPrerendered is true). When the 404 page is server-rendered, status is omitted so the function returns the real HTTP status — 200 for middleware-rewritten valid routes, 404 from 404.astro for genuinely missing pages.

Testing

  • Adds a test case in packages/integrations/vercel/test/server-rendered-error-pages.test.ts covering the catch-all route config emitted when the 404 page is server-rendered, asserting that status is 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

withastro/astro

Changes

  • In dev mode, CSS from unrelated pages was leaking into a route's <head> whenever the route (or anything it imported) reached virtual: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 ensureModulesLoaded and collectCSSWithOrder in vite-plugin-css/index.ts, skipping modules whose ID starts with \0virtual:astro:page:. This mirrors the build-mode isBuildCssBoundary approach 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

withastro/astro

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 global ContentLayer was never re-initialized, leaving loaders subscribed to the closed watcher and ignoring all subsequent file changes.
  • After a successful in-place restart, handleChangeRestart now re-creates globalContentLayer with the new settings and the new Vite watcher, reuses the existing data store (exposed via a new store getter on ContentLayer), and re-runs watchContentConfig() and sync(). 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

withastro/astro

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, specifying name: "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 confirms name: "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

withastro/astro

Changes

  • When astro:rollup-plugin-build-css deletes a client CSS asset because the SSR/prerender build already bundled all of its CSS modules, the asset's filename was left in viteMetadata.importedCss of the chunks that import it. Vite's vite:build-import-analysis then wrote that deleted filename into __vite__mapDeps, causing the browser to preload a file that doesn't exist in dist/ (404).
  • At the end of generateBundle in plugin-css.ts, any CSS asset that was deleted and not restored is now also removed from every client chunk's importedCss set, matching the behavior already used by the inline-stylesheets plugin in the same file.

Testing

  • Extended the css-dangling-references integration test with a hydrated-island fixture page that exercises the exact scenario: a component is both a client:load island and reachable through a dynamic import on the same page. The test asserts that no CSS filename in any chunk's __vite__mapDeps is missing from dist/.
  • 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

withastro/astro

Changes

  • Integration-injected page routes (tagged origin: 'external') no longer receive a 404 from finalizeI18n when i18n.routing.prefixDefaultLocale: true is set. Previously, I18nRouter.matchPrefixAlways returned notFound for 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.ts covering an external-origin page route under prefixDefaultLocale: 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

withastro/astro

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) and NOT_FOUND (404) respectively, consistent with how the actions system already handles other invalid-request scenarios (unknown action → 404, wrong content type → 415).
  • The getAction catch block is extended to treat URIError (thrown by decodeURIComponent for malformed percent-encoding) as a NOT_FOUND, and the parseRequestBody catch block is extended to treat SyntaxError (thrown by JSON.parse/Request.json() for invalid JSON) as a BAD_REQUEST with 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.ts in 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

withastro/astro

Changes

  • Content files with # or ? in their name or path are now loaded correctly by the glob loader. Previously, encodeURI left those characters unescaped, causing the WHATWG URL parser to treat them as hash/query delimiters and truncate the path — leading to an ENOENT error and a silently dropped collection entry.
  • Introduces a small resolveEntryUrl() helper that percent-encodes # and ? after encodeURI. All three affected call sites in glob.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.ts covering 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

withastro/astro

Changes

  • trailingSlash(), middleware(), and pages() now return an empty 400 for paths with too many layers of percent-encoding, matching the behaviour of astro(). 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) in core/routing/invalid-encoding.ts encapsulates the check. handleRequest, handleTrailingSlash, handleMiddlewareWithErrorFallback, and handlePagesWithErrorFallback each call it first, so the rejection holds regardless of how the pipeline is composed.

Testing

  • Extended packages/astro/test/units/fetch/index.test.ts to cover pages() and trailingSlash()+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

withastro/astro

Changes

  • Localized error routes (e.g. /pt/404, /pt/500) now return the correct HTTP status code when rendered through the composable pages() handler (astro/hono, astro/fetch). Previously, handlePagesWithErrorFallback never called getDefaultStatusCode, so FetchState.status stayed at its default of 200 and that value was copied onto the response. The fix calls getDefaultStatusCode in handlePagesWithErrorFallback before delegating to handlePages, matching what render() already does on the astro() path.
  • Root /404 and /500 were already handled by a hardcoded override in renderPage; this change extends correct status-code behavior to any locale-prefixed error route recognized by isLocalizedErrorRoute.

Testing

  • New unit tests added in packages/astro/test/units/fetch/index.test.ts covering pages() 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

withastro/astro

Changes

  • FetchState.getAPIContext() now defers caching the context object until after props are resolved. Calls made before getProps() returns still get a valid context, and the next call (after getProps()) fills in props on the same object. This means endpoints and middleware always see the resolved props value instead of the pre-computed null.
  • handlePagesWithErrorFallback now awaits getProps() before dispatching, so the pages() composable no longer exposes props: null to endpoints when middleware() is absent.

Testing

  • Extended packages/astro/test/units/fetch/index.test.ts with a case covering actions() mounted before middleware(), asserting that endpoints and middleware both see the resolved props instead of null.

Docs

  • No docs update needed; this is a bug fix restoring already-documented behavior of context.props.

Closes #18229

withastro/astro

Changes

  • annotateSourceFile is now disabled when Vite is running in test mode (viteConfig.mode === 'test'), preventing data-astro-source-file / data-astro-source-loc attributes from appearing in HTML rendered by experimental_AstroContainer under Vitest. These annotations are only useful for the dev toolbar in a browser context and have no value in test pipelines.
  • @astrojs/compiler-rs is bumped to ^0.5.1, which is the first version that actually implements annotateSourceFile; the regression was invisible on 0.5.0 because the option was a stub.

Testing

  • Added packages/astro/test/units/compile/annotate-source-file.test.ts, which asserts that the annotateSourceFile flag is false when viteConfig.mode is 'test' and true when it is 'development' with the dev toolbar enabled.

Docs

  • No docs update needed. The annotateSourceFile option is an internal compiler detail; the fix restores existing behavior for the experimental Container API with no API surface change.

Closes #18162

withastro/astro

Changes

  • The composable cache() handler from astro/hono and astro/fetch now calls provideCache(state) before handleCache, matching the behavior of the astro() path. Previously, state.resolve('cache') returned undefined when a cache provider was configured, causing applyCacheHeaders to throw Cannot use 'in' operator to search for 'Symbol(astro:cache:apply)' in undefined and a 500 response.
  • Adds a provideAndHandleCache() helper in packages/astro/src/core/cache/handler.ts that awaits provideCache(state) then runs handleCache. The public cache() composable delegates to it; the astro() path is unchanged.

Testing

  • New unit test in packages/astro/test/units/hono/index.test.ts covering the cache() 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

withastro/starlight

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.

withastro/starlight

Description

  • Closes #
  • What does this PR change? Give us a brief description.
  • Did you change something visual? A before/after screenshot can be helpful.
withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@netlify/blobs (source) ^11.1.1 → ^11.1.3 age confidence
@netlify/functions (source) ^6.0.0 → ^6.0.2 age confidence
vite (source) ^8.3.1 → ^8.3.2 age confidence

Release Notes

netlify/primitives (@​netlify/blobs)

v11.1.3

Compare Source

Bug Fixes
  • blobs: stop blaming builds for runtime write failures (#​793) (547f70b)
Dependencies

v11.1.2

Compare Source

Dependencies
netlify/primitives (@​netlify/functions)

v6.0.2

Compare Source

Dependencies
  • The following workspace dependencies were updated

v6.0.1

Compare Source

Dependencies
  • The following workspace dependencies were updated

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@types/alpinejs (source) ^3.13.11 → ^3.17.0 age confidence
alpinejs (source) ^3.15.8 → ^3.17.4 age confidence
vite (source) ^8.0.13 → ^8.3.2 age confidence

Release Notes

vitejs/vite (vite)

v8.3.2

Compare Source

Bug Fixes
Performance Improvements
Documentation
  • fix dead og-image PNG links in vite6/vite7 changelog entries (#​23594) (1929b4c)
Miscellaneous Chores
Code Refactoring
Tests
  • bundled-dev: accept a rolldown dev runtime with no helper imports (#​23606) (634745d)

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

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, and pnpm typecheck passed.
  • A local astro dev endpoint 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.

withastro/astro

Changes

  • Fixes an issue where AVIF images were served as image/heif instead of image/avif in 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.
withastro/astro

Changes

  • Font.astro now imports componentDataByCssVariable from a new internal module (src/assets/fonts/component-data.ts) whose types are included in the published package, instead of from virtual:astro:assets/fonts/internal which was declared only in the unpublished dev-only.d.ts. This eliminates the TS2307 error consumers see when tsc follows the astro:assets re-export into node_modules.
  • Picture.astro now narrows with 'inferSize' in props before accessing the property, fixing TS2339 errors caused by reading a field that doesn't exist on every member of the LocalImageProps | RemoteImageProps union.

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

withastro/astro

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.astro with await import(/* @vite-ignore */ "/external.js"), public/external.js): before, dist/index.html contains __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 main with the reported symptom and passes with the fix (rebuilt dist between runs, since this suite imports from dist).
  • 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 fetched cdn.jsdelivr.net URL, so they are environment/network dependent and unrelated to script inlining.
  • pnpm build --filter=astro exits 0. biome format and biome ci --formatter-enabled=false report 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.

withastro/astro

Changes

  • The Cloudflare adapter's globalThis.process ??= {}; globalThis.process.env ??= {}; banner is now set on the ssr and prerender Vite environments instead of the top-level vite.build.rolldownOptions.output. With Vite 8's multi-environment build, the top-level build config was inherited by the client environment, 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.ts that 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

withastro/astro

Changes

  • Adds the headingoffset and headingreset global attributes to HTMLAttributes in astro-jsx.d.ts
    • headingoffset accepts 0–8 (as a number or numeric string), matching the spec's allowed range
    • headingreset is typed like other boolean attributes such as inert
  • Adds headingreset to htmlBooleanAttributes, so dynamic values render as a boolean attribute:
    • headingreset={true} → headingreset (previously headingreset="true")
    • headingreset={false} → omitted (previously headingreset="false", which enabled the reset)

References:

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

withastro/astro

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.

withastro/astro

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 db00242 Thanks @edmundhung! - Updates astro add @astrojs/cloudflare@beta to install cf, scaffold cloudflare.config.ts, and generate types with cf

@astrojs/cloudflare@15.0.0-beta.1

Patch Changes

  • #18205 7a519a7 Thanks @ematipico! - Upgrades the @cloudflare/vite-plugin to the latest.
  • Updated dependencies []:
    • @astrojs/underscore-redirects@1.0.4
withastro/astro

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.

withastro/astro

Changes

Closes #18194

Upgrade to the latest of the vite plugin

Testing

Green CI

Docs

N/A

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@nanostores/preact ^1.0.0 → ^1.1.0 age confidence
@preact/signals (source) ^2.8.1 → ^2.11.2 age confidence
@tailwindcss/vite (source) ^4.2.1 → ^4.3.3 age confidence
@types/alpinejs (source) ^3.13.11 → ^3.17.0 age confidence
@types/react (source) ^18.3.28 → ^18.3.31 age confidence
alpinejs (source) ^3.15.8 → ^3.17.4 age confidence
hono (source) ^4.13.7 → ^4.13.11 age confidence
nanostores ^1.1.1 → ^1.5.4 age confidence
preact (source) ^10.28.4 → ^10.29.8 age confidence
sass ^1.97.3 → ^1.105.0 age confidence
solid-js (source) ^1.9.11 → ^1.9.15 age confidence
svelte (source) ^5.55.7 → ^5.57.1 age confidence
tailwindcss (source) ^4.2.1 → ^4.3.3 age confidence
vite (source) ^8.0.13 → ^8.3.1 age confidence
vitest (source) ^5.0.0 → ^5.0.2 age confidence
vue (source) ^3.5.29 → ^3.5.43 age confidence

Release Notes

nanostores/preact (@​nanostores/preact)

v1.1.0

Compare Source

alpinejs/alpine (alpinejs)

v3.17.4

Compare Source

What's Changed

New Contributors

Full Changelog: alpinejs/alpine@v3.17.3...v3.17.4

v3.17.3

Compare Source

What's Changed

New Contributors

Full Changelog: alpinejs/alpine@v3.17.2...v3.17.3

v3.17.2

Compare Source

What's Changed

Full Changelog: alpinejs/alpine@v3.17.1...v3.17.2

v3.17.1

Compare Source

What's Changed

New Contributors

Full Changelog: alpinejs/alpine@v3.17.0...v3.17.1

v3.17.0

Compare Source

What's Changed

New Contributors

Full Changelog: alpinejs/alpine@v3.16.3...v3.17.0

v3.16.3

Compare Source

What's Changed
New Contributors

Full Changelog: alpinejs/alpine@v3.16.2...v3.16.3

v3.16.2

Compare Source

What's Changed
New Contributors

Full Changelog: alpinejs/alpine@v3.16.1...v3.16.2

v3.16.1

Compare Source

What's Changed

Full Changelog: alpinejs/alpine@v3.16.0...v3.16.1

v3.16.0

Compare Source

What's Changed

New Contributors

Full Changelog: alpinejs/alpine@v3.15.12...v3.16.0

v3.15.12

Compare Source

What's Changed

New Contributors

Full Changelog: alpinejs/alpine@v3.15.11...v3.15.12

v3.15.11

Compare Source

What's Changed

New Contributors

Full Changelog: alpinejs/alpine@v3.15.10...v3.15.11

v3.15.10

Compare Source

Fixed

  • Fix x-anchor crash during wire:navigate cleanup #​4790

v3.15.9

Compare Source

What's Changed

New Contributors

Full Changelog: alpinejs/alpine@v3.15.8...v3.15.9

nanostores/nanostores (nanostores)

v1.5.4

Compare Source

v1.5.3

Compare Source

v1.5.2

Compare Source

v1.5.1

Compare Source

v1.5.0

Compare Source

  • Added eq and eqKey for custom value comparison (by @​psd-coder).
  • Fixed calling other listeners if one of them throws (by @​psd-coder).
  • Fixed listenKeys deep paths on whole store set (by @​ankit1324).

v1.4.2

Compare Source

v1.4.1

Compare Source

v1.4.0

Compare Source

  • Added batch to run one re-render on many stores changes (by @​psd-coder).
  • Added listening base key for nested mutation to listenKeys (by @​ifo123).
  • Fixed getPath throwing on null intermediate values (by @​chatman-media).
  • Fixed listenKeys on the whole set changes (by @​LeSingh1).
  • Fixed resetting computed cache on cleanStores (by @​ATOM00blue).

v1.3.0

Compare Source

  • Added globalThis.nanostoresGlobal to sync stores in JS bundles (by @​afurm).

v1.2.0

Compare Source

  • Deprecated async computed in favor of @nanostores/async (by @​Fryuni).
  • Added Store#init to fix SSR (by @​jmurty).
vitest-dev/vitest (vitest)

v5.0.2

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v5.0.1

Compare Source

   🚀 Features
   🐞 Bug Fixes
    View changes on GitHub

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • 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.

withastro/astro

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence
@astrojs/compiler-rs (source) ^0.5.0 → ^0.5.1 age confidence
@capsizecss/unpack (source) ^4.0.0 → ^4.0.1 age confidence
@clack/prompts (source) ^1.1.0 → ^1.8.1 age confidence
@fontsource/monofett (source) 5.2.8 → 5.3.0 age confidence
@fontsource/montserrat (source) 5.2.8 → 5.3.0 age confidence
@playwright/test (source) 1.58.2 → 1.63.0 age confidence
@preact/signals (source) 2.8.2 → 2.11.2 age confidence
@tailwindcss/vite (source) ^4.2.2 → ^4.3.3 age confidence
@types/picomatch (source) ^4.0.2 → ^4.0.3 age confidence
@types/react (source) ^19.0.0 → ^19.3.0 age confidence
@types/react (source) ^18.3.28 → ^18.3.31 age confidence
@types/react-dom (source) ^19.0.0 → ^19.3.0 age confidence
@vitejs/plugin-vue (source) ^6.0.5 → ^6.0.9 age confidence
am-i-vibing (source) ^0.4.0 → ^0.5.0 age confidence
astro-embed (source) ^0.13.1 → ^0.14.0 age confidence
autoprefixer ^10.4.27 → ^10.6.1 age confidence
devalue ^5.8.1 → ^5.9.4 age confidence
expect-type ^1.3.0 → ^1.4.0 age confidence
fs-fixture ^2.13.0 → ^2.16.0 age confidence
get-tsconfig 5.0.0-beta.4 → 5.0.0-beta.6 age confidence
hono (source) ^4.12.14 → ^4.13.11 age confidence
lightningcss ^1.32.0 → ^1.33.0 age confidence
magic-string ^1.0.0 → ^1.4.2 age confidence
magicast ^0.5.2 → ^0.5.5 age confidence
node-mocks-http ^1.17.2 → ^1.18.1 age confidence
oxc-transform-react (source) ^0.145.0 → ^0.151.0 age confidence
p-limit ^7.3.0 → ^7.3.3 age confidence
p-queue ^9.1.0 → ^9.3.3 age confidence
package-manager-detector ^1.6.0 → ^1.8.0 age confidence
picomatch ^4.0.4 → ^4.0.7 age confidence
postcss (source) ^8.5.8 → ^8.5.28 age confidence
postcss-preset-env (source) ^11.2.0 → ^11.5.4 age confidence
preact (source) ^10.29.0 → ^10.29.8 age confidence
preact (source) ^10.28.2 → ^10.29.8 age confidence
react (source) ^19.0.0 → ^19.3.0 age confidence
react (source) ^19.2.4 → ^19.3.0 age confidence
react (source) 19.2.4 → 19.3.0 age confidence
react-dom (source) ^19.0.0 → ^19.3.0 age confidence
react-dom (source) ^19.2.4 → ^19.3.0 age confidence
react-dom (source) 19.2.4 → 19.3.0 age confidence
rolldown (source) ^1.2.10 → ^1.2.11 age confidence
sass ^1.98.0 → ^1.105.0 age confidence
shiki (source) ^4.0.2 → ^4.4.3 age confidence
smol-toml ^1.8.0 → ^1.9.0 age confidence
solid-js (source) ^1.9.11 → ^1.9.15 age confidence
svelte (source) ^5.55.7 → ^5.57.1 age confidence
svelte (source) ^5.54.0 → ^5.57.1 age confidence
tailwindcss (source) ^4.2.2 → ^4.3.3 age confidence
tinyclip ^1.0.1 → ^1.0.3 age confidence
tinyexec ^1.0.4 → ^1.3.1 age confidence
tinyglobby (source) ^0.2.15 → ^0.2.17 age confidence
ultrahtml ^1.6.0 → ^1.7.0 age confidence
undici (source) 7.29.1 → 7.30.0 age confidence
unifont ~0.7.5 → ~0.8.3 age confidence
verkit ^0.4.0 → ^0.5.0 age confidence
vite (source) ^8.0.13 → ^8.3.1 age confidence
vitefu ^1.1.2 → ^1.1.3 age confidence
vue (source) ^3.5.30 → ^3.5.43 age confidence
vue (source) ^3.5.0 → ^3.5.43 age confidence
zod (source) ^4.5.4 → ^4.6.5 age confidence

Release Notes

withastro/compiler-rs (@​astrojs/compiler-rs)

v0.5.1

Compare Source

Patch Changes
  • b48eac6: Fixes missing data-astro-source-file and data-astro-source-loc attributes when source annotation is enabled.
  • afa7276: Fixes a ReferenceError when 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 stray slot="…" 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

Compare Source

Patch Changes
bombshell-dev/clack (@​clack/prompts)

v1.8.1

Compare Source

Patch Changes

v1.8.0

Compare Source

Minor Changes
  • #​592 caa32e8 Thanks @​gameroman! - Export CANCEL_SYMBOL constant from @clack/core and @clack/prompts

  • #​594 37fca4e Thanks @​dreyfus92! - Add tab-completion to the path prompt: 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-in completeOnTab option on autocomplete, which also shows a Tab: complete hint in the instructions footer. Default autocomplete behavior is unchanged.

  • #​583 ae636dd Thanks @​43081j! - Add async validation support to prompts, and validation state rendering to text prompts.

Patch Changes
fontsource/font-files (@​fontsource/monofett)

v5.3.0

Compare Source

fontsource/font-files (@​fontsource/montserrat)

v5.3.0

Compare Source

microsoft/playwright (@​playwright/test)

v1.63.0

Compare Source

v1.62.1

Compare Source

v1.62.0

Compare Source

🧱 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 credentials includes the context's virtual WebAuthn Credentials (passkeys) in the storage state, so they can be persisted and re-seeded into later contexts.
Actions
  • New scroll option ("auto" | "none") on actions to opt out of Playwright's automatic scroll-into-view.
Network
Evaluation
Command line & MCP
Reporters
  • The HTML report's Merge files grouping — previously only a UI toggle — can now be enabled from the config with the new mergeFiles reporter 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

Compare Source

v1.61.0

Compare Source

🔑 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
Browser and Screencast
  • New option artifactsDir in browserType.connectOverCDP() controls where artifacts such as traces and downloads are stored when attached to an existing browser.
  • New option cursor in screencast.showActions() controls the cursor decoration rendered for pointer actions.
  • The onFrame callback in screencast.start() now receives a timestamp of 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.argv from 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 AggregateError as a separate entry.
  • New -G command 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

Compare Source

🌐 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

🛑 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
Locators and Assertions
Network
  • webSocketRoute.protocols() returns the WebSocket subprotocols requested by the page.
  • New option noDefaults in 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
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: 0 or negative values.

🛠️ Other improvements

  • HTML reporter:
    • npx playwright show-report accepts .zip files directly — no need to unzip first.
    • Steps that contain attachments inside nested children show an indicator on the parent step.
    • The repeatEachIndex is 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.
    • handle option on BrowserContext.exposeBinding and Page.exposeBinding.
    • logger option on BrowserType.connect and BrowserType.connectOverCDP — use tracing instead.
    • Context options videosPath / videoSize — use recordVideo instead.

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

Compare Source

Bug Fixes
  • [Windows] Reverted hiding console window when spawning browser processes, which caused regressions including broken codegen, --ui and show commands (#​39990)

v1.59.0

Compare Source

🎬 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
Demo

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 #&#8203;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 snapshot

Connect from @​playwright/mcp — or point your MCP server to the running browser.

@playwright/mcp --endpoint=my-session

Connect 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:// URL

Call 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.
Demo - `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)
  • 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.

withastro/astro

Changes

  • Root cause: the comparator in HostRoutes.add() in @astrojs/underscore-redirects only compares weights when both are truthy (if (a.weight && b.weight)). A weight of 0 is falsy, so any comparison involving it returns false and the definition is inserted before the existing ones. createRedirectsFromAstroRoutes() gives the /* 404 fallback a weight of 0 so 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 returns false too.
  • Fix: compare the weights whenever both are defined (!== undefined), so 0 is 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.

withastro/astro

Fixes #18195

Changes

  • @astrojs/cloudflare now fails in astro:config:setup when the project root has a wrangler.json, wrangler.jsonc, or wrangler.toml but no cloudflare.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.json name and lost the Wrangler file's compatibility date and flags, vars, bindings, and custom entrypoint. A follow-up cf deploy would 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 without cloudflare.config.ts throws, a Wrangler file next to cloudflare.config.ts passes, and an empty root passes. With the check disabled, the three throw cases fail.
  • Ran the full @astrojs/cloudflare test suite: 387 passing, 0 failing. No adapter fixture has a Wrangler file without cloudflare.config.ts; vitest-actions has 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!

withastro/starlight

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 40a2584 Thanks @olafur-andri! - Adds Icelandic language support

  • #4229 e4a3d82 Thanks @HiDeoo! - Fixes a potential issue with icons being cut off in Firefox when pinch-zooming.

  • #4226 fb562dd Thanks @HiDeoo! - Fixes an issue where pages not importing components from @astrojs/starlight/components included styles of Starlight components used on other pages.

  • #4250 531af7d Thanks @HiDeoo! - Fixes Failed to resolve dependency warnings logged when running the development server in projects using the Cloudflare adapter.

  • #4229 e4a3d82 Thanks @HiDeoo! - Fixes the codePen and node icons slightly extending beyond their bounding box.

withastro/starlight

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

withastro/astro

Changes

  • The fixWinEPERMSync helper in packages/astro/src/core/fs/index.ts called fs.rmdirSync(p, options) with recursive: true as a fallback when fs.rmSync threw EPERM on Windows. Node.js 25 removed support for recursive on rmdirSync (DEP0147), so that fallback threw ERR_INVALID_ARG_VALUE instead of recovering, causing astro build to fail whenever another process briefly held a file in dist/. The directory branch now calls fs.rmSync(p, options), which accepts the same options and is the modern replacement.
  • The parameter type of fixWinEPERMSync changes from fs.RmDirOptions to fs.RmOptions to reflect the corrected API.

Testing

  • Added packages/astro/test/units/fs/empty-dir.test.ts, which fakes process.platform = 'win32', makes fs.rmSync throw EPERM once, and asserts that emptyDir still 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