Skip to content

AstroEco is Contributing…

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

withastro/astro

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.json specifically for the tests
  • I added a new typecheck:tests job 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

withastro/astro

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

Changes

  • Fixes astro preview static server to merge user Vite config from astro.config.mjs (config.vite) before starting Vite preview.

  • Keeps preview defaults/overrides on top (configFile: false, Astro-managed preview fields, Astro preview plugin).

  • Applies allowedHosts after merge to avoid Vite array-concatenation behavior.

  • Preserves precedence:

    • explicit Astro server.allowedHosts (true or non-empty array) wins
    • otherwise merged vite.preview.allowedHosts is used
  • Fixes #16088.

withastro/astro

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

withastro/astro

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.

withastro/astro

Changes

  • Replaces the optimize-deps skill with reference/optimize-deps.md
  • Removes the unreliable "Load Domain-Specific Skills" step from diagnose.md and fix.md in the triage pipelin
  • Adds a "Deep Dives" section to AGENTS.md with 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
withastro/astro

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

withastro/astro

Changes

  • The diagnose and fix triage 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
withastro/astro

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

withastro/astro

Changes

  • Guards the buildStart hook in the astro:scripts Vite plugin to skip this.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 config hook and returns early from buildStart when command === 'serve'. The emitFile() call still runs during build as intended, ensuring before-hydration script chunks are correctly emitted for production builds.

Closes #16026
Closes #15975

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, and injectScript in 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.
withastro/astro

Changes

Closes AST-6
Closes #16053

Testing

Added a new test

Docs

N/A

withastro/astro

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

withastro/astro

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

withastro/astro

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.

withastro/astro

Changes

Testing

Manually + new unit test

Docs

Changeset

withastro/astro

Changes

  • Removes alertdialog and application from the aria_non_interactive_roles array 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-attribute error 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

withastro/astro

Changes

  • The a11y-missing-attribute dev 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, or aria-labelledby for <area>; title, aria-label, or aria-labelledby for <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 match function. 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 format and pnpm lint with no new issues.

Docs

  • No docs update needed — this is an internal dev toolbar audit rule fix with no user-facing API change.
withastro/astro

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.

withastro/astro

Changes

  • menuitemradio was incorrectly listed in the aria_non_interactive_roles array used by the dev toolbar's a11y audit rules.
  • Per the WAI-ARIA spec, menuitemradio is 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 on a11y-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.
withastro/astro

Changes

  • Adds a new agent skill at .agents/skills/optimize-deps/SKILL.md documenting tribal knowledge about Vite's dep optimizer as it applies to the Astro dev server.
  • Covers how optimizeDeps works (scan phase vs bundle phase), why non-JS files like .astro require special handling, the roles of vitefu, vite-plugin-environment, and astroFrontmatterScanPlugin, 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.
withastro/astro

Changes

Updates svgo to the latest

Testing

Green CI

Docs

withastro/astro

