AstroEco is Contributing…
Display your GitHub pull requests using astro-loader-github-prs
Changes
This PR marks the start of writing and running test files using TypeScript, by using the Node.js --experimental-strip-types
- I created two new
test:commands so that we can migrate the files progressively. - I added a new
tsconfig.test.jsonspecifically for the tests - I added a new
typecheck:testsjob to make sure that the test files correctly use types
Let me know what you think
Testing
Existing tests should pass. Green CI
Docs
N/A
Summary
- make watch extension resolution robust when root file names do not include extensions
- filter out empty extensions and use a safe fallback extension set for watch mode
- avoid writing terminal clear control codes when stdout is not a TTY, improving CI/log readability
- add targeted tests for extension deduplication and fallback behavior
Why
Some projects can surface root file names without extensions (for example, Dockerfile-style entries). In those cases, watch filtering can become ineffective and miss relevant updates. This change ensures watch mode remains reliable across more project layouts and runtime environments.
Changes
- add resolveWatchExtensions(rootFileNames) in @astrojs/check to centralize and harden extension selection
- update watch setup to use the resolved extension list
- gate screen-clear behavior behind process.stdout.isTTY
- add watchExtensions.test.ts covering:
- unique extension extraction
- fallback behavior when no valid extensions are present
Test plan
- Run
corepack pnpm --filter @astrojs/check build - Run
corepack pnpm --filter @astrojs/check test - Validate watch mode behavior in a project with extensionless root files
Changes
-
Fixes
astro previewstatic server to merge user Vite config fromastro.config.mjs(config.vite) before starting Vite preview. -
Keeps preview defaults/overrides on top (
configFile: false, Astro-managed preview fields, Astro preview plugin). -
Applies
allowedHostsafter merge to avoid Vite array-concatenation behavior. -
Preserves precedence:
- explicit Astro
server.allowedHosts(trueor non-empty array) wins - otherwise merged
vite.preview.allowedHostsis used
- explicit Astro
-
Fixes #16088.
Changes
This PR adds more unit tests to some functions that didn't have any coverage.
It also refactors isLocalsSerializable to use a stack-based approach. I applied the refactor after I added the tests.
Testing
Green CI
Docs
Changes
Fixes .meta properties applied to a top-level content collection not being rendered into JSON Schema. See withastro/roadmap#1327 (reply in thread) for discussion and original bug report.
Testing
I've added a new passing test for this.
Docs
I don't believe new docs are needed, this feels like what the expected behavior should have been with the bump to Zod 4.
Changes
- Replaces the
optimize-depsskill withreference/optimize-deps.md - Removes the unreliable "Load Domain-Specific Skills" step from
diagnose.mdandfix.mdin the triage pipelin - Adds a "Deep Dives" section to
AGENTS.mdwith a short summary of the optimizeDeps bug category and a pointer to the full reference doc.- Idea here is future deep dives will go in the reference/ folder.
Testing
- N/A
Docs
- N/A
Changes
In Dev mode, Vite client changes styles on the fly, for example to transform :deep() in scoped styles in Vue components. The client router replaced those styles during swap with the untransformed versions, which are no valid CSS for the browser.
Auto persisting styles with data-vite-dev-id attributes keeps the transformed versions.
Fixes: #15898
Testing
Added new test case
Docs
n.a., bug fix
Changes
- The
diagnoseandfixtriage sub-skills now include a step to check.agents/skills/for relevant domain-specific skills and load them before starting their work. - Each sub-agent runs in a fresh isolated context with no memory of prior steps, so domain skills that would normally auto-trigger in an interactive session were never loaded. This adds an explicit instruction to bridge that gap.
Testing
- Really hard to test these things, ran triage locally and it did pick up the issue, although I might have steered it by mistake.
Docs
- N/A
Changes
This PR adds many unit tests to our runtime/rendering utilities. Some utilities weren't exported, but now they are.
It also moves some integration tests to unit tests, and remove unused fixtures in the process.
Closes AST-16
Testing
Green CI
Docs
Changes
- Guards the
buildStarthook in theastro:scriptsVite plugin to skipthis.emitFile()when Vite is running in serve mode (astro dev). emitFile()is a Rollup build-time API that Vite stubs out during dev, producing a spurious warning:[WARN] [vite] [plugin:astro:scripts] context method emitFile() is not supported in serve mode.- The fix captures the Vite command via the
confighook and returns early frombuildStartwhencommand === 'serve'. TheemitFile()call still runs duringbuildas intended, ensuring before-hydration script chunks are correctly emitted for production builds.
Testing
before-hydration.test.js— All 7 tests pass, covering both SSG and SSR scenarios, in dev and build modes, with and without hydration scripts injected by integrations. This validates that the before-hydration chunk is still correctly emitted during builds while the warning is suppressed during dev.astro-scripts.test.js— All 11 tests pass, covering script rendering, hoisting, inlining, andinjectScriptin both dev and build modes.
Docs
- No docs update needed — this is a bug fix removing a spurious warning, with no change to user-facing APIs or behavior.
Changes
Fix a bug which prevented pages from being served by ISR by the vercel adapter.
This PR introduced a bug with the vercel adaptor which made any route served by ISR result in a 404. This is due to an intricacy with how vercel ISR works, in that we need to change the request path when serving an ISR path. This was noticed by a commenter in the PR.
Testing
No additional test cases added. Manual e2e tests performed on a test vercel project (note this includes other code from another PR I am working on, but the upshot is that it is a ISR page, which does not 404, as opposed to an earlier deployment without this fix which does 404).
Docs
No docs needed as a bug fix for internal adapter logic
Changes
Closes AST-13
- increased testing coverage for redirects
- moved some redirects tests to unit tests
- increased testing coverage for content collection image reference
- moved prerender flag to unit tests instead of integration tests
Testing
Green CI
Docs
N/A
Changes
With Astro v6, we deprecated constants for event names.
The client router code itself was still using those.
This change replaces them with their string literals.
Testing
covered by existing tests
Docs
n.a. internal refactor.
Changes
- Removes
alertdialogandapplicationfrom thearia_non_interactive_rolesarray in the dev toolbar. Per WAI-ARIA, these are interactive widget roles, not document structure roles. - Fixes a minor trailing space in the
a11y-missing-attributeerror message.
Testing
This is a static data array update, so no new tests were added. The existing a11y-no-interactive-element-to-noninteractive-role and a11y-no-noninteractive-element-to-interactive-role rules automatically pick up the corrected classifications. Verified locally that the test suite passes.
Docs
No documentation updates needed. This strictly fixes internal dev toolbar audit behavior to align with the WAI-ARIA spec and does not affect public APIs.
THANK YOU
Changes
- The
a11y-missing-attributedev toolbar audit incorrectly required all listed attributes on<area>and<object>elements (AND logic). Per the WAI-ARIA spec, these elements only need at least one of their alternative labeling attributes (alt,aria-label, oraria-labelledbyfor<area>;title,aria-label, oraria-labelledbyfor<object>). - Added OR logic so these elements are only flagged when none of the listed attributes are present. Updated the error message to use "or" instead of "," for these elements.
Testing
- The fix is a minimal logic branch in the existing
matchfunction. Elements with a single required attribute (a,html,iframe,img) are completely unaffected since AND/OR is equivalent for a single item. - Verified the fix passes
pnpm formatandpnpm lintwith no new issues.
Docs
- No docs update needed — this is an internal dev toolbar audit rule fix with no user-facing API change.
Changes
We have some deps in the monorepo that relies on things added in 20.12.0, updating the VS Code version by two makes our minimum Node version be 20.14.0 now, fixing builds in CI. People are typically up to date on VS Code versions, and this version is going on two years old at this point, so should be fine, really.
Testing
Tests should pass
Docs
This is shown in VS Code itself, with a prompt to upgrade your VS Code version IIRC.
Changes
menuitemradiowas incorrectly listed in thearia_non_interactive_rolesarray used by the dev toolbar's a11y audit rules.- Per the WAI-ARIA spec,
menuitemradiois a widget role (interactive) — it represents a checkable menu item in a radio group. This matches how eslint-plugin-jsx-a11y classifies it. - This misclassification caused false positives on
a11y-no-interactive-element-to-noninteractive-role(e.g.<button role="menuitemradio">incorrectly flagged) and missed violations ona11y-no-noninteractive-element-to-interactive-role(e.g.<div role="menuitemradio">not flagged).
Testing
- This is a data-level fix (removing one incorrect entry from a static array). The audit rule logic is unchanged, so existing tests continue to validate correctness.
Docs
- No docs update needed — this is an internal dev toolbar behavior fix with no user-facing API change.
Changes
- Adds a new agent skill at
.agents/skills/optimize-deps/SKILL.mddocumenting tribal knowledge about Vite's dep optimizer as it applies to the Astro dev server. - Covers how
optimizeDepsworks (scan phase vs bundle phase), why non-JS files like.astrorequire special handling, the roles ofvitefu,vite-plugin-environment, andastroFrontmatterScanPlugin, and a debugging playbook with logging techniques and potential fix patterns.
Testing
- No code changes — this is documentation/tooling only.
Docs
- This IS the docs. No other changes needed.
Changes
Updates svgo to the latest
Testing
Green CI
Docs
Changes
- Server Islands (
server:defer) now work correctly in Netlify production deployments when usingoutput: 'static'(the default). Previously the/_server-islands/*endpoint returned 404. - The bug was in
astro:config:done:buildOutputwas destructured from the hook params beforesetAdapter()was called, capturing a stale'static'snapshot. SincebuildOutputis a getter onsettings.buildOutput, andsetAdapter()upgrades it to'server', the fix is to readparams.buildOutputaftersetAdapter()rather than destructuring it upfront.
Testing
- Added a regression test in
test/static/static-headers.test.jsthat asserts the SSR function directory is created after building aoutput: 'static'project with aserver:deferisland — the exact scenario from the bug report. - The existing
static-headersfixture already had this setup, so no new fixture was needed.
Docs
No docs update needed — this is a bug fix restoring already-documented behavior.
Closes #16049
Changes
- When
astro devstarts, Astro now checks ifvite@8is installed at the top level of the user's project and emits a warning directing them to add"overrides": { "vite": "^7" }to theirpackage.json. Vite 8 at the top level causes subtle breakage with the Cloudflare adapter because@cloudflare/vite-pluginresolvesvitevia Node's normal module resolution (no nested copy of its own), so it picks up the user's hoisted Vite 8 instead of Astro's Vite 7 — leading to arequire_dist is not a functioncrash in workerd'sCustomModuleRunner. astro add cloudflarenow prompts the user to add"overrides": { "vite": "^7" }to theirpackage.jsonautomatically. This prevents the issue from being introduced later (e.g. if the user installs@tailwindcss/viteafter adding the Cloudflare adapter, which hoists Vite 8 to the top level).
Testing
- Reproduced the crash manually:
npm create astro@latestwith--add cloudflare --add tailwind, deletenode_modules+package-lock.json, reinstall —astro buildfails withrequire_dist is not a function. Adding"overrides": { "vite": "^7" }resolves it.
Docs
No docs update needed — the warning itself is user-facing guidance, and the astro add prompt explains the change inline.
Closes #16029
Changes
- Adds a
Changesetssection to theastro-pr-writerskill covering when changesets are required, file format, bump type rules, and CI restrictions onmajor/minorcore bumps - Documents the Astro changeset message writing conventions from https://contribute.docs.astro.build/docs-for-code-changes/changesets/ — verb-first present tense, user-facing framing, and type-specific guidance (patch, minor, breaking)
- Instructs agents to always write the changeset file manually rather than offering the interactive CLI wizard, which agents cannot use
- Adds a self-check item to verify a changeset exists before posting any package-modifying PR
Testing
- Manual review of the updated skill content against the Astro contribution docs and the existing changeset files in the repo
Docs
- No docs update needed; this change is to an agent skill, not user-facing Astro documentation.
Changes
Closes AST-14
More unit tests, less integration tests, more test coverage.
- encoded params are now unit tested in the build, removed their fixture
- extracted the logic that creates the fallback routes to its own function, so that it's exported and tested
- removed some tests from
rewrite.test.jsas they are already covered from unit tests - improved test cases of in-memory cache
- many fixtures have been removed, as they aren't used anymore
Testing
Green CI
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
Closes #15993
Changes
Middleware changes were not picked up during development without a full server restart. Now it's fixed and editing middleware during astro dev takes effect on the next request. Based on proposed Copilot changes.
Testing
Added a new e2e test that verifies a response header set by middleware updates after editing the middleware file without server restart.
Docs
No docs are required.
Changes
The issue is caused by upstream, this patch only provides a workaround to prevent Astro projects from build failure and runtime 500 error (if it's a server) instead of actually fixing.
The issue happens because a piece of code from "fdir" uses require(), and it would be compiled to a call to the function returned by createRequire(import.meta.url). However, import.meta.url is undefined in workerd runtime.
[ERROR] TypeError: The argument 'path' The argument must be a file URL object, a file URL string, or an absolute path string.. Received 'undefined'
at createRequire (node:module:34:15)
at .../dist/server/chunks/index_DJvu3f_r.mjs:11716:33
See also:
- vitejs/vite#21969
- https://github.com/thecodrr/fdir/blob/790c182eb54809ea7bc14f1bcb40acce89506bb4/src/builder/index.ts#L17
Similar issues:
Testing
It's just a small fix.
Docs
It doesn't add or change any documented behavior but makes it work as expected.
Closes #14669
Changes
When a Svelte component uses generic type parameters (<script generics="T extends ...">), the editor integration now preserves the generics in the generated TypeScript, so props are correctly inferred and intellisense works in .astro files.
Testing
Added several astro check tests in svelte/test/check.test.js
- Single-param generic with conditional type constraint
- Multi-param generic with nested angle brackets (
Record<string, unknown>) - Arrow function type in generic constraint (
(val: string) => boolean)
To check this manually:
- Create a Svelte component with
genericsattribute:
<script lang="ts" generics="T extends boolean = false">
interface Props { flag?: T; items: T extends true ? number[] : string[] }
let { flag, items }: Props = $props();
</script>- Import and use it in an
.astrofile - Before the fix: TypeScript errors and no intellisense
- After the fix: props are correctly inferred with generic constraints
Docs
No docs changes are required.
Changes
- Server islands no longer crash with
this.result.serverIslandNameMap.get is not a functionin dev when using an adapter that adds a separateprerenderVite environment - The bug was triggered by a specific navigation order: visiting any page without a server island first caused the
virtual:astro:server-island-manifestmodule to be cached in theprerenderenvironment with placeholder string values. When a page with a server island was then visited, the plugin invalidated the module only in thessrenvironment — theprerenderenvironment kept its stale cached module. At render time, the truthy placeholder string passed through?? new Map()and calling.get()on it threw. - The fix updates
configureServerto collect all server-side environments (ssr,prerender,astro) and invalidates the manifest module in all of them when server islands are first discovered.
Testing
- Confirmed manually with the reproduction from #16045: visiting
/(no island) then/with-islandnow renders correctly instead of returning HTTP 500. - No automated test added: the bug only manifests with a
prerenderenvironment, which requires the Cloudflare adapter's workerd runtime and cannot be exercised in the standard fixture test suite. The fix is a targeted behavioral change in the plugin's invalidation loop.
Docs
No docs update needed — this is a bug fix with no API or behavior changes visible to users beyond the crash being resolved.
Fixes #16045
Changes
ssrAssetsPerEnvironmentis a recently added property that's used to know what to copy over to the client folder- This iterates over them and adds them to the manifest so the Node adapter knows to serve them.
Testing
- Added a new fixture
packages/integrations/node/test/fixtures/ssr-assets-middleware/with anindex.astrothat imports a CSS file and a[...path].astrocatch-all page — the minimal setup required to reproduce the bug. - Added a regression test in
node-middleware.test.js(middleware with fastify and catch-all route: SSR assets in manifest) that builds withassetsInlineLimit: 0, starts a Fastify server, and asserts that requesting the CSS asset URL returnstext/cssrather thantext/htmlfrom the catch-all. The test fails on unfixed code and passes with the fix.
Docs
No docs update needed — this is a bug fix restoring documented behavior with no API changes.
Fixes #16039
Description
This PR reverts the revert of the usage of the fork interaction action, as HiDeoo originally implemented it. As it turns out, the official action still has quite some weird bugs (which might get fixed), but I'd say: never change a running system.
Related
Changes
Note
Summary generated via AI
Closes #16042
- When
astro devruns behind a TLS-terminating reverse proxy (Caddy, nginx, Traefik, etc.), the proxy connects to Vite over plain HTTP while the browser communicates over HTTPS. The dev server was always constructing the request URL withhttp://because it only checked whether Vite itself was configured with TLS (vite.server.https). The CSRF origin check then comparedhttp://host(server-side URL) againstOrigin: https://host(browser header) and returned 403 for every non-GET form submission. - The dev server now calls
validateForwardedHeadersto derive the protocol fromX-Forwarded-Proto, gated onsecurity.allowedDomainsbeing non-empty — the same security guard used in production (core/app/node.ts). WithoutallowedDomainsthe header is untrusted and behaviour is identical to before. security.allowedDomainsis now propagated into the dev manifest. It was previously absent, meaning the forwarded-header validation would always short-circuit even if the user had configured it.security.checkOriginis now respected in dev unconditionally. The previousbuildOutput === 'server'gate suppressed CSRF protection in dev regardless of the user's config.getFirstForwardedValue(previously an inline closure innode.ts) is extracted and exported fromvalidate-headers.ts, the natural home for forwarded-header utilities, and reused in bothnode.tsand the dev server.
Testing
- 15 new unit tests in
test/units/app/dev-url-construction.test.jscover the URL construction logic in isolation: noallowedDomains(header ignored), matchingallowedDomains(header trusted), wildcard hostname patterns, multi-value comma-separated headers, malicious injection attempts (javascript:, URL-injection),isHttpsfallback, and the end-to-end CSRF implication (constructedurl.originmatches the browserOriginheader iff and only ifallowedDomainsis configured). - All 62 existing
node.test.jstests and 35csrf.test.jstests continue to pass with no changes.
Docs
N/A
Description
This PR fixes the configuration for our first-time contributor workflow.
This broke after #3769
(Note that it still fails on this PR because it runs on pull_request_target so the version on main is still being used.)
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@astrojs/starlight@0.38.3
Patch Changes
- #3770
6e7bed1Thanks @gameroman! - Adds examples to the inline documentation fortitlein the Starlight configuration object
Changes
Fixes #16028.
- Fixes unnecessary prerendering of redirect destinations
- Unnecessary files are no longer generated by static builds for redirected routes.
- Requests are no longer made at build time to external redirect destination URLs, which could cause builds to fail.
Testing
Two tests were added to the Cloudflare package: one for an internal redirect, and one for an external redirect. Both do a test build and check that the _redirects file is properly generated and that no unnecessary requests or files were made.
Docs
No documentation changes needed, as these fixes should not affect user behavior.
Summary
- switch Vitest config references to
vitest/configso the Vite 8/Vitest 4 examples and fixture type-check again - route Astro's SSR-only full reloads through the client hot environment and let headless Chrome settle before HMR assertions
- relax the Markdoc propagated-assets assertion to match minified Vite 8 CSS output
Validation
cd packages/astro && CI=1 bunx nve 22 pnpm exec playwright test e2e/astro-component.test.js e2e/hmr.test.js --project="Chrome Stable" --workers=1 --retries=0cd packages/integrations/markdoc && bunx nve 24.14.0 pnpm run test
Notes
- I couldn't fully rerun
test:check-exampleslocally because this checkout's linked@astrojs/checkworkspace package is missing its language-tools build output, but the original CI failure there was the Vitest config typing error fixed in this patch.
Changes
- Unpin
fast-xml-parserfrom exact5.4.1to^5.5.7
The pin was introduced in #15830 because v5.5.0 shipped with a broken dependency declaration ("fast-xml-builder": "file:../../fxp-builder"). The upstream issue (NaturalIntelligence/fast-xml-parser#799) is now closed and resolved.
The pinned v5.4.1 has open CVEs related to entity expansion limits (XXE prevention), which are fixed in v5.5.7+:
- CVE-2025-27098 — Prototype pollution via attribute parsing
- CVE-2025-27439 — Entity expansion (billion laughs) attack
No breaking API changes exist between 5.4.1 and 5.5.7. The options used by @astrojs/rss (ignoreAttributes, suppressEmptyNode, suppressBooleanAttributes) are unchanged. The fast-xml-builder transitive dependency moved from 1.0.0 to ^1.1.4 (same major version).
Testing
- All 21 existing
@astrojs/rsstests pass with no changes needed - Tests cover the full API surface: basic items, content encoding, custom data, stylesheets, self-closing tags, enclosures, sources, categories, and trailing slashes
Docs
No user-facing behavior changes — this is a transparent dependency update.
Changes
Resolves #16032.
- Adds
imageas a valid ARIA role.
Testing
Locally, by setting role="image" on an element and observing it not get flagged by the audit.
Docs
No documentation update needed.
Changes
- Add
verifyOptionsto catch invalid image configurations during the static build process. - Added a regression test with a static build fixture to ensure the build properly fails when dimensions are missing.
issue : #15793
Testing
Test result in local before implementation :
Test result in local after implementation :
Docs
Changes
https://developer.mozilla.org/en-US/docs/Web/API/PopStateEvent/hasUAVisualTransition
- Skip
document.startViewTransition()whenPopStateEvent.hasUAVisualTransitionistrue - Fixes #16024
Note
On iOS, repeated testing may reveal a remaining minor flicker caused by a separate issue. However, this PR eliminates the double-animation flicker by properly supporting the hasUAVisualTransition API.
Testing
Manually tested on macOS Safari and iOS Safari:
- Navigate between pages using
<ClientRouter /> - Swipe back/forward with gesture
- Confirm no flicker occurs
iOS.26.fixed.mov
macOS.26.fixed.mov
Docs
No docs needed. This is a bug fix with no API changes.
Description
In #1139 we decided to use a fork of actions/first-interaction because the Node version was outdated and the fork has more robust features in general (read the detailed benefits in HiDeoo's list in the PR).
Since then, the original action has been updated quite well, and seems to be maintained actively again, whereas now the fork has not been updated for about a year. I have not done a comparison performance- or feature-wise in depth. But I recommend using the original and actively maintained action.
Therefore, I reverted the commit and also removed the checkout step, as it is actually not necessary.
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.0
Minor Changes
-
#15804
a5e7232Thanks @merlinnot! - Allows setting codec-specific defaults for Astro's built-in Sharp image service viaimage.service.config.You can now configure encoder-level options such as
jpeg.mozjpeg,webp.effort,webp.alphaQuality,avif.effort,avif.chromaSubsampling, andpng.compressionLevelwhen usingastro/assets/services/sharpfor compile-time image generation.These settings apply as defaults for the built-in Sharp pipeline, while per-image
qualitystill takes precedence when set on<Image />,<Picture />, orgetImage(). -
#15455
babf57fThanks @AhmadYasser1! - AddsfallbackRoutesto theIntegrationResolvedRoutetype, exposing i18n fallback routes to integrations via theastro:routes:resolvedhook for projects usingfallbackType: 'rewrite'.This allows integrations such as the sitemap integration to properly include generated fallback routes in their output.
{ 'astro:routes:resolved': ({ routes }) => { for (const route of routes) { for (const fallback of route.fallbackRoutes) { console.log(fallback.pathname) // e.g. /fr/about/ } } } }
-
#15340
10a1a5aThanks @trueberryless! - Adds support for advanced configuration of SmartyPants in Markdown.You can now pass an options object to
markdown.smartypantsin your Astro configuration to fine-tune how punctuation, dashes, and quotes are transformed.This is helpful for projects that require specific typographic standards, such as "oldschool" dash handling or localized quotation marks.
// astro.config.mjs export default defineConfig({ markdown: { smartypants: { backticks: 'all', dashes: 'oldschool', ellipses: 'unspaced', openingQuotes: { double: '«', single: '‹' }, closingQuotes: { double: '»', single: '›' }, quotes: false, }, }, });
See the
retext-smartypantsoptions for more information.
Patch Changes
-
#16025
a09f319Thanks @koji-1009! - Instructs the client router to skip view transition animations when the browser is already providing its own visual transition, such as a swipe gesture. -
#16055
ccecb8fThanks @Gautam-Bharadwaj! - Fixes an issue whereclient:onlycomponents could have duplicateclient:component-pathattributes added in MDX in rare cases -
#16081
44fc340Thanks @crazylogic03! - Fixes theemitFile() is not supported in serve modewarning that appears duringastro devwhen using integrations that inject before-hydration scripts (e.g.@astrojs/react) -
#16068
31d733bThanks @Karthikeya1500! - Fixes the dev toolbar a11y audit incorrectly classifyingmenuitemradioas a non-interactive ARIA role. -
#16080
e80ac73Thanks @ematipico! - Fixesexperimental.queuedRenderingincorrectly escaping the HTML output of.htmlpage files, causing the page content to render as plain text instead of HTML in the browser. -
#16048
13b9d56Thanks @matthewp! - Fixes a dev server crash (serverIslandNameMap.get is not a function) that occurred when navigating to a page withserver:deferafter first visiting a page without one, when using@astrojs/cloudflare -
#16093
336e086Thanks @Snugug! - Fixes Zod meta not correctly being rendered on top-level schema when converted into JSON Schema -
#16043
d402485Thanks @ematipico! - FixescheckOriginCSRF protection inastro devbehind a TLS-terminating reverse proxy. The dev server now readsX-Forwarded-Proto(gated onsecurity.allowedDomains, matching production behaviour) so the constructed request origin matches thehttps://origin the browser sends. Also ensuressecurity.allowedDomainsandsecurity.checkOriginare respected in dev. -
#16064
ba58e0dThanks @ematipico! - Updates the dependencysvgoto the latest, to fix a security issue. -
#16007
2dcd8d5Thanks @florian-lefebvre! - Fixes a case where fonts files would unecessarily be copied several times during the build -
#16017
b089b90Thanks @felmonon! - Fix theastro syncerror message whengetImage()is called while loading content collections. -
#16014
fa73fbbThanks @matthewp! - Fixes a build error where usingastro:config/clientinside a<script>tag would cause Rollup to fail with "failed to resolve importvirtual:astro:routesfromvirtual:astro:manifest" -
#16054
f74465aThanks @seroperson! - Fixes an issue with the development server, where changes to the middleware weren't picked, and it required a full restart of the server. -
#16033
198d31bThanks @adampage! - Fixes a bug where the the roleimagewas incorrectly reported by audit tool bar. -
#15935
278828cThanks @oliverlynch! - Fixes cached assets failing to revalidate due to redirect check mishandling Not Modified responses. -
#16075
2c1ae85Thanks @florian-lefebvre! - Fixes a case where invalid URLs would be generated in development when using font families with an obliquestyleand angles -
#16062
87fd6a4Thanks @matthewp! - Warns on dev server startup when Vite 8 is detected at the top level of the user's project, and automatically adds a"overrides": { "vite": "^7" }entry topackage.jsonwhen runningastro add cloudflare. This prevents arequire_dist is not a functioncrash caused by a Vite version split between Astro (requires Vite 7) and packages like@tailwindcss/vitethat hoist Vite 8. -
Updated dependencies [
10a1a5a]:- @astrojs/markdown-remark@7.1.0
@astrojs/preact@5.1.0
Minor Changes
-
#15862
06fba3aThanks @crutchcorn! - Adds support for passing a Babel config to the Preact Vite Plugin:// astro.config.mjs import { defineConfig } from 'astro/config'; import preact from '@astrojs/preact'; export default defineConfig({ integrations: [ preact({ babel: { generatorOpts: { importAttributesKeyword: 'with', }, }, }), ], });
@astrojs/markdown-remark@7.1.0
Minor Changes
-
#15340
10a1a5aThanks @trueberryless! - UpdatescreateMarkdownProcessorto support advanced SmartyPants options.The
smartypantsproperty inAstroMarkdownOptionsnow acceptsSmartypantsoptions, allowing fine-grained control over typography transformations (backticks, dashes, ellipses, and quotes).import { createMarkdownProcessor } from '@astrojs/markdown-remark'; const processor = await createMarkdownProcessor({ smartypants: { backticks: 'all', dashes: 'oldschool', ellipses: 'unspaced', openingQuotes: { double: '«', single: '‹' }, closingQuotes: { double: '»', single: '›' }, quotes: false, }, });
For the up-to-date supported properties, check out the
retext-smartypantsoptions.
@astrojs/rss@4.0.18
Patch Changes
@astrojs/cloudflare@13.1.4
Patch Changes
-
#16041
56d2bdeThanks @kylemclean! - Fixes unnecessary prerendering of redirect destinationsUnnecessary files are no longer generated by static builds for redirected routes.
Requests are no longer made at build time to external redirect destination URLs, which could cause builds to fail.
-
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.2
@astrojs/markdoc@1.0.3
Patch Changes
- Updated dependencies [
10a1a5a]:- @astrojs/markdown-remark@7.1.0
@astrojs/mdx@5.0.3
Patch Changes
- Updated dependencies [
10a1a5a]:- @astrojs/markdown-remark@7.1.0
@astrojs/netlify@7.0.5
Patch Changes
-
#16063
ccb6a9cThanks @matthewp! - Fixes server islands returning 404 in production when usingoutput: 'static'(the default) -
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.2
@astrojs/node@10.0.4
Patch Changes
-
#16002
846f27fThanks @buley! - Fixes file descriptor leaks from read streams that were not destroyed on client disconnect or read errors -
#15941
f41584aThanks @ematipico! - Fixes an infinite loop inresolveClientDir()when the server entry point is bundled with esbuild or similar tools. The function now throws a descriptive error instead of hanging indefinitely when the expected server directory segment is not found in the file path.
@astrojs/partytown@2.1.6
Patch Changes
- #16002
846f27fThanks @buley! - Fixes file descriptor leaks from read streams that were not destroyed on client disconnect or read errors
@astrojs/react@5.0.2
Patch Changes
-
#15378
a8a926eThanks @dmgawel! - Fix React hydration errors when using conditional slot rendering -
#15146
f771f75Thanks @kedarvartak! - Fixes hydration mismatch when usingexperimentalReactChildren -
#14917
769265bThanks @sanjaiyan-dev! - Refactors to improve the performance of rendering static HTML content in React
@astrojs/sitemap@3.7.2
Patch Changes
- #15455
babf57fThanks @AhmadYasser1! - Fixes i18n fallback pages missing from the generated sitemap when usingfallbackType: 'rewrite'.
@astrojs/svelte@8.0.4
Patch Changes
-
#15604
3e1ac66Thanks @pierreeurope! - Adds a temporary workaround for a Svelte bug causing empty class attributes in SSR output. -
#16050
89a7250Thanks @seroperson! - Using a Svelte component with generic type parameters now correctly infer props in .astro files
@astrojs/vercel@10.0.3
Patch Changes
- #16079
aa26636Thanks @empoulter-uclan! - Fix vercel ISR path rewrite
astro-vscode@2.16.14
Patch Changes
- #16069
c9a5807Thanks @Princesseuh! - Updates the minimum supported version of VS Code to 1.92.0 (July 2024)
Fixes #16012.
Summary
- align the default
LiveLoaderdata type with its existingRecord<string, any>constraint - update the related live content public types to use the same default
- add a type regression covering
defineLiveCollection()with aLiveLoaderwhose data shape is declared as an interface
Verification
pnpm run build:cipnpm exec tsc --noEmit --moduleResolution bundler --module esnext --target es2022 --types node ./test/types/define-live-collection.ts
Summary
- construct the
astro:assetssync-timegetImage()error using the publicAstroUserErrorsignature - add a CLI regression for
astro syncso the thrown content-types error stays descriptive - include a patch changeset for the
astropackage
Testing
- pnpm run build:ci
- pnpm exec astro-scripts test "test/astro-sync.test.js"
Fixes #16015
Summary
- use text content instead of innerText for dev-toolbar a11y name checks
- cover anchors inside closed
Details
so hidden-but-valid text is not flagged - reuse the same text-content check for label and aria-labelledby paths
Testing
- pnpm run build:ci
- pnpm exec playwright test e2e/dev-toolbar-audits.test.js
Fixes #16009
Changes
- Fixes a build error where importing
astro:config/clientinside a<script>tag (client environment) caused Rollup to fail withfailed to resolve import "virtual:astro:routes" from "virtual:astro:manifest". - Refactored
astro:config/clientinvirtual-module.tsto inline config values directly fromAstroSettingsat plugin creation time, instead of generating code that imports fromvirtual:astro:manifest.
Testing
- Added a regression test in
test/serializeManifest.test.jswith a new fixture (astro-manifest-client-script) that importsastro:config/clientinside a<script>tag in an SSR project (usingoutput: 'server'+ test adapter). The test asserts the build succeeds — it fails onmainwith the exact Rollup error from the issue and passes with the fix applied.
Docs
N/A, bug fix
Fixes #15991
Changes
- Fixes a permanent hang on the first HTTP request when using
@astrojs/cloudflarein dev mode. The server would start successfully but every request would time out with no response. - The root cause was in
ensureModulesLoaded()(added in #15988): it traversed intovirtual:astro:dev-css-all, which statically imports all per-routevirtual:astro:dev-css:*modules. So basically it hangs because of a circular import call. - The fix skips
virtual:astro:dev-css,virtual:astro:dev-css-all, andvirtual:astro:dev-css:*modules during the traversal. These are CSS collector virtuals that contain no CSS themselves, so skipping them has no effect on CSS injection —collectCSSWithOrder()handles that separately.
Testing
- Manually verified against a multi-route Cloudflare adapter project where the hang was reliably reproducible.
- The existing
css-dynamic-import-devtest (added in #15988) continues to cover the original fix for dynamic import CSS injection on first load.
Docs
- No docs update needed — this restores expected dev server behavior with no user-facing API changes.
Fixes #16010
Changes
- Font files would be copied several times during the build because it would run for each environment
- This PR fixes it by making sure it runs once during the build
Testing
Manually, tests should pass
Docs
Changeset
Changes
This PR attempts to start moving some build tests (SSG mainly) to be unit testable. Not all tests can be unit testable, but there are many that can be. In this PR, few i18n tests were moved as a starting point (and a fixture were removed in the process).
- The Astro build pipeline now accepts a
fsModinstance, so that we can pass a virtual file system - The build pipeline has been broken down into
generateandrenderPath.renderPathdoesn't save anything to disk. The caller is responsible for that (in our case, the generate function) - We have now a mocked
AstroPrerenderthat does the minimum: it accepts the request and attempts to render the component associated to it. - The testing suite uses the real function
createRoutesList, which crawls the file system and returns the finalRouteList
Note
In order to have a reliable mock rendering, I had to add pathname to the AstroRenderer#render function. The reason why I added it is because I didn't want to normalise it again. The build pipeline already does it, so it felt normal to use it. cc @matthewp
This is probably a minor because it adds a new option to the public interface, but it feels really low-key. Is it a patch acceptable? (I'll send a docs PR of course)
Important
I used the recent @platformatic/vfs, which was published as a shim for the upcoming node:vfs, still in draft.
The package, as for now, doesn't support accepting URL in their call sites, e.g. fs.readSync(new URL(...)) as opposed to the real Node.js fs, that's why some methods were changed. Do you guys accept the trade-off? If not, I'm happy to evaluate an in-house solution
Testing
Green CI.
To give some numbers, the previous integration test took ~1.6s, the new one takes ~400ms
Docs
Yes, for the new parameter added to the public interface
Changes
This PR moves some of the getImage assertions to be unit testable. In order to do, we create a small wrapper around our base image service, just for our tests. I had to do so because the production image service relies on import.meta.env.BASE_URL.
The only caveat of the testing image service is that it has pollute globalThis, so that we can bypass the vite virtual module.
Testing
Removed some integration tests. Added new unit tests.
Docs
N/A
Summary
Two createReadStream() file descriptor leaks found via static analysis of the control flow graph:
1. packages/integrations/partytown/src/sirv.ts:129
fs.createReadStream(file, opts).pipe(res) leaks the file descriptor when the HTTP response is closed prematurely (e.g. client disconnect, timeout). Node's .pipe() does not automatically destroy the source stream when the destination closes.
Fix: Captured the stream reference and added res.on('close', () => stream.destroy()).
2. packages/integrations/node/src/serve-app.ts:24
createReadStream(fullPath) in readErrorPageFromDisk() was never destroyed in the catch block. If the stream partially opened before the error event fired (e.g. permission change between open and error), the fd leaked across retry iterations as the loop tries the next file path pattern.
Fix: Moved stream declaration outside try so it can be destroyed in catch via stream?.destroy().
Test Plan
- Both fixes only affect cleanup paths and do not change normal control flow
- Manual: serve a large static file via partytown integration, disconnect mid-download, verify no leaked fds with
lsof -p <pid>
Changes
- Refactors head propagation runtime logic into focused units (
resolver,buffer,policy) and routes call sites through a dedicated runtime facade so registration, buffering, and instruction gating use a single orchestration path. - Extracts static-analysis decisions used by head metadata propagation into reusable domain helpers (
graphbubbling and marker detection), then updatesvite-plugin-headto use those helpers in both dev and build flows. - Centralizes propagated-asset boundary detection into a shared head-propagation unit and wires both dev crawl and build CSS graph traversal through it, so stop-boundary behavior is computed consistently.
- Replaces fixture-heavy head propagation tests with unit and app-level tests, including removal of old fixture suites and addition of focused tests that cover runtime contracts, bubbling rules, marker detection behavior, and boundary handling.
Testing
- Added a dedicated unit suite under
packages/astro/test/units/render/head-propagation/that validates resolver precedence, live propagator iteration semantics, head/maybe-head policy matrix behavior, graph bubbling, marker detection, boundary checks, and runtime adapter contracts. - Added
packages/astro/test/units/render/head-injection-app.test.jsto keep lightweight app-level coverage for key glue scenarios (page-level propagation, nested layout propagation, and slot-render buffering) without relying on full fixture pipelines. - Verified regression safety by running head-focused unit suites and content-collections test suites after rebuild; all executed suites passed.
Test Checklist
-
packages/astro/test/head-injection.test.jsMarkdown dedupe behavior is covered by policy/runtime unit tests and existing head render unit assertions. -
packages/astro/test/head-injection.test.jsslot/slots.render fixture scenarios are covered bypackages/astro/test/units/render/head-injection-app.test.jsandpackages/astro/test/units/render/head.test.js. -
packages/astro/test/units/dev/head-injection.test.jspage-scope dynamic injection is covered bypackages/astro/test/units/render/head-injection-app.test.js. -
packages/astro/test/units/dev/head-injection.test.jsnested layout dynamic injection is covered bypackages/astro/test/units/render/head-injection-app.test.js. -
packages/astro/test/content-collections-render.test.jspropagation stopping-point behavior is covered bypackages/astro/test/units/render/head-propagation/boundary.test.jsandpackages/astro/test/units/render/head-propagation/graph.test.js. -
packages/astro/test/content-collections.test.jspropagation style application is covered by runtime facade/adapter tests plus app-level head injection tests. - New domain units have direct unit coverage:
resolver,buffer,policy,graph,comment,boundary, runtime facade, and runtime adapters.
Docs
- No docs update needed, because this change is internal refactoring and test strategy migration without user-facing API or behavior changes.
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.0.8
Patch Changes
-
#15978
6d182feThanks @seroperson! - Fixes a bug where Astro Actions didn't properly support nested object properties, causing problems when users used zod functions such assuperRefineordiscriminatedUnion. -
#16011
e752170Thanks @matthewp! - Fixes a dev server hang on the first request when using the Cloudflare adapter -
#15997
1fddff7Thanks @ematipico! - FixesAstro.rewrite()failing when the target path contains duplicate slashes (e.g.//about). The duplicate slashes are now collapsed before URL parsing, preventing them from being interpreted as a protocol-relative URL.
@astrojs/cloudflare@13.1.3
Patch Changes
- Updated dependencies [
3b8d473]:- @astrojs/underscore-redirects@1.0.2
@astrojs/netlify@7.0.4
Patch Changes
- Updated dependencies [
3b8d473]:- @astrojs/underscore-redirects@1.0.2
@astrojs/underscore-redirects@1.0.2
Patch Changes
- #15979
3b8d473Thanks @alexanderniebuhr! - Fixes an issue where redirects in_redirectsfile where not correctly created with trailing slashes.
Description
This PR refactors our sidebar generation logic to avoid using structuredClone() each time a sidebar is created. Especially on large sidebars, the clone can be expensive.
#2252 added the current sidebar approach and introduced the structured clone partially to defend against user mutations in component overrides. Since then, we refactored our route data system in #2390, which introduced klona to create a clone of the entire route data object. This means it is now safe to remove the extra structuredClone() in the sidebar logic.
The new strategy tracks the sidebar entries with isCurrent manually so we can patch those in a performant way on a single persistent object without relying on the structured clone to avoid mutations.
I haven’t tested on Cloudflare’s docs (mentioned in #3760) but I tested in Starlight’s docs:
- Starlight docs: 1% performance increase (~178ms)
- Starlight docs modified to add several thousand extra sidebar entries: 6% performance increase (~2.8s)
I would assume the increase should be even more significant in the CF docs given their high page count and sidebar size. And the fix here is essentially the same as the one tested in cloudflare/cloudflare-docs#28970 — structuredClone() was removed in both — this PR just avoids introducing some unnecessary code duplication and forking of code paths.
Changes
This PR moves the tests for rewrites. From 54 integration tests, we now have only 20 tests. Many had to stay because:
- they test some particular behaviour that belongs to the server (we have middleware that normalises slashes)
- build file system
- build errors
This PR also fixes an issue with rewrites where rewriting to a //about path, would result in an error. Now we normalise the paths.
This PR also refactors the createTestApp to be less verbose
Testing
Green CI
Docs
Changes
normalizeFilenameinvite-plugin-utilsnow handles relative paths starting with.(e.g../src/components/Foo.astro). On certain environments (Windows + newer Node.js), Vite can produce a relative virtual module ID for style sub-requests when the parent component is imported via a TypeScript path alias. The previous code had no branch for this case, so the relative path was passed unchanged to the compile metadata cache lookup — which was stored with an absolute path — causing a cache miss and a build error.- The fix resolves relative paths against
config.root, consistent with how/@fsand/pathvariants are already handled.
Testing
- Added a new test fixture (
alias-path-alias-style) with a minimal Astro project: atsconfig.json@/*path alias importing an Astro component that has a scoped<style>tag. - The build test (
test/alias-path-alias-style.test.js) verifies the build succeeds and that the scoped CSS from the aliased component appears in the output — directly covering the regression path.
Docs
- No docs update needed. This is an internal path normalization fix with no user-facing API change.
Fixes #15963
Changes
- In v6,
runHookBuildSetupwas called once withtarget: 'server', causing integrations that conditionally setdefineglobals based onvite.build.ssr(e.g.@analogjs/astro-angularsettingngServerMode: "true") to place those values at the top level of the Vite config. Because Vite merges the top-leveldefineinto every environment's resolved config, server-only values leaked into the client bundle and broke hydration. - The fix calls
runHookBuildSetupfor both'server'and'client'targets. The client call receivesbuild.ssr: falseso integrations that inspect this flag behave correctly. Server-only defines (present in the server result but absent from the client result) are moved out of the top level and pushed into thessrandprerenderenvironment configs. The client environment is also explicitly markedssr: false.
Testing
- Added a unit test that simulates an integration which sets a define only when
build.ssris truthy. Asserts the define is present for the server hook call and absent for the client hook call withssr: false. - All existing build unit tests pass.
Docs
No docs update needed — this is a bug fix restoring v5 build isolation behavior.
Fixes #15911
Changes
Closes #12385
In this case, the value of the locale isn't stored in the URL, but in the Astro.params because the value is provided via /[locale].
The fix: if computeCurrentLocale returns undefined and we have 1 or more params, then we match the locale against the value of the params.
Closes #15098
Here, the bug was caused by the fact that when we return /404, the route /[locale] was matching it before 404 route, causing returning a response with 404 status code, but the body of the /[locale] route.
The fix: in rewrite AND renderError, when matching the route, we give priority to 404 and 500 routes. This should be safe.
This PR also moves many other tests around i18n to unit tests. It increases the coverage of some internal functions, and it also adds testing for i18n domains, something we lacked until now!
Testing
Green CI
Docs
N/A
Changes
- Styles from components loaded via
await import()in frontmatter are now injected on the first page request in dev mode. Previously they only appeared after a file save triggered HMR — a regression from Astro 5. - The root cause was in
collectCSSWithOrder(): dynamically imported modules are registered in the Vite module graph by Vite's import analysis but not yet transformed, so theirimportedModulesset is empty and the CSS walk terminates early. AddedensureModulesLoaded()which recursively walks the graph and eagerly fetches any untransformed modules viaenv.fetchModule()before the CSS collection walk runs. ensureModulesLoaded()mirrors the samePROPAGATED_ASSET_QUERY_PARAMstopping point used bycollectCSSWithOrder(), so it won't descend into propagated asset modules that the CSS walk would intentionally skip — avoiding unnecessary fetches in content collection graphs.
Testing
- Added a dev mode integration test (
test/css-dynamic-import-dev.test.js) with a fixture whose index page dynamically imports a layout component containing a<style>block. The test starts a dev server, fetches/on first load, and asserts the style is present in the HTML — directly covering the reported regression. - Existing
css-order-importtests (including the dynamic import build scenario) continue to pass.
Docs
- No docs update needed — dynamic imports in frontmatter were already a supported pattern; this restores the expected behavior.
Fixes #15983
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.0.7
Patch Changes
-
#15950
acce5e8Thanks @matthewp! - Fixes a build regression in projects with multiple frontend integrations whereserver:deferserver islands could fail at runtime when all pages are prerendered. -
#15988
c93b4a0Thanks @ossaidqadri! - Fix styles from dynamically imported components not being injected on first dev server load. -
#15968
3e7a9d5Thanks @chasemccoy! - FixesrenderMarkdownin custom content loaders not resolving images in markdown content. Images referenced in markdown processed byrenderMarkdownare now correctly optimized, matching the behavior of the built-inglob()loader. -
#15990
1e6017fThanks @ematipico! - Fixes an issue whereAstro.currentLocalewould always be the default locale instead of the actual one when using a dynamic route like[locale].astroor[locale]/index.astro. It now resolves to the correct locale from the URL. -
#15990
1e6017fThanks @ematipico! - Fixes an issue where visiting an invalid locale URL (e.g./asdf/) would show the content of a dynamic[locale]page with a 404 status code, instead of showing your custom 404 page. Now, the correct 404 page is rendered when the locale in the URL doesn't match any configured locale. -
#15960
1d84020Thanks @matthewp! - Fixes Cloudflare dev server islands withprerenderEnvironment: 'node'by sharing the serialized manifest encryption key across dev environments and routing server island requests through the SSR runtime. -
#15735
9685e2dThanks @fa-sharp! - Fixes an EventEmitter memory leak when serving static pages from Node.js middleware.When using the middleware handler, requests that were being passed on to Express / Fastify (e.g. static files / pre-rendered pages / etc.) weren't cleaning up socket listeners before calling
next(), causing a memory leak warning. This fix makes sure to run the cleanup before callingnext().
create-astro@5.0.3
Patch Changes
- #15967
8db1f62Thanks @matthewp! - Warn when--yesis used with a third-party template to clarify that dependency installation may run lifecycle scripts.
@astrojs/node@10.0.3
Patch Changes
-
#15735
9685e2dThanks @fa-sharp! - Fixes an EventEmitter memory leak when serving static pages from Node.js middleware.When using the middleware handler, requests that were being passed on to Express / Fastify (e.g. static files / pre-rendered pages / etc.) weren't cleaning up socket listeners before calling
next(), causing a memory leak warning. This fix makes sure to run the cleanup before callingnext().
@astrojs/svelte@8.0.3
Patch Changes
- #15961
7e8d0eeThanks @matthewp! - Fix Cloudflare dev SSR dependency optimization to compile.svelte.jsand.svelte.tsdependency modules that use Svelte runes.
@astrojs/vercel@10.0.2
Patch Changes
Changes
This PR removes many integration tests from:
- actions
- params
- CSRF
- class list
### Actions
There are still some tests that need the full pipeline e.g. errors, but many of them have been moved to unit tests using new mock infrastructure.
Additionally, we have now unit tests for the proxy, serialization/deserialisation, etc.
Params
The only integration tests left are the ones that use the build -> static files.
CSRF
Fully moved to unit tests, since it's a middleware
Class list
Fully moved to unit tests. We just need some compiled components, no need for a full pipeline.
Mocks
We have many mocking functions now, which will help to with other tests.
Testing
Green CI
Docs
Description
Fixes issue #15976 - Content collection validation errors in v6 are no longer human-readable.
Changes
Previously, validation errors showed raw zod error output like:
**: [{"expected": "object", "code": "invalid_type", "path": ["label"], "message": "label: Required"}]
Now they show human-readable format:
- label: Required
The fix formats error.issues to show each validation issue with its path and message.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@astrojs/starlight@0.38.2
Patch Changes
-
#3759
f24ce99Thanks @MilesChou! - Fixes an issue where monolingual sites using a region-specific locale (e.g.,zh-TW) as the default would incorrectly display base language translations (e.g.,zhSimplified Chinese) instead of the region-specific ones (e.g.,zh-TWTraditional Chinese). -
#3768
a4c6c20Thanks @delucis! - Improves performance of sidebar generation for sites with very large sidebars
Fixes #15976
Since the Zod v3 → v4 migration (#14956), $ZodError.message returns a JSON-stringified array instead of a human-readable string. The three content error definitions in errors-data.ts used error.message directly, producing output like:
**: [
{
"expected": "object",
"code": "invalid_type",
...
}
]
This iterates over error.issues instead, producing:
**label**: Required
This matches the pattern already used in content/loaders/errors.ts and content/utils.ts.
When a component with a script was first used inside a <template>, Astro's deduplication prevented the script from rendering outside the template, breaking non-template instances. This PR makes such scripts are not deduplicated. Should be merged after withastro/compiler#1156.
Changes
- Adds
templateEnter/templateExitfunctions to be inlined by compiler inside of<template>tags. These functions add instructions that track<template>nesting depth during rendering. stringifyChunkskips dedup for scripts whentemplateDepth > 0. The script still renders inside the template but is also rendered outside for non-template instances.
Testing
Added astro-script-template-dedup integration test with four cases:
- Component used inside
<template>first, then outside: verifies script appears in both places - Component used outside first, then inside: verifies normal dedup still works
- Two components outside, then inside: verifies normal dedup still works x2
- Nested
<template>elements: verifies depth tracking handles nesting
Docs
Docs aren't required as it's a bugfix.
Changes
- makes sure that trailing slashes are preserved if users configured redirects with them in their config
- closes #13165
Testing
- existing tests
- should we make the tests for advanced, currently they only test if the length is equal?
- how should we make the test, snapshot match?
Docs
- internal, so I don't think needed
Closes #14387
Changes
- Added support for nested objects with dot notation in form data parsing
formDataToObjectnow recursively processes nestedZodObjectschemas, converting dot-notation form keys (likebc.b) into nested object structures ({ bc: { b: ... } })
Testing
- Covering most of cases I could imagine in
form-data-to-object.test.js: nested objects,superRefinewrapping, deeper 3-level nesting,optional/nullable/defaultnested objects, nesteddiscriminatedUnion - Several new integration tests in
actions.test.js: nested form objects,superRefinevalidation, nesteddiscriminatedUnion
Docs
No new API was introduced, so likely no docs changes are required
/cc @withastro/maintainers-docs
Summary
This fixes a bug where SSR catch-all routes in dev would try to handle Vite’s own internal dev/HMR URLs.
- Update
astroDevHandlerto use the same Vite internal path filter asastroDevPrerenderHandler - Skip requests for
/@*,/__*, and/node_modules/in the dev SSR middleware so they fall through to Vite - Add a focused unit test to lock in the behavior for a representative Vite internal path
Motivation
When running with an SSR catch-all like [...slug].astro, Vite internal URLs (for example the dev toolbar entrypoint) could be picked up by the SSR handler. That meant dev-only paths could render the catch-all page instead of being handled by Vite, which is surprising and can break tooling.
Aligning the dev SSR handler with the prerender handler keeps Vite internals out of user routes and matches the existing intent of the middleware.
Testing
-
pnpm -C packages/astro exec astro-scripts test "test/units/dev/dev.test.js" -m "Vite internal paths" - (Optional) Manually verify that visiting a Vite internal URL in dev no longer hits the catch-all route
Summary
renderMarkdown from LoaderContext returns image paths as metadata.localImagePaths and metadata.remoteImagePaths (separate arrays), but the runtime's renderEntry function checks for a combined metadata.imagePaths to decide whether to resolve __ASTRO_IMAGE_ placeholders into optimized <img> tags.
Because imagePaths is never set by renderMarkdown, images in custom loaders that use it are never resolved — the __ASTRO_IMAGE_ attributes remain in the final HTML.
The built-in glob() loader avoids this because it uses entryType.getRenderFunction(config), which explicitly combines the two arrays:
return {
html: result.code,
metadata: {
...result.metadata,
imagePaths: result.metadata.localImagePaths.concat(result.metadata.remoteImagePaths),
},
};This PR applies the same combination in #processMarkdown (which backs the renderMarkdown context helper), so custom loaders get the same image optimization behavior as the built-in glob() loader.
Changes
packages/astro/src/content/content-layer.ts: In#processMarkdown, spreadmetadataand add a combinedimagePathsfield fromlocalImagePaths+remoteImagePaths.
Notes
Custom loaders also need to pass assetImports to store.set() for the images to be registered with Vite's asset pipeline. This is required alongside the imagePaths metadata fix. It may be worth documenting this in the Content Loader API reference, or having store.set() automatically extract imagePaths from rendered.metadata when assetImports isn't explicitly provided.
Test plan
- Create a custom object loader that uses
renderMarkdownwith markdown containing relative image paths - Verify images render correctly (no
__ASTRO_IMAGE_placeholders in output) - Verify existing
glob()loader behavior is unchanged
Made with Cursor
Changes
- Add a warning when
--yesis used with a third-party template, clarifying that dependency installation may run lifecycle scripts. - Keep behavior unchanged for interactive installs and non-third-party templates.
- Closes #15939.
Testing
- Test added
Docs
- No docs update needed. This is CLI warning text for an existing workflow.
Changes
- Remove pull request-writing guidance from
astro-developerso it stays focused on coding architecture, debugging, constraints, and testing context. - Add a dedicated
astro-pr-writerskill with explicit trigger language for PR tasks (create/open PR, draft PR, update PR title/body, and PR summaries), plus clear title/body quality rules. - Move PR-writing standards into the new skill so PR behavior is isolated and easier to trigger reliably.
Testing
- Manually, used to create this pull request.
Docs
- No external docs update needed; this change only reorganizes internal agent skill behavior and prompt-triggering guidance.
Changes
- Resolve #... specifiers in the client
resolvePathis called for client hydration paths, uses the importer to resolve # to that package import.- Fixes #15922
Testing
- Add a Cloudflare fixture that imports a React island through package imports (#components/*) to verify
Docs
- No docs update needed; this is an internal resolver/hydration compatibility fix for Cloudflare adapter behavior.
Changes
- Add server optimizeDeps esbuild plugins in
@astrojs/svelteto compile.svelteand.svelte.js/.svelte.tsdependency files for non-client environments. - This is necesary since in CF deps need to be prebundled.
- Add a Cloudflare test fixture that imports a dependency published as
.svelte.jsusing$staterunes. - Fixes #15906.
Testing
- Added
packages/integrations/cloudflare/test/svelte-rune-deps.test.js.
Docs
N/A bug fix
Summary
- Share the serialized manifest encryption key across dev environments so prerender and SSR handlers use the same server-island encryption context.
- This fixes #15946
- aka, so now the islands run in both prerendered and ssred pages.
Testing
- Added test to verify that prerendered pages' server islands are built with workerd features.
Changes
- Require the middleware secret when resolving serverless path overrides.
- Remove unused ISR secret plumbing from the Vercel serverless entrypoint.
- Add regression tests to ensure untrusted override query/header values are ignored.
Testing
- New tests added
Docs
- No docs update needed; this is an internal Vercel adapter bug fix.
Just updating the readme for the Cloudflare adapter which now targets Cloudflare Workers instead of Pages functions
Changes
- Some logic was working but not tested so I added a test case
- The diff is messed up, easier to review without whitespace changes
Testing
Updated, should pass
Docs
N/A
Changes
- When a style-only change triggers HMR, eagerly recompile the Astro file instead of deleting its compile metadata
- Previously, deleting the metadata caused the next SSR request (page refresh) to re-compile via Vite's plugin pipeline, which returned stale/transformed code — breaking
Astro.slots.render()with callback args - Components using
Astro.slots.render("default", [...args])now render correctly after style edits + page refresh
Fixes #15925
Testing
- Added
hmr-slots-render.test.jswith a fixture that reproduces the exact scenario: a component usingAstro.slots.renderwith callback args, style-only edits, and page refresh - Verifies rendered output contains no raw HTML source (
data-astro-cid) after multiple style changes
Docs
No docs needed — this is a bug fix for existing behavior.
Changes
- Fixes a regression where prerender-only projects using
server:deferwith framework components could fail at runtime due to SSR renderers being stripped. - Refactors server-island tracking into a shared
ServerIslandsStateclass used by both server-islands and renderer plugins. - Fixes #15945
Testing
- Test in cloudflare
- Added unit tests for discovery deduplication, name collision handling, and import/name map generation in
ServerIslandsState.
Docs
- No docs update needed. This is an internal bug fix/refactor with no API or config changes.
Changes
Fixes #15914: public assets in astro dev are now served under the configured base path when using the @astrojs/cloudflare adapter.
Problem
With base: "/docs/" and the Cloudflare adapter enabled:
- The page correctly renders URLs like
/docs/test.svg. GET /docs/test.svgreturns 404.GET /test.svgreturns 200.
Without the adapter, /docs/test.svg works as expected. The bug is adapter-specific.
Root cause
Astro’s dev server uses custom middleware (baseMiddleware, etc.) to strip the base prefix from requests before Vite’s static middleware serves files from public/. That middleware is only registered when at least one runnable SSR/prerender environment exists.
With @astrojs/cloudflare, the SSR environment is a workerd-backed CloudflareDevEnvironment, which is not “runnable” in Node. So configureServer returned early and never registered the middleware stack. As a result, requests like /docs/test.svg reached Vite with the base prefix intact, and Vite looked for public/docs/test.svg → 404.
Solution
- Always return the post-hook from
configureServerand always register the core dev middleware (baseMiddleware,trailingSlashMiddleware,routeGuardMiddleware,secFetchMiddleware), regardless of whether the SSR/prerender environments are runnable. - SSR/prerender request handlers remain conditional on
ssrHandler/prerenderHandler, so Cloudflare’s workerd still handles those requests; only the base-path and security middleware are now applied in all cases. - The
unhandledRejectionlistener is only registered when at least one runnable handler exists, to avoid attaching it when no handlers are present.
Testing
- Reproduced the issue with the minimal repro from #15914 (Cloudflare adapter +
base: "/docs/"). - After the fix,
GET /docs/test.svgreturns 200 whenpublic/test.svgexists. - Verified
astro devwithout the Cloudflare adapter still behaves as before.
Changes
- Improved tolerance for dynamic
.htmlroutes: Updated the routing logic to support.html.astrofiles. - Defined routing priority:
index.html>[hogehoge].html.astro. - issue : #15930
Test

Changes
Update VS Code extension file template snippets to be scoped to astro files.
Without this change, VS Code will recommend the astro file templates inside the svelte (or any) file.
Info about file pattern scope
VS Code added file pattern scope to their snippets engine in v1.109. (latest is v1.111). File templates can be glob scoped to their correct file type for better UX/DX.
This change won't affect VS Code forks like Kiro, Cursor, or Antigravity or VS Code versions older than v1.109 until they update to v1.109+.
Testing
I tested the change locally in the dev environment. I couldn't get the automated test runner to work on my MacBook, and it doesn't look like there are automated tests that need updated.
Docs
Added bullet point readme item for snippets and file templates. File templates are provided by the edited .code-snippets file and snippets from language server installed with the extension
Changes
Closes #15709
The function didn't have a guard against infinite loops.
Now it does, and it returns an error message.
Testing
Added a unit test
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.0.6
Patch Changes
-
#15965
2dca307Thanks @matthewp! - Fixes client hydration for components imported through Node.js subpath imports (package.json#imports, e.g.#components/*), for example when using the Cloudflare adapter in development. -
#15770
6102ca2Thanks @jpc-ae! - Updates thecreate astrowelcome message to highlight the graceful dev/preview server quit command rather than the kill process shortcut -
#15953
7eddf22Thanks @Desel72! - fix(hmr): eagerly recompile on style-only change to prevent stale slots render -
#15916
5201ed4Thanks @trueberryless! - FixesInferLoaderSchematype inference for content collections defined with a loader that includes aschema -
#15864
d3c7de9Thanks @florian-lefebvre! - Removes temporary support for Node >=20.19.1 because Stackblitz now uses Node 22 by default -
#15944
a5e1acdThanks @fkatsuhiro! - Fixes SSR dynamic routes with.htmlextension (e.g.[slug].html.astro) not working -
#15937
d236245Thanks @ematipico! - Fixes an issue where HMR didn't correctly work on Windows when adding/changing/deleting routes inpages/. -
#15931
98dfb61Thanks @Strernd! - Fix skew protection query params not being applied to island hydrationcomponent-urlandrenderer-url, and ensure query params are appended safely for asset URLs with existing search/hash parts. -
Updated dependencies []:
- @astrojs/markdown-remark@7.0.1
@astrojs/prism@4.0.1
Patch Changes
- #15864
d3c7de9Thanks @florian-lefebvre! - Removes temporary support for Node >=20.19.1 because Stackblitz now uses Node 22 by default
create-astro@5.0.2
Patch Changes
- #15864
d3c7de9Thanks @florian-lefebvre! - Removes temporary support for Node >=20.19.1 because Stackblitz now uses Node 22 by default
@astrojs/db@0.20.1
Patch Changes
- #15364
948b693Thanks @VagnoDev! - Replace deprecated deep-diff with microdiff and resolve subdependency warnings.
@astrojs/markdoc@1.0.2
Patch Changes
-
#15864
d3c7de9Thanks @florian-lefebvre! - Removes temporary support for Node >=20.19.1 because Stackblitz now uses Node 22 by default -
Updated dependencies [
d3c7de9]:- @astrojs/prism@4.0.1
- @astrojs/markdown-remark@7.0.1
@astrojs/mdx@5.0.2
Patch Changes
-
#15864
d3c7de9Thanks @florian-lefebvre! - Removes temporary support for Node >=20.19.1 because Stackblitz now uses Node 22 by default -
Updated dependencies []:
- @astrojs/markdown-remark@7.0.1
@astrojs/preact@5.0.2
Patch Changes
- #15864
d3c7de9Thanks @florian-lefebvre! - Removes temporary support for Node >=20.19.1 because Stackblitz now uses Node 22 by default
@astrojs/react@5.0.1
Patch Changes
- #15864
d3c7de9Thanks @florian-lefebvre! - Removes temporary support for Node >=20.19.1 because Stackblitz now uses Node 22 by default
@astrojs/solid-js@6.0.1
Patch Changes
- #15864
d3c7de9Thanks @florian-lefebvre! - Removes temporary support for Node >=20.19.1 because Stackblitz now uses Node 22 by default
@astrojs/svelte@8.0.2
Patch Changes
- #15864
d3c7de9Thanks @florian-lefebvre! - Removes temporary support for Node >=20.19.1 because Stackblitz now uses Node 22 by default
@astrojs/language-server@2.16.6
Patch Changes
- #15927
421e8deThanks @FelmonFekadu! - Fixes completions sometimes not working inside thehrefattribute
astro-vscode@2.16.13
Patch Changes
-
#15943
1a627e2Thanks @alexanderdombroski! - Improves astro file templates to be scoped to.astrofile extensions -
#15927
421e8deThanks @FelmonFekadu! - Fixes completions sometimes not working inside thehrefattribute -
#15602
7832dfeThanks @0xRozier! - Fix syntax highlighting for script and style tags inside expressions (e.g. ternaries and logical operators)
@astrojs/markdown-remark@7.0.1
Patch Changes
- Updated dependencies [
d3c7de9]:- @astrojs/prism@4.0.1
@astrojs/upgrade@0.7.1
Patch Changes
- #15864
d3c7de9Thanks @florian-lefebvre! - Removes temporary support for Node >=20.19.1 because Stackblitz now uses Node 22 by default
Changes
Closes #15909
In HMR, when checking if we need to reload the manifest, we now normalise paths.
Using Node.js and vite is safe, we're inside a vite plugin.
Testing
I don't have windows and we skip these tests on windows. Will probably use a preview release.
Docs
N/A
Summary
- Fix default locale
buildResourcesusingstripLangRegionresult as a separate layer that overwrites region-specific translations - For example, a monolingual site with
lang: 'zh-TW'gets Simplified Chinese (zh) UI strings instead of Traditional Chinese (zh-TW)
Root Cause
In createTranslationSystem.ts, the default locale translation loading passes both builtinTranslations[defaultLocale] and builtinTranslations[stripLangRegion(defaultLocale)] as separate arguments to buildResources. Since buildResources applies later layers over earlier ones, zh (Simplified Chinese) overwrites zh-TW (Traditional Chinese).
The locales loop (line 37) correctly uses || as a fallback, but the default locale path (line 25-26) does not.
Fix
Align the default locale behavior with the locales loop by using || so the stripLangRegion result is only used as a fallback when the specific locale has no built-in translations:
- builtinTranslations[defaultLocale],
- builtinTranslations[stripLangRegion(defaultLocale)],
+ builtinTranslations[defaultLocale] || builtinTranslations[stripLangRegion(defaultLocale)],Test plan
- Added test case for
zh-TWmonolingual site verifyingsearch.labelreturns搜尋(Traditional Chinese) instead of搜索(Simplified Chinese) - All existing i18n tests pass
Reproduction
// astro.config.mjs
starlight({
locales: {
root: {
label: '繁體中文',
lang: 'zh-TW',
},
},
})The UI strings (search, theme selector, etc.) incorrectly show Simplified Chinese instead of Traditional Chinese.
🤖 Generated with Claude Code
Changes
Fix bug #15920 introduced in 35bc814 by skipping the redirect check for Not Modified status 304
A few other small improvements
- replace double awaits with Promise.all
- explicitly return null data from
revalidateRemoteImagewhen there is no change - before this relied on the response body for unchanged assets being empty, and it was confusing. - explicitly write cache file in utf-8, as we are reading it in utf-8
- reword a few comments
Testing
I ran pnpm run test:match "assets" with 0 errors, however the full pnpm run test fails on my machine.
I don't believe there is any test coverage of the revalidation feature as it depends on remote servers, however I quickly tested the fix by loading a remote image and editing the cache file and it seems to work as expected.
Docs
No user facing changes - no docs changes required.
Changes
Updates our integrations to point to 6.0.0 as a peer dep
Testing
Green CI
Docs
Changes
Closes #15838
We now track the style tags inside the SVG elements, and we pass them to createSvgComponent.
If there are styles, we pass the propagation hint so that we can write styles in the end, and correctly generate and track CSP hashes.
Testing
Added a new test, existing tests should pass
Docs
N/A
Summary
This fixes a Vercel skew protection bug: astro-island hydration URLs were missing adapter assetQueryParams (for example ?dpl=), so island JS was not pinned to the active deployment.
Reproduction
I validated this against the reproduction project (repro-skew-protection) and Astro core changes from this branch:
VERCEL_DEPLOYMENT_ID=dpl_test123 VERCEL_SKEW_PROTECTION_ENABLED=1 npx astro buildBefore this fix, rendered islands had:
component-url="/_astro/...js"(nodpl)renderer-url="/_astro/...js"(nodpl)
With this fix, rendered islands have:
component-url="/_astro/...js?dpl=dpl_test123"renderer-url="/_astro/...js?dpl=dpl_test123"
Changes
-
packages/astro/src/core/build/plugins/plugin-manifest.ts- Serialize
entryModuleswithappendAssetQuery(...)so island URL resolution getsassetQueryParams. - Keep raw entry module values for static file tracking and page script handling to avoid double-appending.
- Serialize
-
packages/astro/src/core/render/ssr-element.ts- Make
createAssetLink()query/hash-aware:- extension detection now uses pathname without query/hash
- query params are appended safely (
?vs&, before hash)
- This preserves extension-based
assetsPrefixrouting when URLs already contain query params.
- Make
-
packages/astro/test/asset-query-params.test.js- Add island coverage asserting
component-urlandrenderer-urlinclude?dpl=test-deploy-id. - Add regression coverage for
assetsPrefixmap (js/css/fallback) +assetQueryParams, ensuring island URLs still use JS CDN prefix.
- Add island coverage asserting
Testing
pnpm -C packages/astro run build:ci
pnpm -C packages/astro exec astro-scripts test "test/asset-query-params.test.js"
pnpm -C packages/astro exec astro-scripts test "test/astro-assets-prefix-multi-cdn.test.js"All pass.
Context
This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| svelte (source) | ^5.53.8 → ^5.54.1 |
||
| yaml (source) | ^2.8.2 → ^2.8.3 |
Release Notes
Configuration
📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), 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
preactjs/preset-vite (@preact/preset-vite)
v2.10.5
What's Changed
- The
thisofconfig()isundefinedin vite 5 by @JoviDeCroock in #192 - Use
import()for zimmerframe in order to support CJS Vite configs. by @washingtonsteven in #194
New Contributors
- @washingtonsteven made their first contribution in #194
Full Changelog: preactjs/preset-vite@2.10.4...2.10.5
v2.10.4
What's Changed
- perf: avoid babel in dev by using magic string for hook names injection by @sapphi-red in #183
- Add support for vite 8 by @JoviDeCroock in #189
- Add support for oxc by @JoviDeCroock in #190
Full Changelog: preactjs/preset-vite@2.10.3...2.10.4
sveltejs/svelte (svelte)
v5.54.1
Patch Changes
-
fix: hydration comments during hmr (#17975)
-
fix: null out
effect.bindestroy_effect(#17980) -
fix: group sync statements (#17977)
-
fix: defer batch resolution until earlier intersecting batches have committed (#17162)
-
fix: properly invoke
iterator.return()during reactivity loss check (#17966) -
fix: remove trailing semicolon from {@const} tag printer (#17962)
sveltejs/language-tools (svelte2tsx)
v0.7.52
Patch Changes
- fix: use Promise for async kit handler return types (#2966)
solidjs/vite-plugin-solid (vite-plugin-solid)
v2.11.11
Patch Changes
7f39675: Add vite 8 in peer deps
vuejs/devtools (vite-plugin-vue-devtools)
v8.1.0
No significant changes
View changes on GitHub
v8.0.7
🚀 Features
- Show VNode lifecycle events as
built-in- by @skirtles-code in #1036 (35de5) - Tooltips for field values - by @skirtles-code in #1037 (27555)
🐞 Bug Fixes
- Use
displayNamefor functional components - by @skirtles-code in #1046 (20efd) - Match camelCase event declarations - by @skirtles-code in #1048 (0f7e1)
computedandinjectleak via mixins - by @skirtles-code in #1050 (ecca7)
View changes on GitHub
jpkleemans/vite-svg-loader (vite-svg-loader)
v5.1.1
- Fix: High severity vulnerability in svgo dependency (GHSA-xpqw-6gx7-v673 / CVE-2026-29074 #167
- Chore: move console.warn to debug #115
Configuration
📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), 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
- let the HTML plugin return null when completion is requested inside a brace expression so the TypeScript service can handle it
- add a regression test covering completions in HTML attribute expressions like href={some}
- add a changeset for the language server fix
Fixes #14671.
Testing
- pnpm -C packages/language-tools/language-server build
- pnpm -C packages/language-tools/language-server exec astro-scripts test test/typescript/completions.test.ts --teardown-test ./test/misc/teardown.ts --tsx true --setup ./test/setup.js
- pnpm -C packages/language-tools/language-server exec astro-scripts test test/html/completions.test.ts --teardown-test ./test/misc/teardown.ts --tsx true --setup ./test/setup.js
- pnpm -C packages/language-tools/language-server exec astro-scripts test test/{html/completions.test.ts,typescript/completions.test.ts} --teardown-test ./test/misc/teardown.ts --tsx true --setup ./test/setup.js
Changes
- Apply patch suggestion from Houston and verify that it indeed works in this minimal repro: https://github.com/trueberryless/HiDeoo-astro-6-cc-loader-schema-types-repro/tree/fix
- Closes #15905
Testing
Added a fixture with a type-check.ts and a new test file. I wasn't sure how to best test this, so feel free to make adjustments!
Docs
No. Bug fix.
This PR contains the following updates:
Release Notes
withastro/compiler (@astrojs/compiler)
v3.0.1
Patch Changes
05ef961: Fix scoped CSS nesting so descendant selectors without&inside nested rules are not incorrectly re-scoped.
withastro/compiler-rs (@astrojs/compiler-rs)
v0.1.6
Patch Changes
6e274fe: Fixes dynamic slots not being collected properly- Updated dependencies [
6e274fe]- @astrojs/compiler-binding@0.1.6
v0.1.5
Patch Changes
ddf38ff: Fixes dynamic slots not working correctly21b6cd5: Fixes CSS scoping not working correctly when using :global with pseudo elementse93a108: Fixes the compiler scoping nested selectors in certain casesc8f6dc5: Fixed an issue where define:vars scripts would not be handled correctlyc8f6dc5: Fixes an issue where set:html did not work correctly in certain cases- Updated dependencies [
ddf38ff] - Updated dependencies [
21b6cd5] - Updated dependencies [
e93a108] - Updated dependencies [
c8f6dc5] - Updated dependencies [
c8f6dc5]- @astrojs/compiler-binding@0.1.5
bombshell-dev/clack (@clack/prompts)
v1.1.0
Minor Changes
e3333fb: Replacespicocolorswith Node.js built-instyleText.
Patch Changes
c3666e2: destructlimitOptionparam for better code readability, tweak types definitionsba3df8e: Fixes withGuide support in intro, outro, and cancel messages.- Updated dependencies [
e3333fb]- @clack/core@1.1.0
preactjs/signals (@preact/signals)
v2.8.2
Patch Changes
-
#888
d3c419dThanks @JoviDeCroock! - Fix infinite recursion when tools like Storybook traverse Signal props -
Updated dependencies [
308c921]:- @preact/signals-core@1.14.0
shikijs/shiki (@shikijs/rehype)
v4.0.2
🐞 Bug Fixes
View changes on GitHub
v4.0.1
🐞 Bug Fixes
View changes on GitHub
solidjs/solid-router (@solidjs/router)
v0.16.1
Patch Changes
-
e847f96: Fix the published package contents sodistno longer includes mirroredsrc,test, or co-located spec files.Also move the data tests under
test/and align the test TypeScript config with that layout sotest:typescontinues to pass cleanly.
v0.16.0
Minor Changes
Patch Changes
tailwindlabs/tailwindcss (@tailwindcss/vite)
v4.2.2
Fixed
- Don't crash when candidates contain prototype properties like
row-constructor(#19725) - Canonicalize
calc(var(--spacing)*…)expressions into--spacing(…)(#19769) - Fix crash in canonicalization step when handling utilities containing
@propertyat-rules (e.g.shadow-sm border) (#19727) - Skip full reload for server only modules scanned by client CSS when using
@tailwindcss/vite(#19745) - Add support for Vite 8 in
@tailwindcss/vite(#19790) - Improve canonicalization for bare values exceeding default spacing scale suggestions (e.g.
w-1234 h-1234→size-1234) (#19809) - Fix canonicalization resulting in empty list (e.g.
w-5 h-5 size-5→''instead ofsize-5) (#19812)
postcss/postcss (postcss)
v8.5.8
- Fixed
Processor#version.
v8.5.7
- Improved source map annotation cleaning performance (by CodeAnt AI).
preactjs/preact (preact)
v10.29.0
Features
- Implement flushSync (#5036, thanks @JoviDeCroock)
Fixes
- Ensure we reset renderCount (#5017, thanks @JoviDeCroock)
- undefined prototype (#5041, thanks @JoviDeCroock)
Performance
- Golf down compat (#5025, thanks @JoviDeCroock)
rehype-pretty/rehype-pretty-code (rehype-pretty-code)
v0.14.3
Patch Changes
- chore: fix npm OIDC trusted publishing workflow
- docs: update docs with renamed shiki function:
getHighlighter->createHighlighter
sass/dart-sass (sass)
v1.98.0
Command-Line Interface
- Gracefully handle dependency loops in
--watchmode.
Dart API
- Add a
const Logger.defaultLoggerfield. This provides a logger that emits to
standard error or the browser console, but automatically chooses whether to
use terminal colors.
JavaScript API
-
Fix a crash when manually constructing a
SassCalculationfor'calc'with
an argument that can't be simplified. -
Properly emit deprecation warnings as text rather than
StringBufferobjects
when running in a browser. -
Emit colored warnings and other messages on the console when running in a
browser.
sveltejs/svelte (svelte)
v5.54.0
Minor Changes
- feat: allow
css,runes,customElementcompiler options to be functions (#17951)
Patch Changes
- fix: reinstate reactivity loss tracking (#17801)
v5.53.13
Patch Changes
-
fix: ensure
$inspectafter top level await doesn't break builds (#17943) -
fix: resume inert effects when they come from offscreen (#17942)
-
fix: don't eagerly access not-yet-initialized functions in template (#17938)
-
fix: discard batches made obsolete by commit (#17934)
-
fix: ensure "is standalone child" is correctly reset (#17944)
-
fix: remove nodes in boundary when work is pending and HMR is active (#17932)
v5.53.12
Patch Changes
-
fix: update
select.__valueonchange(#17745) -
chore: add
invarianthelper for debugging (#17929) -
fix: ensure deriveds values are correct across batches (#17917)
-
fix: handle async RHS in
assignment_value_stale(#17925) -
fix: avoid traversing clean roots (#17928)
v5.53.11
Patch Changes
-
fix: remove
untrackcircular dependency (#17910) -
fix: recover from errors that leave a corrupted effect tree (#17888)
-
fix: properly lazily evaluate RHS when checking for
assignment_value_stale(#17906) -
fix: resolve boundary in correct batch when hydrating (#17914)
-
chore: rebase batches after process, not during (#17900)
v5.53.10
Patch Changes
- fix: re-process batch if new root effects were scheduled (#17895)
v5.53.9
Patch Changes
- fix: better
bind:thiscleanup timing (#17885)
tinylibs/tinyclip (tinyclip)
v0.1.12
What's Changed
- feat: engine constraint by @florian-lefebvre in #22
Full Changelog: tinylibs/tinyclip@0.1.11...0.1.12
v0.1.11
What's Changed
- feat: remove browser support by @florian-lefebvre in #21
Full Changelog: tinylibs/tinyclip@0.1.10...0.1.11
v0.1.10
What's Changed
Full Changelog: tinylibs/tinyclip@0.1.9...0.1.10
v0.1.9
What's Changed
- chore: add publishing guide by @florian-lefebvre in #18
- feat: test errors (attempt 2) by @florian-lefebvre in #15
- fix: check WSL before wayland by @43081j in #19
Full Changelog: tinylibs/tinyclip@0.1.8...0.1.9
v0.1.8
What's Changed
- Revert "increase version" by @florian-lefebvre in #17
Full Changelog: tinylibs/tinyclip@0.1.7...0.1.8
tinylibs/tinyexec (tinyexec)
v1.0.4
What's Changed
New Contributors
Full Changelog: tinylibs/tinyexec@1.0.3...1.0.4
v1.0.3
What's Changed
- chore: enable dependabot, bump actions by @43081j in #60
- chore: upgrade dependencies by @43081j in #62
- chore(deps): bump actions/checkout from 5.0.0 to 5.0.1 in the github-actions group by @dependabot[bot] in #66
- chore: add licenses to distributed code temporarily by @43081j in #69
- chore(deps): bump actions/checkout from 5.0.1 to 6.0.0 in the github-actions group by @dependabot[bot] in #70
- chore(deps): bump the github-actions group with 2 updates by @dependabot[bot] in #72
- chore: bump node in CI by @43081j in #75
- chore(deps-dev): bump the development-dependencies group across 1 directory with 8 updates by @dependabot[bot] in #74
- chore(deps-dev): bump the development-dependencies group with 3 updates by @dependabot[bot] in #77
- chore(deps): bump actions/setup-node from 6.1.0 to 6.2.0 in the github-actions group by @dependabot[bot] in #76
- chore(deps): bump actions/checkout from 6.0.1 to 6.0.2 in the github-actions group by @dependabot[bot] in #79
- chore(deps-dev): bump the development-dependencies group with 6 updates by @dependabot[bot] in #80
- chore(deps-dev): bump @types/node from 25.0.10 to 25.2.0 in the development-dependencies group by @dependabot[bot] in #81
- chore(deps-dev): bump the development-dependencies group across 1 directory with 6 updates by @dependabot[bot] in #83
- chore(deps-dev): bump the development-dependencies group with 3 updates by @dependabot[bot] in #84
- chore(deps-dev): bump @types/node from 25.3.0 to 25.3.3 in the development-dependencies group by @dependabot[bot] in #85
- fix: prefer local
node_modules/.binexecutables to globally installed ones by @iiroj in #87 - chore(deps): bump actions/setup-node from 6.2.0 to 6.3.0 in the github-actions group by @dependabot[bot] in #88
- chore(deps-dev): bump the development-dependencies group with 4 updates by @dependabot[bot] in #89
New Contributors
- @dependabot[bot] made their first contribution in #66
- @iiroj made their first contribution in #87
Full Changelog: tinylibs/tinyexec@1.0.2...1.0.3
vuejs/core (vue)
v3.5.30
Bug Fixes
- compat: add
entitiesto @vue/compat deps to fix CJS edge cases (#12514) (e725a67), closes #10609 - custom-element: ensure child component styles are injected in correct order before parent styles (#13374) (1398bf8), closes #13029
- custom-element: properly locate parent when slotted in shadow dom (#12480) (f06c81a), closes #12479
- custom-element: should properly patch as props for vue custom elements (#12409) (740983e), closes #12408
- reactivity: avoid duplicate raw/proxy entries in Set.add (#14545) (d943612)
- reactivity: fix reduce on reactive arrays to preserve reactivity (#12737) (16ef165), closes #12735
- reactivity: handle
Setwith initial reactive values edge case (#12393) (5dc27ca), closes #8647 - runtime-core: warn about negative number in v-for (#12308) (9438cc5)
- ssr: prevent watch from firing after async setup await (#14547) (6cda71d), closes #14546
- types: make generics with runtime props in defineComponent work (fix #11374) (#13119) (cea3cf7), closes #13763
- types: narrow useAttrs class/style typing for TSX (#14492) (bbb8977), closes #14489
Configuration
📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), 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
- keep generated
AstroComponentsuffixes in the internal TSX output used by the language server - rewrite
.astroauto-import completion labels and resolved import edits back to the expected component name - add regression coverage for the
.astroauto-import completion path and the shared import-text rewrite helpers
Fixes #14683.
Testing
- pnpm -C packages/language-tools/language-server build
- pnpm -C packages/language-tools/ts-plugin build
- pnpm -C packages/language-tools/language-server exec astro-scripts test "test/{typescript/completions.test.ts,typescript/diagnostics.test.ts,units/utils.test.ts}" --teardown-test ./test/misc/teardown.ts --tsx true --setup ./test/setup.js
- pnpm -C packages/language-tools/language-server test (fails locally in existing
AstroCheckfixture tests because@astrojs/svelteand@astrojs/vueare not installed in this environment; the TypeScript/completion suites above pass)
Overview
Production builds don't emit the before-hydration script chunk to the client output, causing a 404 when islands attempt to load it. This breaks hydration for any integration using injectScript('before-hydration')
Changes
- Add
ASTRO_VITE_ENVIRONMENT_NAMES.clientto the environment guard inbuildStart()ofvite-plugin-scripts - Add test verifying the before-hydration chunk file exists in the build output
The before-hydration chunk is only emitted for prerender and ssr environments, but not client — which is the environment that produces browser-served JS.
This was introduced in #14306 (Vite Environment API migration), where the original !isSsrBuild condition was changed to ['prerender', 'ssr'].includes(this.environment.name) which mistakenly inverted the original intent.
Testing
Existing tests only assert the attribute is present in HTML, not that the referenced file exists in the client output.
- Confirmed all tests pass
- Added new test asserting the
before-hydration-urlresolves in the build output (this test fails without bug fix)
Docs
No docs changes needed — restores existing injectScript('before-hydration', ...) behavior.
Changes
- Closes #15900
- Zod 4’s
.toJSONSchema()method outputs a schema matching the output shape of the Zod schema by default. However, our JSON schemas should reflect the input shape as they are used on documents before they are processed. - This PR fixes our JSON schema generation use the input shape using Zod’s
iooption.
Testing
- Added a new test that failed before my change to confirm this fixes things.
- Removed
additionalProperties: falsefrom two schemas we were expecting in tests. This property is set on output schemas because the full shape is known, but for inputs it is only set when usingz.strictObject() - Other existing tests should pass.
Docs
n/a — bug fix
Changes
Closes #15897
I applied a custom resolver solely for CSS files.
Testing
Added a new test
Docs
N/A
Description
In #3644, Vitest was updated to version 4.1.0-beta.6. Now that 4.1.0 is released, this PR updates to the stable version.
The migration in #3644 was also made in the less disruptive way possible considering the amount of changes in the PR. This PR uses some of the new APIs, removes some now deprecated APIs, etc. from the version 4.0 and 4.1.
Each change are in dedicated commits, where the commit message contains a link to the relevant section of the Vitest changelog, if any.
Summary
On macOS, cp -rc uses clonefile(2) (APFS copy-on-write) which is ~3x faster than
Node.js cpSync for large directories. This PR applies that optimization to three
file copy operations in the Vercel adapter, and adds a persistent cache for the NFT
dependency trace.
Changes
APFS clone for large file copies (index.ts)
- Static output copy (
dist/client/→.vercel/output/static/): wascpSync, nowcp -rcon macOS - Server output copy (
dist/server/→.vercel/output/_functions/): same
NFT dependency cache (lib/nft.ts)
- Caches the list of
node_modules/files traced by@vercel/nft, keyed bysha256(package-lock.json) - On cache hit, skips
nodeFileTraceentirely (saves ~1-2s) - Separately caches the function's assembled
node_modules/dir using APFS CoW clone - On full cache hit: restores func
node_modules/via clone (~50ms vs ~900ms) and clonesdist/server/into the bundle
Benchmark (last9/last9.io — 273 pages, hybrid output)
| Step | Before | After |
|---|---|---|
| NFT trace (cold) | ~2s | ~2s (unchanged) |
| NFT trace (warm) | ~2s | ~0.05s (skipped) |
_functions/ file copy (warm) |
~900ms | ~50ms |
runHookBuildDone total (warm) |
~2100ms | ~870ms |
All changes fall back gracefully on non-macOS platforms or when cp is unavailable.
Non-goals
- No behavior change on Linux/Windows (falls back to existing cpSync path)
- Cache is keyed conservatively (package-lock.json hash) — any dep change invalidates it
Changes
A previous lint fix removed the main and I think it's causing the load to fail, but I could not reproduce this myself neither on macOS or on Linux, in both cases it worked just fine.
Fixes #15842
Testing
This is impossible to test in the monorepo
Docs
N/A
Changes
- Route
/_server-islands/*through the Astro core prerender dev handler by treating server island routes as prerender-handler eligible. - This prevents it from being forwarded to the workerd environment which does not have the key.
Testing
- Add a Cloudflare
prerenderEnvironment: 'node'dev regression test that reproduces and verifiesserver:deferisland fetches return200.
Docs
- No docs changes needed. This is a dev routing bug fix and test coverage update.
Changes
- move Astro Actions server-output validation from
astro:config:donetoastro:routes:resolvedso it runs after prerender resolution - add a shared routing helper to detect non-prerendered project routes and reuse it in the renderers plugin
Testing
- add a regression fixture/test for static projects with a
prerender = falseroute, and include a patch changeset
Docs
N/A, bug fix
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
astro@6.0.5
Patch Changes
-
#15891
b889231Thanks @matthewp! - Fix dev routing forserver:deferislands when adapters opt into handling prerendered routes in Astro core. Server island requests are now treated as prerender-handler eligible so prerendered pages usingprerenderEnvironment: 'node'can load island content without400errors. -
#15890
765a887Thanks @matthewp! - Fixesastro:actionsvalidation to check resolved routes, so projects using default static output with at least oneprerender = falsepage or endpoint no longer fail during startup. -
#15884
dcd2c8eThanks @matthewp! - Avoid aMaxListenersExceededWarningduringastro devstartup by increasing the shared Vite watcher listener limit when attaching content server listeners. -
#15904
23d5244Thanks @jlukic! - Emit thebefore-hydrationscript chunk for theclientVite environment. The chunk was only emitted forprerenderandssrenvironments, causing a 404 when browsers tried to load it. This broke hydration for any integration usinginjectScript('before-hydration', ...), including Lit SSR. -
#15933
325901eThanks @ematipico! - Fixes an issue where<style>tags inside SVG components weren't correctly tracked when enabling CSP. -
#15875
c43ef8aThanks @matthewp! - Ensure custom prerenderers are always torn down during build, even whengetStaticPaths()throws. -
#15887
1861fedThanks @ematipico! - Fixes an issue where the build incorrectly leaked server entrypoint into the client environment, causing adapters to emit warnings during the build. -
#15888
925252eThanks @matthewp! - Fix a bug whereserver:defercould fail at runtime in prerendered pages for some adapters (including Cloudflare), causing errors likeserverIslandMap?.get is not a function. -
#15901
07c1002Thanks @delucis! - Fixes JSON schema generation for content collection schemas that have differences between their input and output shapes. -
#15882
759f946Thanks @matthewp! - FixAstro.url.pathnamefor the root page when usingbuild.format: "file"so it resolves to/index.htmlinstead of/.htmlduring builds.
create-astro@5.0.1
Patch Changes
- #15885
817afb6Thanks @matthewp! - Avoid spawning package manager commands withshell: trueto prevent Node.js DEP0190 warnings duringcreate-astroruns on newer Node versions.
@astrojs/cloudflare@13.1.2
Patch Changes
-
#15888
925252eThanks @matthewp! - Fixes a bug where dependencies imported by prerender-onlyserver:deferislands could remain as bare imports in server output, causing module resolution failures in preview and Cloudflare Workers. -
#15934
6f8f0bcThanks @ematipico! - Updates the AstropeerDependencies#astroto be6.0.0. -
#15875
c43ef8aThanks @matthewp! - Include workerd response details in Cloudflare prerenderer errors to makegetStaticPaths()failures easier to diagnose. -
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.1
@astrojs/markdoc@1.0.1
Patch Changes
- #15934
6f8f0bcThanks @ematipico! - Updates the AstropeerDependencies#astroto be6.0.0.
@astrojs/mdx@5.0.1
Patch Changes
- #15934
6f8f0bcThanks @ematipico! - Updates the AstropeerDependencies#astroto be6.0.0.
@astrojs/netlify@7.0.3
Patch Changes
-
#15934
6f8f0bcThanks @ematipico! - Updates the AstropeerDependencies#astroto be6.0.0. -
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.1
@astrojs/node@10.0.2
Patch Changes
- #15934
6f8f0bcThanks @ematipico! - Updates the AstropeerDependencies#astroto be6.0.0.
@astrojs/preact@5.0.1
Patch Changes
- #15881
de2860cThanks @matthewp! - FixuseId()collisions across multiple Astro islands by seeding a unique per-island root mask for Preact SSR and hydration.
@astrojs/svelte@8.0.1
Patch Changes
- #15934
6f8f0bcThanks @ematipico! - Updates the AstropeerDependencies#astroto be6.0.0.
@astrojs/vercel@10.0.1
Patch Changes
- #15934
6f8f0bcThanks @ematipico! - Updates the AstropeerDependencies#astroto be6.0.0.
@astrojs/vue@6.0.1
Patch Changes
- #15934
6f8f0bcThanks @ematipico! - Updates the AstropeerDependencies#astroto be6.0.0.
@astrojs/check@0.9.8
Patch Changes
-
#15892
a2f597dThanks @Princesseuh! - Fixes Astro not being able to find astro check sometimes -
Updated dependencies [
7b4b254]:- @astrojs/language-server@2.16.5
@astrojs/language-server@2.16.5
Patch Changes
- #15895
7b4b254Thanks @Princesseuh! - Updates Volar services to 0.0.70. This updates notably mean that the transitive dependency yaml-language-server no longer depends on a vulnerable version of lodash, causing warnings to show when installing the language server.
astro-vscode@2.16.12
Patch Changes
- #15895
7b4b254Thanks @Princesseuh! - Updates Volar services to 0.0.70. This updates notably mean that the transitive dependency yaml-language-server no longer depends on a vulnerable version of lodash, causing warnings to show when installing the language server.
Changes
- Fix server island manifest placeholder replacement when generated chunks use double-quoted string literals.
- Use quote-agnostic matching for detection and replacement in server-island build hooks.
- Fixes #15886
Testing
- Add a regression unit test that simulates quote-style conversion and asserts the output contains materialized
serverIslandMap/serverIslandNameMapmaps.
Docs
- No docs update needed; this is a bug fix for incorrect runtime behavior.
Changes
Closes #15839
This was hard to find. AI helped a lot here.
The problem was caused by how entrypoints were calculated. We used a mix of hoisted input and configResovled (the correct hook), which didn't work in a environment-aware situation, because the input gets overridden continuously, and eventually creating the incorrect entrypoint.
Testing
Manually tested, again. I'll do another preview release
Docs
Changes
- Remove shell: true from create-astro process spawning.
- Avoid Node.js DEP0190 warnings during create astro runs.
- This is no longer supported when using args.
- I couldn't find a need for
shell: truewhich is to support stuff like&&which is not part of using create-astro - fixes #15835
Testing
No
Docs
- No docs update needed; internal CLI behavior fix.
Changes
- Raise the Vite watcher max listener limit in
attachContentServerListeners()when it is below 50 (and not unlimited), preventing noisyMaxListenersExceededWarningonastro devstartup. - Fixes #15883
Testing
- Add a unit regression test that verifies the watcher max listener value is increased during content listener attachment.
Docs
- No docs update needed; this is an internal dev-server warning fix with no user-facing API changes.
Changes
- fix root
Astro.url.pathnameinbuild.format: \"file\"builds to return/index.htmlinstead of/.html
Testing
- add integration assertions for root and non-root
Astro.url.pathnamebehavior inpage-formattests
Docs
N/A, bug fix
Closes #15866
Changes
- seed Preact root vnode masks per island so
useId()values are unique across Astro islands - persist the per-island id to
data-preact-island-idand reuse it during hydration/client-only render paths - This is necessary because
useIdin Preact is only scoped to the root. - Fixes #15831
Testing
- add a Preact fixture + test that verifies unique
useIdoutput across multiple islands
Docs
N/A, bug fix
Changes
- Add a dedicated PR writing guide at
.agents/skills/astro-developer/pull-requests.mdthat defines section-by-section rules forChanges,Testing, andDocs, including reviewer-useful implementation detail expectations. - Update the skill decision matrix in
.agents/skills/astro-developer/SKILL.mdto route PR authoring tasks to the new guide so agents consistently apply the same rubric.
Testing
- Validated the guide content against the provided bad/good Cloudflare PR example and review notes so the rubric now explicitly rejects command-list testing sections, routine changeset callouts, and task-log style
Changesbullets. - Checked the template and self-check list align with the same constraints (behavior + how it works in
Changes, scenario-based validation inTesting, docs PR link requirement when docs updates are needed).
Docs
- No additional docs PR needed; this change is itself a documentation update inside the
astro-developerskill.
Changes
- Surface Cloudflare prerenderer response body details in error messages for
getStaticPaths()and static image collection failures. - Ensure prerenderer teardown always runs by moving teardown into a
finallyblock in Astro build generation. - Fixes #15860.
Testing
- Add a Cloudflare integration test fixture with a dynamic route missing
getStaticPaths()and assert the surfaced error details.
Docs
- No docs update needed; this is error reporting and teardown reliability.
Changes
- Fix dev-only CSS missing on newly created pages until server restart.
- Invalidate
virtual:astro:dev-css-allwhen routes are rebuilt so the route-to-CSS map is regenerated. - Fixes #15863
Testing
- Tested manually. Patched an example app, created a new page, new log was shown.
Docs
- N/A (bug fix).
Changes
There's no dev mode way to make this work, so we should use the passthrough service in dev.
Fixes #15848
Testing
Updated the test
Docs
N/A
Fixes #15857.
Changes
- Add
astro/toolbartooptimizeDeps.includein the dev toolbar Vite plugin. - Only include it when custom dev toolbar apps are registered (
settings.devToolbarApps.length > 0).
Testing
- Not run locally for this small config change.
Docs
- N/A, bug fix
Changes
- Update the unknown file extension error hint to recommend
vite.resolve.noExternalinstead ofvite.ssr.noExternal. - Aligns guidance with Astro 6 / Vite 7 config behavior.
- Fixes #15856
Testing
N/A
Docs
N/A bug fix
Changes
Closes #15839
- Applies
noExternalusing the properconfigEnvrionmenthook for node and netlify adapters - Added a missing configuration to the node adapter
Testing
Manually tested. It was the only way. I'll do a preview release too
Docs
Changes
- We officially support node >=22.12.0 but we had to support node 20 because of stackblitz
- It now runs on node 22 by default so we can update it accordingly (stackblitz/webcontainer-core#560 (comment))
Testing
N/A
Docs
Changeset
Changes
This PR adds the ability to pass Babel options to the Preact adapter since the underlying Preact Vite plugin does not support Babel config files: https://github.com/preactjs/preset-vite/blob/main/src/index.ts#L132
Context
When adding Preact to our project, we found that adding an import attribute:
import * as languages from "../../content/data/languages.json" with { type: "json" };Broke our project with the error:
You are using import attributes, without specifying the desired output syntax.
Please specify the "importAttributesKeyword" generator option, whose value can be one of:
- "with" : `import { a } from "b" with { type: "json" };`
- "assert" : `import { a } from "b" assert { type: "json" };`
- "with-legacy" : `import { a } from "b" with type: "json";`
22:56:23 [ERROR] Expected "{" but found "type"
And the only way we could fix this was to add:
{ "generatorOpts": { "importAttributesKeyword": "with" } }
As the Babel options in the Preact plugin.
Testing
This was pulled into the Playful Programming project branch having this issue and validated the fix there.
Docs
No changes should be required to merge this, but happy to write new docs to explain how one can leverage this functionality.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@astrojs/starlight@0.38.1
Patch Changes
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.0.4
Patch Changes
-
#15870
920f10bThanks @matthewp! - Prebundleastro/toolbarin dev when custom dev toolbar apps are registered, preventing re-optimization reloads that can hide or break the toolbar. -
#15876
f47ac53Thanks @ematipico! - FixesredirectToDefaultLocaleproducing a protocol-relative URL (//locale) instead of an absolute path (/locale) whenbaseis'/'. -
#15767
e0042f7Thanks @matthewp! - Fixes server islands (server:defer) not working when only used in prerendered pages withoutput: 'server'. -
#15873
35841edThanks @matthewp! - Fix a dev server bug where newly created pages could miss layout-imported CSS until restart. -
#15874
ce0669dThanks @ematipico! - Fixes a warning when usingprefetchAll -
#15754
58f1d63Thanks @rururux! - Fixes a bug where a directory at the project root sharing the same name as a page route would cause the dev server to return a 404 instead of serving the page. -
#15869
76b3a5eThanks @matthewp! - Update the unknown file extension error hint to recommendvite.resolve.noExternal, which is the correct Vite 7 config key.
@astrojs/cloudflare@13.1.1
Patch Changes
-
#15815
d1872eeThanks @matthewp! - Prebundle additional Astro runtime dependencies for Cloudflare development server, speeding up initial start time and preventing required restarts. -
#15872
3b47b89Thanks @Princesseuh! - Fixes images not working in dev mode when using thecloudflareoption -
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.1
@astrojs/netlify@7.0.2
Patch Changes
-
#15868
bb2b8f5Thanks @ematipico! - Fixes an issue where the adapter would cause a series of warnings during the build. -
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.1
@astrojs/node@10.0.1
Patch Changes
- #15868
bb2b8f5Thanks @ematipico! - Fixes an issue where the adapter would cause a series of warnings during the build.
Description
- Closes #3748
- With zod v4,
.default(value).optional()returns the default value forundefinedinput instead ofundefineditself. This caused the frontmattertableOfContentsfield to always resolve to the schema default ({ minHeadingLevel: 2, maxHeadingLevel: 3 }), preventing the global Starlight config from being used as a fallback.
Changes
schemas/tableOfContents.ts: Extracted a sharedTableOfContentsBaseSchemaand created two separate exports:UserConfigTableOfContentsSchema()— wraps the base with.default(defaults)for the user config.FrontmatterTableOfContentsSchema()— wraps the base with.optional()soundefinedis preserved when frontmatter does not set the field.
schema.ts: Updated the frontmatter schema to useFrontmatterTableOfContentsSchema().utils/user-config.ts: Updated to useUserConfigTableOfContentsSchema().
Testing
All 511 existing unit tests pass. The fix can be verified by setting a global tableOfContents config (e.g., maxHeadingLevel: 4) and confirming it applies to pages that do not override it in frontmatter.
A StackBlitz reproduction is available in the linked issue.
Description
- Removes the temporary patch for the
starlight-links-validatorplugin that was temporarily added in #3644 - Updates the
starlight-links-validatorplugin from version0.14.0to0.20.0which includes support for Astro v6 - Fixes a link issue in a hero action link (feature introduced in version
0.19.0of the plugin)
Changes
Found a bug where distURL was empty. We didn't catch it because our tests were weak.
Testing
The existing tests now checks for their length too
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
@astrojs/cloudflare@13.1.0
Minor Changes
-
#15711
b2bd27bThanks @OliverSpeir! - Adds aprerenderEnvironmentoption to the Cloudflare adapter.By default, Cloudflare uses its workerd runtime for prerendering static pages. Set
prerenderEnvironmentto'node'to use Astro's built-in Node.js prerender environment instead, giving prerendered pages access to the full Node.js ecosystem during both build and dev. This is useful when your prerendered pages depend on Node.js-specific APIs or NPM packages that aren't compatible with workerd.// astro.config.mjs import cloudflare from '@astrojs/cloudflare'; import { defineConfig } from 'astro/config'; export default defineConfig({ adapter: cloudflare({ prerenderEnvironment: 'node', }), });
Patch Changes
-
#15845
50fcc8bThanks @aqiray! - fix: show actionable error when running astro preview without prior build -
#15794
d1ac58eThanks @OliverSpeir! - Fixes image serving inpassthroughmode by using the CloudflareASSETSbinding instead of generic fetch, which does not work in Workers for local assets -
#15850
660da74Thanks @tristanbes! - fix(cloudflare): forwardconfigPathand otherPluginConfigoptions to the Cloudflare Vite PluginOptions like
configPath,inspectorPort,persistState,remoteBindings, andauxiliaryWorkerswere accepted by the type system but never forwarded tocfVitePlugin(), making them silently ignored.Also fixes
addWatchFileforconfigPathwhich resolved the path relative to the adapter'snode_modulesdirectory instead of the project root. -
#15843
fcd237dThanks @Calvin-LL! - fix cloudflare image transform ignoring quality parameter -
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.1
astro@6.0.3
Patch Changes
-
#15711
b2bd27bThanks @OliverSpeir! - Improves Astro core's dev environment handling for prerendered routes by ensuring route/CSS updates and prerender middleware behavior work correctly across both SSR and prerender environments.This enables integrations that use Astro's prerender dev environment (such as Cloudflare with
prerenderEnvironment: 'node') to get consistent route matching and HMR behavior during development. -
#15852
1cdaf9fThanks @ematipico! - Fixes a regression where the the routes emitted by theastro:build:donehook didn't have thedistURLarray correctly populated. -
#15765
ca76ff1Thanks @matthewp! - Hardens server island POST endpoint validation to use own-property checks for improved consistency
Summary
Fixes #15846
-
Forward
cloudflareOptionstocfVitePlugin()— Options likeconfigPath,inspectorPort,persistState,remoteBindings, andauxiliaryWorkersare accepted by the type system (viaPick<PluginConfig, ...>in theOptionstype) but were never spread into thecfVitePlugin()call, making them silently ignored. -
Fix
addWatchFilepath resolution forconfigPath—createRequire(import.meta.url).resolve(configPath)resolves relative to the adapter's ownnode_modules/@astrojs/cloudflare/dist/directory instead of the project root, causing aCannot find moduleerror. Replaced withnew URL(configPath, config.root)to match how the other wrangler config watch files are resolved.
Reproduction
// astro.config.ts — with wrangler-review.jsonc at project root, no wrangler.jsonc
export default defineConfig({
adapter: cloudflare({
configPath: "./wrangler-review.jsonc",
}),
});Running astro dev crashes with:
Cannot find module './wrangler-review.jsonc'
Require stack:
- node_modules/@astrojs/cloudflare/dist/index.js
Changes
3-line diff in packages/integrations/cloudflare/src/index.ts:
- Spread
cloudflareOptionsintocfVitePlugin()so allPluginConfigoptions are forwarded - Use
new URL(configPath, config.root)instead ofcreateRequire(import.meta.url).resolve(configPath) - Remove unused
createRequireimport
Use case
Projects using separate wrangler configs per environment (wrangler-review.jsonc for dev/staging, wrangler-prod.jsonc for production) with CI renaming the appropriate file at deploy time. In @astrojs/cloudflare v12, platformProxy.configPath handled this. After migrating to v13, configPath is the documented replacement but doesn't work.
Closes #15837
Changes
- Running
astro previewwith the Cloudflare adapter without a priorastro buildthrew a cryptic ENOENT error with a long stack trace - Added an explicit check for
.wrangler/deploy/config.jsonbefore starting the preview server - If the file is missing, a clear error message is shown:
No build output found. Run astro build before running astro preview.
Testing
- Verified the cryptic ENOENT error is replaced with a clear actionable message when running
astro previewwithout a prior build - Verified that
astro previewworks correctly after runningastro build - Changeset added ✅
Docs
No docs update needed. The error message itself is self-explanatory.
Changes
- the image-transform-endpoint used in
imageService: 'cloudflare-binding'ignores theqsearch param, this PR fixes that. thequalityTableis from@astrojs/vercelconst qualityTable: Record<ImageQualityPreset, number> = {
Testing
pnpm run test in packages/integrations/cloudflare/
I tried to add a test locally but the local workerd doesn't actually change the image quality when passing in the quality field. It returned two files with identical hashes when I pass in two different quality values. I can confirm that the quality does indeed change on cloudflare.
Docs
bug fix doesn't need doc change
Description
- #3644 introduced an update to Prettier which is breaking some of our formatting
- This PR reverts the formatting commits this caused and pins Prettier to the old version to unblock us
- We can revisit updating Prettier when we’re not trying to release stuff
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@astrojs/starlight-tailwind@5.0.0
Major Changes
-
#3644
0d2e7edThanks @HiDeoo! -⚠️ BREAKING CHANGE: The minimum supported version of Starlight is now 0.38.0Please use the
@astrojs/upgradecommand to upgrade your project:npx @astrojs/upgrade
@astrojs/starlight-docsearch@0.7.0
Minor Changes
-
#3644
0d2e7edThanks @HiDeoo! -⚠️ BREAKING CHANGE: The minimum supported version of Starlight is now 0.38.0Please use the
@astrojs/upgradecommand to upgrade your project:npx @astrojs/upgrade
@astrojs/starlight-markdoc@0.6.0
Minor Changes
-
#3644
0d2e7edThanks @HiDeoo! -⚠️ BREAKING CHANGE: The minimum supported version of Starlight is now 0.38.0Please use the
@astrojs/upgradecommand to upgrade your project:npx @astrojs/upgrade
@astrojs/starlight@0.38.0
Minor Changes
-
#3644
0d2e7edThanks @HiDeoo! - Adds support for Astro v6, drops support for Astro v5.Upgrade Astro and dependencies
⚠️ BREAKING CHANGE: Astro v5 is no longer supported. Make sure you update Astro and any other official integrations at the same time as updating Starlight:npx @astrojs/upgrade
Community Starlight plugins and Astro integrations may also need to be manually updated to work with Astro v6. If you encounter any issues, please reach out to the plugin or integration author to see if it is a known issue or if an updated version is being worked on.
Update your collections
⚠️ BREAKING CHANGE: Drops support for content collections backwards compatibility.In Astro 5.x, projects could delay upgrading to the new Content Layer API introduced for content collections because of some existing automatic backwards compatibility that was not previously behind a flag. This meant that it was possible to upgrade from Astro 4 to Astro 5 without updating your content collections, even if you had not enabled the
legacy.collectionsflag. Projects would continue to build, and no errors or warnings would be displayed.Astro v6.0 now removes this automatic legacy content collections support, along with the
legacy.collectionsflag.If you experience content collections errors after updating to v6, check your project for any removed legacy features that may need updating to the Content Layer API. See the Starlight v0.30.0 upgrade guide for detailed instructions on upgrading legacy collections to the new Content Layer API.
If you are unable to make any changes to your collections at this time, including Starlight's default
docsandi18ncollections, you can enable thelegacy.collectionsBackwardsCompatflag to upgrade to v6 without updating your collections. This temporary flag preserves some legacy v4 content collections features, and will allow you to keep your collections in their current state until the legacy flag is no longer supported. -
#3704
375edccThanks @florian-lefebvre! - Fixes autocomplete for components exported from@astrojs/starlight/components/*⚠️ Potentially breaking change: This change moves some files used in Starlight’s component internals out of thecomponents/directory. Direct use of these files was not and is not officially supported. If you previously importedTableOfContents/starlight-toc.ts,TableOfContents/TableOfContentsList.astro,Icons.ts, orSidebarPersistState.ts, please review your code when updating. -
#3729
3642625Thanks @delucis! - Improves Starlight’s default body font stack to better support languages such as Chinese, Japanese, and Korean on Windows.
For most users there should be no visible change.If you would prefer to keep the previous font stack, you can add the following custom CSS to your site:
:root { --sl-font-system: ui-sans-serif, system-ui, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; }
-
#3598
fff38d5Thanks @HiDeoo! - Makes hover styles consistent in Starlight’s navigation barPreviously, the social icon links and language/theme switchers in Starlight’s navigation bar, dimmed on hover.
After this change, they now increase in contrast on hover instead.
This matches hover behavior elsewhere, for example in the sidebar, table of contents, or search button.⚠️ Potentially breaking change: this is a subtle change to the hover style colors.
If you want to preserve the previous styling, you can add the following custom CSS to your site:starlight-theme-select label, starlight-lang-select label { color: var(--sl-color-gray-1); &:hover { color: var(--sl-color-white); } } .social-icons a:hover { color: var(--sl-color-text-accent); opacity: 0.66; }
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.0.2
Patch Changes
- #15832
95e12a2Thanks @Princesseuh! - Fixesreturn;syntax not working in the frontmatter correctly in certain contexts
@astrojs/cloudflare@13.0.2
Patch Changes
-
#15832
95e12a2Thanks @Princesseuh! - Fixesreturn;syntax not working in the frontmatter correctly in certain contexts -
#15803
e42b015Thanks @merlinnot! - Fixes the Cloudflare adapter adding aSESSIONKV binding even when sessions are explicitly configured to use a different driver, such asunstorage/drivers/null. -
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.1
Changes
For import analysis, we have to remove top-level returns from Astro files in the Cloudflare adapter, we do this using a pretty naive replace, but it's fine. However, we didn't handle bare returns, i.e. return; so this fixes that.
The same code is also present in Astro for better errors during compile errors, so fixed that there too.
Testing
Added a test to the CF adapter
Docs
N/A
Changes
fast-xml-parser's 5.5.0 is broken and causes install to fail NaturalIntelligence/fast-xml-parser#799
Testing
N/A
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 5-legacy, this PR will be updated.
Releases
astro@5.18.1
Patch Changes
- Updated dependencies [
c2cd371]:- @astrojs/internal-helpers@0.7.6
- @astrojs/markdown-remark@6.3.11
@astrojs/cloudflare@12.6.13
Patch Changes
- Updated dependencies [
c2cd371]:- @astrojs/internal-helpers@0.7.6
- @astrojs/underscore-redirects@1.0.0
@astrojs/markdoc@0.15.11
Patch Changes
- Updated dependencies [
c2cd371]:- @astrojs/internal-helpers@0.7.6
- @astrojs/markdown-remark@6.3.11
@astrojs/mdx@4.3.14
Patch Changes
- Updated dependencies []:
- @astrojs/markdown-remark@6.3.11
@astrojs/netlify@6.6.5
Patch Changes
- Updated dependencies [
c2cd371]:- @astrojs/internal-helpers@0.7.6
- @astrojs/underscore-redirects@1.0.0
@astrojs/node@9.5.5
Patch Changes
- Updated dependencies [
c2cd371]:- @astrojs/internal-helpers@0.7.6
@astrojs/vercel@9.0.5
Patch Changes
- Updated dependencies [
c2cd371]:- @astrojs/internal-helpers@0.7.6
@astrojs/internal-helpers@0.7.6
Patch Changes
- #15828
c2cd371Thanks @Princesseuh! - Fixes glob matching of remote patterns matching more paths than intended in select situations
@astrojs/markdown-remark@6.3.11
Patch Changes
- Updated dependencies [
c2cd371]:- @astrojs/internal-helpers@0.7.6
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.0.1
Patch Changes
- #15827
a4c0d0bThanks @matthewp! - Fixesastro addso the tsconfig preview shows the actual pending changes before confirmation
@astrojs/rss@4.0.17
Patch Changes
- #15830
8d3f3aaThanks @Princesseuh! - Pinfast-xml-parserto 5.4.1 in order to fix an upstream bug
astro-vscode@2.16.11
Patch Changes
- #15825
2cfe935Thanks @Princesseuh! - Fixes failed publish for 2.16.11.
Changes
A previous merge reverted this by accident, bringing it back to fix VS Code publishing.
Testing
N/A
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
@astrojs/cloudflare@13.0.1
Patch Changes
- Updated dependencies [
e20474b]:- @astrojs/underscore-redirects@1.0.1
@astrojs/netlify@7.0.1
Patch Changes
- Updated dependencies [
e20474b]:- @astrojs/underscore-redirects@1.0.1
@astrojs/partytown@2.1.5
Patch Changes
- #15820
e20474bThanks @Princesseuh! - Fixes broken publish
@astrojs/language-server@2.16.4
Patch Changes
-
#15820
e20474bThanks @Princesseuh! - Fixes broken publish -
Updated dependencies [
e20474b]:- @astrojs/yaml2ts@0.2.3
@astrojs/ts-plugin@1.10.7
Patch Changes
-
#15820
e20474bThanks @Princesseuh! - Fixes broken publish -
Updated dependencies [
e20474b]:- @astrojs/yaml2ts@0.2.3
astro-vscode@2.16.10
Patch Changes
- #15823
29e03faThanks @Princesseuh! - Fixes broken publishing
@astrojs/yaml2ts@0.2.3
Patch Changes
- #15820
e20474bThanks @Princesseuh! - Fixes broken publish
@astrojs/underscore-redirects@1.0.1
Patch Changes
- #15820
e20474bThanks @Princesseuh! - Fixes broken publish
Changes
A few packages failed to publish during Astro 6 because of beta things. Apart from @astrojs/language-server they just had one version above, but the language server had a few patches so needed a manual package.json bump
Testing
N/A
Docs
N/A
Changes
- Draft PR to test support for Vite 8
Testing
Looking to get CI green
Docs
Not yet
Changes
These three packages got releases on main without corresponding beta updates, as such, the beta versions are behind what's actually published. This PR manually updates the package.json so that we publish one version higher than the current when we get out of beta.
Testing
N/A
Docs
N/A
Note, I don't love that we need to do this so much. I think we need to figure out an API so that plugins that need this can do it themselves, rather than having them all here.
Have an idea for that I'm going to propose as a minor change.
Summary
- Add Cloudflare adapter SSR
optimizeDeps.includeentries for Astro runtime modules that are discovered on first request in Workers dev. - This avoids repeated mid-request SSR dep discovery reloads that can invalidate Workers request context and cause first-load hangs.
- This is necessary to get Starlight + Cloudflare working reliably in dev from a cold Vite optimizer cache.
Testing
- Manually testing Starlights docs site
Docs
N/A, bug fix
Changes
- Patched
@changesets/changelog-githubto use batching, to prevent hitting limits. - This is a temporary change just needed to get v6 done.
Testing
Verified this fixes it locally.
Docs
N/A, repo bug fix
Exit prerelease mode, merging this will update the CI release to publish 6, which will be blocked until release.
Changes
Multiple things:
- We were not applying the fit defaults correctly because they were locked behind some conditions checking for layout still
- The Netlify adapter never sent the fit query param
- The Netlify adapter was wrongfully using the imageCDN even when it was disabled in dev
Testing
Added tests for Netlify
Docs
N/A. The specified behavior is already documented, the code was wrong.
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
The changelog information of each package has been omitted from this message, as the content exceeds the size limit.
astro@6.0.0
@astrojs/prism@4.0.0
create-astro@5.0.0
@astrojs/cloudflare@13.0.0
@astrojs/mdx@5.0.0
@astrojs/netlify@7.0.0
@astrojs/node@10.0.0
@astrojs/preact@5.0.0
@astrojs/react@5.0.0
@astrojs/solid-js@6.0.0
@astrojs/svelte@8.0.0
@astrojs/vercel@10.0.0
@astrojs/vue@6.0.0
@astrojs/markdown-remark@7.0.0
@astrojs/db@0.20.0
@astrojs/alpinejs@0.5.0
@astrojs/markdoc@1.0.0
@astrojs/internal-helpers@0.8.0
@astrojs/upgrade@0.7.0
@astrojs/rss@4.0.16
@astrojs/sitemap@3.7.1
@astrojs/check@0.9.7
@astrojs/language-server@2.16.1
astro-vscode@2.16.9
Changes
- Adds codec-specific defaults to Astro’s built-in Sharp image service via image.service.config
- Supports jpeg, png, webp, and avif encoder option objects for compile-time image generation
- Applies these config values to Sharp’s format-specific encoders while keeping per-image quality as the higher-precedence override
- Preserves the existing animated GIF to WebP behavior, with loop: 0 remaining the default unless explicitly overridden
Testing
- Added unit tests for codec-specific encoder option resolution
- Verified config defaults are applied when no per-image quality is provided
- Verified per-image quality overrides config-level quality
- Verified jpg output maps to JPEG encoder defaults
- Verified animated GIF to WebP keeps the default loop: 0 unless overridden in config
Docs
Added public config docs for image.service.config.jpeg, image.service.config.png, image.service.config.webp, and image.service.config.avif
/cc @withastro/maintainers-docs for feedback!
Changes
Fixes #15802.
Testing
Tests included in the PR.
Docs
I think it's a bugfix, not a new feature, so I don't think docs are needed.
Changes
After spending some time working with route caching in the alpha, it's clear it's annoying to need to wrap everything in a try/catch to see if caching is enabled. The PR changes it so DisabledAstroCache now silently no-ops with a one-time console warning instead of throwing. invalidate() still throws since callers expect purging to work.
Adds cache.enabled property to CacheLike so libraries can check whether caching is active.
Testing
Updated tests
Docs
Description
This PR deletes the test-hosts.yml file as this workflow is not needed anymore according to Erika and Matthew.
Initially reported on Discord by qzio.
fixes: #15796
Changes
As reported in the linked issue, using the latest beta version of the Cloudflare Workers integration alongside the React integration caused build failures.
This PR addresses the issue by adding picomatch to optimizeDeps.include.
- Added
picomatchtooptimizeDeps.include.
Testing
Curiously, this build error could not be reproduced within this monorepo's test environment, where the logs showed the following output instead.
08:21:58 [@astrojs/cloudflare] Enabling image processing with Cloudflare Images for production with the "IMAGES" Images binding.
08:21:58 [@astrojs/cloudflare] Enabling sessions with Cloudflare KV with the "SESSION" KV binding.
08:21:59 [vite] Re-optimizing dependencies because lockfile has changed
08:22:01 [vite] ✨ new dependencies optimized: picomatch
08:22:01 [vite] ✨ optimized dependencies changed. reloadingIn fact, the first commit eb65bec of this PR includes only the test cases without the actual fix, yet all CI integration tests passed successfully.
However, I have confirmed on my local machine that adding picomatch to optimizeDeps.include resolves the issue in standard (non-monorepo) repositories.
As a workaround for the tests in this PR, I am verifying that the log message "new dependencies optimized: picomatch" no longer appears, ensuring it is correctly pre-optimized.
It may be necessary to use the pr preview label to further verify the fix in a real-world repository.
Docs
N/A, bug fix
Changes
Adds a Cloudflare-specific /_image passthrough endpoint that serves local assets via env.ASSETS and proxies remote images via fetch.
When using imageService: 'passthrough' or imageService: 'compile' currently, the /_image endpoint falls back to Astro's generic endpoint which loads local assets by fetching the same origin.
In Cloudflare Workers, without the global_fetch_strictly_public compatibility flag (not included in the default generated wrangler config), same-origin fetch are routed back through the Worker's own fetch handler rather than the CDN. Since the Worker doesn't handle /_astro/ paths, the request returns 404.
This bypasses HTTP routing entirely (for local assets) and works regardless of compatibility flags.
Testing
manually with pnpm preview
Docs
n/a
Changes
- Upgrades to
@astrojs/compiler@3
Testing
N/A
Docs
N/A
Changes
Update the template for Astro 6
Testing
N/A. Tested manually
Docs
N/A
Changes
- We'll do
types: []in Astro 7, when TS 6 will have more adoption - Closes #15785
Testing
N/A
Docs
- Changeset
- withastro/docs#13353
Changes
The checkout step was removed in #14454 to force the changed-files action to use the github api to identify changed files, since a local git diff is not reliable from a forked repository.
The checkout is however required before the check so the markdown files can be examined. See recent runs of the workflow, which error in the " Check if any changesets contain minor or major changes" step since the markdown files can't be found for example
Checking for changesets marked as minor or major
cat: .changeset/harden-node-server-defaults.md: No such file or directory
Testing
Docs
Pull request CI step, no docs required.
Changes
This is technically a minor. I had to add clientAddress so that the adapters can send the client IP.
Testing
Added new tests
Docs
Changes
This PR fixes an issue where certain secrete can be exposed to the client if vite.envPrefix includes them.
Testing
Added unit tests and integration tests
Docs
N/A
Changes
/* wasn't implemented the same way as /** and could match more paths than intended in some situations
Testing
Added a test
Docs
N/A
Changes
This PR fixes an issue where Vercel and CF adapters could retrieve the incorrect value for x-forwarded-for.
I moved the utilities we use for node adapter in the internal-helpers package, so that all three packages use the same logic.
Testing
Added new tests.
Unfortunately Vercel can't be tested due to technical limitations
Docs
Changes
- Preserves the port from the
Hostheader when constructing the request URL withoutallowedDomainsconfigured, ensuring the origin includes the correct port (e.g.,http://localhost:4321instead ofhttp://localhost) - Restricts
X-Forwarded-Prototo only be trusted whenallowedDomainsis configured, improving consistency with how other forwarded headers are handled
Testing
- Added unit tests for port preservation in localhost fallback (with and without
allowedDomains) - Added unit tests for
X-Forwarded-Protorejection when noallowedDomainsis configured - All existing CSRF protection and request construction tests continue to pass
Docs
No docs changes needed.
Changes
- Strips
Content-LengthandTransfer-Encodingheaders from the original response before merging inmergeResponses(), matching the existing treatment ofContent-type - Ensures framing headers from the original response do not carry over to a rendered error page that has a different body
Testing
- Added unit tests in
middleware-app.test.jsverifying thatContent-LengthandTransfer-Encodingfrom middleware responses are not preserved when rendering 404/500 error pages - Non-framing custom headers (e.g.
X-Custom) are confirmed to still be preserved
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.
main is currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, run changeset pre exit on main.
Releases
astro@6.0.0-beta.20
Major Changes
- #15424
33d6146Thanks @Princesseuh! - Throws an error whengetImage()fromastro:assetsis called on the client - (v6 upgrade guidance)
Minor Changes
-
#15700
4e7f3e8Thanks @ocavue! - Updates the internal logic during SSR by providing additional metadata for UI framework integrations. -
#15781
2de969dThanks @ematipico! - Adds a newclientAddressoption to thecreateContext()functionProviding this value gives adapter and middleware authors explicit control over the client IP address. When not provided, accessing
clientAddressthrows an error consistent with other contexts where it is not set by the adapter.Additionally, both of the official Netlify and Vercel adapters have been updated to provide this information in their edge middleware.
import { createContext } from 'astro/middleware'; createContext({ clientAddress: context.headers.get('x-real-ip'), });
-
#15755
f9ee868Thanks @matthewp! - Adds a newsecurity.serverIslandBodySizeLimitconfiguration optionServer island POST endpoints now enforce a body size limit, similar to the existing
security.actionBodySizeLimitfor Actions. The new option defaults to1048576(1 MB) and can be configured independently.Requests exceeding the limit are rejected with a 413 response. You can customize the limit in your Astro config:
export default defineConfig({ security: { serverIslandBodySizeLimit: 2097152, // 2 MB }, });
Patch Changes
-
#15712
7ac43c7Thanks @florian-lefebvre! - Improvesastro infoby supporting more operating systems when copying the information to the clipboard. -
#15780
e0ac125Thanks @ematipico! - Preventsvite.envPrefixmisconfiguration from exposingaccess: "secret"environment variables in client-side bundles. Astro now throws a clear error at startup if anyvite.envPrefixentry matches a variable declared withaccess: "secret"inenv.schema.For example, the following configuration will throw an error for
API_SECRETbecause it's defined assecretits name matches['PUBLIC_', 'API_']defined inenv.schema:// astro.config.mjs import { defineConfig } from 'astro/config'; export default defineConfig({ env: { schema: { API_SECRET: envField.string({ context: 'server', access: 'secret', optional: true }), API_URL: envField.string({ context: 'server', access: 'public', optional: true }), }, }, vite: { envPrefix: ['PUBLIC_', 'API_'], }, });
-
#15778
4ebc1e3Thanks @ematipico! - Fixes an issue where the computedclientAddresswas incorrect in cases of a Request header with multiple values. TheclientAddressis now also validated to contain only characters valid in IP addresses, rejecting injection payloads. -
#15776
e9a9cc6Thanks @matthewp! - Hardens error page response merging to ensure framing headers from the original response are not carried over to the rendered error page -
#15759
39ff2a5Thanks @matthewp! - Adds a newbodySizeLimitoption to the@astrojs/nodeadapterYou can now configure a maximum allowed request body size for your Node.js standalone server. The default limit is 1 GB. Set the value in bytes, or pass
0to disable the limit entirely:import node from '@astrojs/node'; import { defineConfig } from 'astro/config'; export default defineConfig({ adapter: node({ mode: 'standalone', bodySizeLimit: 1024 * 1024 * 100, // 100 MB }), });
-
#15777
02e24d9Thanks @matthewp! - Fixes CSRF origin check mismatch by passing the actual server listening port tocreateRequest, ensuring the constructed URL origin includes the correct port (e.g.,http://localhost:4321instead ofhttp://localhost). Also restrictsX-Forwarded-Prototo only be trusted whenallowedDomainsis configured. -
#15768
6328f1aThanks @matthewp! - Hardens internal cookie parsing to use a null-prototype object consistently for the fallback path, aligning with how the cookie library handles parsed values -
#15757
631aaedThanks @matthewp! - Hardens URL pathname normalization to consistently handle backslash characters after decoding, ensuring middleware and router see the same canonical pathname -
#15761
8939751Thanks @ematipico! - Fixes an issue where it wasn't possible to setexperimental.queuedRendering.poolSizeto0. -
#15764
44daecfThanks @matthewp! - Fixes form actions incorrectly auto-executing during error page rendering. When an error page (e.g. 404) is rendered, form actions from the original request are no longer executed, since the full request handling pipeline is not active. -
#15788
a91da9fThanks @florian-lefebvre! - Reverts changes made to TSConfig templates -
Updated dependencies [
4ebc1e3,4e7f3e8]:- @astrojs/internal-helpers@0.8.0-beta.3
- @astrojs/markdown-remark@7.0.0-beta.11
@astrojs/node@10.0.0-beta.9
Minor Changes
-
#15759
39ff2a5Thanks @matthewp! - Adds a newbodySizeLimitoption to the@astrojs/nodeadapterYou can now configure a maximum allowed request body size for your Node.js standalone server. The default limit is 1 GB. Set the value in bytes, or pass
0to disable the limit entirely:import node from '@astrojs/node'; import { defineConfig } from 'astro/config'; export default defineConfig({ adapter: node({ mode: 'standalone', bodySizeLimit: 1024 * 1024 * 100, // 100 MB }), });
Patch Changes
-
#15777
02e24d9Thanks @matthewp! - Fixes CSRF origin check mismatch by passing the actual server listening port tocreateRequest, ensuring the constructed URL origin includes the correct port (e.g.,http://localhost:4321instead ofhttp://localhost). Also restrictsX-Forwarded-Prototo only be trusted whenallowedDomainsis configured. -
#15763
1567e8cThanks @matthewp! - Normalizes static file paths before evaluating dotfile access rules for improved consistency -
Updated dependencies [
4ebc1e3,4e7f3e8]:- @astrojs/internal-helpers@0.8.0-beta.3
@astrojs/internal-helpers@0.8.0-beta.3
Minor Changes
- #15778
4ebc1e3Thanks @ematipico! - Added a new entry point called/request, which exposes utilities to work with theRequesttype:getFirstForwardedValue: retrieves the first value of a multi-value header.isValidIpAddress: checks whether a string contains only characters valid in IPv4/IPv6 addresses.getValidatedIpFromHeader: extracts the first value from a header and validates it as an IP address.getClientIpAddress: retrieves and validates the first IP from thex-forwarded-forheader.
Patch Changes
- #15700
4e7f3e8Thanks @ocavue! - Adds a fork ofcreateFilterfrom@rollup/pluginutilswithout Node.js APIs.
@astrojs/cloudflare@13.0.0-beta.14
Patch Changes
-
#15778
4ebc1e3Thanks @ematipico! - Fixes an issue where the computedclientAddresswas incorrect in cases of a Request header with multiple values. TheclientAddressis now also validated to contain only characters valid in IP addresses, rejecting injection payloads. -
Updated dependencies [
4ebc1e3,4e7f3e8]:- @astrojs/internal-helpers@0.8.0-beta.3
- @astrojs/underscore-redirects@1.0.0
@astrojs/markdoc@1.0.0-beta.15
Patch Changes
- Updated dependencies [
4ebc1e3,4e7f3e8]:- @astrojs/internal-helpers@0.8.0-beta.3
- @astrojs/markdown-remark@7.0.0-beta.11
@astrojs/mdx@5.0.0-beta.12
Patch Changes
- Updated dependencies []:
- @astrojs/markdown-remark@7.0.0-beta.11
@astrojs/netlify@7.0.0-beta.14
Patch Changes
-
#15781
2de969dThanks @ematipico! - Adds a newclientAddressoption to thecreateContext()functionProviding this value gives adapter and middleware authors explicit control over the client IP address. When not provided, accessing
clientAddressthrows an error consistent with other contexts where it is not set by the adapter.Additionally, both of the official Netlify and Vercel adapters have been updated to provide this information in their edge middleware.
import { createContext } from 'astro/middleware'; createContext({ clientAddress: context.headers.get('x-real-ip'), });
-
Updated dependencies [
4ebc1e3,4e7f3e8]:- @astrojs/internal-helpers@0.8.0-beta.3
- @astrojs/underscore-redirects@1.0.0
@astrojs/preact@5.0.0-beta.5
Patch Changes
-
#15700
4e7f3e8Thanks @ocavue! - Improves how Preact components are identified when setting theincludeand/orexcludeoptions in projects where multiple JSX frameworks are used together -
Updated dependencies [
4ebc1e3,4e7f3e8]:- @astrojs/internal-helpers@0.8.0-beta.3
@astrojs/react@5.0.0-beta.4
Patch Changes
-
#15700
4e7f3e8Thanks @ocavue! - Improves how React components are identified when setting theincludeand/orexcludeoptions in projects where multiple JSX frameworks are used together -
Updated dependencies [
4ebc1e3,4e7f3e8]:- @astrojs/internal-helpers@0.8.0-beta.3
@astrojs/vercel@10.0.0-beta.8
Patch Changes
-
#15781
2de969dThanks @ematipico! - Adds a newclientAddressoption to thecreateContext()functionProviding this value gives adapter and middleware authors explicit control over the client IP address. When not provided, accessing
clientAddressthrows an error consistent with other contexts where it is not set by the adapter.Additionally, both of the official Netlify and Vercel adapters have been updated to provide this information in their edge middleware.
import { createContext } from 'astro/middleware'; createContext({ clientAddress: context.headers.get('x-real-ip'), });
-
#15778
4ebc1e3Thanks @ematipico! - Fixes an issue where the computedclientAddresswas incorrect in cases of a Request header with multiple values. TheclientAddressis now also validated to contain only characters valid in IP addresses, rejecting injection payloads. -
Updated dependencies [
4ebc1e3,4e7f3e8]:- @astrojs/internal-helpers@0.8.0-beta.3
@astrojs/markdown-remark@7.0.0-beta.11
Patch Changes
Changes
- Pin
actions/labelerto commit SHA and add explicit permissions block - Enable Renovate automated updates for
actions/labeler - Replace
secrets: inheritwith explicit secret passing informat.ymlworkflow - Add explicit permissions blocks to workflows that were inheriting default permissions (
check.yml,cleanup-cache.yml,scripts.yml,test-hosts.yml) - Remove unused
actions: write,checks: write, andstatuses: writepermissions from workflows - Add
persist-credentials: falsetodiff-dependencies.ymlcheckout step - Use environment variables instead of direct secret interpolation in shell commands for
VSCE_TOKEN,OVSX_TOKEN, and Netlify webhook - Replace third-party Discord notification action with direct
curlcall for better supply chain management
Testing
No functional changes to workflow behavior. All changes follow GitHub Actions security best practices for:
- Principle of least privilege (explicit permissions)
- Secure credential handling (environment variables vs direct interpolation)
- Supply chain hardening (SHA-pinned actions, reduced third-party dependencies)
Docs
No docs changes needed - these are internal CI/CD workflow improvements.
fixes: #15769
Changes
The previous pull request #15717 was missing the changeset for @astrojs/internal-helpers, which caused a build error.
This PR adds the missing changeset to trigger the release and resolve the build error.
It seems variable MANY_LEADING_SLASHES is only used internally, but since it is exported, I included it in the changeset just in case.
Testing
N/A
Docs
N/A
CTRL+C kills the dev and preview processes while the actual stop/quit command is documented here: https://docs.astro.build/en/reference/cli-reference/
While either way works, the command version exits gracefully and should be highlighted for new users. One minor difference in the two versions when using powerline/OMP in a CLI is that CTRL+C will display a script error after the process was killed while the command does not.
Changes
- The message after creating a new Astro project explaining how to run the dev server now explains that
q+ENTERwill stop the server. - The
CTRL+Ckill process shortcut is no longer mentioned.
Testing
This change is for a simple text string only. No specific tests reference this text in the codebase.
Docs
The docs are already clear enough, just the script message has not been updated: https://docs.astro.build/en/reference/cli-reference/
Changes
- Uses
Object.create(null)instead of{}for the fallback object inAstroCookies#ensureParsed()when no Cookie header is present - This aligns the fallback path with how the
cookielibrary already creates parsed objects (usingNullObject), ensuring consistent behavior
Testing
- Added unit tests for
cookies.get()verifying that Object.prototype properties are not returned when no cookie header is present - Added unit tests for
cookies.has()verifying that Object.prototype properties are not detected when no cookie header is present
Docs
No docs changes needed.
Changes
- Fixes #15753
- A map is created in the manifest for server island names to their import paths. This was failing after splitting the build into ssr/prerender, because the map is created in ssr where islands might only be used in prerender pages.
- Fix is to use a placeholder and update the mapping as a post-build hook after both builds are complete.
Testing
- Added a new unit test in
test/units/build/server-islands.test.jsthat runs an in-memory Astro build using virtual.astromodules (no fixture files on disk). - Test verifies the server island manifest is populated when
server:deferis only used in prerendered pages.
Docs
N/A, bug fix
Note there isn't a security issue here, this is defense in depth.
Changes
- Updates server island POST endpoint validation in
getRequestData()to useObject.hasOwn()instead of theinoperator when checking for plaintextslotsandcomponentExportproperties - This ensures only own properties on the parsed JSON data are validated, improving consistency with standard property-checking patterns
Testing
- Added two unit tests to
packages/astro/test/units/server-islands/endpoint.test.jsverifying that validation checks only consider own properties on the parsed request data - All existing endpoint tests continue to pass
Docs
No docs changes needed.
Changes
- Skips form action auto-execution in
lastNext()whenskipMiddlewareis true (e.g. during error page recovery) - Ensures form actions only run when the full request handling pipeline, including middleware, is active
Testing
- Added unit tests in
packages/astro/test/units/render/render-context.test.jscovering both cases:- Verifies form actions are not auto-executed when
skipMiddleware=true - Verifies form actions are auto-executed when
skipMiddleware=false(normal flow)
- Verifies form actions are not auto-executed when
Docs
No docs changes needed.
Changes
- Normalizes static file paths using
path.posix.normalize()before evaluating dotfile access rules in the Node adapter's static file handler - Ensures the
.well-known/check and thesendlibrary operate on the same normalized path for consistent behavior
Testing
- Added tests in
well-known-locations.test.jsto verify dotfile access rules are applied consistently when paths contain..segments - Added a
.hidden-filetest fixture for dotfile-at-root-level test coverage
Docs
No docs changes needed.
Changes
There was some overlap in the string caching inside the new rendering, which wasn't by design.
This PR removes the content cache from inside the pooling. It wasn't meant to be there in the first place.
Still, the warm up of the cache is now done for the HtmlStringCache.
Another bug I found was the configuration. It poolSize didn't allow 0, even though we document that's how users should turn it off.
Testing
Manually tested against the docs repository. Updated the tests
Docs
Changes
This PR fixes the queued rendering by:
- correctly using the node when it's popped from pool (before it was creating a new one every single time pop)
- breaking down the pool into typed nodes. The size of the pool is shared, so the functionality is still the same
Testing
Added new tests
Docs
N/A
Changes
- Adds a global body size limit to
createRequest()that enforces a maximum request body size via a streaming size-limiting wrapper - The Node adapter's
createAppHandlerapplies a default 1GB body size limit to prevent unbounded memory consumption - Adds new
bodySizeLimitoption in the adapter, ex.node({ bodySizeLimit: Infinity })sets to no limit
Testing
- Added unit tests for body size limiting in
packages/astro/test/units/app/node.test.js:- Verifies request body exceeding the limit is rejected
- Verifies request body within the limit is accepted
- Verifies no limit is enforced when bodySizeLimit is not configured
Docs
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
main is currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, run changeset pre exit on main.
Releases
@astrojs/internal-helpers@0.8.0-beta.2
Minor Changes
- #15771
745e632Thanks @rururux! - Adds the new utilitiesMANY_LEADING_SLASHESandcollapseDuplicateLeadingSlashes.
astro@6.0.0-beta.19
Patch Changes
-
#15760
f49a27fThanks @ematipico! - Fixed an issue where queued rendering wasn't correctly re-using the saved nodes. -
#15728
12ca621Thanks @SvetimFM! - Improves internal state retention for persisted elements during view transitions, especially avoiding WebGL context loss in Safari and resets of CSS transitions and iframes in modern Chromium and Firefox browsers -
#15756
b6c64d1Thanks @matthewp! - Hardens the dev server by validating Sec-Fetch metadata headers to restrict cross-origin subresource requests -
#15414
faedcc4Thanks @sapphi-red! - Fixes a bug where some requests to the dev server didn't start with the leading/. -
Updated dependencies [
745e632]:- @astrojs/internal-helpers@0.8.0-beta.2
- @astrojs/markdown-remark@7.0.0-beta.10
@astrojs/cloudflare@13.0.0-beta.13
Patch Changes
- Updated dependencies [
745e632]:- @astrojs/internal-helpers@0.8.0-beta.2
- @astrojs/underscore-redirects@1.0.0
@astrojs/markdoc@1.0.0-beta.14
Patch Changes
- Updated dependencies [
745e632]:- @astrojs/internal-helpers@0.8.0-beta.2
- @astrojs/markdown-remark@7.0.0-beta.10
@astrojs/mdx@5.0.0-beta.11
Patch Changes
- Updated dependencies []:
- @astrojs/markdown-remark@7.0.0-beta.10
@astrojs/netlify@7.0.0-beta.13
Patch Changes
- Updated dependencies [
745e632]:- @astrojs/internal-helpers@0.8.0-beta.2
- @astrojs/underscore-redirects@1.0.0
@astrojs/node@10.0.0-beta.8
Patch Changes
- Updated dependencies [
745e632]:- @astrojs/internal-helpers@0.8.0-beta.2
@astrojs/vercel@10.0.0-beta.7
Patch Changes
- Updated dependencies [
745e632]:- @astrojs/internal-helpers@0.8.0-beta.2
@astrojs/markdown-remark@7.0.0-beta.10
Patch Changes
- Updated dependencies [
745e632]:- @astrojs/internal-helpers@0.8.0-beta.2
Changes
- Normalizes backslash characters (
\) in decoded URL pathnames before assigning tourl.pathname - Ensures middleware and the router see a consistent, canonical pathname
Testing
- Added
test/units/app/encoded-backslash-bypass.test.jswith 6 tests covering encoded backslash (%5C) handling in URL pathnames with dynamic routes and middleware - Verified all existing tests pass (double-slash bypass, trailing-slash, router-match, origin-pathname)
Docs
N/A, but fix
Here's the scenario this fixes:
- Developer has their dev server running
astro dev - Developer fixes another website that has a
<script src="http://localhost:4321/src/pages/index.astro"></script>, which is now exploited to this site.
Changes
- Adds
secFetchMiddlewareto the dev server middleware chain that validatesSec-Fetch-SiteandSec-Fetch-Moderequest headers - Blocks cross-origin subresource requests (e.g.
no-cors,corsmode) while allowing same-origin requests, navigations, websocket upgrades, and non-browser clients - The middleware is inserted at the front of the Vite middleware stack so it runs before any content is served
Testing
Added unit tests in packages/astro/test/units/dev/sec-fetch.test.js covering:
- Same-origin, same-site, and direct navigation requests are allowed
- Requests without Sec-Fetch headers (non-browser clients) are allowed
- Cross-origin navigation requests are allowed
- WebSocket upgrade requests are allowed (HMR)
- Cross-origin subresource requests are blocked with 403
Docs
No docs changes needed
Changes
- Adds a new
security.serverIslandBodySizeLimitconfig option (defaults to 1 MB) so server islands have their own body size limit, separate fromsecurity.actionBodySizeLimit - Extracts the body-reading logic into a shared utility (
core/request-body.ts) withreadBodyWithLimit()andBodySizeLimitError, used by both Actions and Server Islands - The server islands POST endpoint now reads the request body incrementally with a streaming reader and rejects payloads exceeding the configured limit with a 413 response
- Also checks the
Content-Lengthheader upfront for early rejection of oversized requests - Removes duplicated
readRequestBodyWithLimitfrom the actions runtime in favor of the shared utility
Testing
- Added unit tests for body size enforcement: oversized body returns 413, oversized Content-Length header returns 413, body within limit is accepted, default limit works when none is specified
- All existing server islands unit tests (19 total) pass
- All existing middleware app tests (20 total) pass
- Actions integration tests (including "Rejects oversized JSON action body") pass
Docs
fixes: #15655
Picked up from Houston AI suggestion.
Changes
Houston:
The root cause is in the dev server's route guard middleware (
packages/astro/src/vite-plugin-astro-server/route-guard.ts). When a request comes in for a path like/test, the guard checks whether a file or directory exists at the project root with that name usingfs.existsSync(). SinceexistsSyncreturns true for both files and directories, a directory namedtest/at the project root causes the guard to return a 404, even thoughsrc/pages/test.astrois a valid page route. This only affects the dev server and only when a root-level directory name collides with a page route name.
The fix changes the route guard to use
fs.statSync()instead offs.existsSync(), and only blocks the request when the path resolves to an actual file (not a directory). Directories at the project root are allowed through so that page routes with matching names can be served normally.
Testing
In addition to Houston's test for when both a directory and a matching route exist,
I added a test to verify that a 404 is correctly returned when a directory exists at the project root but no matching route exists.
Docs
N/A, bug fix
Changes
- When a session ID is supplied via cookie but has no corresponding server-side storage entry, the session now generates a new ID instead of using the cookie-supplied one
- Refactors
#ensureSessionID()to track whether the session ID originated from a client cookie vs. being freshly generated - Adds
#sessionIDFromCookieflag that is checked in#ensureData()and reset inregenerate()
Testing
Added tests
Docs
No user-facing changes
This PR contains the following updates:
Release Notes
sveltejs/svelte (svelte)
v5.53.8
Patch Changes
-
fix:
{@​html}no longer duplicates content insidecontenteditableelements (#17853) -
fix: don't access inert block effects (#17882)
-
fix: handle asnyc updates within pending boundary (#17873)
-
perf: avoid re-traversing the effect tree after
$:assignments (#17848) -
chore: simplify scheduling logic (#17805)
v5.53.7
Patch Changes
-
fix: correctly add __svelte_meta after else-if chains (#17830)
-
perf: cache element interactivity and source line splitting in compiler (#17839)
-
chore: avoid rescheduling effects during branch commit (#17837)
-
perf: optimize CSS selector pruning (#17846)
-
fix: preserve original boundary errors when keyed each rows are removed during async updates (#17843)
-
perf: avoid O(n²) name scanning in scope
generateandunique(#17844) -
fix: preserve each items that are needed by pending batches (#17819)
volarjs/services (volar-service-css)
v0.0.70
- refactor(pug): import parser from @vue/language-plugin-pug (#113)
- ci: add auto-version and release workflows (#115)
v0.0.69
Microsoft/vscode-html-languageservice (vscode-html-languageservice)
v5.6.2
Changes:
This list of changes was auto generated.
Configuration
📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
Changes
Fixes a bug that caused session.regenerate() to silently lose session data
Previously, regenerated session data was not saved under the new session ID unless set() was also called. This PR fixes this by setting #dirty to true when regenrate is called.
Testing
Added a test
Docs
Fixes #15607
The databaseFileEnvDefined() function used Vite's loadEnv('', process.cwd()) which defaults to only loading VITE_-prefixed environment variables. This meant ASTRO_DATABASE_FILE set in .env files was never detected, causing a false error during astro build.
The fix reuses the existing getAstroEnv() utility which correctly passes the 'ASTRO_' prefix to loadEnv(), consistent with how other parts of the @astrojs/db package load environment variables.
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
- Extracts path resolution logic in the node adapter static file handler into a
resolveStaticPathfunction - Adds a bounds check to ensure resolved paths stay within the client directory before hitting the filesystem
Testing
Added unit tests in packages/integrations/node/test/units/serve-static-path-traversal.test.js
Docs
N/A, bug fix
If the user adds a cookie in middleware, but the result of rendering is an error page (404 or 500), currently those cookies are not preserved. This ensures that they are by merging the Set-Cookie header properly.
Changes
- Improves
mergeResponsesinBaseAppto properly transferAstroCookiesfrom the original response to the merged response during error page rendering - Replaces
Map-based header merging withheaders.append()to correctly preserve multi-value headers likeSet-Cookie
Testing
- Added 3 unit tests in
test/units/middleware/middleware-app.test.jscovering cookie preservation when middleware returnsResponse(null, { status: 404 }),Response(null, { status: 500 }), and multiple cookies through sequenced middleware
Docs
No docs changes needed.
Changes
redirectIsExternal()now detects protocol-relative URLs (//) in addition tohttp://andhttps://- Route generator uses
collapseDuplicateLeadingSlasheswhen building segments to prevent double leading slashes in output
Practically what htis means is a redirect like:
redirects: { '/old/[...slug]': '/[...slug]' }
With a request like /old//evil.com/ would redirect to evil.com. This is defense in depth, a vulnerability would be required that creates path relative links to take advantage of this.
Testing
Unit tests added in packages/astro/test/units/redirects/open-redirect.test.js covering both redirectIsExternal and getRouteGenerator.
Docs
N/A, bug fix
Changes
X-Forwarded-Foris now gated bysecurity.allowedDomains, consistent with howX-Forwarded-Host,X-Forwarded-Proto, andX-Forwarded-Portare already handled.
Testing
Added and updated unit tests in packages/astro/test/units/app/node.test.js
Docs
N/A, bug fix
Changes
- Removes a special case in
addAttribute()that skipped escaping for URL values containing& - All dynamic attribute values now go through consistent escaping via
toAttributeString() - Removes the now-unused
isHttpUrlhelper
Testing
packages/astro/test/units/app/url-attribute-xss.test.js(new)- Updated assertion in
packages/astro/test/astro-attrs.test.js
Docs
N/A, bug fix
Changes
This PR moves the majority of getStaticPaths tests to be unit tested.
This PR moves some redirects tests to be unit tested.
I also moved some mocking functions inside a mocks.js
Testing
Green CI
Docs
N/A
Changes
This PR moves more uses cases to be tested as unit tests:
- custom 500
- HTML escape
- slot transformation
The HTML escape tests were living in two fixtures. I kept one test suite, and moved all cases in one test suite (fixtures included)
Testing
Green CI
Docs
Description
This PR removes some outdated translation pages from the Starlight documentation.
The goal is not to remove any languages that the documentation is currently translated into, but instead identify, discuss, cherry-pick, and remove any translations that may be outdated and also potentially harmful to users.
This PR starts by focusing on languages that have not been updated in the past year. For such languages, various factors have been considered to identify potentially misleading translations, such as:
- Breaking changes between Astro v4 → Astro v5 (and v6 around the corner)
- Many Starlight changes over the past year, including route data migration and cascade layers support
Considering the above criteria, it seems that our guides and reference pages are the most likely to be inaccurate if they are outdated, e.g. by showing invalid examples, outdated syntax or options, etc. Some other pages, while outdated, may not be as much of a problem, for example:
- Index page
- 404 page
- The environmental impact page
- Any page in the "Resources" section
Based on the above, I've identified the following languages as potentially having outdated and harmful translations, and thus I have removed such translation pages in this PR:
| Language | Last update | Translated pages | Deleted pages |
|---|---|---|---|
da |
2023-12-17 | 2 | 1 |
hi |
2024-08-09 | 11 | 8 |
id |
2024-10-16 | 14 | 11 |
it |
2024-08-16 | 20 | 14 |
pt-br |
2024-06-20 | 20 | 14 |
pt-pt |
2025-01-08 | 7 | 1 |
tr |
2024-05-20 | 11 | 6 |
This PR is meant to be a starting point for discussion, so if you are using one of the above languages, or have contributed to some of the translations, please feel free to share your thoughts and feedback on this PR, and we can discuss it further.
I'd also like to note that if at any future point, anyone is motivated and would like to translate in the long run some of the deleted pages, they would be more than welcome to do so, and these deleted pages would still be available in the git history, so they can be easily used as a base for new translations (even though sometimes it may be easier to just start from scratch considering the amount of changes).
Fixes #15730
Changes
- This fixes an issue in the Node.js middleware handler that was causing an EventEmitter leak warning when serving static pages and files. For the requests that were being passed on to Express / Fastify (e.g. static files / pre-rendered pages / etc.), the socket listener and AbortController cleanup wasn't being run before calling
next(). This fix makes sure to run the cleanup function before callingnext()(I did need to add the cleanup function to the exports from 'astro/app/node', which doesn't feel ideal). - Ideally, these socket listeners shouldn't be created in the first place if the request is just being passed on to Express / Fastify / another handler. I did explore another way of fixing this that would avoid that but it felt like it was making the code harder to reason about. I think it's worth further exploration though.
- I also see that the node adapter is getting a major refactor so might make sense to wait before bigger changes like that.
Testing
- Added a test that sends 30 back-to-back requests to a static page served by the Node.js middleware and Fastify. This triggers the EventEmitter leak warning and is caught by the test. This should help ensure a similar cleanup issue doesn't come up again.
Docs
- Internal fix, no docs needed
This PR contains the following updates:
Release Notes
withastro/compiler-rs (@astrojs/compiler-rs)
v0.1.4
Patch Changes
30299ab: Fixes an issue where certain compressHTML settings wouldn't work- Updated dependencies [
30299ab]- @astrojs/compiler-binding@0.1.4
v0.1.3
Patch Changes
c49b415: Trim body whitespace like the Go compiler does- Updated dependencies [
c49b415]- @astrojs/compiler-binding@0.1.3
v0.1.2
Patch Changes
efed4ed: Fixes further issues found in the Astro tests, especially around HTML escaping in set:html- @astrojs/compiler-binding@0.1.2
postcss/autoprefixer (autoprefixer)
v10.4.27
- Removed development key from
package.json.
v10.4.26
- Reduced package size.
v10.4.25
- Fixed broken gradients on CSS Custom Properties (by @serger777).
csstools/postcss-plugins (postcss-preset-env)
v11.2.0
February 21, 2026
- Added
@csstools/postcss-font-width-propertyCheck the plugin README for usage details. - Updated
cssdbto8.8.0
Configuration
📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
Changes
(ignore first commit please, it’s the commit for #15368)
Accessing Astro context in a React SSR environment requires some (big imo) unnecessary shenanigans. Some folks have hacked around this limitation. I see this and I think "why are we making people do this song and dance", especially when it’s so easy to just pass the Astro context in where it’s needed so that integrations can use it.
In this PR I’ve added Astro.locals to RendererContext, and I’ve updated the React integration to make use of the now-available locals value as well.
Testing
New tests added
Docs
Not documented yet
Summary
- Fixes
swapBodyElement()to lifttransition:persistelements to<html>before the bodyreplaceWith(), preventing Safari from losing WebGL2 context on<canvas>elements during page transitions.
Details
Safari loses WebGL2 context when canvas elements are briefly detached from the DOM tree. The current swapBodyElement() calls oldBody.replaceWith(newBody) first, which detaches the entire old body (including persist elements), then moves persist elements from old to new body. In the gap between detach and reattach, Safari fires webglcontextlost.
The fix moves persist elements to <html> (a safe parent that survives the swap) before replaceWith(), then places them into the new body afterward. This means persist elements are never detached from the DOM, so Safari doesn't lose the WebGL context.
Chrome and Firefox are unaffected by this change — they don't lose WebGL context on brief DOM detachment, so the fix is a no-op for them behaviorally.
Closes #15727 (Bug 3 — canvas context loss)
Test plan
- Astro project with
<ClientRouter />+<canvas transition:persist>initializing WebGL2 - Navigate between pages on Safari 18 (desktop and iPad) — canvas should retain WebGL context
- Rapid navigation (5+ quick clicks) — no blank canvas, no console errors
- Chrome/Firefox — no regression, persist elements still work correctly
-
astro-islandpersist elements — props still copied correctly after swap
🤖 Generated with Claude Code
Changes
- Add
branches: [main]filter to thebuild-sandbox-image.ymlworkflow'spushtrigger. - Without a branch filter, the workflow ran on every push to every branch. Branches merging
mainwould include the newly-added.flue/sandbox/files in the diff, satisfying thepathsfilter and triggering unnecessary builds (~47 runs, most on feature branches).
Testing
Verified against GitHub Actions docs that branches and paths are AND conditions — the workflow will now only trigger on pushes to main that change the specified files.
Docs
No docs needed — CI-only change.
fixes: #15722
Changes
- Ported
loadLanguagesfrom prismjs, rewrote them as ESM, and configured them to be loaded in Cloudflare Workers environments. - Accordingly, changed the
runHighlighterWithAstrofunction to an async function. - Updated files that depended on
runHighlighterWithAstroto also handle it as an async function.
Fixes a CommonJS-related error that occurred when using the Cloudflare Workers integration with the <Prism /> component in the latest beta of Astro.
The root cause was that the loadLanguages function exported from prismjs used require() and require.resolve() internally.
To work around this, i ported loadLanguages and its dependencies from the prismjs repository, rewrote them as ESM, and configured them to be loaded only in Cloudflare Workers environments.
Initially, i considered simply adding 'prismjs/components/index.js' to optimizeDeps.include in @astrojs/cloudflare, but this approach was abandoned because while require() was replaced, require.resolve() remained as-is and still caused an error.
As mentioned in this comment, I encountered an interesting phenomenon while investigating this issue.
Specifically, statically importing the prismjs module in the workerd environment caused the tests to become flaky, while switching to dynamic import made them stable.
This pull request therefore takes that approach. I've left an explanatory comment in the workerd-specific file.
Reference
loadLanguages: https://github.com/PrismJS/prism/blob/76dde18a575831c91491895193f56081ac08b0c5/components/index.js
Testing
Added a test to verify that the component works without errors in a workerd environment.
Docs
N/A, bug fix
Changes
- Use
Object.hasOwn()instead ofinoperator when resolving action names ingetAction(), so prototype methods likeconstructorortoStringare not treated as valid actions.
Testing
- Added tests in both dev and build that POST to
/_actions/constructor,/_actions/__proto__,/_actions/toString, and/_actions/valueOfand assert 404.
Docs
N/A, bug fix
This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @vue/compiler-sfc (source) | ^3.5.28 → ^3.5.29 |
||
| svelte (source) | ^5.53.1 → ^5.53.6 |
||
| vue (source) | ^3.5.28 → ^3.5.29 |
Release Notes
sveltejs/svelte (svelte)
v5.53.6
Patch Changes
-
perf: optimize parser hot paths for faster compilation (#17811)
-
fix:
SvelteMapincorrectly handles keys withundefinedvalues (#17826) -
fix: SvelteURL
searchsetter now returns the normalized value, matching native URL behavior (#17828) -
fix: visit synthetic value node during ssr (#17824)
-
fix: always case insensitive event handlers during ssr (#17822)
-
chore: more efficient effect scheduling (#17808)
-
perf: optimize compiler analysis phase (#17823)
-
fix: skip redundant batch.apply (#17816)
-
chore: null out current_batch before committing branches (#17809)
Configuration
📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
Changes
- Enables
erasableSyntaxOnlyfor packages and updates accordingly - I updated what I could for language tools then removed the flag since there some incompatible APIs that are required atm
Testing
Should pass
Docs
N/A, internal refactor
Changes
- Internal headers could sometimes leak when rendering error pages
- This PR improves the logic to always clean the response and makes sure we now pass render options down properly
Testing
Updated
Docs
Changeset
Changes
- Collapses multiple leading slashes (e.g.
//admin→/admin) inremoveBase()and#createNormalizedUrl() - Ensures middleware
context.url.pathnamealways reflects the canonical single-slash form that the router uses for matching
Testing
New unit test suite in packages/astro/test/units/app/double-slash-bypass.test.js with 6 tests
Docs
N/A, bug fix
Description
This PR adds a new theme to the theme catalog for the Rose Pine soho vibes.
Changes
Fixes an issue where static headers weren't correctly applied in the node.js adapter
Testing
Added a new test
Docs
N/A
Changes
- https://github.com/tinylibs/tinyclip is an e18e project to have an efficient/small package for copy/pasting stuff (announced here https://bsky.app/profile/43081j.com/post/3mgb2aziupk26)
- It is partly adapted from the current implementation
- This PR updates the implementation to use tinyclip, which is more robust
Testing
Updated, should pass
Docs
Changeset
Changes
Adds a prerenderEnvironment config option to cloudflare adapter
Closes #15684
Adds prerenderEnvironment: 'workerd' | 'node' to the adapter options (defaults to 'workerd'). When set to 'node', we skip the custom workerd-based prerenderer and the @cloudflare/vite-plugin prerender worker config, falling back to Astro's built-in prerender environment instead.
Makes prerenderEnvironment: 'node' work during astro dev by adding a Vite plugin that intercepts requests for prerendered pages and renders them through the prerender environment which is, currently, node instead of workerd.
Testing
adds tests to start up dev server and verify it is using the correct environement
Docs
/cc @withastro/maintainers-docs for feedback!
withastro/docs#13389
This PR contains the following updates:
Release Notes
cloudflare/workers-sdk (@cloudflare/vite-plugin)
v1.25.6
Patch Changes
-
#12673
a04f6f1Thanks @jamesopstad! - Move proxy shared secret to a constant that is reused across restarts. -
#12684
53025f9Thanks @jamesopstad! - Fix Miniflare being incorrectly disposed during rapid dev server restarts -
Updated dependencies [
99037e3,295297a,f765244,c0e9e08]:- miniflare@4.20260305.0
- wrangler@4.69.0
v1.25.5
Patch Changes
-
#12628
494ee7bThanks @Master-Hash! - Append Cloudflare defaults to existing.assetsignorefiles during build outputWhen a project includes a
PUBLIC_DIR/.assetsignore, the plugin now preserves those rules and appends the requiredwrangler.jsonand.dev.varsentries instead of replacing the file content. -
Updated dependencies [
3d6e421,294297e]:- wrangler@4.68.1
- miniflare@4.20260302.0
v1.25.4
Patch Changes
v1.25.3
Patch Changes
netlify/primitives (@netlify/vite-plugin)
v2.10.3
Dependencies
- The following workspace dependencies were updated
- dependencies
- @netlify/dev bumped from 4.11.2 to 4.11.3
- dependencies
vercel/vercel (@vercel/functions)
v3.4.3
Patch Changes
- [functions] Revert "[functions] URL encode cache tags" (#15213)
cloudflare/workers-sdk (wrangler)
v4.69.0
Minor Changes
-
#12625
c0e9e08Thanks @WillTaylorDev! - Addcacheconfiguration option for enabling worker cache (experimental)You can now enable cache before worker execution using the new
cacheconfiguration:This setting is environment-inheritable and opt-in. When enabled, cache behavior is applied before your worker runs.
Note: This feature is experimental. The runtime API is not yet generally available.
Patch Changes
-
#12661
99037e3Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260302.0 1.20260303.0 -
#12680
295297aThanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260303.0 1.20260305.0 -
#12671
f765244Thanks @MattieTK! - fix: Only redact account names in CI environments, not all non-interactive contextsThe multi-account selection error in
getAccountIdnow only redacts account names
when running in a CI environment (detected viaci-info). Non-interactive terminals
such as coding agents and piped commands can now see account names, which they need
to identify which account to configure. CI logs remain protected. -
Updated dependencies [
99037e3,295297a]:- miniflare@4.20260305.0
v4.68.1
Patch Changes
-
#12648
3d6e421Thanks @petebacondarwin! - Fix Angular scaffolding to allow localhost SSR in development modeRecent versions of Angular's
AngularAppEngineblock serving SSR onlocalhostby default. This causedwrangler dev/wrangler pages devto fail withURL with hostname "localhost" is not allowed.The fix passes
allowedHosts: ["localhost"]to theAngularAppEngineconstructor inserver.ts, which is safe to do even in production since Cloudflare will already restrict which host is allowed. -
#12657
294297eThanks @dario-piotrowicz! - Update Waku autoconfig logicAs of
1.0.0-alpha.4, Waku projects can be built on top of the Cloudflare Vite plugin, and the changes here allow Wrangler autoconfig to support this. Running autoconfig on older versions of Waku will result in an error. -
Updated dependencies []:
- miniflare@4.20260302.0
v4.68.0
Minor Changes
-
#12614
8d882faThanks @dario-piotrowicz! - Enable autoconfig forwrangler deployby default (while allowing users to still disable it via--x-autoconfig=falseif necessary) -
#12614
8d882faThanks @dario-piotrowicz! - Mark thewrangler setupcommand as stable
v4.67.1
Patch Changes
-
#12595
e93dc01Thanks @dario-piotrowicz! - Add a warning in the autoconfig logic letting users know that support for projects inside workspaces is limited -
#12582
c2ed7c2Thanks @penalosa! - Internal refactor to use capnweb's nativeReadableStreamsupport to power remote Media and Dispatch Namespace bindings. -
#12618
d920811Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260219.0 1.20260227.0 -
#12637
896734dThanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260227.0 1.20260302.0 -
#12601
ebdbe52Thanks @43081j! - Switch toempathicfor file-system upwards traversal to reduce dependency bloat. -
#12602
58a4020Thanks @anonrig! - Optimize filesystem operations by using Node.js's throwIfNoEntry: false optionThis reduces the number of system calls made when checking for file existence by avoiding the overhead of throwing and catching errors for missing paths. This is an internal performance optimization with no user-visible behavioral changes.
-
#12591
6f6cd94Thanks @martinezjandrew! - Implemented logic withinwrangler containers registries configureto check if a specified secret name is already in-use and offer to reuse that secret. Also added--skip-confirmationflag to the command to skip all interactive prompts. -
Updated dependencies [
c2ed7c2,d920811,896734d,58a4020]:- miniflare@4.20260302.0
Configuration
📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), 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 | Type | Update | Pending |
|---|---|---|---|---|---|---|
| @astrojs/rss (source) | ^4.0.15-beta.4 → ^4.0.15 |
dependencies | patch | |||
| @astrojs/sitemap (source) | ^3.6.1-beta.3 → ^3.7.0 |
dependencies | minor | |||
| @tailwindcss/vite (source) | ^4.2.0 → ^4.2.1 |
dependencies | patch | |||
| eslint (source) | ^9.39.2 → ^9.39.3 |
devDependencies | patch | |||
| fast-xml-parser | ^5.3.7 → ^5.4.1 |
dependencies | minor | |||
| nanostores | ^1.1.0 → ^1.1.1 |
dependencies | patch | |||
| node (source) | 24.13.1 → 24.14.0 |
minor | ||||
| node | 24.13.1-bullseye → 24.14.0-bullseye |
final | minor | |||
| node | 24.13.1-bookworm-slim → 24.14.0-bookworm-slim |
final | minor | |||
| pnpm (source) | 10.30.1 → 10.30.3 |
packageManager | patch | |||
| shiki (source) | ^3.22.0 → ^3.23.0 |
dependencies | minor | |||
| svelte (source) | ^5.53.0 → ^5.53.5 |
dependencies | patch | 5.53.6 |
||
| tailwindcss (source) | ^4.2.0 → ^4.2.1 |
dependencies | patch | |||
| turbo (source) | ^2.8.10 → ^2.8.11 |
devDependencies | patch | 2.8.12 |
||
| typescript-eslint (source) | ^8.56.0 → ^8.56.1 |
devDependencies | patch | |||
| vue (source) | ^3.5.28 → ^3.5.29 |
dependencies | patch |
Release Notes
withastro/astro (@astrojs/rss)
v4.0.15
Patch Changes
- #15199
d8e64efThanks @ArmandPhilippot! - Fixes the links to Astro Docs so that they match the current docs structure.
withastro/astro (@astrojs/sitemap)
v3.7.0
Minor Changes
-
#14471
4296373Thanks @Slackluky! - Adds the ability to split sitemap generation into chunks based on customizable logic. This allows for better management of large sitemaps and improved performance. The newchunksoption in the sitemap configuration allows users to define functions that categorize sitemap items into different chunks. Each chunk is then written to a separate sitemap file.integrations: [ sitemap({ serialize(item) { th return item }, chunks: { // this property will be treated last on the configuration 'blog': (item) => { // will produce a sitemap file with `blog` name (sitemap-blog-0.xml) if (/blog/.test(item.url)) { // filter path that will be included in this specific sitemap file item.changefreq = 'weekly'; item.lastmod = new Date(); item.priority = 0.9; // define specific properties for this filtered path return item; } }, 'glossary': (item) => { if (/glossary/.test(item.url)) { item.changefreq = 'weekly'; item.lastmod = new Date(); item.priority = 0.7; return item; } } // the rest of the path will be stored in `sitemap-pages.0.xml` }, }), ],
v3.6.1
Patch Changes
- #15033
dd06779Thanks @florian-lefebvre! - Updates how routes are retrieved to avoid relying on a deprecated API
eslint/eslint (eslint)
v9.39.3
Bug Fixes
Chores
8594a43chore: upgrade @eslint/js@9.39.3 (#20529) (Milos Djermanovic)9ceef92chore: package.json update for @eslint/js release (Jenkins)af498c6chore: ignore/docs/v9.xin link checker (#20453) (Milos Djermanovic)
NaturalIntelligence/fast-xml-parser (fast-xml-parser)
v5.4.1
v5.4.0: Separate Builder
XML Builder was the part of fast-xml-parser for years. But considering that any bug in builder may false-alarm the users who are only using parser and vice-versa, we have decided to split it into a separate package.
Migration
To migrate to fast-xml-builder;
From
import { XMLBuilder } from "fast-xml-parser";To
import XMLBuilder from "fast-xml-builder";XMLBuilder will be removed from current package in any next major version of this library. So better to migrate.
v5.3.9: support strictReservedNames
Full Changelog: NaturalIntelligence/fast-xml-parser@v5.3.9...v5.3.9
nanostores/nanostores (nanostores)
v1.1.1
- Fixed types by projects without
DOMtypes (by @YevheniiKotyrlo). - Fixed docs (by @hamzakargin and @Fryuni).
shikijs/shiki (shiki)
v3.23.0
🚀 Features
- Update grammar and themes - by @antfu (9b4ca)
- cli:
- Add stdin support and list commands - by @Divyapahuja31 and DIVYA PAHUJA in #1241 (213f1)
- transformers:
- Add 'leading' position to transformerRenderWhitespace - by @Divyapahuja31 and DIVYA PAHUJA in #1236 (49cbb)
- Add support for [!code info] notation - by @Divyapahuja31 and DIVYA PAHUJA in #1237 (cd2a6)
🐞 Bug Fixes
- Add
declaremodifier to top level declarations in.d.ts- by @KazariEX in #1242 (142d5) - cli: Normalize language/extension casing for CLI inputs - by @Nandann018-ux and @antfu in #1245 (4bea1)
View changes on GitHub
vercel/turborepo (turbo)
v2.8.11: Turborepo v2.8.11
What's Changed
Docs
- chore: Migrate to Ultracite by @haydenbleasel in #11948
@turbo/repository
- perf: Defer TLS initialization to a background thread by @anthonyshew in #11967
- fix: Add repository field to @turbo/repository package.json by @anthonyshew in #11982
- release(library): 0.0.1-canary.19 by @github-actions[bot] in #11983
Changelog
- fix: Get all pnpm lockfile pruning tests passing by @anthonyshew in #11897
- perf: Optimize pnpm lockfile transitive closure resolution by @anthonyshew in #11898
- fix: Resolve npm packages in @turbo/gen compiled binary by @anthonyshew in #11900
- perf: Deduplicate file hashing and parallelize globwalks by @anthonyshew in #11902
- perf: Improve transitive dependency resolution cache sharing across workspaces by @anthonyshew in #11903
- perf: Reduce filesystem syscalls in globwalk, SCM hashing, and task scheduling by @anthonyshew in #11907
- feat: Remove daemon from
turbo run, deprecate daemon flags and config by @anthonyshew in #11910 - test: Replace help text integration tests with insta snapshots by @anthonyshew in #11911
- perf: Reduce allocations in SCM hashing, glob preprocessing, and cache lookups by @anthonyshew in #11916
- perf: Parallelize package.json loading and reduce builder allocations by @anthonyshew in #11918
- perf: Cache compiled env wildcard regexes for builtin pass-through patterns by @anthonyshew in #11920
- perf: Replace O(N) workspace path lookup with HashMap index in DependencySplitter by @anthonyshew in #11922
- perf: Parallelize lockfile parsing with workspace discovery by @anthonyshew in #11927
- perf: Optimize
turbo runhotpath with parallelization and reduced allocations by @anthonyshew in #11928 - perf: Share HTTP client and improve profile instrumentation by @anthonyshew in #11929
- perf: Share HTTP client and improve profile instrumentation by @anthonyshew in #11932
- perf: Reduce git subprocess calls on startup by @anthonyshew in #11934
- chore: Upgrade zstd 0.12.3 to 0.13.3 by @anthonyshew in #11936
- perf: Replace git subprocesses with
libgit2and skip unnecessary summary work by @anthonyshew in #11938 - perf: Reduce per-package hashing overhead and eliminate SCM subprocesses by @anthonyshew in #11942
- perf: Reduce CPU overhead in
turbo runhot path by @anthonyshew in #11947 - perf: Replace
libgit2git status withgix-indexfor faster file hashing by @anthonyshew in #11950 - perf: Resolve literal input paths via stat instead of glob walk by @anthonyshew in #11955
- perf: Optimize engine builder, task visitor, and untracked file discovery by @anthonyshew in #11956
- perf: Parallelize
turbo runpre-execution hot path by @anthonyshew in #11958 - chore: Add tracing spans to uninstrumented hot path functions by @anthonyshew in #11959
- perf: Use
Arc<str>for task dependency hashes to avoid heap clones by @anthonyshew in #11962 - perf: Add more tracing spans into startup path by @anthonyshew in #11965
- perf: Parallelize task hash computation across topological waves by @anthonyshew in #11969
- perf: Send engine callback before tracker bookkeeping and add tracing spans by @anthonyshew in #11970
- fix: Resolve git_root to worktree root in linked worktrees by @anthonyshew in #11974
- perf: Fast path for shallow wildcard glob patterns in workspace discovery by @anthonyshew in #11972
- chore: Move git hooks from pre-commit to pre-push and match CI lint checks by @anthonyshew in #11977
- chore: Update AGENTS.md by @anthonyshew in #11978
- perf: Replace heap-allocated String with stack-allocated OidHash for git OIDs by @anthonyshew in #11984
- perf: Eliminate redundant syscalls in FSCache fetch and exists by @anthonyshew in #11985
- perf: Reduce per-task allocations in visitor dispatch loop by @anthonyshew in #11986
- docs: Fix same-page anchor links that don't scroll to target by @anthonyshew in #11989
- docs: Mention inputs key in package hash inputs table by @anthonyshew in #11990
- fix(docs): update sitemap.md to single-line pipe-delimited format by @molebox in #11976
- fix: Disable husky pre-push hook during release staging by @anthonyshew in #11991
- fix: Use versioned schema URLs in Turborepo skill files by @anthonyshew in #11994
- fix: Restore daemon client in
RunCacheforturbo watchby @anthonyshew in #11995
Full Changelog: vercel/turborepo@v2.8.10...v2.8.11
typescript-eslint/typescript-eslint (typescript-eslint)
v8.56.1
This was a version bump only for typescript-eslint to align it with other projects, there were no code changes.
See GitHub Releases for more information.
You can read about our versioning strategy and releases on our website.
Configuration
📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), 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.
Last fetched: | Scheduled refresh: Every Saturday
See Customizing GitHub Activity Pages to configure your own
Inspired by prs.atinux.com


{ "cache": { "enabled": true, }, }