AstroEco is Contributing…
Display your GitHub pull requests using astro-loader-github-prs
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@6.1.8
Patch Changes
-
#16348
7d26cd7Thanks @ocavue! - Fixes a bug where emitted assets during a client build would contain always fresh, new hashes in their name. Now the build should be more stable. -
#16317
d012bfeThanks @das-peter! - Fixes a bug whereallowedDomainsweren't correctly propagated when using the development server. -
#16317
d012bfeThanks @das-peter! - Adds tests to verify settings are properly propagated when using the development server. -
#16282
5b0fdaaThanks @jmurty! - Fixes build errors on platforms with skew protection enabled (e.g. Vercel, Netlify) for inter-chunk Javascript using dynamic imports -
Updated dependencies [
e0b240e]:- @astrojs/telemetry@3.3.1
@astrojs/telemetry@3.3.1
Patch Changes
- #16257
e0b240eThanks @gameroman! - Removeddebugdependency
Part of #16241
This PR shows how to migrate integration tests packages/astro/test/*.js to TypeScript. Only a few tests are migrated. I just want to verify that these TS files are actually picked up by CI for both testing and type checking.

Summary
- Fixes the TextMate grammar so that the
langattribute on<style>and<script>tags is correctly detected even when it appears on a different line than the opening tag - Adds a two-phase scanning approach (inspired by Vue's grammar): first scan attributes until
lang/typeis found on a subsequent line, then enter the correct language scope - The existing single-line
\Glookahead patterns are preserved for same-line cases; the new patterns only activate whenlangis not on the opening tag line
Fixes #14657
Test plan
- Added grammar snapshot tests for multi-line
langattribute with SASS, SCSS, and LESS - All 25 grammar tests pass (22 existing + 3 new)
- Verified snapshots show
source.sass,source.css.scss, andsource.css.less(notsource.css) for multi-line cases - Verified
define:varswith multi-line attributes also works correctly
Summary
Ports all test files in packages/internal-helpers/test/ from JavaScript to TypeScript, as part of the ongoing test migration effort.
- Renamed
create-filter.test.jstocreate-filter.test.tswith type annotations - Renamed
path.test.jstopath.test.tswith type annotations for test data arrays - Renamed
request.test.jstorequest.test.tswith type annotations (e.g.,makeRequesthelper) - Added
tsconfig.test.jsonfor test typechecking (following the pattern frompackages/astro) - Updated
package.jsontest script to use--strip-typeswith.test.tsglob, and addedtypecheck:testsscript
All 60 tests pass and tsc --project tsconfig.test.json reports no errors.
Closes #16241 (partial)
Test plan
-
pnpm --filter @astrojs/internal-helpers test-- all 60 tests pass -
pnpm --filter @astrojs/internal-helpers typecheck:tests-- no type errors
Changes
This PR creates a new function called loadOrCrateNodeLogger, which is called in every place where we create a logger right before loading the configuration.
It also adds a new --experimental-json (as per RFC) which creates a new JSON logger.
The loading of the logger has been implemented in:
devbuildsyncadd
Testing
Mostly manual testing. Existing CI should stay green.
Docs
N/A
Changes
- What does this change?
- Be short and concise. Bullet points can help!
- Before/after screenshots can help as well.
- Don't forget a changeset! Run
pnpm changeset. - See https://contribute.docs.astro.build/docs-for-code-changes/changesets/ for more info on writing changesets.
Testing
Docs
Changes
- Updates how svg optimization works
- Instead of having svgo directly in our config types, there's a new
SvgOptimizerinterface with a built-insvgoOptimizer()implementation. This is partly motivated by the nightmare that was the zod 3 to 4 update - This makes it easier to make changes to the API and also allows using other services, for example https://github.com/noahbald/oxvg
Testing
- New type test
- Updated test fixture
- Manual check
Docs
- Changeset
- withastro/docs#13732
Changes
- The fetch() call for remote images in the Cloudflare binding image transform (image-binding-transform.ts) now uses
{ redirect: 'manual' }and rejects 3xx responses with a 404, consistent with every other remote image fetch path in core Astro and the Cloudflare integration. - Previously this was the only image fetch path that used the default
redirect: 'follow'behavior, which meant the worker would follow HTTP redirects to whatever destination the remote server specified, bypassing theisRemoteAllowed()domain check that only validated the initial URL.
Testing
- Added a test that spins up a local HTTP server returning a 302 redirect, requests
/_imagewith that URL (which passes the domain allowlist), and asserts a 404 is returned instead of following the redirect. - All existing binding image service tests continue to pass.
Docs
- No docs update needed — this is an internal behavior change with no new API surface.
Changes
- Moves the immutable
Cache-Controlheader fromsend'sheadersevent to thestreamevent, which only fires on the success path (after precondition checks pass). Previously, conditional request failures (e.g.If-Matchmismatch) on hashed/_astro/assets returned error responses withCache-Control: public, max-age=31536000, immutable, causing CDNs to cache the error. - Propagates the real HTTP status code from
send's error object (e.g. 412 for precondition failure) instead of always returning 500.
Testing
- Added integration test in
test/assets.test.jsthat sends a request withIf-Match: xxxto a hashed asset and asserts it returns 412 without the immutable cache header. - Existing test for immutable headers on successful asset requests continues to pass.
Docs
- No docs update needed — this is a bugfix with no user-facing API change.
Changes
Part of #16241
Since everyone is working on the unit tests under packages/astro/, let me do something else and migrate the integration tests under packages/integrations/react/.
The React test migration itself is easy and boring: only 3 files to change. However, I want to use it as an example to show that we can migrate integration tests in smaller PRs, contrary to what the original issue suggests:
Once unit tests are ported, we move to integration tests. This might need to require a one-shot PR because our
loadFixtureutility is used in various packages.
I achieve this by using TypeScript's Project References feature. Basically, it involves splitting the whole monorepo into smaller TypeScript "projects". Each tsconfig.json file with composite: true represents one TypeScript "project".
Note
A "TypeScript project" and a "PNPM monorepo workspace package" are different concepts.
- In TypeScript, a
tsconfig.jsonrepresents a TypeScript project, and different projects are connected via thereferencesfield intsconfig.json. - In PNPM, a
package.jsonrepresents a workspace package, and different packages are connected viadependencies/devDependenciesinpackage.json. - Usually, people put one or more TypeScript projects in a package. For example, Vite's official React TypeScript template is one package (
package.json) with two TypeScript projects (tsconfig.app.jsonandtsconfig.node.json).
In this PR, I've added/modified the following TypeScript projects:
New projects:
.github/scripts/tsconfig.json— for.github/scripts/scripts/tsconfig.json— for repo-levelscripts/(replaces the oldscripts/jsconfig.json)packages/integrations/react/tsconfig.test.json— for React integration tests, and it imports and uses theloadFixtureutility from another project.
Modified projects (now composite: true with references):
packages/astro/tsconfig.jsonpackages/astro/tsconfig.test.json(whereloadFixtureutility is defined)packages/astro/test/types/tsconfig.json
The references graph between these projects looks like this:
flowchart BT
subgraph astro["packages/astro"]
astroSrc["tsconfig.json<br/><i>(src)</i>"]
astroTest["tsconfig.test.json<br/><i>(unit tests)</i>"]
astroTypes["test/types/tsconfig.json<br/><i>(type tests)</i>"]
end
subgraph react["packages/integrations/react"]
reactTest["tsconfig.test.json<br/><i>(integration tests)</i>"]
end
subgraph scripts["scripts/"]
scriptsCfg["tsconfig.json"]
end
subgraph ghScripts[".github/scripts/"]
ghScriptsCfg["tsconfig.json"]
end
astroTest -- references --> astroSrc
astroTest -- references --> scriptsCfg
reactTest -- references --> astroTest
scriptsCfg -- references --> ghScriptsCfg
tsc --build instead of tsc --project
I've changed some scripts from tsc --project to tsc --build. This is required by the Project References feature: tsc --project only type-checks the single tsconfig.json you point it at and ignores any references it declares, whereas tsc --build walks the references graph and type-checks each referenced project in dependency order, reusing .tsbuildinfo caches for incremental rebuilds.
I've also added a repo-level typecheck:tests script (pnpm -r typecheck:tests) so that CI runs the type check across all workspace packages that define one, rather than only packages/astro/. For now, only two packages has typecheck:tests.
Testing
CI all green
Docs
No docs needed.
After updating from 5.16.6 to 6.1.5 the CORS handling seems to have changed in dev mode.
Investigation found the following possible changes as origin of the change in behavior:
Debugging showed that validateForwardedHeaders() didn't get any allowedDomains despite configured, leading to non recognition of forwarded protocol and hence origin mismatch in createOriginCheckMiddleware() triggering errors like
Cross-site POST form submissions are forbidden
Changes
Adjusted createSerializedManifest() so it forwards the settings.config.security?.allowedDomains in the same way as e.g. settings.config.security?.checkOrigin.
Testing
Manually tested if the from submissions work again as expected as well as verified via debugger breakpoint that the expected allowedDomains value was present in validateForwardedHeaders()
Docs
Changes
This PR fixes a bug where non-SVG images can be converted to SVG output.
Testing
Added various tests
Docs
N/A
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
astro@6.1.7
Patch Changes
-
#16027
c62516bThanks @fkatsuhiro! - Fixes a bug where remote image dimensions were not validated during static builds on Netlify. -
#16311
94048f2Thanks @Arecsu! - Fixes--portflag being ignored after a Vite-triggered server restart (e.g. when a.envfile changes) -
#16316
0fcd04cThanks @ematipico! - Fixes the/_imageendpoint accepting an arbitraryf=svgquery parameter and serving non-SVG content asimage/svg+xml. The endpoint now validates that the source is actually SVG before honoringf=svg, matching the same guard already enforced on the<Image>component path.
@astrojs/cloudflare@13.1.10
Patch Changes
-
#16320
a43eb4bThanks @matthewp! - Usesredirect: 'manual'for remote image fetches in the Cloudflare binding image transform, consistent with all other image fetch paths -
#16307
a81dd3eThanks @matthewp! - Surfacesconsole.logandconsole.warnoutput from workerd during prerendering -
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.3
@astrojs/netlify@7.0.7
Patch Changes
-
#16027
c62516bThanks @fkatsuhiro! - Fixes a bug where remote image dimensions were not validated during static builds on Netlify. -
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.3
@astrojs/node@10.0.5
Patch Changes
Closes #16278
Changes
- This fix has been made by @astrobot-houston. I tested it, works great.
- Fix
astro dev --portnot being preserved after a Vite-triggered server restart (e.g..envfile change) portwas missing from the destructured server config inpackages/astro/src/core/dev/container.ts— all other server properties (host,headers,open,allowedHosts) were already forwarded tocreateVite(), butportwas simply omitted
Testing
Tested manually: started astro dev --port 7000, modified .env, confirmed the server restarts on port 7000 instead of falling back to Vite's default 5173. Same as astro dev default 4321 port. It will restart properly with 4321
No automated test added — this would require an integration test simulating a Vite restart, which is outside the scope of this fix.
Docs
No docs change needed — --port is already documented as working. This restores the expected behavior.
Changes
- Worker
console.log/console.warnoutput during prerendering was silently swallowed because the internal Vite preview server in@astrojs/cloudflareusedlogLevel: 'error'. Changed tologLevel: 'info'so that console output from workerd is no longer suppressed.
Closes #16200
Testing
- Tested manually
Docs
- N/A, bug fix
Changes
- Style and script tags with
langortypeon a different line than the tag name now get correct syntax highlighting. Previously, the TextMate grammar's\Ganchor only matched on the first line after the opening tag, causing multiline attributes to fall through to the default language (CSS/JS) instead of the specified one (Sass, SCSS, TypeScript, etc.) - Adds a
begin/whilepattern that consumes intermediate attribute lines until the line containinglang/typeis reached, then hands off to the existing lang-detection rules without the\Gconstraint - Includes explicit rules for
application/ld+json→ JSON andtype="module"→ JavaScript to handle cases where backreference capture groups reset after thewhilerule
Closes #14657
Testing
- Added 4 grammar snapshot fixtures covering multiline
langdetection:sass-multiline.astro,scss-multiline.astro,ts-multiline.astro, andsass-multiline-scoped.astro(three-line split withis:global) - All 26 grammar tests pass, including existing single-line fixtures confirming no regressions
Docs
- No docs update needed — this is a bug fix in the VS Code extension's TextMate grammar with no user-facing API change
Changes
Closes AST-52
This PR starts the implementation of the new logger functionality. As for now, the implementation and usage is solely focused on development.
Docs haven't been written as they should, and I would like to keep it that way for now, I will focus on writing towards the end of the works.
Here's the RFC: withastro/roadmap#1339
Here's what's been done:
- Updated the configuration to accept the new experimental flag
- Created a new
logHandlerswithjson, that returns a JSON loggernode, that returns the Node.js loggerconsole, that returns the console loggercompose, which allows to have multiple loggers together- New relative entrypoints, so that the specifiers can be easily imported
- The logger particular because we need it as early as possible, before we even start the dev server. So I used the same trick we use to import the configuration: we spawn a temporary vite server, specifically for loading the module. I exposed the inner function used by the loading system of the configuration, so that it's reusable for the logger.
- Created a small vite virtual module for the loading of the logger. We need a virtual module to support the compose API. The plugin for now is very minimal, however we will need to expand it for SSR. It will work very much like the middleware does.
- I established some patterns. Throughout the code base we were creating loggers in two ways, now we use only one way, using the
create*Loggerfunctions. This means that the destination becomes an implementation detail. - I moved all the implementation inside the
impls/folder. - I removed the
_formattype I created few days ago, because it's not needed anymore, because the architecture took a different course. - The JSON logger uses a small regex to remove ANSI characters from the message. In another PR I plan to remove them from our logs, because using colours in our messages means that ANSI will be broadcast to downstream loggers too.
Important
This PR is a stacked PR against feat/logger, which means tests won't probably run.
Testing
I updated the existing tests to use the new pattern. Green CI.
I tested locally the new compose API and the new json API.
Docs
N/A
Changes
- Consolidates two independent inline
<script>escaping implementations into a single sharedstringifyForScriptutility inescape.ts - The new utility escapes all
<characters to\u003cin JSON-serialized output, which is a simpler and more thorough approach than the previous pattern-specific replacements defineScriptVarsinrender/util.tsandsafeJsonStringifyinrender/server-islands.tsboth now use the shared function, removing duplicated logic
Testing
- Updated existing
defineScriptVarstest to match the new escape sequence (\u003cinstead of\x3C) - Added tests for case-insensitive tag variants (
</Script>,</SCRIPT>,</sCrIpT>) - Added tests for whitespace variants (
</script >,</script\t>) - Added test for self-closing form (
</script/>) - All tests in
packages/astro/test/units/render/html-primitives.test.js
Docs
- No docs update needed — this is an internal refactor with no user-facing API change
Changes
- Closes #16139
- Previous attempt: #15327
- Introduces a new
experimental_getFontBuffer()utility to allow working with font buffers during prerendering - The big thing is that it works thanks to HTTP requests. So during prerendering we have to start a temporary node server
Testing
Added a lot of unit tests, as well as few integration tests
Docs
- errors
- withastro/docs#13729
- changeset
ℹ️ Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
Release Notes
bombshell-dev/clack (@clack/prompts)
v1.2.0
Minor Changes
9786226: Externalizefast-string-widthandfast-wrap-ansito avoid double dependencies090902c: Addsdateprompt withformatsupport (YMD, MDY, DMY)
Patch Changes
134a1a1: Fix thepathprompt sodirectory: truecorrectly enforces directory-only selection while still allowing directory navigation, and add regression tests for both directory and default file selection behavior.bdf89a5: Addsplaceholderoption toautocomplete. When the placeholder is set and the input is empty, pressingtabwill set the value toplaceholder.336495a: Apply guide to wrapped multi-line messages in confirm prompt.9fe8de6: RespectwithGuide: falsein autocomplete and multiselect prompts.29a50cb: Fixpathdirectory mode so pressing Enter with an existing directoryinitialValuesubmits that current directory instead of the first child option, and add regression coverage for immediate submit and child-directory navigation.- Updated dependencies [
9786226] - Updated dependencies [
bdf89a5] - Updated dependencies [
417b451] - Updated dependencies [
090902c]- @clack/core@1.2.0
sveltejs/devalue (devalue)
v5.7.1
Patch Changes
8becc7c: fix: handle regexes consistently in uneval's value and reference formats
v5.7.0
Minor Changes
df2e284: feat: use native alternatives to encode/decode base64498656e: feat: addDataViewsupporta210130: feat: whitelistFloat16Arraydf2e284: feat: simplify TypedArray slices
Patch Changes
kpdecker/jsdiff (diff)
v8.0.4
- #667 - fix another bug in
diffWordswhen used with anIntl.Segmenter. If the text to be diffed included a combining mark after a whitespace character (i.e. roughly speaking, an accented space),diffWordswould previously crash. Now this case is handled correctly.
sindresorhus/p-queue (p-queue)
v9.1.2
v9.1.1
- Fix
signaloption not rejecting when task is aborted while queueda64b316- If you use a custom queue class, you will have to add a
remove()method. See the built-in class.
- If you use a custom queue class, you will have to add a
preactjs/preact (preact)
v10.29.1
Fixes
- Create a unique event-clock for each Preact instance on a page. (#5068, thanks @JoviDeCroock)
- Fix incorrect DOM order with conditional ContextProvider and inner keys (#5067, thanks @JoviDeCroock)
Maintenance
- fix: Remove postinstall script for playwright setup (#5063, thanks @rschristian)
- chore: speed up tests by using playwright instead of webdriverio (#5060, thanks @marvinhagemeister)
- chore: migrate remaining .js -> .jsx files (#5059, thanks @marvinhagemeister)
- chore: rename
.test.js->.test.jsxwhen JSX is used (#5058, thanks @marvinhagemeister) - Migrate from biome to oxfmt (#5033, thanks @JoviDeCroock)
facebook/react (react)
v19.2.5: 19.2.5 (April 8th, 2026)
React Server Components
- Add more cycle protections (#36236 by @eps1lon and @unstubbable)
rollup/rollup (rollup)
v4.60.1
2026-03-30
Bug Fixes
- Resolve a situation where side effect imports could be dropped due to a caching issue (#6286)
Pull Requests
- #6286: fix: skip dropping side-effects on namespaceReexportsByName cache hit (#6274) (@littlegrayss, @TrickyPi)
- #6317: chore(deps): pin dependencies (@renovate[bot], @lukastaegert)
- #6318: chore(deps): update msys2/setup-msys2 digest to
cafece8(@renovate[bot], @lukastaegert) - #6319: chore(deps): update minor/patch updates (@renovate[bot], @lukastaegert)
- #6320: chore(deps): pin dependency typescript to v5 (@renovate[bot], @lukastaegert)
- #6321: chore(deps): update openharmony-rs/setup-ohos-sdk action to v1 (@renovate[bot], @lukastaegert)
- #6322: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6323: chore(deps): lock file maintenance (@renovate[bot])
- #6324: chore(deps): lock file maintenance (@renovate[bot], @lukastaegert)
v4.60.0
2026-03-22
Features
- Support source phase imports as long as they are external (#6279)
Pull Requests
- #6279: feat: external only Source Phase imports support (@guybedford, @lukastaegert)
sass/dart-sass (sass)
v1.99.0
-
Add support for parent selectors (
&) at the root of the document. These are
emitted as-is in the CSS output, where they're interpreted as the scoping
root. -
User-defined functions named
calcorclampare no longer forbidden. If
such a function exists without a namespace in the current module, it will be
used instead of the built-incalc()orclamp()function. -
User-defined functions whose names begin with
-and end with-expression,
-url,-and,-or, or-notare no longer forbidden. These were
originally intended to match vendor prefixes, but in practice no vendor
prefixes for these functions ever existed in real browsers. -
User-defined functions named
EXPRESSION,URL, andELEMENT, those that
begin with-and end with-ELEMENT, as well as the same names with some
lowercase letters are now deprecated, These are names conflict with plain CSS
functions that have special syntax.See the Sass website for details.
-
In a future release, calls to functions whose names begin with
-and end
with-expressionand-urlwill no longer have special parsing. For now,
these calls are deprecated if their behavior will change in the future.See the Sass website for details.
-
Calls to functions whose names begin with
-and end with-progid:...are
deprecated.See the Sass website for details.
nodejs/undici (undici)
v7.25.0
What's Changed
Full Changelog: nodejs/undici@v7.24.8...v7.25.0
v7.24.8
What's Changed
- fix: backport 401 stream-backed body fix to v7.x by @mcollina in #5006
Full Changelog: nodejs/undici@v7.24.7...v7.24.8
v7.24.7
What's Changed
- docs: update broken links in file "Dispatcher.md" by @samuel871211 in #4924
- doc: remove unused parameter
redirectionLimitReachedby @samuel871211 in #4933 - test: skip flaky macOS Node 20 cookie fetch cases by @mcollina in #4932
- fix(types): align Response with DOM fetch types by @theamodhshetty in #4867
- fix(types): Fix clone method type declaration to be an instance method rather than instance property by @mistval in #4925
- test: skip IPv6 tests when IPv6 is not available by @mcollina in #4939
- fix: correctly handle multi-value rawHeaders in fetch by @mcollina in #4938
- ignore AGENTS.md by @mcollina in #4942
New Contributors
- @samuel871211 made their first contribution in #4924
- @mistval made their first contribution in #4925
Full Changelog: nodejs/undici@v7.24.6...v7.24.7
v7.24.6
What's Changed
- fix(test): client wasm compatible with clang 22 by @rozzilla in #4909
- fix(mock): improve error message when intercepts are exhausted by @travisbreaks in #4912
- fix(websocket): support open diagnostics over h2 by @mcollina in #4921
- fix: assume http/https scheme for scheme-less proxy env vars by @travisbreaks in #4914
- fix(cache): check Authorization on request headers per RFC 9111 §3.5 by @metalix2 in #4911
- fix: wrap kConnector call in try/catch to prevent client hang by @veeceey in #4834
- docs: clarify fetch and FormData pairing by @mcollina in #4922
- fix: support Connection header with connection-specific header names per RFC 7230 by @mcollina in #4775
- fix: avoid prototype collisions in parseHeaders by @mcollina in #4923
- build(deps-dev): bump typescript from 5.9.3 to 6.0.2 by @dependabot[bot] in #4926
- test: auto-init WPT submodule by @mcollina in #4930
New Contributors
- @rozzilla made their first contribution in #4909
- @veeceey made their first contribution in #4834
Full Changelog: nodejs/undici@v7.24.5...v7.24.6
v7.24.5
What's Changed
- Formdata tests by @KhafraDev in #4902
- test: add unexpected disconnect guards to more client test files by @samayer12 in #4844
- fix(cache): only apply 1-year deleteAt for immutable responses by @metalix2 in #4913
New Contributors
- @metalix2 made their first contribution in #4913
Full Changelog: nodejs/undici@v7.24.4...v7.24.5
v7.24.4
What's Changed
- fix(fetch): handle URL credentials in dispatch path extraction by @mcollina in #4892
Full Changelog: nodejs/undici@v7.24.3...v7.24.4
v7.24.3
What's Changed
Full Changelog: nodejs/undici@v7.24.2...v7.24.3
v7.24.2
What's Changed
- fix fetch path logic by @KhafraDev in #4890
- remove maxDecompressedMessageSize by @KhafraDev in #4891
Full Changelog: nodejs/undici@v7.24.1...v7.24.2
v7.24.1
svitejs/vitefu (vitefu)
v1.1.3
- Sort result arrays of
crawlFrameworkPkgsto ensure they are deterministic (#30) - Update Vite 8 peer dependency to stable
vitest-dev/vitest (vitest)
v4.1.4
🚀 Features
- coverage:
- Default to text reporter
skipFullif agent detected - by @hi-ogawa in #10018 (53757)
- Default to text reporter
- experimental:
- Expose
assertionas a public field - by @sheremet-va in #10095 (a120e) - Support aria snapshot - by @hi-ogawa, Claude Opus 4.6 (1M context), @AriPerkkio, Codex and @sheremet-va in #9668 (d4fbb)
- Expose
- reporter:
- Add filterMeta option to json reporter - by @nami8824 and @sheremet-va in #10078 (b77de)
🐞 Bug Fixes
- Use "black" foreground for labeled terminal message to ensure contrast - by @hi-ogawa in #10076 (203f0)
- Make
expect(..., message)consistent as error message prefix - by @hi-ogawa and Codex in #10068 (a1b5f) - Do not hoist imports whose names match class properties . - by @SunsetFi in #10093 and #10094 (0fc4b)
- browser: Spread user server options into browser Vite server in project - by @GoldStrikeArch in #10049 (65c9d)
View changes on GitHub
v4.1.3
🚀 Experimental Features
- Add
experimental.preParseflag - by @sheremet-va in #10070 (78273) - Support
browser.locators.exactoption - by @sheremet-va in #10013 (48799) - Add
TestAttachment.bodyEncoding- by @hi-ogawa in #9969 (89ca0) - Support custom snapshot matcher - by @hi-ogawa, Claude Sonnet 4.6 and Codex in #9973 (59b0e)
🐞 Bug Fixes
- Advance fake timers with
expect.pollinterval - by @hi-ogawa and Claude Sonnet 4.6 in #10022 (3f5bf) - Add
@vitest/coverage-v8and@vitest/coverage-istanbulas optional dependency - by @alan-agius4 in #10025 (146d4) - Fix
defineHelperfor webkit async stack trace + update playwright 1.59.0 - by @hi-ogawa in #10036 (5a5fa) - Fix suite hook throwing errors for unused auto test-scoped fixture - by @hi-ogawa and Claude Sonnet 4.6 in #10035 (39865)
- expect:
- Remove
JestExtendError.contextfrom verbose error reporting - by @hi-ogawa in #9983 (66751) - Don't leak "runner" types - by @sheremet-va in #10004 (ec204)
- Remove
- snapshot:
- Fix flagging obsolete snapshots for snapshot properties mismatch - by @hi-ogawa and Claude Sonnet 4.6 in #9986 (6b869)
- Export custom snapshot matcher helper from
vitest- by @hi-ogawa and Codex in #10042 (691d3)
- ui:
- Don't leak vite types - by @sheremet-va in #10005 (fdff1)
- vm:
- Fix external module resolve error with deps optimizer query - by @hi-ogawa and Claude Sonnet 4.6 in #10024 (9dbf4)
View changes on GitHub
v4.1.2
This release bumps Vitest's flatted version and removes version pinning to resolve flatted's CVE related issues (#9975).
🐞 Bug Fixes
- Don't resolve
setupFilesfrom parent directory - by @hi-ogawa in #9960 (7aa93) - Ensure sequential mock/unmock resolution - by @hi-ogawa and Claude Opus 4.6 in #9830 (7c065)
- browser: Take failure screenshot if
toMatchScreenshotcan't capture a stable screenshot - by @macarie in #9847 (faace) - coverage: Correct
coverageConfigDefaultsvalues and types - by @Arthie in #9940 (b3c99) - pretty-format: Fix output limit over counting - by @hi-ogawa in #9965 (d3b7a)
- Disable colors if agent is detected - by @sheremet-va and @AriPerkkio in #9851 (6f97b)
View changes on GitHub
v4.1.1
🚀 Features
- experimental:
- Expose
matchesTagsFilterto test if the current filter matches tags - by @sheremet-va in #9913 (eec53) - Introduce
experimental.vcsProvider- by @sheremet-va in #9928 (56115)
- Expose
🐞 Bug Fixes
- Mark
TestProject.testFilesListinternal properly - by @sapphi-red in #9867 (54f26) - Detect fixture that returns without calling
use- by @oilater in #9831 and #9861 (633ae) - Drop vite 8.beta support - by @AriPerkkio in #9862 (b78f5)
- Type regression in vi.mocked() static class methods - by @purepear and @hi-ogawa in #9857 (90926)
- Properly re-evaluate actual modules of mocked external - by @hi-ogawa in #9898 (ae5ec)
- Preserve coverage report when html reporter overlaps - by @hi-ogawa in #9889 (2d81a)
- Provide
vi.advanceTimersto the preview provider - by @sheremet-va in #9891 (1bc3e) - Don't leak event listener in playwright provider - by @sheremet-va in #9910 (d9355)
- Open browser in
--standalonemode without running tests - by @sheremet-va in #9911 (e78ad) - Guard disposable and optional
body- by @sheremet-va in #9912 (6fdb2) - Resolve
retry.conditionRegExp serialization issue - by @nstepien and @hi-ogawa in #9942 (7b605) - collect:
- Don't treat extra props on
testreturn as tests - by @sheremet-va in #9871 (141e7)
- Don't treat extra props on
- coverage:
- Simplify provider types - by @AriPerkkio in #9931 (aaf9f)
- Load built-in provider without module runner - by @AriPerkkio in #9939 (bf892)
- expect:
- Soft assertions continue after .resolves/.rejects promise errors - by @mixelburg, Maks Pikov, Claude Opus 4.6 (1M context) and @hi-ogawa in #9843 (6d74b)
- Fix sinon-chai style API - by @hi-ogawa in #9943 (0f08d)
- pretty-format:
- Limit output for large object - by @hi-ogawa and Claude Opus 4.6 (1M context) in #9949 (0d5f9)
View changes on GitHub
vuejs/core (vue)
v3.5.32
Bug Fixes
- runtime-core: prevent currentInstance leak into sibling render during async setup re-entry (#14668) (f166353), closes #14667
- teleport: handle updates before deferred mount (#14642) (32b44f1), closes #14640
- types: allow customRef to have different getter/setter types (#14639) (e20ddb0)
- types: use private branding for shallowReactive (#14641) (302c47a), closes #14638 #14493
Reverts
- Revert "fix(server-renderer): cleanup component effect scopes after SSR render" (#14674) (219d83b), closes #14674 #14669
v3.5.31
Bug Fixes
- compiler-sfc: allow Node.js subpath imports patterns in asset urls (#13045) (95c3356), closes #9919
- compiler-sfc: support template literal as defineModel name (#14622) (bd7eef0), closes #14621
- reactivity: normalize toRef property keys before dep lookup + improve types (#14625) (1bb28d0), closes #12427 #12431
- runtime-core: invalidate detached v-for memo vnodes after unmount (#14624) (560def4), closes #12708 #12710
- runtime-core: preserve nullish event handlers in mergeProps (#14550) (5725222)
- runtime-core: prevent merging model listener when value is null or undefined (#14629) (b39e032)
- runtime-dom: defer
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
This PR contains the following updates:
Release Notes
vuejs/core (@vue/compiler-sfc)
v3.5.32
Bug Fixes
- runtime-core: prevent currentInstance leak into sibling render during async setup re-entry (#14668) (f166353), closes #14667
- teleport: handle updates before deferred mount (#14642) (32b44f1), closes #14640
- types: allow customRef to have different getter/setter types (#14639) (e20ddb0)
- types: use private branding for shallowReactive (#14641) (302c47a), closes #14638 #14493
Reverts
- Revert "fix(server-renderer): cleanup component effect scopes after SSR render" (#14674) (219d83b), closes #14674 #14669
v3.5.31
Bug Fixes
- compiler-sfc: allow Node.js subpath imports patterns in asset urls (#13045) (95c3356), closes #9919
- compiler-sfc: support template literal as defineModel name (#14622) (bd7eef0), closes #14621
- reactivity: normalize toRef property keys before dep lookup + improve types (#14625) (1bb28d0), closes #12427 #12431
- runtime-core: invalidate detached v-for memo vnodes after unmount (#14624) (560def4), closes #12708 #12710
- runtime-core: preserve nullish event handlers in mergeProps (#14550) (5725222)
- runtime-core: prevent merging model listener when value is null or undefined (#14629) (b39e032)
- runtime-dom: defer teleport mount/update until suspense resolves (#8619) (88ed045), closes #8603
- runtime-dom: handle activeElement check in Shadow DOM for v-model (#14196) (959ded2)
- server-renderer: cleanup component effect scopes after SSR render (#14548) (862f11e)
- suspense: avoid unmount activeBranch twice if wrapped in transition (#9392) (908c6ad), closes #7966
- suspense: update suspense vnode's el during branch self-update (#12922) (a2c1700), closes #12920
- transition: skip enter guard while hmr updating (#14611) (be0a2f1), closes #14608
- types: prevent shallowReactive marker from leaking into value unions (#14493) (3b561db), closes #14490
sveltejs/devalue (devalue)
v5.7.1
Patch Changes
8becc7c: fix: handle regexes consistently in uneval's value and reference formats
v5.7.0
Minor Changes
df2e284: feat: use native alternatives to encode/decode base64498656e: feat: addDataViewsupporta210130: feat: whitelistFloat16Arraydf2e284: feat: simplify TypedArray slices
Patch Changes
preactjs/preact (preact)
v10.29.1
Fixes
- Create a unique event-clock for each Preact instance on a page. (#5068, thanks @JoviDeCroock)
- Fix incorrect DOM order with conditional ContextProvider and inner keys (#5067, thanks @JoviDeCroock)
Maintenance
- fix: Remove postinstall script for playwright setup (#5063, thanks @rschristian)
- chore: speed up tests by using playwright instead of webdriverio (#5060, thanks @marvinhagemeister)
- chore: migrate remaining .js -> .jsx files (#5059, thanks @marvinhagemeister)
- chore: rename
.test.js->.test.jsxwhen JSX is used (#5058, thanks @marvinhagemeister) - Migrate from biome to oxfmt (#5033, thanks @JoviDeCroock)
preactjs/preact-render-to-string (preact-render-to-string)
v6.6.7
Patch Changes
- #457
ce6ef71Thanks @lemonmade! - fix: renderToStringAsync produces commas for suspended components with complex children
facebook/react (react)
v19.2.5: 19.2.5 (April 8th, 2026)
React Server Components
- Add more cycle protections (#36236 by @eps1lon and @unstubbable)
sveltejs/language-tools (svelte2tsx)
v0.7.53
Patch Changes
- fix: prevent error with escape sequence in attribute (#2968)
solidjs/vite-plugin-solid (vite-plugin-solid)
v2.11.12
Patch Changes
9e46d91: fix: preserve jsx for rolldown dep scan
vuejs/devtools (vite-plugin-vue-devtools)
v8.1.1
🚀 Features
- overlay: Enhance style inspector button ux when enabled - by @skirtles-code in #1069 (0e32d)
🐞 Bug Fixes
- applet: Preserve active component when filtering - by @skirtles-code in #1065 (ec4a2)
- overlay: Use
toggleEnabledto allow exiting in spector mode - by @SaKaNa-Y in #1067 (ace74)
View changes on GitHub
svitejs/vitefu (vitefu)
v1.1.3
- Sort result arrays of
crawlFrameworkPkgsto ensure they are deterministic (#30) - Update Vite 8 peer dependency to stable
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
On Windows, styles go missing when the import path casing doesn't match the actual filename (e.g., import './Styles.css' when the file is styles.css). The CSS collection walk uses module IDs as map/set keys, and different casing creates different keys for the same file.
Normalizes IDs to lowercase for comparison on Windows (process.platform === 'win32'). Original casing is preserved in output — only the dedup keys are normalized. No-op on case-sensitive systems.
Fixes #14013
Changes
Fixes #16291.
The astro:head-metadata dev plugin (configHeadVitePlugin) previously tracked only the ssr Vite environment. Adapters like @astrojs/cloudflare register a dedicated prerender environment for prerendered routes and load page modules there, so containsHead and propagation were never set on those modules. As a result, maybeRenderHead() could fire inside an unrelated component's <template> element, most visibly trapping every hoisted <style data-vite-dev-id> block inside Starlight's <template id="theme-icons">, leaving affected pages completely unstyled during astro dev.
- Track both
ssrandprerenderenvironments inconfigureServer - Add a
findModulehelper sobuildImporterGraphFromEnvironmentcan walk importers across either graph - Iterate every tracked environment (with module-id dedup) when building the
virtual:astro:component-metadatavirtual module - Invalidate the virtual module on all tracked environments on HMR-triggered changes
Testing
pnpm --filter astro run test:unit- 1175 pass, 0 fail, 3 skipped (includes the fulltest/units/render/head-propagation/suite of 29 tests andtest/units/render/head-injection-app.test.js)pnpm --filter astro run test:types— cleantest/astro-head.test.jsintegration test passes@astrojs/cloudflare'stest/prerender-styles.test.jspasses — closest existing test covering hoisted styles through the prerender environmentbiome checkandbiome format --checkclean on the modified file- Verified end-to-end against the reproduction from #16291: a page routed through Starlight's 404 handler goes from a ~99 KB
<template id="theme-icons">with ~40 hoisted<style>blocks trapped inside, to a ~2 KB template containing only the three SVG icons, with every style block emitted outside the template.
No new regression test added because existing dev-mode test infrastructure in packages/astro/test/ does not exercise a custom prerender environment, reproducing the bug at the unit level requires a Vite dev server configured with both ssr and prerender environments, which is adapter-level setup. The bug is fully covered by @astrojs/cloudflare's prerender-styles.test.js, which now exercises the patched code path end-to-end.
Docs
No docs change needed, this is a dev-mode rendering bug, not a user-visible API change.
Changes
This PR fixes issue #16198 where server.allowedHosts (and vite.preview.allowedHosts) were ignored when using astro preview with the @astrojs/cloudflare adapter.
Technical Details:
- Updated
PreviewServerParamsinterface inastrocore to includeallowedHosts. - Updated
astrocore preview logic to passallowedHostsfrom the user configuration to the adapter's preview entrypoint. - Updated
@astrojs/cloudflarepreview entrypoint to acceptallowedHostsand pass it to Vite's preview configuration, replacing the hardcoded empty array.
These changes ensure that requests with non-localhost Host headers are correctly handled according to the user's security configuration when previewing Cloudflare builds locally.
Testing
Verified by building both astro and @astrojs/cloudflare packages and ensuring type compatibility. All unit tests passed locally.
Docs
No documentation changes required as this fixes an inconsistency between core configuration and adapter behavior.
Closes #16198
Changes
Bumps drizzle-orm in packages/db/package.json from ^0.42.0 to ^0.45.2, patching GHSA-gpj5-g38j-94v9 (CVE-2026-39356), a high severity SQL injection in drizzle-orm's identifier escaping. Changeset added at .changeset/late-lamps-attack.md.
Drizzle 0.44+ wraps query errors in a DrizzleQueryError whose .cause is the original LibsqlError, which broke @astrojs/db's error handling. Adds a new getDbError() helper exported from astro:db that walks the .cause chain and returns the underlying LibsqlError. isDbError() is still exported and still returns true for wrapped errors, but its return type is relaxed from the err is LibsqlError type predicate to boolean since the outer object is no longer a LibsqlError at runtime. Internal call sites in migration-queries.ts, integration/index.ts, and cli/commands/execute/index.ts now use getDbError() so .code and .message are read from the unwrapped error.
Testing
No new tests. The SQL injection fix lives in drizzle-orm, so regression coverage belongs upstream. The existing @astrojs/db suite (86 tests) passes locally, including the error-handling and libsql-remote tests that initially failed on CI after the drizzle bump. The fixture at test/fixtures/error-handling/src/pages/foreign-key-constraint.json.ts was updated to use the new getDbError() helper so it can still read .code and .message off the underlying LibsqlError; the test assertions in test/error-handling.test.js are unchanged.
Docs
User-facing change. Error handling docs for astro:db should document the new getDbError() helper and the isDbError() return type change. Any user code that reads e.code or e.message after catching a db.insert() / db.select() error needs to migrate to getDbError(); the changeset walks through the before/after pattern.
Description
This PR adds my latest plugin, Starlight Recipes, to the plugin showcase page.
Changes
We've been running auto-triage for some time now with a fair amount of success, but over time we identified a few things it didn't do too well. This PR tweaks it a little bit based on the feedback received. Most notably:
The message is still a bit messy to scan, big paragraphs. This PR changes two things in that regard:
- Reduce the total amount of sentences suggested (max before was 7 sentences, now 5)
- Add a bullet point summary at the top, moving the priority reasoning to a single line summary
- Added a tone suggestion explanation to try to keep the messages straight to the point over dramatically describing sometimes mundane things
The AI was quite overconfident in fixes, while this is unavoidable, we can tip its behavior in our favor nonetheless:
- There is now a proper "Low-confidence" path, where the AI will instead produce a branch with comments on where it believes the issue is, and a test if it was able to, hopefully providing a good jump start to anyone who wants to work on the issue.
- In general, some of the language has been updated to err more on the side of "exploration" "jumping point" "analysis".
Some misc things:
- It always priority a bit too high, not considering context enough. For instance, typically experimental features are never higher than P3 naturally. It's possible to fix this partially by editing the label descriptions, but there's a quite strict limit of characters so it's not amazing.
- It sometimes suggested insane things like removing adapters or integrations as potential fixes, lol
This PR also adds a new workflow to clean out branches after issues have been fixed. I know Fred historically used those to see the difference between the automated exploration vs the final PR, but in this future world I'd like for us to use the AI PRs are jumping point, so the history would anyway live in the PR.
Testing
Tried it in local as a skill with a few issues and liked the results better, but of course we'll really only know in production.
Docs
N/A
Changes
- Add
script-src-elem,script-src-attr,style-src-elem, andstyle-src-attrto the allowed CSP directives list so they pass config validation - Add first-class
scriptElemDirectiveandstyleElemDirectiveconfig sections (withresourcesandhashes) alongside the existingscriptDirective/styleDirective - When
script-src-elemorstyle-src-elemare configured, auto-generated script/style hashes are forwarded into the-elemdirective alongside any user-specified hashes - Expose
insertScriptElemResource,insertScriptElemHash,insertStyleElemResource, andinsertStyleElemHashon theAstro.cspruntime API -attrdirectives (script-src-attr,style-src-attr) are supported as generic directives via thedirectivesconfig array orinsertDirective()API- Tighten existing CSP rendering tests to use structured directive parsing and assert absence of CSP3 directives when not configured
Closes #16233
Motivation for this issue is to provide CSP support when using Shiki which uses inline style attributes for syntax highlighting.
Testing
Added unit tests across two files:
test/units/csp/config.test.ts— 8 tests validating CSP Level 3 directive names are accepted/rejected by the config schematest/units/csp/rendering.test.js— rewrote existing tests to use structuredparseCsp()helper for exact directive matching; added 12 new tests for-elemrendering, auto-generated hash forwarding,-attrpassthrough, and runtime API
All existing CSP tests continue to pass (25 JS + 9 TS unit tests).
Docs
This adds new user-facing config options (scriptElemDirective, styleElemDirective) and runtime API methods (insertScriptElemResource, etc.) that should be documented alongside the existing CSP reference.
Changes
Fix build errors in Vercel deployments caused by assetQueryParams being applied incorrectly to inter-chunk JS dynamic imports e.g. const shared = await import('./shared.js');
Build error is: Expected ":" but found ")"
NOTE: this fix should be credited to @leifmarcus because they suggested it in #16258 (comment) – this PR just tests and applies that suggestion.
Testing
Build errors are normally only seen in Vercel deployments, but can be triggered locally by providing the same deployment ID environment variable provided in the Vercel environment when skew protection is enabled:
VERCEL_DEPLOYMENT_ID=testing pnpm run build
Updated test appends assetQueryParams to relative imports inside client JS chunks to include a dynamic import – not just static imports – so it will trigger the build error if run at the commit 4f772eb that precedes the fix commit.
I also confirmed the fix by linking the patched Astro to a project that previously failed to build locally using the command above. However I have not yet tested a real Vercel deployment with the fix applied: I'm not sure how to go about doing that?
Docs
No docs changes needed.
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@6.1.6
Patch Changes
-
#16202
b5c2fbaThanks @matthewp! - Fixes Actions failing withActionsWithoutServerOutputErrorwhen usingoutput: 'static'with an adapter -
#16303
b06eabfThanks @matthewp! - Improves handling of special characters in inline<script>content -
#14924
bb4586aThanks @aralroca! - Fixes SCSS and CSS module file changes triggering a full page reload instead of hot-updating styles in place during development
@astrojs/cloudflare@13.1.9
Patch Changes
-
#16210
e030bd0Thanks @matthewp! - Fixes.sveltefiles innode_modulesfailing withUnknown file extension ".svelte"when using the Cloudflare adapter withprerenderEnvironment: 'node' -
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.3
@astrojs/partytown@2.1.7
Patch Changes
- #16265
7fe40bcThanks @ChrisLaRocque! - Updates@qwik.dev/partytownto 0.13.2
@astrojs/svelte@8.0.5
Patch Changes
Changes
Part of #16241
This is a big one because all unit tests we had were using utilities, mocks, etc. Since using ts/js when importing stuff would have caused much more distress, I preferred to port all unit tests.
Each commit is the port of a file (plus deletion of the js file), fix of regressions (latest commits), and porting of test-helpers (first commit).
Testing
Green CI
Docs
Changes
- fix #16276
Testing
tests were added
Docs
just a patch to make the cloudflare adapter work in the expected manner
Fixes #16273
Summary
Custom elements in MDX files bypass the renderer pipeline because the JSX runtime (jsx.ts:96) sends all string-typed vnodes directly to renderElement() — pure string concatenation with no renderer check.
The .astro compiler already handles this correctly by treating custom elements (tags with hyphens) as components (print-to-js.go:381).
Change
One condition added to jsx.ts line 96:
// Before:
case typeof vnode.type === 'string' && vnode.type !== ClientOnlyPlaceholder:
// After:
case typeof vnode.type === 'string' && vnode.type !== ClientOnlyPlaceholder && !vnode.type.includes('-'):Custom elements (string types containing a hyphen) now fall through to the existing renderComponentToString() path at line 147–153, which calls renderFrameworkComponent() → renderer check().
If no renderer claims the element, the existing fallback in renderComponent() renders it as raw HTML — no regression for projects without a matching renderer.
Testing
Tested across a production site with 80+ web components in MDX pages:
| Metric | Before | After |
|---|---|---|
| SSR'd custom elements | 77% | 99% |
| Build regressions | 0 | 0 |
Fixes #16203
Problem
The astro-frontmatter-scan esbuild plugin registers its onLoad handler without a namespace filter. In esbuild, an unfiltered onLoad matches all namespaces, including html. When a .ts file default-imports an .astro component, Vite's dep scanner resolves the .astro file into the html namespace. The plugin intercepts it and returns only the extracted frontmatter — which has no export default — causing:
[ERROR] No matching export in "html:/path/to/Component.astro" for import "default"
Fix
Add namespace: 'file' to the onLoad call so the plugin only handles .astro files resolved from the filesystem. Files in the html namespace now fall through to Vite's built-in htmlTypeOnLoadCallback, which already appends export default {} for non-.vue files.
Test plan
- Verified against the reproduction repo from the issue: error no longer occurs
filenamespace behavior is unchanged — same handler, same logic, only the namespace scope is narrowed
Changes
This PR renames the internal types of our logger in preparation of the upcoming custom logger.
Our internal types are a big old naming-wise, I decided to do some house keeping and make their names a bit more consistent.
Additionally, I added the _format option to the logger options. It's been marked as internal and optional. The option isn't exposed to users yet and not even to the current tests (apart from the new ones), so it's safe to merge without repercussions to users and other libraries.
Testing
I added some preliminary new tests for the _format option.
Docs
Not needed at this stage
Summary
Contributes to #16241
- Ports 16 routing unit test files from JavaScript to TypeScript
- Adds minimal type annotations where needed (type casts for test mocks, parameter types for callbacks)
- Files that depend on the untyped
mocks.jshelper are intentionally left as JS to avoid cascading changes - No changes to test logic or assertions — purely a type-level migration
Files ported
api-context, dev-routing, dynamic-route-collision, generator, getstaticpaths-cache, params-validation, prerender, preview-routing, resolved-pathname, rewrite, route-manifest, router-match, route-sanitization, routing-priority, trailing-slash, virtual-routes
Test plan
- All 162 ported TS tests pass (
node --experimental-strip-types --test test/units/routing/*.test.ts) - All 73 remaining JS tests pass (
node --test test/units/routing/*.test.js) -
tsc --project tsconfig.test.json --noEmitreports zero errors in ported files
Update package.json to require @qwik.dev/partytown ^0.13.2 and refresh pnpm-lock.yaml accordingly. Run pnpm install to apply the updated dependency and regenerate the lockfile.
There are lighthouse test penalties tied to the current version of the partytown integration that are solved by this latest version
Changes
Update package.json for the partytown integration to require @qwik.dev/partytown ^0.13.2 and refresh pnpm-lock.yaml accordingly. Run pnpm install to apply the updated dependency and regenerate the lockfile.
Testing
There weren't any tests in the partytown integration to start with
Docs
Shouldn't need to be any changes to docs
Fix for #16263
Changes
- The fix converts
assetFileNamesfrom a static string template to a function that detects and strips the @_@ pattern before it reaches the output filename, producing clean names like post.arA8i2KH.css. This is applied to both the server and client build output configurations instatic-build.ts
Testing
- Rebuilt locally and new file names are generated as expected. My last demo file was /_astro/post.arA8i2KH.css
Docs
No need for documentation changes
Description
- Updates the comparisons table on our environmental impact page
- Uses latest data from websitecarbon.com
- Direct link: https://deploy-preview-3812--astro-starlight.netlify.app/environmental-impact/#comparisons
Fixes #14013
Styles were missing in dev mode when the import path casing differed from the actual file path (e.g., ./Component vs component.astro). This affected case-insensitive file systems (macOS, Windows).
Normalized path comparison in the style resolution logic to be case-insensitive.
Ports 8 self-contained unit test files from JavaScript to TypeScript as part of #16241.
Files ported:
app/dev-url-construction.testapp/headers.testapp/url-attribute-xss.testassets/image-layout.testrender/escape.testrender/hydration.testrouting/origin-pathname.testrouting/routing-helpers.test
These files were chosen because they don't depend on shared JS test helpers (mocks.js, test-utils.js), so they can be ported independently without creating mixed JS/TS helper conflicts.
Changes beyond the rename:
- Removed
// @ts-checkdirectives (redundant in.tsfiles) - Converted JSDoc
@param/@returnsto native TS types indev-url-construction.test.ts - Added
asassertions onunescapeHTMLreturn values inescape.test.ts(the return type union doesn't expose[Symbol.asyncIterator]directly) - Typed the
errparameter inhydration.test.tscatch callback - Added a
route()factory helper inrouting-helpers.test.tsto satisfy theRouteDataparameter type
typecheck:tests, test:unit:ts (1019 pass, 0 fail), and test:unit:js (1328 pass, 0 fail) all pass.
Description
- Add a reusable tag filter UI (
src/components/tags/*) for desktop (DesktopAside) and mobile (MobileControl) - Apply tag filtering to
ListViewandCardView, including filtering for/changelogand/shorts - Add
FEATURES.tag, update related types/schema logic, and show tags inPostMeta - Split
faqs-and-known-issues.mdinto standalone/shorts/*entries and add the dynamic shorts route - Refactor TOC-related components so TOC and tag controls can share the new aside/panel UI
- Refer to Tag Filter in List and Card Views for details
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@6.1.5
Patch Changes
-
#16171
5bcd03cThanks @Desel72! - Fixes a build error that occurred when a pre-rendered page used the<Picture>component and another page calledrender()on content collection entries. -
#16239
7c65c04Thanks @dataCenter430! - Fixes sync content inside<Fragment>not streaming to the browser until all async sibling expressions have resolved. -
#16242
686c312Thanks @martrapp! - Revives UnoCSS in dev mode when used with the client router.This change partly reverts #16089, which in hindsight turned out to be too general. Instead of automatically persisting all style sheets, we now do this only for styles from Vue components.
-
#16192
79d86b8Thanks @alexanderniebuhr! - Uses today’s date for Cloudflarecompatibility_dateinastro add cloudflareWhen creating new projects,
astro add cloudflarenow setscompatibility_dateto the current date. Previously, this date was resolved from locally installed packages, which could be unreliable in some package manager environments. Using today’s date is simpler and more reliable across environments, and is supported byworkerd. -
#16259
34df955Thanks @gameroman! - Removeddlvdependency
@astrojs/cloudflare@13.1.8
Patch Changes
-
#16225
756e7beThanks @travisbreaks! - FixesERR_MULTIPLE_CONSUMERSerror when using Cloudflare Queues with prerendered pages. The prerender worker config callback now excludesqueues.consumersfrom the entry worker config, since the prerender worker only renders static HTML and should not register as a queue consumer. Queue producers (bindings) are preserved. -
#16192
79d86b8Thanks @alexanderniebuhr! - Removes an unused function re-export from the/infopackage path -
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.3
Description
I created a theme for Starlight (starlight-theme-nord), and would like to add it into documentation.
Changes
renderFragmentComponentwas callingrenderSlotToString, which eagerly awaited the entire slot content into a string before returning aRenderInstance. This caused sync siblings inside a<Fragment>to block until all async children resolved, unlike<div>and bare template expressions which streamed immediately.- Fix: replace
renderSlotToStringwithrenderSlot, so Fragment children go through the samerenderChild-> buffered async pipeline every other element uses. - Fixes #13283
Testing
- Added unit test in
test/units/render/html-primitives.test.jsverifying sync content flushes to the destination before a deferred Promise resolves. - Added integration tests in
test/streaming.test.jsusing a fixture page that mirrors the issue's exact reproduction — asserts sync content arrives in an earlier stream chunk than the async child. - All 99 existing + new tests pass.
Docs
No docs change needed
On case-insensitive filesystems (Windows, macOS), running npm run dev from a path with different casing than the canonical filesystem path caused inline <style> blocks to be silently dropped.
Root cause
The HMR handler in vite-plugin-astro/hmr.ts compared file paths using strict equality. When the casing of ctx.file (provided by Vite's watcher using the actual filesystem casing) differed from the key stored in the compile metadata map, lookups failed and CSS was never returned.
Changes
- Normalize path casing for comparison when looking up compile metadata on
win32anddarwin. - Normalize CSS dependency paths using the same approach when checking if an updated file is a CSS dependency.
- Add a changeset for the
astropackage.
Testing
Existing HMR tests continue to pass. The fix is scoped to case-insensitive platforms so Linux behavior is unaffected.
Fixes #14013
Changes
Added position prop to Astro Image with safe style merging to preserve existing user styles.
- issue : #16215
Testing
After implementation:
Docs
Changes
- Added
allowedHoststo thePreviewServerParamsinterface so adapter preview entrypoints can receive the user'sserver.allowedHostsconfiguration - Pass
settings.config.server.allowedHostsfrom the core preview entrypoint (packages/astro/src/core/preview/index.ts) to adapter preview modules - Update the Cloudflare adapter's preview entrypoint to use the passed
allowedHostsvalue (allowedHosts ?? []) instead of hardcoding an empty array
Before: astro preview with @astrojs/cloudflare always returns 403 for non-localhost Host headers, regardless of server.allowedHosts config.
After: server.allowedHosts is respected, matching the behavior of astro dev and the static preview server.
Fixes #16198
Testing
- Existing tests in
test/astro-preview-allowed-hosts.test.jspass (5/5 tests, 3 suites) - TypeScript compilation passes for both
astroand@astrojs/cloudflarewith 0 errors - Both packages build cleanly (0 errors, 0 warnings)
- Biome lint passes on all changed files
- Manual verification: the static preview server already handles
allowedHostscorrectly via the same pattern (seestatic-preview-server.ts); this fix extends that to adapter preview entrypoints
Docs
No docs changes needed. server.allowedHosts is already documented — this fix makes it work correctly with adapter preview entrypoints as users would expect.
ℹ️ Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
Release Notes
cloudflare/workers-sdk (@cloudflare/vite-plugin)
v1.32.1
Patch Changes
v1.32.0
Minor Changes
-
#13137
1313275Thanks @emily-shen! - Addehotkey to open local explorer during devPress
eduringvite devto open the local explorer UI at/cdn-cgi/explorer, which allows you to inspect the state of your D1, R2, KV, DO and Workflow bindings.
Patch Changes
- Updated dependencies [
5338bb6,79fd529,28bc2be,4fd138b,bafb96b,c50cb5b,2589395,525a46b,5eff8c1,1313275]:- wrangler@4.82.0
- miniflare@4.20260410.0
v1.31.2
Patch Changes
- Updated dependencies [
42c7ef0,c510494,8b71eca,a42e0e8,7ca6f6e]:- miniflare@4.20260409.0
- wrangler@4.81.1
v1.31.1
Patch Changes
- Updated dependencies [
a3e3b57,7d318e1,fa6d84f,96ee5d4,7d318e1,7a60d4b,78cbe37,6fa5dfd]:- miniflare@4.20260405.0
- wrangler@4.81.0
v1.31.0
Minor Changes
-
#13011
b9b7e9dThanks @ruifigueira! - Add experimental headful browser rendering support for local developmentExperimental: This feature may be removed or changed without notice.
When developing locally with the Browser Rendering API, you can enable headful (visible) mode via the
X_BROWSER_HEADFULenvironment variable to see the browser while debugging:X_BROWSER_HEADFUL=true wrangler dev X_BROWSER_HEADFUL=true vite dev
Note: when using
@cloudflare/playwright, two Chrome windows may appear — the initial blank page and the one created bybrowser.newPage(). This is expected behavior due to how Playwright handles browser contexts via CDP. -
#13051
d5bffdeThanks @dario-piotrowicz! - UpdategetLocalWorkerdCompatibilityDateto return today's dateThe re-exported
getLocalWorkerdCompatibilityDatefunction from@cloudflare/vite-pluginpreviously resolved the workerd compatibility date by traversing the localminiflareinstallation, which was unreliable in some package manager setups. It now simply returns today's date. The function is also marked as deprecated — callers should just use today's date instead, for example like so:new Date().toISOString().slice(0, 10)
Patch Changes
-
#13125
f76652cThanks @kayluhb! - Fix SyntaxError when SSR-transformed module ends with a single-line commentWhen module code ends with a
//comment (e.g.//# sourceMappingURL=...preserved by vite-plus), the closing}of the async wrapper inrunInlinedModulewas absorbed into the comment, causingSyntaxError: Unexpected end of input. Adding a newline before the closing brace prevents this. -
#13188
110002cThanks @shulaoda! - Normalize the return value ofgetAssetsDirectory()withvite.normalizePath()to ensureassets.directoryin the outputwrangler.jsonalways uses forward slashes -
Updated dependencies [
9c4035b,5d29055,fb67a18,d5bffde,ab44870,48d83ca,b2f53ea,b9b7e9d,14e72eb,4dc94fd,b2f53ea,d5bffde,48d83ca]:- wrangler@4.80.0
- miniflare@4.20260401.0
v1.30.3
Patch Changes
-
#13111
f214760Thanks @dependabot! - Add missingconnectkey toWorkerEntrypointandDurableObjectkey lists in the runner workerThe
connectmethod was added to theWorkerEntrypointandDurableObjecttypes in workerd 1.20260329.1 but was missing from theWORKER_ENTRYPOINT_KEYSandDURABLE_OBJECT_KEYSarrays used for RPC property access in the Vite plugin runner worker. This caused the compile-time exhaustiveness check to fail with the updated workers-types. -
Updated dependencies [
ffbc268,9eff028,ed20a9b,f214760,746858a,9aad27f,1fc5518,b539dc7,9282493,a532eea,cd0e971,d4c6158,2565b1d]:- wrangler@4.79.0
- miniflare@4.20260329.0
v1.30.2
Patch Changes
-
#12953
80b093eThanks @jamesopstad! - FixCannot perform I/O on behalf of a different requesterrors for deferred dynamic importsConcurrent requests that loaded the same dynamic import were previously sharing the same promise to resolve it in a Worker context. We now ensure that all imports execute within a Durable Object's IoContext before the result is returned to the Worker.
-
Updated dependencies [
eeaa473,9fcdfca,bc24ec8,1faff35,0b4c21a,535582d,992f9a3,f4ea4ac,91b7f73,f6cdab2,53ed15a,ce65246,7a5be20,6b50bfa,0386553,9c5ebf5,53ed15a,53ed15a]:- wrangler@4.78.0
- miniflare@4.20260317.3
v1.30.1
Patch Changes
-
#12851
86a40f0Thanks @jamesopstad! - Fix a bug that prevented using subpath imports for additional module typesYou can now use subpath imports for additional module types (
.html,.txt,.sql,.bin,.wasm) by defining them in yourpackage.jsonimportsfield:import page from "#templates/page"; export default { fetch() { return new Response(page, { headers: { "Content-Type": "text/html" }, }); }, } satisfies ExportedHandler;
-
Updated dependencies [
593c4db,b8f3309,451dae3,5aaaab2,5aaaab2,f8516dd,9c9fe30,379f2a2,c2e9163,6a6449e,9a1cf29,875da60]:- wrangler@4.77.0
- miniflare@4.20260317.2
v1.30.0
Minor Changes
-
#12848
ce48b77Thanks @emily-shen! - Enable local explorer by defaultThis ungates the local explorer, a UI that lets you inspect the state of D1, DO and KV resources locally by visiting
/cdn-cgi/explorerduring local development.Note: this feature is still experimental, and can be disabled by setting the env var
X_LOCAL_EXPLORER=false.
Patch Changes
-
#12942
4f7fd79Thanks @jamesopstad! - Avoid splicing into the middleware stack for Vite versions other than v6Previously, the plugin spliced its pre-middleware into the Vite middleware stack relative to
viteCachedTransformMiddleware. In Vite 8, this middleware can be omitted in some scenarios, which would cause the splice to fail. The plugin now registers pre-middleware usingserver.middlewares.use()directly, which places it in the correct position for Vite 7+. For Vite 6, the middleware is moved to the correct position in a post hook. -
Updated dependencies [
782df44,3c988e2,62545c9,d028ffb,cb71403,71ab981,3a1c149,7c3c6c6,ce48b77,8729f3d]:- wrangler@4.76.0
- miniflare@4.20260317.1
- @cloudflare/unenv-preset@2.16.0
v1.29.1
Patch Changes
-
#12936
cff91ffThanks @jamesopstad! - Select the appropriatevite/module-runnerimplementation during dev based on the user's Vite versionThe plugin now builds against Vite 8 and ships two bundled copies of
vite/module-runner: one from Vite 8 and one from Vite 7.1.12 (the last version before a breaking change to the module runner in Vite 7.2.0). At dev server startup, the correct implementation is selected based on the user's installed Vite version. This is Vite 8's module runner for users on Vite >= 7.2.0, and the legacy module runner for users on older versions. -
Updated dependencies [
c9b3184,13df6c7,df0d112,81ee98e,c600ce0,f509d13,3b81fc6,0a7fef9]:- wrangler@4.75.0
- miniflare@4.20260317.0
v1.29.0
Minor Changes
-
#12885
12505c9Thanks @edmundhung! - Add Vite 8 to the supported peer dependency rangeThe package now lists Vite 8 in its peer dependency range, so installs with Vite 8 no longer show a peer dependency warning.
Patch Changes
-
#12859
876108aThanks @dario-piotrowicz! - Fix crash when plugins send HMR events before runner initializationPreviously, if another Vite plugin (such as
vite-plugin-vue-devtools) sent HMR events duringconfigureServerbefore the Cloudflare plugin had initialized its runner, the dev server would crash withAssertionError: The WebSocket is undefined. The environment's WebSocket send operations are now deferred until the runner is fully initialized, allowing early HMR events to be handled gracefully. -
Updated dependencies [
ade0aed,2b9a186,65f1092,7b0d8f5,351e1e1,2b9a186]:- miniflare@4.20260312.1
- wrangler@4.74.0
v1.28.0
Minor Changes
-
#12855
c2b76bcThanks @jamesopstad! - Support local explorer/cdn-cgi/routesThe local explorer UI can now be accessed at
/cdn-cgi/explorer.
Patch Changes
-
#12834
64edac7Thanks @jamesopstad! - Warn when theassetsfield is provided for auxiliary WorkersAuxiliary Workers do not support static assets. Previously, the
assetsfield was silently ignored but we now warn if it is used. -
#12794
b980af6Thanks @aron-cf! - Fix Sandbox SDK preview URL WebSocket routingWhen using Sandbox SDK preview URLs, WebSocket requests using the
vite-hmrprotocol could be dropped before they reached the worker, causing HMR to fail. The plugin now forwards Sandbox WebSocket traffic and preserves the original request origin/host so worker proxy logic receives the correct URL. -
Updated dependencies [
f7de0fd,ff543e3,8e89e85,e63539d,8d1e130,6ee18e1,ecc7f79,1dda1c8,4bb61b9]:- miniflare@4.20260312.0
- wrangler@4.73.0
v1.27.0
Minor Changes
-
#12826
de65c58Thanks @gabivlj! - Enable container egress interception in local dev without theexperimentalcompatibility flagContainer local development now always prepares the egress interceptor sidecar image needed for
interceptOutboundHttp(). This makes container-to-Worker interception available by default in Wrangler, Miniflare, and the Cloudflare Vite plugin.
Patch Changes
- Updated dependencies [
5451a7f,5451a7f,82cc2a8,3c67c2a,d645594,211d75d,6ed249b,9f93b54,de65c58,cb14820,a7c87d1,b8c33f5,e4d9510]:- miniflare@4.20260310.0
- wrangler@4.72.0
v1.26.1
Patch Changes
- Updated dependencies [
5cc8fcf,ec2459e]:- @cloudflare/unenv-preset@2.15.0
- wrangler@4.71.0
- miniflare@4.20260301.1
v1.26.0
Minor Changes
-
#12649
35b2c56Thanks @gabivlj! - Add experimental support for containers to workers communication with interceptOutboundHttpThis feature is experimental and requires adding the "experimental" compatibility flag to your Wrangler configuration.
-
#12701
23a365aThanks @jamesopstad! - Add local dev validation for the experimentalsecretsconfiguration propertyWhen the new
secretsproperty is defined,wrangler devandvite devnow validate secrets declared insecrets.required. When required secrets are missing from.dev.varsor.env/process.env, a warning is logged listing the missing secret names.When
secretsis defined, only the keys listed insecrets.requiredare loaded. Additional keys in.dev.varsor.envare excluded. If you are not using.dev.vars, keys listed insecrets.requiredare loaded fromprocess.envas well as.env. TheCLOUDFLARE_INCLUDE_PROCESS_ENVenvironment variable is therefore not needed when using this feature.When
secretsis not defined, the existing behavior is unchanged.// wrangler.jsonc { "secrets": { "required": ["API_KEY", "DB_PASSWORD"], }, }
Patch Changes
cloudflare/workerd (@cloudflare/workers-types)
v4.20260413.1
v4.20260412.2
v4.20260412.1
v4.20260411.1
v4.20260410.1
v4.20260409.1
v4.20260408.1
v4.20260405.1
v4.20260404.1
v4.20260403.1
v4.20260402.1
v4.20260401.1
v4.20260331.1
v4.20260329.1
v4.20260317.1
v4.20260316.1
v4.20260313.1
v4.20260312.1
v4.20260310.1
v4.20260307.1
v4.20260306.1
v4.20260305.1
v4.20260305.0
v4.20260304.0
v4.20260303.0
v4.20260302.0
v4.20260301.1
v4.20260228.1
fastify/middie (@fastify/middie)
v9.3.1
What's Changed
Full Changelog: fastify/middie@v9.3.0...v9.3.1
v9.3.0
What's Changed
- chore(license): standardise license notice by @Fdawgs in #250
- fix: preserve query string when stripping path prefix by @panva in #249
- build(deps-dev): bump c8 from 10.1.3 to 11.0.0 by @dependabot[bot] in #253
New Contributors
Full Changelog: fastify/middie@v9.2.0...v9.3.0
v9.2.0
⚠️ Security Release
Fixes GHSA-8p85-9qpw-fwgw
What's Changed
New Contributors
Full Changelog: fastify/middie@v9.1.0...v9.2.0
fastify/fastify-static (@fastify/static)
v9.1.0
What's Changed
- build(deps-dev): bump @types/node from 24.10.4 to 25.0.3 by @dependabot[bot] in #552
- test: move ignoreTrailingSlash under routerOptions by @lraveri in #553
- build(deps-dev): bump borp from 0.20.2 to 0.21.0 by @dependabot[bot] in #543
- chore: bump pino and borp dependencies, delete stale.yml by @Tony133 in #557
- chore: update syntax typescript by @Tony133 in #558
- chore(license): standardise license notice by @Fdawgs in #560
- fix: sendFile ignoring option overrides in some cases by @bakugo in #559
- chore: upgrade c8 to v11.0.0 and improvements test by @Tony133 in #564
- build(deps): bump fastify/workflows/.github/workflows/plugins-ci.yml from 5 to 6 by @dependabot[bot] in #566
New Contributors
- @lraveri made their first contribution in #553
- @Tony133 made their first contribution in #557
- @bakugo made their first contribution in #559
Full Changelog: fastify/fastify-static@v9.0.0...v9.1.0
netlify/primitives (@netlify
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| ovsx (source) | ^0.10.9 → ^0.10.10 |
||
| prettier (source) | ^3.8.1 → ^3.8.2 |
||
| svelte (source) | ^5.54.1 → ^5.55.3 |
||
| tinyglobby (source) | ^0.2.15 → ^0.2.16 |
Release Notes
sveltejs/svelte (svelte)
v5.55.3
Patch Changes
-
fix: ensure proper HMR updates for dynamic components (#18079)
-
fix: correctly calculate
@constblockers (#18039) -
fix: freeze deriveds once their containing effects are destroyed (#17921)
-
fix: defer error boundary rendering in forks (#18076)
-
fix: avoid false positives for reactivity loss warning (#18088)
v5.55.2
Patch Changes
-
fix: invalidate
@consttags based on visible references in legacy mode (#18041) -
fix: handle parens in template expressions more robustly (#18075)
-
fix: disallow
--inidPrefix(#18038) -
fix: correct types for
ontoggleon<details>elements (#18063) -
fix: don't override
$destroy/set/oninstance methods in dev mode (#18034) -
fix: unskip branches of earlier batches after commit (#18048)
-
fix: never set derived.v inside fork (#18037)
-
fix: skip rebase logic in non-async mode (#18040)
-
fix: don't reset status of uninitialized deriveds (#18054)
v5.55.1
Patch Changes
-
fix: correctly handle bindings on the server (#18009)
-
fix: prevent hydration error on async
{@​html ...}(#17999) -
fix: cleanup
superTypeParametersinClassDeclarations/ClassExpression(#18015) -
fix: improve duplicate module import error message (#18016)
-
fix: reschedule new effects in prior batches (#18021)
v5.55.0
Minor Changes
- feat: export TweenOptions, SpringOptions, SpringUpdateOptions and Updater from svelte/motion (#17967)
Patch Changes
- fix: ensure HMR wrapper forwards correct start/end nodes to active effect (#17985)
SuperchupuDev/tinyglobby (tinyglobby)
v0.2.16
Fixed
- Upgraded
picomatchto 4.0.4, mitigating any potential exposure to
CVE-2026-33671
and CVE-2026-33672
Changed
Configuration
📅 Schedule: (UTC)
- Branch creation
- Between 12:00 AM and 03:59 AM, only on Monday (
* 0-3 * * 1)
- Between 12:00 AM and 03:59 AM, only on Monday (
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
Summary
Fixes #16199. The @astrojs/cloudflare adapter's prerender worker config callback spreads the entire entryWorkerConfig into the prerender worker, including queues.consumers. When Miniflare sees two workers both registered as consumers of the same queue, it rejects with ERR_MULTIPLE_CONSUMERS. The prerender worker only renders static HTML and has no need for queue consumer registrations.
Changes
- Destructure
queuesfromentryWorkerConfigin the prerender workerconfig()callback - Spread
restWorkerConfig(without queues) instead of the full config - Preserve
queues.producers(bindings) when present, since producers are just bindings and don't cause conflicts - Drop
queues.consumersentirely from the prerender worker - Add test fixture with a hybrid site (prerendered page + SSR endpoint) that defines both
queues.consumersandqueues.producersinwrangler.jsonc - Add test verifying the build succeeds and both routes work in preview
Test plan
- New test
prerender-queue-consumers.test.jspasses (2/2 assertions) - Existing
wrangler-preview-platform.test.jsstill passes (4/4 assertions) - Changeset included
Changes
Fix React 19 "Float" mechanism injecting into Astro islands instead of the . This PR adds a filter to @astrojs/react to strip these auto-generated resource from the island's HTML output, ensuring valid HTML structure.
- issue : #16212
Testing
Before Implemented:
After Implemented:
Docs
Changes
- adds a cloudflare cdn cache provider for route caching
Testing
- not sure yet
Docs
- tbd
Changes
- Adds
astro-og-canvas@0.11.0tominimumReleaseAgeExcludeinpnpm-workspace.yamlso the smoke testpnpm installstep no longer fails - The docs site (
withastro/docs) depends onastro-og-canvas, and version0.11.0was published less than 3 days ago, hitting theminimumReleaseAge: 4320constraint
Testing
- CI smoke tests should pass once this lands; no other test changes needed
Docs
- No docs update needed — this is a CI configuration change only
Changes
- Packages that ship
.sveltefiles (e.g.bits-ui) now work with the Cloudflare adapter'sprerenderEnvironment: 'node'option. Previously they failed withUnknown file extension ".svelte"because the prerender environment'sresolve.noExternalwas missing these packages, so they were loaded via Node's nativeimport()instead of Vite's transform pipeline. @astrojs/cloudflare: Removed top-levelssr.noExternal = truefrom thecf-externalsplugin. This was poisoningvitefu'scrawlFrameworkPkgsinto returning an empty list, since it assumed all packages were already noExternal. Thessrenvironment still getsresolve.noExternal: truefrom@cloudflare/vite-plugindirectly. Also removed theconfigEnvironmenthook that disabled dep optimization for the prerender environment.@astrojs/svelte: UsescrawlFrameworkPkgsto discover packages that peerDepend onsvelteand adds them toresolve.noExternalfor all server environments (includingprerender) viaconfigEnvironment.
Testing
- Added a test to the existing
prerenderEnvironment: 'node'test suite that renders a svelte component importing a.sveltefile from a fakenode_modulespackage. - All 6 existing tests continue to pass, including workerd SSR, server islands, and Node.js API access.
Docs
- No docs update needed — this fixes a bug, no new API surface.
Closes #15906
Description
- Fixes #3785
- When adding our
draftfeature, we added a notice to alert people during dev that page had draft status, but missed adding this same alert if the page used theherocomponent. - This PR fixes that by also including the notice in the hero component
Here’s an example of what this looks like if you set draft: true on the homepage of the Starlight docs:
| Small viewport | Large viewport |
|---|---|
![]() |
![]() |
This also required a couple of minor CSS changes:
- We previously did not set
grid-template-columnson the hero component for small viewports, but this is risky when components can overflow the viewport width (like the draft notice) as the grid simply adapts to accommodate them. The hero is now explicitly a single, 100%-wide column for small viewports so it contains the notice. - The hero component uses centre-aligned text on small viewports, but the notice looks quite odd with centred text due to the icon lock-up. So this PR explicitly adds start-alignment to the notice.
I think both of these changes are minor and should be safe enough to release in a patch.
Fixes #16196
This seems likely connected to #16110, which introduced inter-chunk import rewriting for adapter asset query params.
Deployment Failure on Netlify
[ERROR] [vite] ✗ Build failed in 360ms
Syntax error "c"
Location:
_astro/page.BsrPi06Q.js:17:50
Changes
- Fix
plugin-chunk-importsrewrite logic to preserve valid JS import syntax when appendingassetQueryParams. - Rewrite only the module specifier content (inside quotes) using
es-module-lexeroffsets, instead of inserting blindly at the previous end offset. - Merge adapter-provided query params with existing
?queryand#hashin relative inter-chunk JS imports. - Add clarifying inline comments around specifier offsets and param snapshot behavior.
- This addresses cloud-only build failures (e.g. Netlify/Vercel) where generated
_astro/*.jscould become syntactically invalid in downstream bundling.
Testing
- Reproduced the issue on Netlify before this fix (deployment build failed with syntax errors in generated
_astro/*.jschunks). - After applying this fix, redeployed the same project on Netlify and confirmed the build now succeeds.
Changes
- Adds Semgrep OSS security scanning workflow
- Runs on pull requests and weekly on Saturdays (cron schedule)
- Uses pinned Semgrep container image for reproducibility
- No tokens required - uses OSS version with auto config
Testing
- Workflow file syntax validated locally
- Uses official semgrep/semgrep container with pinned SHA
- OSS scan with --config=auto for comprehensive rule coverage
Docs
- No docs update needed, this is an internal CI improvement that does not affect user-facing behavior
Changes
- Skips the
ActionsWithoutServerOutputErrorvalidation when an adapter is present. PR #15890 moved this check fromastro:config:donetoastro:routes:resolvedbut lost adapter-awareness — the old check was naturally bypassed because adapters overridebuildOutputto'server'. The new check only inspects resolved routes, sooutput: 'static'with all pages prerendered + an adapter (Netlify, Cloudflare, etc.) incorrectly throws.
Testing
- Added a test that starts a dev server with the
actionsfixture,output: 'static', andtestAdapter(), confirming the action endpoint responds successfully. - Full
actions.test.jssuite passes (26/26).
Docs
- No docs change needed — this restores previously documented Astro 5 behavior.
Closes #16103
Changes
- Removes four unused re-exports (
matchHostname,matchPathname,matchPort,matchProtocol) frompackages/astro/src/assets/utils/index.ts - Updates the sole internal consumer in
packages/astro/src/core/app/base.tsto importmatchPatterndirectly from@astrojs/internal-helpers/remoteinstead of through the barrel file - Fixes Vite build warning about unused imports that reappeared after the v6 merge (#15036) partially reverted the original fix from #15034
Fixes #16188
Testing
No tests added — this is a cosmetic build warning fix with no runtime behavior change. Verified by running astro build and confirming the warning no longer appears (both static and server output modes).
Docs
No docs update needed — this change has no user-facing behavior impact.
Summary
Bumps @qwik.dev/partytown from ^0.11.2 to ^0.13.2.
This update includes fixes for deprecated Chromium APIs (SharedStorage and AttributionReporting) that were causing Lighthouse warnings in sites using Partytown.
Related: QwikDev/partytown#697
Related: #15494
Changes
- Bumps
@qwik.dev/partytowndependency from^0.11.2to^0.13.2 - Resolves Lighthouse deprecation warnings for
SharedStorageandAttributionReportingAPIs in the Partytown sandbox service worker
Testing
Tested locally by overriding @qwik.dev/partytown to 0.13.2 in a production Astro 6 project. Full build completes successfully and Partytown functions as expected.
Docs
No docs needed, this is a dependency version bump with no documented API changes.
The default cloudflare-binding image service relied on the IMAGES binding for transforms, but this binding is unavailable during the Node-side build pipeline. Prerendered pages were left with un-optimized images. Expand the Sharp fallback to cover both compile and cloudflare-binding build services so that static images are optimized at build time.
Fixes #16035
Changes
- Added
needsBuildTimeOptimizationflag that covers bothcompileandcloudflare-bindingbuild services compileImageConfigis now passed to the workerd prerender handler forcloudflare-binding, enablinginstallAddStaticImageto track images during prerenderingcollectStaticImagesis now defined forcloudflare-binding, allowing Sharp to process tracked images on the Node side during build- Added changeset for
@astrojs/cloudflarepatch
Before: Default cloudflare-binding mode skipped build-time image optimization entirely — prerendered/static pages contained un-optimized images.
After: Sharp processes images at build time for both compile and cloudflare-binding modes, producing optimized output.
Testing
All 136 existing Cloudflare adapter tests pass with 0 failures, including:
compile-image-service.test.js(5/5 pass)binding-image-service.test.js(6/6 pass)external-image-service.test.js(2/2 pass)dev-image-endpoint.test.js(6/6 pass)prerenderer-errors.test.js(1/1 pass)static.test.js(1/1 pass)
Reproduction repo: https://github.com/alexanderniebuhr/astro-v6-repro
Docs
No docs changes needed. This fix aligns the default cloudflare-binding behavior with what users already expect — image optimization should work out of the box. The existing Cloudflare adapter docs describe cloudflare-binding as the default image service; this change ensures it actually optimizes images at build time.
Changes
- Extensionless endpoints (e.g.
src/pages/demo.ts) withtrailingSlash: "always"now produce their actual response instead of redirect HTML duringastro build. The bug was ingetUrlForPath()ingenerate.ts, which skipped trailing slash handling for all endpoints. The route manifest correctly appliedtrailingSlashto extensionless endpoints, but the prerender request URL did not, causingBaseApp.render()to emit a 301 redirect instead of calling the endpoint. - Endpoints with file extensions (e.g.
/feed.xml,/data.json) remain exempt from trailing slash enforcement, matching the documented v6 behavior.
Testing
- Added a unit test in
generate.test.jsthat verifies the prerender request URL includes a trailing slash for extensionless endpoints whentrailingSlash: "always"is configured. The test intercepts the URL passed to the prerenderer and asserts it ends with/. - All existing
generate.test.jsandtrailing-slash.test.jstests continue to pass.
Docs
- No docs update needed — this restores the behavior that the docs already describe.
Closes #16185
closes: #15986
(The error mentioned in the issue title has been confirmed fixed in Astro@6.1.3, but since this warning log was also reported in the same issue, I'm including this fix here as well.)
Changes
When using the @tailwindcss/vite plugin, a Failed to load url astro:server-app.js (resolved id: astro:server-app.js). Does the file exist? warning could appear under certain conditions.
Steps to reproduce
- Start the dev server and open a page that loads a CSS file containing Tailwind styles
- Edit a file on a different page
- The warning appears in the console
The root cause is that the virtual module ID astro:server-app does not start with virtual:, causing Vite to mistake it for a regular JS file. The fix prefixes the ID with virtual: to ensure Vite handles it correctly.
Testing
Added an e2e test that monitors console output to verify the warning no longer appears.
Docs
N/A, bug fix
Changes
This PR increases the testing coverage of the following parts:
- integration hooks utilities: no changes involved to the source code other than exporting the functions to test.
- image assets utilities: no changes involved to the source code other than exporting the functions to test.
- dev server rewrites and redirects: done a small refactor by creating a "decision" type that decides what to do. Then a self contained function has been created, exported and tested. This was done for redirects and rewrites of the dev server.
- astro config validation: the
superRefinefunction had various number of validation functions. They were extracted into smaller functions so that they could be tested
Testing
Green CI
Docs
Closes #16145
Changes
- Add optional
waitUntilto theCacheProvider.onRequest()context type. - Thread
waitUntilthroughBaseApp.render()so adapters can pass it to runtime cache providers. - Forward Cloudflare
ExecutionContext.waitUntilfrom the adapter handler intoapp.render(). - Add a regression test covering a custom cache provider on Cloudflare.
- Added a changeset for
astroand@astrojs/cloudflare.
Testing
pnpm run buildnode --test packages/integrations/cloudflare/test/cache-provider-wait-until.test.js
Docs
- No docs update added. This fixes the implementation to match the existing documented
CacheProvider.onRequest()signature.
Changes
- A sync commit accidentally introduced an unused
import {createLoggerFromFlags} from "../../../../../src/cli/flags.ts"into the client-sidePostComment.tsxtest fixture. This Node.js-only import broke React hydration, preventing theonSubmithandler from attaching. The "Comment action - success" and "Logout action redirects" E2E tests failed as a result.
Testing
- Ran the full
actions-blog.test.jssuite with--repeat-each=10(76/76 passed) to confirm the fix is stable and not flaky.
Docs
- No docs update needed — this is a test fixture change only.
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@6.1.4
Patch Changes
-
#16197
21f9fe2Thanks @SchahinRohani! - Remove unused re-exports from assets/utils barrel file to fix Vite build warning -
#16059
6d5469eThanks @matthewp! - FixesExpected 'miniflare' to be definederrors and 404 responses in dev mode when using the Cloudflare adapter and the config file changes. Instead of creating a brand new Vite server on config changes, Astro now performs a Vite in-place restart, allowing the Cloudflare adapter to reuse its existing miniflare instance across restarts. -
#16154
7610ba4Thanks @Desel72! - Fixes pages with dots in their filenames (e.g.hello.world.astro) returning 404 when accessed with a trailing slash in the dev server. ThetrailingSlashForPathfunction now only forcestrailingSlash: 'never'for endpoints with file extensions, allowing pages to correctly respect the user'strailingSlashconfig. -
#16193
23425e2Thanks @matthewp! - FixestrailingSlash: "always"producing redirect HTML instead of the actual response for extensionless endpoints during static builds
@astrojs/react@5.0.3
Patch Changes
- #16224
a2b9eebThanks @fkatsuhiro! - Fix React 19 "Float" mechanism injecting into Astro islands instead of the . This PR adds a filter to @astrojs/react to strip these auto-generated resource from the island's HTML output, ensuring valid HTML structure.
Updated Czech translations only
Changes
- Adds
preact/hooksand@preact/signalsto the Preact integration's clientoptimizeDeps.includeso Vite pre-bundles them upfront instead of discovering them late after the first page load - Without this, Vite discovers
@preact/signalson first request, re-optimizes, and sends a full page reload that races with test interactions
Testing
- Ran
e2e/namespaced-component.test.js10 times with cache cleared before each run: 10/10 passed. Previously failed ~3/5 on main.
Docs
- No docs needed — internal dep optimization change with no user-facing API
Changes
- SSR builds with only injected routes (no
src/pages/directory) were failing at runtime withNo matching renderer found. - The renderer plugin's build optimization strips renderers from the SSR bundle when it determines no SSR pages need them. The way it determines this was not accounting for injected routes. This fixes it.
Testing
- Added unit tests for
hasNonPrerenderedRoutecovering: project pages, prerendered pages, endpoint exclusion, and the newincludeExternaloption with injected routes. - Verified end-to-end against HiDeoo's reproduction
Docs
- N/A, bug fix
Changes
Our unit tests are hanging because runInContainer and createContainer broke in some of the latest changes.
The reason why they break is because internally they use fs-fixture, which create fixtures without node_modules. Our apps now rely on node_modules because we use virtual modules, which are available via node_modules (via vite).
This system doesn't work anymore, so we need to abandon it.
The fix:
- make some tests unit tests
- use real fixtures (they aren't unit tests anymore, but I didn't want to change their location too)
The test frontmatter.test.js was skipped because it keeps crashing.
Testing
Green CI, no timeouts.
I verified that locally tests don't hang anymore.
Docs
Description
- Closes #
- What does this PR change? Give us a brief description.
- Did you change something visual? A before/after screenshot can be helpful.
Last fetched: | Scheduled refresh: Every Saturday
See Customizing GitHub Activity Pages to configure your own
Inspired by prs.atinux.com