Changes

  • Server Islands (server:defer) now work correctly in Netlify production deployments when using output: 'static' (the default). Previously the /_server-islands/* endpoint returned 404.
  • The bug was in astro:config:done: buildOutput was destructured from the hook params before setAdapter() was called, capturing a stale 'static' snapshot. Since buildOutput is a getter on settings.buildOutput, and setAdapter() upgrades it to 'server', the fix is to read params.buildOutput after setAdapter() rather than destructuring it upfront.

Testing

  • Added a regression test in test/static/static-headers.test.js that asserts the SSR function directory is created after building a output: 'static' project with a server:defer island — the exact scenario from the bug report.
  • The existing static-headers fixture 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

withastro/astro

Changes

  • When astro dev starts, Astro now checks if vite@8 is installed at the top level of the user's project and emits a warning directing them to add "overrides": { "vite": "^7" } to their package.json. Vite 8 at the top level causes subtle breakage with the Cloudflare adapter because @cloudflare/vite-plugin resolves vite via 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 a require_dist is not a function crash in workerd's CustomModuleRunner.
  • astro add cloudflare now prompts the user to add "overrides": { "vite": "^7" } to their package.json automatically. This prevents the issue from being introduced later (e.g. if the user installs @tailwindcss/vite after adding the Cloudflare adapter, which hoists Vite 8 to the top level).

Testing

  • Reproduced the crash manually: npm create astro@latest with --add cloudflare --add tailwind, delete node_modules + package-lock.json, reinstall — astro build fails with require_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

withastro/astro

Changes

  • Adds a Changesets section to the astro-pr-writer skill covering when changesets are required, file format, bump type rules, and CI restrictions on major/minor core 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.
withastro/astro

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.js as 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

withastro/astro

Changes

Testing

Docs

withastro/astro

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.

withastro/astro

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:

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.

withastro/astro

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:

  1. Create a Svelte component with generics attribute:
<script lang="ts" generics="T extends boolean = false">
  interface Props { flag?: T; items: T extends true ? number[] : string[] }
  let { flag, items }: Props = $props();
</script>
  1. Import and use it in an .astro file
  2. Before the fix: TypeScript errors and no intellisense
  3. After the fix: props are correctly inferred with generic constraints

Docs

No docs changes are required.

withastro/astro

Changes

  • Server islands no longer crash with this.result.serverIslandNameMap.get is not a function in dev when using an adapter that adds a separate prerender Vite environment
  • The bug was triggered by a specific navigation order: visiting any page without a server island first caused the virtual:astro:server-island-manifest module to be cached in the prerender environment with placeholder string values. When a page with a server island was then visited, the plugin invalidated the module only in the ssr environment — the prerender environment 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 configureServer to 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-island now renders correctly instead of returning HTTP 500.
  • No automated test added: the bug only manifests with a prerender environment, 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

withastro/astro

Changes

  • ssrAssetsPerEnvironment is 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 an index.astro that imports a CSS file and a [...path].astro catch-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 with assetsInlineLimit: 0, starts a Fastify server, and asserts that requesting the CSS asset URL returns text/css rather than text/html from 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

withastro/starlight

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

withastro/astro

Changes

Note

Summary generated via AI

Closes #16042

  • When astro dev runs 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 with http:// because it only checked whether Vite itself was configured with TLS (vite.server.https). The CSRF origin check then compared http://host (server-side URL) against Origin: https://host (browser header) and returned 403 for every non-GET form submission.
  • The dev server now calls validateForwardedHeaders to derive the protocol from X-Forwarded-Proto, gated on security.allowedDomains being non-empty — the same security guard used in production (core/app/node.ts). Without allowedDomains the header is untrusted and behaviour is identical to before.
  • security.allowedDomains is 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.checkOrigin is now respected in dev unconditionally. The previous buildOutput === 'server' gate suppressed CSRF protection in dev regardless of the user's config.
  • getFirstForwardedValue (previously an inline closure in node.ts) is extracted and exported from validate-headers.ts, the natural home for forwarded-header utilities, and reused in both node.ts and the dev server.

Testing

  • 15 new unit tests in test/units/app/dev-url-construction.test.js cover the URL construction logic in isolation: no allowedDomains (header ignored), matching allowedDomains (header trusted), wildcard hostname patterns, multi-value comma-separated headers, malicious injection attempts (javascript:, URL-injection), isHttps fallback, and the end-to-end CSRF implication (constructed url.origin matches the browser Origin header iff and only if allowedDomains is configured).
  • All 62 existing node.test.js tests and 35 csrf.test.js tests continue to pass with no changes.

Docs

N/A

withastro/starlight

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

withastro/starlight

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@astrojs/starlight@0.38.3

Patch Changes

  • #3770 6e7bed1 Thanks @gameroman! - Adds examples to the inline documentation for title in the Starlight configuration object
withastro/astro

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.

withastro/astro

Summary

  • switch Vitest config references to vitest/config so 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=0
  • cd packages/integrations/markdoc && bunx nve 24.14.0 pnpm run test

Notes

  • I couldn't fully rerun test:check-examples locally because this checkout's linked @astrojs/check workspace package is missing its language-tools build output, but the original CI failure there was the Vitest config typing error fixed in this patch.
withastro/astro

Changes

  • Unpin fast-xml-parser from exact 5.4.1 to ^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+:

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/rss tests 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.

withastro/astro

Changes

Testing

  • existing

Docs

  • none bug fix
withastro/astro

Changes

Resolves #16032.

  • Adds image as 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.

withastro/astro

Changes

  • Add verifyOptions to 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 :

スクリーンショット 2026-03-26 1 27 53

Test result in local after implementation :

スクリーンショット 2026-03-26 1 29 39

Docs

withastro/astro

Changes

https://developer.mozilla.org/en-US/docs/Web/API/PopStateEvent/hasUAVisualTransition

  • Skip document.startViewTransition() when PopStateEvent.hasUAVisualTransition is true
  • 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:

  1. Navigate between pages using <ClientRouter />
  2. Swipe back/forward with gesture
  3. 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.

withastro/starlight

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.

withastro/astro

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

astro@6.1.0

Minor Changes

  • #15804 a5e7232 Thanks @merlinnot! - Allows setting codec-specific defaults for Astro's built-in Sharp image service via image.service.config.

    You can now configure encoder-level options such as jpeg.mozjpeg, webp.effort, webp.alphaQuality, avif.effort, avif.chromaSubsampling, and png.compressionLevel when using astro/assets/services/sharp for compile-time image generation.

    These settings apply as defaults for the built-in Sharp pipeline, while per-image quality still takes precedence when set on <Image />, <Picture />, or getImage().

  • #15455 babf57f Thanks @AhmadYasser1! - Adds fallbackRoutes to the IntegrationResolvedRoute type, exposing i18n fallback routes to integrations via the astro:routes:resolved hook for projects using fallbackType: '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 10a1a5a Thanks @trueberryless! - Adds support for advanced configuration of SmartyPants in Markdown.

    You can now pass an options object to markdown.smartypants in 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-smartypants options for more information.

Patch Changes

  • #16025 a09f319 Thanks @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 ccecb8f Thanks @Gautam-Bharadwaj! - Fixes an issue where client:only components could have duplicate client:component-path attributes added in MDX in rare cases

  • #16081 44fc340 Thanks @crazylogic03! - Fixes the emitFile() is not supported in serve mode warning that appears during astro dev when using integrations that inject before-hydration scripts (e.g. @astrojs/react)

  • #16068 31d733b Thanks @Karthikeya1500! - Fixes the dev toolbar a11y audit incorrectly classifying menuitemradio as a non-interactive ARIA role.

  • #16080 e80ac73 Thanks @ematipico! - Fixes experimental.queuedRendering incorrectly escaping the HTML output of .html page files, causing the page content to render as plain text instead of HTML in the browser.

  • #16048 13b9d56 Thanks @matthewp! - Fixes a dev server crash (serverIslandNameMap.get is not a function) that occurred when navigating to a page with server:defer after first visiting a page without one, when using @astrojs/cloudflare

  • #16093 336e086 Thanks @Snugug! - Fixes Zod meta not correctly being rendered on top-level schema when converted into JSON Schema

  • #16043 d402485 Thanks @ematipico! - Fixes checkOrigin CSRF protection in astro dev behind a TLS-terminating reverse proxy. The dev server now reads X-Forwarded-Proto (gated on security.allowedDomains, matching production behaviour) so the constructed request origin matches the https:// origin the browser sends. Also ensures security.allowedDomains and security.checkOrigin are respected in dev.

  • #16064 ba58e0d Thanks @ematipico! - Updates the dependency svgo to the latest, to fix a security issue.

  • #16007 2dcd8d5 Thanks @florian-lefebvre! - Fixes a case where fonts files would unecessarily be copied several times during the build

  • #16017 b089b90 Thanks @felmonon! - Fix the astro sync error message when getImage() is called while loading content collections.

  • #16014 fa73fbb Thanks @matthewp! - Fixes a build error where using astro:config/client inside a <script> tag would cause Rollup to fail with "failed to resolve import virtual:astro:routes from virtual:astro:manifest"

  • #16054 f74465a Thanks @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 198d31b Thanks @adampage! - Fixes a bug where the the role image was incorrectly reported by audit tool bar.

  • #15935 278828c Thanks @oliverlynch! - Fixes cached assets failing to revalidate due to redirect check mishandling Not Modified responses.

  • #16075 2c1ae85 Thanks @florian-lefebvre! - Fixes a case where invalid URLs would be generated in development when using font families with an oblique style and angles

  • #16062 87fd6a4 Thanks @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 to package.json when running astro add cloudflare. This prevents a require_dist is not a function crash caused by a Vite version split between Astro (requires Vite 7) and packages like @tailwindcss/vite that hoist Vite 8.

  • Updated dependencies [10a1a5a]:

    • @astrojs/markdown-remark@7.1.0

@astrojs/preact@5.1.0

Minor Changes

  • #15862 06fba3a Thanks @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 10a1a5a Thanks @trueberryless! - Updates createMarkdownProcessor to support advanced SmartyPants options.

    The smartypants property in AstroMarkdownOptions now accepts Smartypants options, 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-smartypants options.

@astrojs/rss@4.0.18

Patch Changes

@astrojs/cloudflare@13.1.4

Patch Changes

  • #16041 56d2bde Thanks @kylemclean! - 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.

  • 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 ccb6a9c Thanks @matthewp! - Fixes server islands returning 404 in production when using output: 'static' (the default)

  • Updated dependencies []:

    • @astrojs/underscore-redirects@1.0.2

@astrojs/node@10.0.4

Patch Changes

  • #16002 846f27f Thanks @buley! - Fixes file descriptor leaks from read streams that were not destroyed on client disconnect or read errors

  • #15941 f41584a Thanks @ematipico! - Fixes an infinite loop in resolveClientDir() 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 846f27f Thanks @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

@astrojs/sitemap@3.7.2

Patch Changes

  • #15455 babf57f Thanks @AhmadYasser1! - Fixes i18n fallback pages missing from the generated sitemap when using fallbackType: 'rewrite'.

@astrojs/svelte@8.0.4

Patch Changes

  • #15604 3e1ac66 Thanks @pierreeurope! - Adds a temporary workaround for a Svelte bug causing empty class attributes in SSR output.

  • #16050 89a7250 Thanks @seroperson! - Using a Svelte component with generic type parameters now correctly infer props in .astro files

@astrojs/vercel@10.0.3

Patch Changes

astro-vscode@2.16.14

Patch Changes

withastro/astro

Fixes #16012.

Summary

  • align the default LiveLoader data type with its existing Record<string, any> constraint
  • update the related live content public types to use the same default
  • add a type regression covering defineLiveCollection() with a LiveLoader whose data shape is declared as an interface

Verification

  • pnpm run build:ci
  • pnpm exec tsc --noEmit --moduleResolution bundler --module esnext --target es2022 --types node ./test/types/define-live-collection.ts
withastro/astro

Summary

  • construct the astro:assets sync-time getImage() error using the public AstroUserError signature
  • add a CLI regression for astro sync so the thrown content-types error stays descriptive
  • include a patch changeset for the astro package

Testing

  • pnpm run build:ci
  • pnpm exec astro-scripts test "test/astro-sync.test.js"

Fixes #16015

withastro/astro

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

withastro/astro

Changes

  • Fixes a build error where importing astro:config/client inside a <script> tag (client environment) caused Rollup to fail with failed to resolve import "virtual:astro:routes" from "virtual:astro:manifest".
  • Refactored astro:config/client in virtual-module.ts to inline config values directly from AstroSettings at plugin creation time, instead of generating code that imports from virtual:astro:manifest.

Testing

  • Added a regression test in test/serializeManifest.test.js with a new fixture (astro-manifest-client-script) that imports astro:config/client inside a <script> tag in an SSR project (using output: 'server' + test adapter). The test asserts the build succeeds — it fails on main with the exact Rollup error from the issue and passes with the fix applied.

Docs

N/A, bug fix

Fixes #15991

withastro/astro

Changes

  • Fixes a permanent hang on the first HTTP request when using @astrojs/cloudflare in 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 into virtual:astro:dev-css-all, which statically imports all per-route virtual: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, and virtual: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-dev test (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

withastro/astro

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

withastro/astro

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 fsMod instance, so that we can pass a virtual file system
  • The build pipeline has been broken down into generate and renderPath. renderPath doesn't save anything to disk. The caller is responsible for that (in our case, the generate function)
  • We have now a mocked AstroPrerender that 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 final RouteList

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

withastro/astro

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

withastro/astro

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

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 (graph bubbling and marker detection), then updates vite-plugin-head to 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.js to 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.js Markdown dedupe behavior is covered by policy/runtime unit tests and existing head render unit assertions.
  • packages/astro/test/head-injection.test.js slot/slots.render fixture scenarios are covered by packages/astro/test/units/render/head-injection-app.test.js and packages/astro/test/units/render/head.test.js.
  • packages/astro/test/units/dev/head-injection.test.js page-scope dynamic injection is covered by packages/astro/test/units/render/head-injection-app.test.js.
  • packages/astro/test/units/dev/head-injection.test.js nested layout dynamic injection is covered by packages/astro/test/units/render/head-injection-app.test.js.
  • packages/astro/test/content-collections-render.test.js propagation stopping-point behavior is covered by packages/astro/test/units/render/head-propagation/boundary.test.js and packages/astro/test/units/render/head-propagation/graph.test.js.
  • packages/astro/test/content-collections.test.js propagation 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.
withastro/astro

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

astro@6.0.8

Patch Changes

  • #15978 6d182fe Thanks @seroperson! - Fixes a bug where Astro Actions didn't properly support nested object properties, causing problems when users used zod functions such as superRefine or discriminatedUnion.

  • #16011 e752170 Thanks @matthewp! - Fixes a dev server hang on the first request when using the Cloudflare adapter

  • #15997 1fddff7 Thanks @ematipico! - Fixes Astro.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

withastro/starlight

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#28970structuredClone() was removed in both — this PR just avoids introducing some unnecessary code duplication and forking of code paths.

withastro/astro

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

withastro/astro

Changes

  • normalizeFilename in vite-plugin-utils now 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 /@fs and /path variants are already handled.

Testing

  • Added a new test fixture (alias-path-alias-style) with a minimal Astro project: a tsconfig.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

withastro/astro

Changes

  • In v6, runHookBuildSetup was called once with target: 'server', causing integrations that conditionally set define globals based on vite.build.ssr (e.g. @analogjs/astro-angular setting ngServerMode: "true") to place those values at the top level of the Vite config. Because Vite merges the top-level define into every environment's resolved config, server-only values leaked into the client bundle and broke hydration.
  • The fix calls runHookBuildSetup for both 'server' and 'client' targets. The client call receives build.ssr: false so 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 the ssr and prerender environment configs. The client environment is also explicitly marked ssr: false.

Testing

  • Added a unit test that simulates an integration which sets a define only when build.ssr is truthy. Asserts the define is present for the server hook call and absent for the client hook call with ssr: false.
  • All existing build unit tests pass.

Docs

No docs update needed — this is a bug fix restoring v5 build isolation behavior.

Fixes #15911

withastro/astro

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

withastro/astro

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 their importedModules set is empty and the CSS walk terminates early. Added ensureModulesLoaded() which recursively walks the graph and eagerly fetches any untransformed modules via env.fetchModule() before the CSS collection walk runs.
  • ensureModulesLoaded() mirrors the same PROPAGATED_ASSET_QUERY_PARAM stopping point used by collectCSSWithOrder(), 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-import tests (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

withastro/astro

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

astro@6.0.7

Patch Changes

  • #15950 acce5e8 Thanks @matthewp! - Fixes a build regression in projects with multiple frontend integrations where server:defer server islands could fail at runtime when all pages are prerendered.

  • #15988 c93b4a0 Thanks @ossaidqadri! - Fix styles from dynamically imported components not being injected on first dev server load.

  • #15968 3e7a9d5 Thanks @chasemccoy! - Fixes renderMarkdown in custom content loaders not resolving images in markdown content. Images referenced in markdown processed by renderMarkdown are now correctly optimized, matching the behavior of the built-in glob() loader.

  • #15990 1e6017f Thanks @ematipico! - Fixes an issue where Astro.currentLocale would always be the default locale instead of the actual one when using a dynamic route like [locale].astro or [locale]/index.astro. It now resolves to the correct locale from the URL.

  • #15990 1e6017f Thanks @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 1d84020 Thanks @matthewp! - Fixes Cloudflare dev server islands with prerenderEnvironment: 'node' by sharing the serialized manifest encryption key across dev environments and routing server island requests through the SSR runtime.

  • #15735 9685e2d Thanks @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 calling next().

create-astro@5.0.3

Patch Changes

  • #15967 8db1f62 Thanks @matthewp! - Warn when --yes is used with a third-party template to clarify that dependency installation may run lifecycle scripts.

@astrojs/node@10.0.3

Patch Changes

  • #15735 9685e2d Thanks @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 calling next().

@astrojs/svelte@8.0.3

Patch Changes

  • #15961 7e8d0ee Thanks @matthewp! - Fix Cloudflare dev SSR dependency optimization to compile .svelte.js and .svelte.ts dependency modules that use Svelte runes.

@astrojs/vercel@10.0.2

Patch Changes

  • #15959 335a204 Thanks @matthewp! - Fix Vercel serverless path override handling so override values are only applied when the trusted middleware secret is present.
withastro/astro

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

withastro/astro

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.

withastro/starlight

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@astrojs/starlight@0.38.2

Patch Changes

  • #3759 f24ce99 Thanks @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., zh Simplified Chinese) instead of the region-specific ones (e.g., zh-TW Traditional Chinese).

  • #3768 a4c6c20 Thanks @delucis! - Improves performance of sidebar generation for sites with very large sidebars

withastro/astro

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.

withastro/astro

Closes #15389,
Closed #13795

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 / templateExit functions to be inlined by compiler inside of <template> tags. These functions add instructions that track <template> nesting depth during rendering.
  • stringifyChunk skips dedup for scripts when templateDepth > 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.

withastro/astro

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

Closes #14387

Changes

  • Added support for nested objects with dot notation in form data parsing
  • formDataToObject now recursively processes nested ZodObject schemas, converting dot-notation form keys (like bc.b) into nested object structures ({ bc: { b: ... } })

Testing

  • Covering most of cases I could imagine in form-data-to-object.test.js: nested objects, superRefine wrapping, deeper 3-level nesting, optional/nullable/default nested objects, nested discriminatedUnion
  • Several new integration tests in actions.test.js: nested form objects, superRefine validation, nested discriminatedUnion

Docs

No new API was introduced, so likely no docs changes are required

/cc @withastro/maintainers-docs

withastro/astro

Summary

This fixes a bug where SSR catch-all routes in dev would try to handle Vite’s own internal dev/HMR URLs.

  • Update astroDevHandler to use the same Vite internal path filter as astroDevPrerenderHandler
  • 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
withastro/astro

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, spread metadata and add a combined imagePaths field from localImagePaths + 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 renderMarkdown with 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

withastro/astro

Changes

  • Add a warning when --yes is 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.
withastro/astro

Changes

  • Remove pull request-writing guidance from astro-developer so it stays focused on coding architecture, debugging, constraints, and testing context.
  • Add a dedicated astro-pr-writer skill 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.
withastro/astro

Changes

  • Resolve #... specifiers in the client
  • resolvePath is 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.
withastro/astro

Changes

  • Add server optimizeDeps esbuild plugins in @astrojs/svelte to compile .svelte and .svelte.js/.svelte.ts dependency 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.js using $state runes.
  • Fixes #15906.

Testing

  • Added packages/integrations/cloudflare/test/svelte-rune-deps.test.js.

Docs

N/A bug fix

withastro/astro

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

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

Just updating the readme for the Cloudflare adapter which now targets Cloudflare Workers instead of Pages functions

withastro/astro

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

withastro/astro

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.js with a fixture that reproduces the exact scenario: a component using Astro.slots.render with 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.

withastro/astro

Changes

  • Fixes a regression where prerender-only projects using server:defer with framework components could fail at runtime due to SSR renderers being stripped.
  • Refactors server-island tracking into a shared ServerIslandsState class 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.
withastro/astro

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.svg returns 404.
  • GET /test.svg returns 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 configureServer and 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 unhandledRejection listener 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.svg returns 200 when public/test.svg exists.
  • Verified astro dev without the Cloudflare adapter still behaves as before.
withastro/astro

Changes

  • Improved tolerance for dynamic .html routes: Updated the routing logic to support .html.astro files.
  • Defined routing priority: index.html > [hogehoge].html.astro.
  • issue : #15930

Test

スクリーンショット 2026-03-17 2 28 51
withastro/astro

Changes

Update VS Code extension file template snippets to be scoped to astro files.

file template expansion

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

withastro/astro

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

withastro/astro

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

astro@6.0.6

Patch Changes

  • #15965 2dca307 Thanks @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 6102ca2 Thanks @jpc-ae! - Updates the create astro welcome message to highlight the graceful dev/preview server quit command rather than the kill process shortcut

  • #15953 7eddf22 Thanks @Desel72! - fix(hmr): eagerly recompile on style-only change to prevent stale slots render

  • #15916 5201ed4 Thanks @trueberryless! - Fixes InferLoaderSchema type inference for content collections defined with a loader that includes a schema

  • #15864 d3c7de9 Thanks @florian-lefebvre! - Removes temporary support for Node >=20.19.1 because Stackblitz now uses Node 22 by default

  • #15944 a5e1acd Thanks @fkatsuhiro! - Fixes SSR dynamic routes with .html extension (e.g. [slug].html.astro) not working

  • #15937 d236245 Thanks @ematipico! - Fixes an issue where HMR didn't correctly work on Windows when adding/changing/deleting routes in pages/.

  • #15931 98dfb61 Thanks @Strernd! - Fix skew protection query params not being applied to island hydration component-url and renderer-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

create-astro@5.0.2

Patch Changes

@astrojs/db@0.20.1

Patch Changes

  • #15364 948b693 Thanks @VagnoDev! - Replace deprecated deep-diff with microdiff and resolve subdependency warnings.

@astrojs/markdoc@1.0.2

Patch Changes

  • #15864 d3c7de9 Thanks @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 d3c7de9 Thanks @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

@astrojs/react@5.0.1

Patch Changes

@astrojs/solid-js@6.0.1

Patch Changes

@astrojs/svelte@8.0.2

Patch Changes

@astrojs/language-server@2.16.6

Patch Changes

astro-vscode@2.16.13

Patch Changes

@astrojs/markdown-remark@7.0.1

Patch Changes

  • Updated dependencies [d3c7de9]:
    • @astrojs/prism@4.0.1

@astrojs/upgrade@0.7.1

Patch Changes

withastro/astro

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

withastro/starlight

Summary

  • Fix default locale buildResources using stripLangRegion result 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-TW monolingual site verifying search.label returns 搜尋 (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

withastro/astro

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 revalidateRemoteImage when 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.

withastro/astro

Changes

Updates our integrations to point to 6.0.0 as a peer dep

Testing

Green CI

Docs

withastro/astro

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

withastro/astro

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 build

Before this fix, rendered islands had:

  • component-url="/_astro/...js" (no dpl)
  • renderer-url="/_astro/...js" (no dpl)

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 entryModules with appendAssetQuery(...) so island URL resolution gets assetQueryParams.
    • Keep raw entry module values for static file tracking and page script handling to avoid double-appending.
  • 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 assetsPrefix routing when URLs already contain query params.
  • packages/astro/test/asset-query-params.test.js

    • Add island coverage asserting component-url and renderer-url include ?dpl=test-deploy-id.
    • Add regression coverage for assetsPrefix map (js/css/fallback) + assetQueryParams, ensuring island URLs still use JS CDN prefix.

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

Related: #14545, #14543, #14627, #14853

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
svelte (source) ^5.53.8^5.54.1 age confidence
yaml (source) ^2.8.2^2.8.3 age confidence

Release Notes

eemeli/yaml (yaml)

v2.8.3

Compare Source


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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@preact/preset-vite ^2.10.3^2.10.5 age confidence
@preact/signals (source) ^2.8.1^2.8.2 age confidence
@vitejs/plugin-react (source) ^5.1.4^5.2.0 age confidence
@vitejs/plugin-vue (source) ^6.0.4^6.0.5 age confidence
@vitejs/plugin-vue-jsx (source) ^5.1.4^5.1.5 age confidence
@vue/compiler-sfc (source) ^3.5.29^3.5.30 age confidence
devalue ^5.6.3^5.6.4 age confidence
preact (source) ^10.28.4^10.29.0 age confidence
svelte (source) ^5.53.6^5.54.1 age confidence
svelte2tsx (source) ^0.7.51^0.7.52 age confidence
vite-plugin-solid ^2.11.10^2.11.11 age confidence
vite-plugin-vue-devtools (source) ^8.0.6^8.1.0 age confidence
vite-svg-loader 5.1.05.1.1 age confidence
vue (source) ^3.5.29^3.5.30 age confidence

Release Notes

preactjs/preset-vite (@​preact/preset-vite)

v2.10.5

Compare Source

What's Changed

New Contributors

Full Changelog: preactjs/preset-vite@2.10.4...2.10.5

v2.10.4

Compare Source

What's Changed

Full Changelog: preactjs/preset-vite@2.10.3...2.10.4

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

v5.2.0

Compare Source

vitejs/vite-plugin-vue (@​vitejs/plugin-vue-jsx)

v5.1.5

Miscellaneous Chores
sveltejs/svelte (svelte)

v5.54.1

Compare Source

Patch Changes
  • fix: hydration comments during hmr (#​17975)

  • fix: null out effect.b in destroy_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

Compare Source

Patch Changes
  • fix: use Promise for async kit handler return types (#​2966)
solidjs/vite-plugin-solid (vite-plugin-solid)

v2.11.11

Compare Source

Patch Changes
vuejs/devtools (vite-plugin-vue-devtools)

v8.1.0

Compare Source

No significant changes

    View changes on GitHub

v8.0.7

Compare Source

   🚀 Features
   🐞 Bug Fixes
    View changes on GitHub
jpkleemans/vite-svg-loader (vite-svg-loader)

v5.1.1

Compare Source


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.

withastro/astro

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

Changes

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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@astrojs/compiler (source) ^3.0.0^3.0.1 age confidence
@astrojs/compiler-rs (source) ^0.1.4^0.1.6 age confidence
@clack/prompts (source) ^1.0.1^1.1.0 age confidence
@preact/signals (source) 2.8.12.8.2 age confidence
@shikijs/rehype (source) ^4.0.0^4.0.2 age confidence
@shikijs/twoslash (source) ^4.0.0^4.0.2 age confidence
@solidjs/router ^0.15.4^0.16.1 age confidence
@tailwindcss/vite (source) ^4.2.1^4.2.2 age confidence
@vitejs/plugin-vue (source) ^6.0.4^6.0.5 age confidence
postcss (source) ^8.5.6^8.5.8 age confidence
preact (source) ^10.28.4^10.29.0 age confidence
rehype-pretty-code (source) ^0.14.1^0.14.3 age confidence
sass ^1.97.3^1.98.0 age confidence
shiki (source) ^4.0.0^4.0.2 age confidence
svelte (source) ^5.53.6^5.54.0 age confidence
tailwindcss (source) ^4.2.1^4.2.2 age confidence
tinyclip ^0.1.6^0.1.12 age confidence
tinyexec ^1.0.2^1.0.4 age confidence
vue (source) ^3.5.29^3.5.30 age confidence

Release Notes

withastro/compiler (@​astrojs/compiler)

v3.0.1

Compare Source

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

Compare Source

Patch Changes

v0.1.5

Compare Source

Patch Changes
  • ddf38ff: Fixes dynamic slots not working correctly
  • 21b6cd5: Fixes CSS scoping not working correctly when using :global with pseudo elements
  • e93a108: Fixes the compiler scoping nested selectors in certain cases
  • c8f6dc5: Fixed an issue where define:vars scripts would not be handled correctly
  • c8f6dc5: 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]
bombshell-dev/clack (@​clack/prompts)

v1.1.0

Compare Source

Minor Changes
  • e3333fb: Replaces picocolors with Node.js built-in styleText.
Patch Changes
  • c3666e2: destruct limitOption param for better code readability, tweak types definitions
  • ba3df8e: Fixes withGuide support in intro, outro, and cancel messages.
  • Updated dependencies [e3333fb]
preactjs/signals (@​preact/signals)

v2.8.2

Compare Source

Patch Changes
shikijs/shiki (@​shikijs/rehype)

v4.0.2

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v4.0.1

Compare Source

   🐞 Bug Fixes
    View changes on GitHub
solidjs/solid-router (@​solidjs/router)

v0.16.1

Patch Changes
  • e847f96: Fix the published package contents so dist no longer includes mirrored src, test, or co-located spec files.

    Also move the data tests under test/ and align the test TypeScript config with that layout so test:types continues to pass cleanly.

v0.16.0

Minor Changes
Patch Changes
  • 63940c5: Use name in action and createAsync

    action() and createAsync() were not respecting user defined name.
    Moreover, action was not applying the hashed name and only naming the action "mutate".

  • f9b6dc6: Make useHref return a string with string param

tailwindlabs/tailwindcss (@​tailwindcss/vite)

v4.2.2

Compare Source

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 @property at-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-1234size-1234) (#​19809)
  • Fix canonicalization resulting in empty list (e.g. w-5 h-5 size-5'' instead of size-5) (#​19812)
vitejs/vite-plugin-vue (@​vitejs/plugin-vue)

v6.0.5

Miscellaneous Chores
postcss/postcss (postcss)

v8.5.8

Compare Source

  • Fixed Processor#version.

v8.5.7

Compare Source

  • Improved source map annotation cleaning performance (by CodeAnt AI).
preactjs/preact (preact)

v10.29.0

Compare Source

Features

Fixes

Performance

rehype-pretty/rehype-pretty-code (rehype-pretty-code)

v0.14.3

Compare Source

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

Compare Source

Command-Line Interface
  • Gracefully handle dependency loops in --watch mode.
Dart API
  • Add a const Logger.defaultLogger field. 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 SassCalculation for 'calc' with
    an argument that can't be simplified.

  • Properly emit deprecation warnings as text rather than StringBuffer objects
    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

Compare Source

Minor Changes
  • feat: allow css, runes, customElement compiler options to be functions (#​17951)
Patch Changes
  • fix: reinstate reactivity loss tracking (#​17801)

v5.53.13

Compare Source

Patch Changes
  • fix: ensure $inspect after 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

Compare Source

Patch Changes
  • fix: update select.__value on change (#​17745)

  • chore: add invariant helper 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

Compare Source

Patch Changes
  • fix: remove untrack circular 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

Compare Source

Patch Changes
  • fix: re-process batch if new root effects were scheduled (#​17895)

v5.53.9

Compare Source

Patch Changes
  • fix: better bind:this cleanup timing (#​17885)
tinylibs/tinyclip (tinyclip)

v0.1.12

Compare Source

What's Changed

Full Changelog: tinylibs/tinyclip@0.1.11...0.1.12

v0.1.11

Compare Source

What's Changed

Full Changelog: tinylibs/tinyclip@0.1.10...0.1.11

v0.1.10

Compare Source

What's Changed

Full Changelog: tinylibs/tinyclip@0.1.9...0.1.10

v0.1.9

Compare Source

What's Changed

Full Changelog: tinylibs/tinyclip@0.1.8...0.1.9

v0.1.8

Compare Source

What's Changed

Full Changelog: tinylibs/tinyclip@0.1.7...0.1.8

tinylibs/tinyexec (tinyexec)

v1.0.4

Compare Source

What's Changed

New Contributors

Full Changelog: tinylibs/tinyexec@1.0.3...1.0.4

v1.0.3

Compare Source

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/.bin executables 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

Full Changelog: tinylibs/tinyexec@1.0.2...1.0.3

vuejs/core (vue)

v3.5.30

Compare Source

Bug Fixes

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.

withastro/astro

Summary

  • keep generated AstroComponent suffixes in the internal TSX output used by the language server
  • rewrite .astro auto-import completion labels and resolved import edits back to the expected component name
  • add regression coverage for the .astro auto-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 AstroCheck fixture tests because @astrojs/svelte and @astrojs/vue are not installed in this environment; the TypeScript/completion suites above pass)
withastro/astro

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.client to the environment guard in buildStart() of vite-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-url resolves in the build output (this test fails without bug fix)

Docs

No docs changes needed — restores existing injectScript('before-hydration', ...) behavior.

withastro/astro

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 io option.

Testing

  • Added a new test that failed before my change to confirm this fixes things.
  • Removed additionalProperties: false from 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 using z.strictObject()
  • Other existing tests should pass.

Docs

n/a — bug fix

withastro/astro

Changes

Closes #15897

I applied a custom resolver solely for CSS files.

Testing

Added a new test

Docs

N/A

withastro/starlight

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.

withastro/astro

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/): was cpSync, now cp -rc on 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 by sha256(package-lock.json)
  • On cache hit, skips nodeFileTrace entirely (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 clones dist/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
withastro/astro

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

withastro/astro

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 verifies server:defer island fetches return 200.

Docs

  • No docs changes needed. This is a dev routing bug fix and test coverage update.
withastro/astro

Changes

  • move Astro Actions server-output validation from astro:config:done to astro:routes:resolved so 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 = false route, and include a patch changeset

Docs

N/A, bug fix

withastro/astro

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

astro@6.0.5

Patch Changes

  • #15891 b889231 Thanks @matthewp! - Fix dev routing for server:defer islands when adapters opt into handling prerendered routes in Astro core. Server island requests are now treated as prerender-handler eligible so prerendered pages using prerenderEnvironment: 'node' can load island content without 400 errors.

  • #15890 765a887 Thanks @matthewp! - Fixes astro:actions validation to check resolved routes, so projects using default static output with at least one prerender = false page or endpoint no longer fail during startup.

  • #15884 dcd2c8e Thanks @matthewp! - Avoid a MaxListenersExceededWarning during astro dev startup by increasing the shared Vite watcher listener limit when attaching content server listeners.

  • #15904 23d5244 Thanks @jlukic! - Emit the before-hydration script chunk for the client Vite environment. The chunk was only emitted for prerender and ssr environments, causing a 404 when browsers tried to load it. This broke hydration for any integration using injectScript('before-hydration', ...), including Lit SSR.

  • #15933 325901e Thanks @ematipico! - Fixes an issue where <style> tags inside SVG components weren't correctly tracked when enabling CSP.

  • #15875 c43ef8a Thanks @matthewp! - Ensure custom prerenderers are always torn down during build, even when getStaticPaths() throws.

  • #15887 1861fed Thanks @ematipico! - Fixes an issue where the build incorrectly leaked server entrypoint into the client environment, causing adapters to emit warnings during the build.

  • #15888 925252e Thanks @matthewp! - Fix a bug where server:defer could fail at runtime in prerendered pages for some adapters (including Cloudflare), causing errors like serverIslandMap?.get is not a function.

  • #15901 07c1002 Thanks @delucis! - Fixes JSON schema generation for content collection schemas that have differences between their input and output shapes.

  • #15882 759f946 Thanks @matthewp! - Fix Astro.url.pathname for the root page when using build.format: "file" so it resolves to /index.html instead of /.html during builds.

create-astro@5.0.1

Patch Changes

  • #15885 817afb6 Thanks @matthewp! - Avoid spawning package manager commands with shell: true to prevent Node.js DEP0190 warnings during create-astro runs on newer Node versions.

@astrojs/cloudflare@13.1.2

Patch Changes

  • #15888 925252e Thanks @matthewp! - Fixes a bug where dependencies imported by prerender-only server:defer islands could remain as bare imports in server output, causing module resolution failures in preview and Cloudflare Workers.

  • #15934 6f8f0bc Thanks @ematipico! - Updates the Astro peerDependencies#astro to be 6.0.0.

  • #15875 c43ef8a Thanks @matthewp! - Include workerd response details in Cloudflare prerenderer errors to make getStaticPaths() failures easier to diagnose.

  • Updated dependencies []:

    • @astrojs/underscore-redirects@1.0.1

@astrojs/markdoc@1.0.1

Patch Changes

@astrojs/mdx@5.0.1

Patch Changes

@astrojs/netlify@7.0.3

Patch Changes

  • #15934 6f8f0bc Thanks @ematipico! - Updates the Astro peerDependencies#astro to be 6.0.0.

  • Updated dependencies []:

    • @astrojs/underscore-redirects@1.0.1

@astrojs/node@10.0.2

Patch Changes

@astrojs/preact@5.0.1

Patch Changes

  • #15881 de2860c Thanks @matthewp! - Fix useId() 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

@astrojs/vercel@10.0.1

Patch Changes

@astrojs/vue@6.0.1

Patch Changes

@astrojs/check@0.9.8

Patch Changes

  • #15892 a2f597d Thanks @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 7b4b254 Thanks @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 7b4b254 Thanks @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.
withastro/astro

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/serverIslandNameMap maps.

Docs

  • No docs update needed; this is a bug fix for incorrect runtime behavior.
withastro/astro

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

withastro/astro

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: true which 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.
withastro/astro

Changes

  • Raise the Vite watcher max listener limit in attachContentServerListeners() when it is below 50 (and not unlimited), preventing noisy MaxListenersExceededWarning on astro dev startup.
  • 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.
withastro/astro

Changes

  • fix root Astro.url.pathname in build.format: \"file\" builds to return /index.html instead of /.html

Testing

  • add integration assertions for root and non-root Astro.url.pathname behavior in page-format tests

Docs

N/A, bug fix

Closes #15866

withastro/astro

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-id and reuse it during hydration/client-only render paths
  • This is necessary because useId in Preact is only scoped to the root.
  • Fixes #15831

Testing

  • add a Preact fixture + test that verifies unique useId output across multiple islands

Docs

N/A, bug fix

withastro/astro

Changes

  • Add a dedicated PR writing guide at .agents/skills/astro-developer/pull-requests.md that defines section-by-section rules for Changes, Testing, and Docs, including reviewer-useful implementation detail expectations.
  • Update the skill decision matrix in .agents/skills/astro-developer/SKILL.md to 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 Changes bullets.
  • Checked the template and self-check list align with the same constraints (behavior + how it works in Changes, scenario-based validation in Testing, 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-developer skill.
withastro/astro

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 finally block 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.
withastro/astro

Changes

Closes #15836

Testing

Manually tested. No more warning

Docs

withastro/astro

Changes

  • Fix dev-only CSS missing on newly created pages until server restart.
  • Invalidate virtual:astro:dev-css-all when 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).
withastro/astro

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

withastro/astro

Fixes #15857.

Changes

  • Add astro/toolbar to optimizeDeps.include in 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
withastro/astro

Changes

  • Update the unknown file extension error hint to recommend vite.resolve.noExternal instead of vite.ssr.noExternal.
  • Aligns guidance with Astro 6 / Vite 7 config behavior.
  • Fixes #15856

Testing

N/A

Docs

N/A bug fix

withastro/astro

Changes

Closes #15839

  • Applies noExternal using the proper configEnvrionment hook 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

withastro/astro

Changes

Testing

N/A

Docs

Changeset

withastro/astro

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.

withastro/starlight

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@astrojs/starlight@0.38.1

Patch Changes

  • #3751 fb955ff Thanks @pyxelr! - Fixes a regression causing global tableOfContents config to be ignored
withastro/astro

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

astro@6.0.4

Patch Changes

  • #15870 920f10b Thanks @matthewp! - Prebundle astro/toolbar in dev when custom dev toolbar apps are registered, preventing re-optimization reloads that can hide or break the toolbar.

  • #15876 f47ac53 Thanks @ematipico! - Fixes redirectToDefaultLocale producing a protocol-relative URL (//locale) instead of an absolute path (/locale) when base is '/'.

  • #15767 e0042f7 Thanks @matthewp! - Fixes server islands (server:defer) not working when only used in prerendered pages with output: 'server'.

  • #15873 35841ed Thanks @matthewp! - Fix a dev server bug where newly created pages could miss layout-imported CSS until restart.

  • #15874 ce0669d Thanks @ematipico! - Fixes a warning when using prefetchAll

  • #15754 58f1d63 Thanks @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 76b3a5e Thanks @matthewp! - Update the unknown file extension error hint to recommend vite.resolve.noExternal, which is the correct Vite 7 config key.

@astrojs/cloudflare@13.1.1

Patch Changes

  • #15815 d1872ee Thanks @matthewp! - Prebundle additional Astro runtime dependencies for Cloudflare development server, speeding up initial start time and preventing required restarts.

  • #15872 3b47b89 Thanks @Princesseuh! - Fixes images not working in dev mode when using the cloudflare option

  • Updated dependencies []:

    • @astrojs/underscore-redirects@1.0.1

@astrojs/netlify@7.0.2

Patch Changes

  • #15868 bb2b8f5 Thanks @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 bb2b8f5 Thanks @ematipico! - Fixes an issue where the adapter would cause a series of warnings during the build.
withastro/starlight

Description

  • Closes #3748
  • With zod v4, .default(value).optional() returns the default value for undefined input instead of undefined itself. This caused the frontmatter tableOfContents field 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 shared TableOfContentsBaseSchema and created two separate exports:
    • UserConfigTableOfContentsSchema() — wraps the base with .default(defaults) for the user config.
    • FrontmatterTableOfContentsSchema() — wraps the base with .optional() so undefined is preserved when frontmatter does not set the field.
  • schema.ts: Updated the frontmatter schema to use FrontmatterTableOfContentsSchema().
  • utils/user-config.ts: Updated to use UserConfigTableOfContentsSchema().

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.

withastro/starlight

Description

  • Removes the temporary patch for the starlight-links-validator plugin that was temporarily added in #3644
  • Updates the starlight-links-validator plugin from version 0.14.0 to 0.20.0 which includes support for Astro v6
  • Fixes a link issue in a hero action link (feature introduced in version 0.19.0 of the plugin)
withastro/astro
withastro/astro

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

withastro/astro

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@astrojs/cloudflare@13.1.0

Minor Changes

  • #15711 b2bd27b Thanks @OliverSpeir! - Adds a prerenderEnvironment option to the Cloudflare adapter.

    By default, Cloudflare uses its workerd runtime for prerendering static pages. Set prerenderEnvironment to '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 50fcc8b Thanks @aqiray! - fix: show actionable error when running astro preview without prior build

  • #15794 d1ac58e Thanks @OliverSpeir! - Fixes image serving in passthrough mode by using the Cloudflare ASSETS binding instead of generic fetch, which does not work in Workers for local assets

  • #15850 660da74 Thanks @tristanbes! - fix(cloudflare): forward configPath and other PluginConfig options to the Cloudflare Vite Plugin

    Options like configPath, inspectorPort, persistState, remoteBindings, and auxiliaryWorkers were accepted by the type system but never forwarded to cfVitePlugin(), making them silently ignored.

    Also fixes addWatchFile for configPath which resolved the path relative to the adapter's node_modules directory instead of the project root.

  • #15843 fcd237d Thanks @Calvin-LL! - fix cloudflare image transform ignoring quality parameter

  • Updated dependencies []:

    • @astrojs/underscore-redirects@1.0.1

astro@6.0.3

Patch Changes

  • #15711 b2bd27b Thanks @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 1cdaf9f Thanks @ematipico! - Fixes a regression where the the routes emitted by the astro:build:done hook didn't have the distURL array correctly populated.

  • #15765 ca76ff1 Thanks @matthewp! - Hardens server island POST endpoint validation to use own-property checks for improved consistency

withastro/astro

Summary

Fixes #15846

  • Forward cloudflareOptions to cfVitePlugin() — Options like configPath, inspectorPort, persistState, remoteBindings, and auxiliaryWorkers are accepted by the type system (via Pick<PluginConfig, ...> in the Options type) but were never spread into the cfVitePlugin() call, making them silently ignored.

  • Fix addWatchFile path resolution for configPathcreateRequire(import.meta.url).resolve(configPath) resolves relative to the adapter's own node_modules/@astrojs/cloudflare/dist/ directory instead of the project root, causing a Cannot find module error. Replaced with new 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:

  1. Spread cloudflareOptions into cfVitePlugin() so all PluginConfig options are forwarded
  2. Use new URL(configPath, config.root) instead of createRequire(import.meta.url).resolve(configPath)
  3. Remove unused createRequire import

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.

withastro/astro

Closes #15837

Changes

  • Running astro preview with the Cloudflare adapter without a prior astro build threw a cryptic ENOENT error with a long stack trace
  • Added an explicit check for .wrangler/deploy/config.json before 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 preview without a prior build
  • Verified that astro preview works correctly after running astro build
  • Changeset added ✅

Docs

No docs update needed. The error message itself is self-explanatory.

withastro/astro

Changes

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

withastro/starlight

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

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@astrojs/starlight-tailwind@5.0.0

Major Changes

  • #3644 0d2e7ed Thanks @HiDeoo! - ⚠️ BREAKING CHANGE: The minimum supported version of Starlight is now 0.38.0

    Please use the @astrojs/upgrade command to upgrade your project:

    npx @astrojs/upgrade

@astrojs/starlight-docsearch@0.7.0

Minor Changes

  • #3644 0d2e7ed Thanks @HiDeoo! - ⚠️ BREAKING CHANGE: The minimum supported version of Starlight is now 0.38.0

    Please use the @astrojs/upgrade command to upgrade your project:

    npx @astrojs/upgrade

@astrojs/starlight-markdoc@0.6.0

Minor Changes

  • #3644 0d2e7ed Thanks @HiDeoo! - ⚠️ BREAKING CHANGE: The minimum supported version of Starlight is now 0.38.0

    Please use the @astrojs/upgrade command to upgrade your project:

    npx @astrojs/upgrade

@astrojs/starlight@0.38.0

Minor Changes

  • #3644 0d2e7ed Thanks @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.collections flag. 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.collections flag.

    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 docs and i18n collections, you can enable the legacy.collectionsBackwardsCompat flag 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 375edcc Thanks @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 the components/ directory. Direct use of these files was not and is not officially supported. If you previously imported TableOfContents/starlight-toc.ts, TableOfContents/TableOfContentsList.astro, Icons.ts, or SidebarPersistState.ts, please review your code when updating.

  • #3729 3642625 Thanks @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 fff38d5 Thanks @HiDeoo! - Makes hover styles consistent in Starlight’s navigation bar

    Previously, 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;
    }
withastro/astro

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

astro@6.0.2

Patch Changes

@astrojs/cloudflare@13.0.2

Patch Changes

  • #15832 95e12a2 Thanks @Princesseuh! - Fixes return; syntax not working in the frontmatter correctly in certain contexts

  • #15803 e42b015 Thanks @merlinnot! - Fixes the Cloudflare adapter adding a SESSION KV binding even when sessions are explicitly configured to use a different driver, such as unstorage/drivers/null.

  • Updated dependencies []:

    • @astrojs/underscore-redirects@1.0.1
withastro/astro

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

withastro/astro

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

withastro/astro

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to 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 c2cd371 Thanks @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
withastro/astro

Changes

Backport of #15779

Testing

Updated tests

Docs

N/A

withastro/astro

Changes

  • Restore tsconfig preview output in astro add by rendering the computed diff before the confirmation prompt.
Screenshot 2026-03-10 at 9 18 36 AM

Testing

There isn't existing test infrastructure for astro add, and this was confirmed manually.

Docs

N/A, bug fix

withastro/astro

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

astro@6.0.1

Patch Changes

  • #15827 a4c0d0b Thanks @matthewp! - Fixes astro add so the tsconfig preview shows the actual pending changes before confirmation

@astrojs/rss@4.0.17

Patch Changes

astro-vscode@2.16.11

Patch Changes

withastro/astro

Changes

A previous merge reverted this by accident, bringing it back to fix VS Code publishing.

Testing

N/A

Docs

N/A

withastro/astro

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@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

@astrojs/language-server@2.16.4

Patch Changes

@astrojs/ts-plugin@1.10.7

Patch Changes

astro-vscode@2.16.10

Patch Changes

@astrojs/yaml2ts@0.2.3

Patch Changes

@astrojs/underscore-redirects@1.0.1

Patch Changes

withastro/astro

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

withastro/astro

Changes

  • Draft PR to test support for Vite 8

Testing

Looking to get CI green

Docs

Not yet

withastro/astro

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

withastro/astro

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.include entries 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

withastro/astro

Changes

  • Patched @changesets/changelog-github to 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

withastro/astro

Changes

Closes #15799

Testing

Added tests

Docs

withastro/astro

Exit prerelease mode, merging this will update the CI release to publish 6, which will be blocked until release.

withastro/astro

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.

withastro/astro

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

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

withastro/astro

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!

withastro/astro

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.

withastro/astro

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

withastro/docs#13362

withastro/astro

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.

withastro/astro

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 picomatch to optimizeDeps.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. reloading

In 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

withastro/astro

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

withastro/astro

Changes

  • Upgrades to @astrojs/compiler@3

Testing

N/A

Docs

N/A

withastro/astro

Changes

Update the template for Astro 6

Testing

N/A. Tested manually

Docs

N/A

withastro/astro

Changes

  • We'll do types: [] in Astro 7, when TS 6 will have more adoption
  • Closes #15785

Testing

N/A

Docs

withastro/astro

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.

withastro/astro

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

withastro/docs#13351

withastro/astro

Changes

This PR fixes an issue where certain secrete can be exposed to the client if vite.envPrefix includes them.

cc @florian-lefebvre

Testing

Added unit tests and integration tests

Docs

N/A

withastro/astro

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

withastro/astro

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

withastro/astro

Changes

  • Preserves the port from the Host header when constructing the request URL without allowedDomains configured, ensuring the origin includes the correct port (e.g., http://localhost:4321 instead of http://localhost)
  • Restricts X-Forwarded-Proto to only be trusted when allowedDomains is 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-Proto rejection when no allowedDomains is configured
  • All existing CSRF protection and request construction tests continue to pass

Docs

No docs changes needed.

withastro/astro

Changes

  • Strips Content-Length and Transfer-Encoding headers from the original response before merging in mergeResponses(), matching the existing treatment of Content-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.js verifying that Content-Length and Transfer-Encoding from 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.

withastro/astro

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

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

Minor Changes

  • #15700 4e7f3e8 Thanks @ocavue! - Updates the internal logic during SSR by providing additional metadata for UI framework integrations.

  • #15781 2de969d Thanks @ematipico! - Adds a new clientAddress option to the createContext() function

    Providing this value gives adapter and middleware authors explicit control over the client IP address. When not provided, accessing clientAddress throws 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 f9ee868 Thanks @matthewp! - Adds a new security.serverIslandBodySizeLimit configuration option

    Server island POST endpoints now enforce a body size limit, similar to the existing security.actionBodySizeLimit for Actions. The new option defaults to 1048576 (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 7ac43c7 Thanks @florian-lefebvre! - Improves astro info by supporting more operating systems when copying the information to the clipboard.

  • #15780 e0ac125 Thanks @ematipico! - Prevents vite.envPrefix misconfiguration from exposing access: "secret" environment variables in client-side bundles. Astro now throws a clear error at startup if any vite.envPrefix entry matches a variable declared with access: "secret" in env.schema.

    For example, the following configuration will throw an error for API_SECRET because it's defined as secret its name matches ['PUBLIC_', 'API_'] defined in env.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 4ebc1e3 Thanks @ematipico! - Fixes an issue where the computed clientAddress was incorrect in cases of a Request header with multiple values. The clientAddress is now also validated to contain only characters valid in IP addresses, rejecting injection payloads.

  • #15776 e9a9cc6 Thanks @matthewp! - Hardens error page response merging to ensure framing headers from the original response are not carried over to the rendered error page

  • #15759 39ff2a5 Thanks @matthewp! - Adds a new bodySizeLimit option to the @astrojs/node adapter

    You 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 0 to 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 02e24d9 Thanks @matthewp! - Fixes CSRF origin check mismatch by passing the actual server listening port to createRequest, ensuring the constructed URL origin includes the correct port (e.g., http://localhost:4321 instead of http://localhost). Also restricts X-Forwarded-Proto to only be trusted when allowedDomains is configured.

  • #15768 6328f1a Thanks @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 631aaed Thanks @matthewp! - Hardens URL pathname normalization to consistently handle backslash characters after decoding, ensuring middleware and router see the same canonical pathname

  • #15761 8939751 Thanks @ematipico! - Fixes an issue where it wasn't possible to set experimental.queuedRendering.poolSize to 0.

  • #15764 44daecf Thanks @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 a91da9f Thanks @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 39ff2a5 Thanks @matthewp! - Adds a new bodySizeLimit option to the @astrojs/node adapter

    You 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 0 to 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 02e24d9 Thanks @matthewp! - Fixes CSRF origin check mismatch by passing the actual server listening port to createRequest, ensuring the constructed URL origin includes the correct port (e.g., http://localhost:4321 instead of http://localhost). Also restricts X-Forwarded-Proto to only be trusted when allowedDomains is configured.

  • #15763 1567e8c Thanks @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 4ebc1e3 Thanks @ematipico! - Added a new entry point called /request, which exposes utilities to work with the Request type:
    • 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 the x-forwarded-for header.

Patch Changes

  • #15700 4e7f3e8 Thanks @ocavue! - Adds a fork of createFilter from @rollup/pluginutils without Node.js APIs.

@astrojs/cloudflare@13.0.0-beta.14

Patch Changes

  • #15778 4ebc1e3 Thanks @ematipico! - Fixes an issue where the computed clientAddress was incorrect in cases of a Request header with multiple values. The clientAddress is 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 2de969d Thanks @ematipico! - Adds a new clientAddress option to the createContext() function

    Providing this value gives adapter and middleware authors explicit control over the client IP address. When not provided, accessing clientAddress throws 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 4e7f3e8 Thanks @ocavue! - Improves how Preact components are identified when setting the include and/or exclude options 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 4e7f3e8 Thanks @ocavue! - Improves how React components are identified when setting the include and/or exclude options 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 2de969d Thanks @ematipico! - Adds a new clientAddress option to the createContext() function

    Providing this value gives adapter and middleware authors explicit control over the client IP address. When not provided, accessing clientAddress throws 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 4ebc1e3 Thanks @ematipico! - Fixes an issue where the computed clientAddress was incorrect in cases of a Request header with multiple values. The clientAddress is 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

  • Updated dependencies [4ebc1e3, 4e7f3e8]:
    • @astrojs/internal-helpers@0.8.0-beta.3
withastro/astro

Changes

  • Pin actions/labeler to commit SHA and add explicit permissions block
  • Enable Renovate automated updates for actions/labeler
  • Replace secrets: inherit with explicit secret passing in format.yml workflow
  • 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, and statuses: write permissions from workflows
  • Add persist-credentials: false to diff-dependencies.yml checkout 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 curl call 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.

withastro/astro

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

withastro/astro

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 + ENTER will stop the server.
  • The CTRL+C kill 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/

withastro/astro

Changes

  • Uses Object.create(null) instead of {} for the fallback object in AstroCookies#ensureParsed() when no Cookie header is present
  • This aligns the fallback path with how the cookie library already creates parsed objects (using NullObject), 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.

withastro/astro

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.js that runs an in-memory Astro build using virtual .astro modules (no fixture files on disk).
  • Test verifies the server island manifest is populated when server:defer is only used in prerendered pages.

Docs

N/A, bug fix

withastro/astro

Note there isn't a security issue here, this is defense in depth.

Changes

  • Updates server island POST endpoint validation in getRequestData() to use Object.hasOwn() instead of the in operator when checking for plaintext slots and componentExport properties
  • 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.js verifying that validation checks only consider own properties on the parsed request data
  • All existing endpoint tests continue to pass

Docs

No docs changes needed.

withastro/astro

Changes

  • Skips form action auto-execution in lastNext() when skipMiddleware is 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.js covering both cases:
    • Verifies form actions are not auto-executed when skipMiddleware=true
    • Verifies form actions are auto-executed when skipMiddleware=false (normal flow)

Docs

No docs changes needed.

withastro/astro

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 the send library operate on the same normalized path for consistent behavior

Testing

  • Added tests in well-known-locations.test.js to verify dotfile access rules are applied consistently when paths contain .. segments
  • Added a .hidden-file test fixture for dotfile-at-root-level test coverage

Docs

No docs changes needed.

withastro/astro

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

withastro/astro

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

withastro/astro

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 createAppHandler applies a default 1GB body size limit to prevent unbounded memory consumption
  • Adds new bodySizeLimit option 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

withastro/astro

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

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 745e632 Thanks @rururux! - Adds the new utilities MANY_LEADING_SLASHES and collapseDuplicateLeadingSlashes.

astro@6.0.0-beta.19

Patch Changes

  • #15760 f49a27f Thanks @ematipico! - Fixed an issue where queued rendering wasn't correctly re-using the saved nodes.

  • #15728 12ca621 Thanks @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 b6c64d1 Thanks @matthewp! - Hardens the dev server by validating Sec-Fetch metadata headers to restrict cross-origin subresource requests

  • #15414 faedcc4 Thanks @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
withastro/astro

Changes

  • Normalizes backslash characters (\) in decoded URL pathnames before assigning to url.pathname
  • Ensures middleware and the router see a consistent, canonical pathname

Testing

  • Added test/units/app/encoded-backslash-bypass.test.js with 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

withastro/astro

Here's the scenario this fixes:

  1. Developer has their dev server running astro dev
  2. 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 secFetchMiddleware to the dev server middleware chain that validates Sec-Fetch-Site and Sec-Fetch-Mode request headers
  • Blocks cross-origin subresource requests (e.g. no-cors, cors mode) 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

withastro/astro

Changes

  • Adds a new security.serverIslandBodySizeLimit config option (defaults to 1 MB) so server islands have their own body size limit, separate from security.actionBodySizeLimit
  • Extracts the body-reading logic into a shared utility (core/request-body.ts) with readBodyWithLimit() and BodySizeLimitError, 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-Length header upfront for early rejection of oversized requests
  • Removes duplicated readRequestBodyWithLimit from 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

withastro/astro

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 using fs.existsSync(). Since existsSync returns true for both files and directories, a directory named test/ at the project root causes the guard to return a 404, even though src/pages/test.astro is 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 of fs.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

withastro/astro

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 #sessionIDFromCookie flag that is checked in #ensureData() and reset in regenerate()

Testing

Added tests

Docs

No user-facing changes

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
svelte (source) ^5.51.5^5.53.8 age confidence
volar-service-css (source) 0.0.680.0.70 age confidence
volar-service-emmet (source) 0.0.680.0.70 age confidence
volar-service-html (source) 0.0.680.0.70 age confidence
volar-service-prettier (source) 0.0.680.0.70 age confidence
volar-service-typescript (source) 0.0.680.0.70 age confidence
volar-service-typescript-twoslash-queries (source) 0.0.680.0.70 age confidence
volar-service-yaml (source) 0.0.680.0.70 age confidence
vscode-html-languageservice ^5.6.1^5.6.2 age confidence

Release Notes

sveltejs/svelte (svelte)

v5.53.8

Compare Source

Patch Changes
  • fix: {@&#8203;html} no longer duplicates content inside contenteditable elements (#​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

Compare Source

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 generate and unique (#​17844)

  • fix: preserve each items that are needed by pending batches (#​17819)

volarjs/services (volar-service-css)

v0.0.70

Compare Source

v0.0.69

Compare Source

Microsoft/vscode-html-languageservice (vscode-html-languageservice)

v5.6.2

Compare Source

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.

withastro/astro

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

withastro/astro

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

Testing

Docs

withastro/astro

Changes

  • Extracts path resolution logic in the node adapter static file handler into a resolveStaticPath function
  • 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

withastro/astro

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 mergeResponses in BaseApp to properly transfer AstroCookies from the original response to the merged response during error page rendering
  • Replaces Map-based header merging with headers.append() to correctly preserve multi-value headers like Set-Cookie

Testing

  • Added 3 unit tests in test/units/middleware/middleware-app.test.js covering cookie preservation when middleware returns Response(null, { status: 404 }), Response(null, { status: 500 }), and multiple cookies through sequenced middleware

Docs

No docs changes needed.

withastro/astro

Changes

  • redirectIsExternal() now detects protocol-relative URLs (//) in addition to http:// and https://
  • Route generator uses collapseDuplicateLeadingSlashes when 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

withastro/astro

Changes

  • X-Forwarded-For is now gated by security.allowedDomains, consistent with how X-Forwarded-Host, X-Forwarded-Proto, and X-Forwarded-Port are already handled.

Testing

Added and updated unit tests in packages/astro/test/units/app/node.test.js

Docs

N/A, bug fix

withastro/astro

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 isHttpUrl helper

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

withastro/astro

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

withastro/astro

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

withastro/starlight

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

withastro/astro

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 calling next() (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
withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@astrojs/compiler-rs (source) ^0.1.1^0.1.4 age confidence
@tailwindcss/vite (source) ^4.2.0^4.2.1 age confidence
autoprefixer ^10.4.24^10.4.27 age confidence
postcss-preset-env (source) ^11.1.3^11.2.0 age confidence
svelte (source) ^5.53.1^5.53.6 age confidence
tailwindcss (source) ^4.2.0^4.2.1 age confidence
vitefu ^1.1.1^1.1.2 age confidence
vue (source) ^3.5.28^3.5.29 age confidence

Release Notes

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

v0.1.4

Compare Source

Patch Changes

v0.1.3

Compare Source

Patch Changes

v0.1.2

Compare Source

Patch Changes
postcss/autoprefixer (autoprefixer)

v10.4.27

Compare Source

  • Removed development key from package.json.

v10.4.26

Compare Source

  • Reduced package size.

v10.4.25

Compare Source

  • Fixed broken gradients on CSS Custom Properties (by @​serger777).
csstools/postcss-plugins (postcss-preset-env)

v11.2.0

Compare Source

February 21, 2026

svitejs/vitefu (vitefu)

v1.1.2

Compare Source

  • Allow Vite 8 peer dependency (#​28)

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.

withastro/astro

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

withastro/astro

Summary

  • Fixes swapBodyElement() to lift transition:persist elements to <html> before the body replaceWith(), 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-island persist elements — props still copied correctly after swap

🤖 Generated with Claude Code

withastro/astro

Changes

  • Add branches: [main] filter to the build-sandbox-image.yml workflow's push trigger.
  • Without a branch filter, the workflow ran on every push to every branch. Branches merging main would include the newly-added .flue/sandbox/ files in the diff, satisfying the paths filter 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.

withastro/astro

fixes: #15722

Changes

  • Ported loadLanguages from prismjs, rewrote them as ESM, and configured them to be loaded in Cloudflare Workers environments.
  • Accordingly, changed the runHighlighterWithAstro function to an async function.
  • Updated files that depended on runHighlighterWithAstro to 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

withastro/astro

Changes

  • Use Object.hasOwn() instead of in operator when resolving action names in getAction(), so prototype methods like constructor or toString are not treated as valid actions.

Testing

  • Added tests in both dev and build that POST to /_actions/constructor, /_actions/__proto__, /_actions/toString, and /_actions/valueOf and assert 404.

Docs

N/A, bug fix

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@vue/compiler-sfc (source) ^3.5.28^3.5.29 age confidence
svelte (source) ^5.53.1^5.53.6 age confidence
vue (source) ^3.5.28^3.5.29 age confidence

Release Notes

sveltejs/svelte (svelte)

v5.53.6

Compare Source

Patch Changes
  • perf: optimize parser hot paths for faster compilation (#​17811)

  • fix: SvelteMap incorrectly handles keys with undefined values (#​17826)

  • fix: SvelteURL search setter 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.

withastro/astro

Changes

  • Enables erasableSyntaxOnly for 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

withastro/astro

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

withastro/astro

Changes

  • Collapses multiple leading slashes (e.g. //admin/admin) in removeBase() and #createNormalizedUrl()
  • Ensures middleware context.url.pathname always 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

withastro/starlight

Description

This PR adds a new theme to the theme catalog for the Rose Pine soho vibes.

withastro/astro

Changes

Fixes an issue where static headers weren't correctly applied in the node.js adapter

Testing

Added a new test

Docs

N/A

withastro/astro

Changes

Testing

Updated, should pass

Docs

Changeset

withastro/astro

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

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@cloudflare/vite-plugin (source) ^1.25.2^1.25.6 age confidence
@netlify/vite-plugin (source) ^2.10.2^2.10.3 age confidence
@tailwindcss/vite (source) ^4.2.0^4.2.1 age confidence
@vercel/functions (source) ^3.4.2^3.4.3 age confidence
@vercel/nft ^1.3.1^1.3.2 age confidence
svelte (source) ^5.53.1^5.53.5 age confidence
tailwindcss (source) ^4.2.0^4.2.1 age confidence
vue (source) ^3.5.28^3.5.29 age confidence
wrangler (source) ^4.67.0^4.69.0 age confidence

Release Notes

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

v1.25.6

Compare Source

Patch Changes

v1.25.5

Compare Source

Patch Changes
  • #​12628 494ee7b Thanks @​Master-Hash! - Append Cloudflare defaults to existing .assetsignore files during build output

    When a project includes a PUBLIC_DIR/.assetsignore, the plugin now preserves those rules and appends the required wrangler.json and .dev.vars entries instead of replacing the file content.

  • Updated dependencies [3d6e421, 294297e]:

    • wrangler@​4.68.1
    • miniflare@​4.20260302.0

v1.25.4

Compare Source

Patch Changes

v1.25.3

Compare Source

Patch Changes
netlify/primitives (@​netlify/vite-plugin)

v2.10.3

Compare Source

Dependencies
  • The following workspace dependencies were updated
vercel/vercel (@​vercel/functions)

v3.4.3

Compare Source

Patch Changes
  • [functions] Revert "[functions] URL encode cache tags" (#​15213)
vercel/nft (@​vercel/nft)

v1.3.2

Compare Source

Bug Fixes
cloudflare/workers-sdk (wrangler)

v4.69.0

Compare Source

Minor Changes
  • #​12625 c0e9e08 Thanks @​WillTaylorDev! - Add cache configuration option for enabling worker cache (experimental)

    You can now enable cache before worker execution using the new cache configuration:

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

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

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260302.0 1.20260303.0
  • #​12680 295297a Thanks @​dependabot! - Update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260303.0 1.20260305.0
  • #​12671 f765244 Thanks @​MattieTK! - fix: Only redact account names in CI environments, not all non-interactive contexts

    The multi-account selection error in getAccountId now only redacts account names
    when running in a CI environment (detected via ci-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

Compare Source

Patch Changes
  • #​12648 3d6e421 Thanks @​petebacondarwin! - Fix Angular scaffolding to allow localhost SSR in development mode

    Recent versions of Angular's AngularAppEngine block serving SSR on localhost by default. This caused wrangler dev / wrangler pages dev to fail with URL with hostname "localhost" is not allowed.

    The fix passes allowedHosts: ["localhost"] to the AngularAppEngine constructor in server.ts, which is safe to do even in production since Cloudflare will already restrict which host is allowed.

  • #​12657 294297e Thanks @​dario-piotrowicz! - Update Waku autoconfig logic

    As 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

Compare Source

Minor Changes

v4.67.1

Compare Source

Patch Changes
  • #​12595 e93dc01 Thanks @​dario-piotrowicz! - Add a warning in the autoconfig logic letting users know that support for projects inside workspaces is limited

  • #​12582 c2ed7c2 Thanks @​penalosa! - Internal refactor to use capnweb's native ReadableStream support to power remote Media and Dispatch Namespace bindings.

  • #​12618 d920811 Thanks @​dependabot! - Update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260219.0 1.20260227.0
  • #​12637 896734d Thanks @​dependabot! - Update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260227.0 1.20260302.0
  • #​12601 ebdbe52 Thanks @​43081j! - Switch to empathic for file-system upwards traversal to reduce dependency bloat.

  • #​12602 58a4020 Thanks @​anonrig! - Optimize filesystem operations by using Node.js's throwIfNoEntry: false option

    This 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 6f6cd94 Thanks @​martinezjandrew! - Implemented logic within wrangler containers registries configure to check if a specified secret name is already in-use and offer to reuse that secret. Also added --skip-confirmation flag 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.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence Type Update Pending
@astrojs/rss (source) ^4.0.15-beta.4^4.0.15 age confidence dependencies patch
@astrojs/sitemap (source) ^3.6.1-beta.3^3.7.0 age confidence dependencies minor
@tailwindcss/vite (source) ^4.2.0^4.2.1 age confidence dependencies patch
eslint (source) ^9.39.2^9.39.3 age confidence devDependencies patch
fast-xml-parser ^5.3.7^5.4.1 age confidence dependencies minor
nanostores ^1.1.0^1.1.1 age confidence dependencies patch
node (source) 24.13.124.14.0 age confidence minor
node 24.13.1-bullseye24.14.0-bullseye age confidence final minor
node 24.13.1-bookworm-slim24.14.0-bookworm-slim age confidence final minor
pnpm (source) 10.30.110.30.3 age confidence packageManager patch
shiki (source) ^3.22.0^3.23.0 age confidence dependencies minor
svelte (source) ^5.53.0^5.53.5 age confidence dependencies patch 5.53.6
tailwindcss (source) ^4.2.0^4.2.1 age confidence dependencies patch
turbo (source) ^2.8.10^2.8.11 age confidence devDependencies patch 2.8.12
typescript-eslint (source) ^8.56.0^8.56.1 age confidence devDependencies patch
vue (source) ^3.5.28^3.5.29 age confidence dependencies patch

Release Notes

withastro/astro (@​astrojs/rss)

v4.0.15

Compare Source

Patch Changes
withastro/astro (@​astrojs/sitemap)

v3.7.0

Compare Source

Minor Changes
  • #​14471 4296373 Thanks @​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 new chunks option 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

Compare Source

Patch Changes
tailwindlabs/tailwindcss (@​tailwindcss/vite)

v4.2.1

Compare Source

Fixed
  • Allow trailing dash in functional utility names for backwards compatibility (#​19696)
  • Properly detect classes containing . characters within curly braces in MDX files (#​19711)
eslint/eslint (eslint)

v9.39.3

Compare Source

Bug Fixes

  • 791bf8d fix: restore TypeScript 4.0 compatibility in types (#​20504) (sethamus)

Chores

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

v5.4.1

Compare Source

v5.4.0: Separate Builder

Compare Source

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

Compare Source

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

nanostores/nanostores (nanostores)

v1.1.1

Compare Source

nodejs/node (node)

v24.14.0

Compare Source

pnpm/pnpm (pnpm)

v10.30.3

Compare Source

v10.30.2

Compare Source

shikijs/shiki (shiki)

v3.23.0

Compare Source

   🚀 Features
   🐞 Bug Fixes
    View changes on GitHub
vercel/turborepo (turbo)

v2.8.11: Turborepo v2.8.11

Compare Source

What's Changed

Docs
@​turbo/repository
Changelog

Full Changelog: vercel/turborepo@v2.8.10...v2.8.11

typescript-eslint/typescript-eslint (typescript-eslint)

v8.56.1

Compare Source

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.

vuejs/core (vue)

v3.5.29

Compare Source

Bug Fixes

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