Skip to content

AstroEco is Contributing…

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

withastro/astro

Problem

When multiple JSX renderers are used (e.g. React + Preact), Astro doesn't really know which renderer it should use to render a .jsx file during SSR. Astro will try to guess the renderer on a best-effort basis, for example:

  • if a component is named QwikComponent, then it won't be treated as a React component (code link)
  • if a component outputs <undefined> in the HTML, then it won't be treated as a Preact component (code link)

These guesses are fragile and error-prone. For example, in #15341, a React component is rendered using preact during SSR. This could cause subtle bugs, such as hydration mismatches when using preact to render a React component. Currently we just patch console.error and pretend it's not a problem.

Idea

When multiple JSX renderers are used in the same project, users SHOULD specify the include/exclude patterns to identify the components that should be rendered by each renderer. Otherwise a warning is already shown to the user.

These include/exclude patterns are currently only used by the Vite JSX transform plugins. We can reuse them during the SSR phase to pick the correct renderer for a JSX component.

Changes

This PR includes three main changes:

  1. In packages/astro/src: I pass the metadata to the render.ssr.check() function. Notice that this matches the existing signature of the check() function.

  2. In packages/astro/test: I build a comprehensive test fixture with two mock renderers (woof/meow) that demonstrates the filter pattern. Tests cover different scenarios: SSR-only components, client:load components, and client:only components.

  3. In packages/integrations/preact: I reuse the include/exclude options passed to the integration. During the SSR phase, these options are used to check the component path from metadata.componentUrl.

    For now, I only update @astrojs/preact in this PR because I want to keep the PR small and focused. But in an ideal world, we should update all the JSX renderers to use this approach, including official renderers like @astrojs/react and third-party renderers like @qwikdev/astro.

Potential breaking changes

Let's say we have a project with the following config:

defineConfig({
  integrations: [
    preact({
      include: ['**/preact/jsx/*.jsx'],
    }),
    react({
      include: ['**/react/jsx/*.jsx'],
    }),
  ],
})

And we have the following file structure:

src/
  components/
    preact/
      jsx/
        Button.jsx  <-- A Preact component with .jsx extension
      js/
        Tooltip.js  <-- A Preact component with .js extension
    react/
      jsx/
        Box.jsx     <-- A React component with .jsx extension

Before this PR, all three components would be rendered by preact during SSR.
After this PR, Button.jsx will be rendered by preact, Box.jsx will be rendered by react, and Tooltip.js won't be rendered by any renderer, which will cause a build-time error.

Alternative Approach

In my current approach, I let @astrojs/preact handle its own include/exclude patterns and decide whether to render a component by itself. In an alternative approach, we could let the Astro core handle the include/exclude patterns. I didn't choose this alternative approach because include/exclude are technically renderer-specific. Although almost all Vite plugins use these patterns since this pattern is from Rollup, a Vite plugin could prefer to use other patterns to identify if a .jsx file is a valid component, especially in the future when Rolldown replaces Rollup as the default bundler.

Known limitation

SSR-only components (those without any client:* directive) don't have metadata.componentUrl, because the Astro compiler only emits client:component-path for hydrated components. The filter can't apply in this case, and check() falls back to its existing try-render behavior. Therefore, my current PR only improves the JSX components with client:* directive.

I can submit another purpose to the compiler repo with more details, if the team thinks this is a good idea.

Docs

No ready.

withastro/astro

Changes

Images and styles in content in Cloudflare in MDX did not work correctly, the vite-plugin-content-assets plugin just would never run because it'd instantly fail at the beginning, the error would happens inside workerd, so it didn't crash the build but you'd just get a thousand errors during the build, and in dev the file just was wrong.

Fixes #15681 (comment)

Testing

Added a test

Docs

N/A

withastro/astro

Changes

This PR tries to add more unit tests for server islands. If follow the same pattern followed until now. Creating dedicated mocks for the use case.

Some integration tests couldn't be removed because of what they test (the whole pipeline)

Testing

Green CI

Docs

withastro/astro

Changes

This PR ports the majority of middleware integration tests to be unit tests.

Some tests can't be ported, so in the next commit I will remove only the ones that can be ported.

Testing

Green CI

Docs

withastro/astro

Changes

This PR removes the build steps from the CI jobs. I did this because it doesn't sense to build the project twice:

  • one for just checking if the build works
  • one of the rest of the jobs

Testing

Green CI

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

astro@6.0.0-beta.18

Patch Changes

  • #15685 1a323e5 Thanks @jcayzac! - Fix regression where SVG images in content collection image() fields could not be rendered as inline components. This behavior is now restored while preserving the TLA deadlock fix.

  • #15693 4db2089 Thanks @ArmandPhilippot! - Fixes the links to Astro Docs to match the v6 structure.

  • Updated dependencies [f94d3c5]:

    • @astrojs/markdown-remark@7.0.0-beta.9

@astrojs/markdoc@1.0.0-beta.13

Patch Changes

  • Updated dependencies [f94d3c5]:
    • @astrojs/markdown-remark@7.0.0-beta.9

@astrojs/mdx@5.0.0-beta.10

Patch Changes

  • Updated dependencies [f94d3c5]:
    • @astrojs/markdown-remark@7.0.0-beta.9

@astrojs/markdown-remark@7.0.0-beta.9

Patch Changes

withastro/astro

SVG images in content collection image() fields were regressed to plain metadata objects by 5bc2b2c, which fixed a TLA circular-dependency deadlock by skipping SVG component creation entirely.

Changes

The fix embeds the parsed SVG data (attributes and inner HTML) in the metadata at build time, then reconstructs the renderable component inside updateImageReferencesInData() in content/runtime.ts. This keeps the SVG Vite module free of server-runtime imports (preserving the TLA fix) while restoring the ability to render SVG images as inline components.

Testing

  • Existing tests pass
  • Add new test to validate the regression is fixed.

Docs

  • No impact on public API.
withastro/astro

Changes

  • Netlify config must be statically analyzable, but when it got moved into an import it no longer was, causing Netlify not to have a catch-all route.
  • Caused by #15413

Testing

Docs

N/A, bug fix

withastro/astro

Changes

This change optimizes the bundle size when using the <Code /> component with output: 'server'.
Previously, all of Shiki's language and theme files were automatically bundled at build time, causing the bundle size to bloat with files that are never used.
In my environment, a project with just a single <Code /> component on a page resulted in a build size of around 10MB.
This pull request addresses the issue by introducing the optimizeShiki option, which allows users to explicitly specify which languages and themes to include in the bundle.

This becomes particularly problematic when deploying to Cloudflare Workers, which enforces the following size limits:

  Workers Free Workers Paid
After compression (gzip) 3 MB 10 MB
Before compression 64 MB 64 MB

The reduction effect is as follows:

  Total Upload gzip Reduction (Total)
Not optimized 9,778.58 KiB 1,706.13 KiB
Without <Code /> 483.41 KiB 119.04 KiB -95.1%
1 lang, 1 theme (Optimized) 1,363.29 KiB 346.49 KiB -86.1%

Measured with pnpm wrangler deploy --dry-run

When this option is used, only the specified languages and themes are available during SSR. However, since bundle size is not a concern during prerendering or SSG, all languages and themes remain freely available in those environments regardless of the option.

A minimal reproduction repository demonstrating the bundle size issue is available here: https://github.com/rururux/astro-code-bundle-size-demo
After running pnpm build, check the size of the dist/server/chunks directory to observe the bloated bundle size.

Testing

The following scenarios are covered by the new tests:

  • Bundle size is reduced when the optimizeShiki option is configured
  • All languages and themes are bundled as usual when the option is not set
  • Languages specified in the option are correctly syntax-highlighted
  • Languages not specified in the option are rendered without syntax highlighting
  • Prerendered pages apply syntax highlighting regardless of the option configuration

Docs

TODO:

  • changeset
  • jsDoc
  • document PR

/cc @withastro/maintainers-docs

withastro/astro

Changes

This PR moves some CSP tests to be unit tests. Unfortunate some other tests can't be unit tested because need vite.

I kept track of the tests that can be moved to unit, and I will remove them in the next commit once all tests pass.

Testing

Green CI

Docs

withastro/astro

fixes: #15675

Changes

A changeset was missing for the ./shiki subpath export addition in @astrojs/markdown-remark, so the package was never re-published with that change.
As a result, the published version (7.0.0-beta.7) is outdated and packages that depend on @astrojs/markdown-remark (such as astro itself) fail when trying to resolve the ./shiki specifier.
This PR adds the missing changeset to trigger a new release.

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.

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

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

Minor Changes

  • #15495 5b99e90 Thanks @leekeh! - Adds a new middlewareMode adapter feature to replace the previous edgeMiddleware option.

    This feature only impacts adapter authors. If your adapter supports edgeMiddleware, you should upgrade to the new middlewareMode option to specify the middleware mode for your adapter as soon as possible. The edgeMiddleware feature is deprecated and will be removed in a future major release.

    export default function createIntegration() {
      return {
        name: '@example/my-adapter',
        hooks: {
          'astro:config:done': ({ setAdapter }) => {
            setAdapter({
              name: '@example/my-adapter',
              serverEntrypoint: '@example/my-adapter/server.js',
              adapterFeatures: {
    -            edgeMiddleware: true
    +            middlewareMode: 'edge'
              }
            });
          },
        },
      };
    }

Patch Changes

  • #15657 cb625b6 Thanks @qzio! - Adds a new security.actionBodySizeLimit option to configure the maximum size of Astro Actions request bodies.

    This lets you increase the default 1 MB limit when your actions need to accept larger payloads. For example, actions that handle file uploads or large JSON payloads can now opt in to a higher limit.

    If you do not set this option, Astro continues to enforce the 1 MB default to help prevent abuse.

    // astro.config.mjs
    export default defineConfig({
      security: {
        actionBodySizeLimit: 10 * 1024 * 1024, // set to 10 MB
      },
    });
  • Updated dependencies [1fa4177]:

    • @astrojs/markdown-remark@7.0.0-beta.8

@astrojs/netlify@7.0.0-beta.12

Minor Changes

  • #15495 5b99e90 Thanks @leekeh! - Adds new middlewareMode adapter feature and deprecates edgeMiddleware option

    The edgeMiddleware option is now deprecated and will be removed in a future major release, so users should transition to using the new middlewareMode feature as soon as possible.

    export default defineConfig({
      adapter: netlify({
    -    edgeMiddleware: true
    +    middlewareMode: 'edge'
      })
    })

Patch Changes

  • #15679 19ba822 Thanks @matthewp! - Fixes server-rendered routes returning 404 errors

    A configuration error in the build output prevented Netlify from correctly routing requests to server-rendered pages, causing them to return 404 errors. This fix ensures that all server routes are properly handled by the Netlify SSR function.

  • Updated dependencies []:

    • @astrojs/underscore-redirects@1.0.0

@astrojs/vercel@10.0.0-beta.6

Minor Changes

  • #15495 5b99e90 Thanks @leekeh! - Adds new middlewareMode adapter feature and deprecates edgeMiddleware option

    The edgeMiddleware option is now deprecated and will be removed in a future release, so users should transition to using the new middlewareMode feature as soon as possible.

    export default defineConfig({
      adapter: vercel({
    -    edgeMiddleware: true
    +    middlewareMode: 'edge'
      })
    })

@astrojs/cloudflare@13.0.0-beta.11

Patch Changes

  • #15495 5b99e90 Thanks @leekeh! - Refactors to use middlewareMode adapter feature (set to classic)

  • Updated dependencies []:

    • @astrojs/underscore-redirects@1.0.0

@astrojs/markdoc@1.0.0-beta.12

Patch Changes

  • Updated dependencies [1fa4177]:
    • @astrojs/markdown-remark@7.0.0-beta.8

@astrojs/mdx@5.0.0-beta.9

Patch Changes

  • Updated dependencies [1fa4177]:
    • @astrojs/markdown-remark@7.0.0-beta.8

@astrojs/node@10.0.0-beta.6

Patch Changes

  • #15495 5b99e90 Thanks @leekeh! - Refactors to use middlewareMode adapter feature (set to classic)

  • #15657 cb625b6 Thanks @qzio! - Adds a new security.actionBodySizeLimit option to configure the maximum size of Astro Actions request bodies.

    This lets you increase the default 1 MB limit when your actions need to accept larger payloads. For example, actions that handle file uploads or large JSON payloads can now opt in to a higher limit.

    If you do not set this option, Astro continues to enforce the 1 MB default to help prevent abuse.

    // astro.config.mjs
    export default defineConfig({
      security: {
        actionBodySizeLimit: 10 * 1024 * 1024, // set to 10 MB
      },
    });

@astrojs/markdown-remark@7.0.0-beta.8

Patch Changes

  • #15676 1fa4177 Thanks @rururux! - Fixes an issue where the use of the Code component would result in an unexpected error.
withastro/astro

Changes

This PR tries to unit tests all components/functions that are used for manual routing.

In the next PR/commit I will remove the integration tests.

There's no actual change to the source code

Testing

Green CI

Docs

withastro/astro

Changes

  • Equivalent of #15665 for vercel

Testing

Should pass

Docs

Changeset

withastro/astro

Changes

  • Vendors cssesc and migrate to ESM. It has been causing a bunch of issues since it was introduced. FYI I sent a message to its maintainer to try upstream improvements directly but in the meantime, that's the best solution I could come with

Testing

Should pass

Docs

Changeset

withastro/astro

Changes

  • https://devblogs.microsoft.com/typescript/announcing-typescript-6-0-beta
  • Updates our packages to work with TS 6 beta (intermediary release to prepare for TS 7). The updates that it requires on our side keep it backward compatible with v5
  • I updated to TS 6 to spot all errors then downgraded to TS 5. It's probably too early to upgrade to v6 in the monorepo
  • Most important change: the base tsconfig now has types: ["node"] and libReplacement: false
  • Removes some unused things in language tools

Testing

Should pass!

Docs

withastro/astro

Changes

  • Was failing with "Entry module cannot be external"
    • This happened after a refactor to use the new adapter API

Testing

  • Verified manually in astro.build

Docs

N/A, bug fix

withastro/astro

Changes

  • None, just docs

Testing

N/A

Docs

  • Explains that {} is for allowing any domain, pathname, etc.
  • Gives the use-case (behind a trusted proxy).

Fixes #15660

withastro/astro

Normalises all imageService config into a { buildService, devService, runtimeService } triple, makes custom Node-only image services work with compile, adds a Vite dev middleware that uses jiti to dynamically import the image service entrypoint in Node, so custom TypeScript services work in dev

Config shapes

export default defineConfig({
  adapter: cloudflare({
    imageService: 'compile',
  }),
});
export default defineConfig({
  adapter: cloudflare({
    imageService: './src/my-service.ts'
  }),
});
export default defineConfig({
  adapter: cloudflare({
    imageService: {
      entrypoint: './src/my-service.ts',
      config: { quality: 80 },
    },
  }),
});
export default defineConfig({
  adapter: cloudflare({
    imageService: {
      build: 'sharp', // just an example lol 
      dev: './src/my-dev-service.ts',
      runtime: './src/my-runtime-service.ts',
      transformAtBuild: false,
    }
  }),
});

Available presets: cloudflare-binding (default) | cloudflare | compile | passthrough | custom (deprecated)

What each preset resolves to

Preset buildService devService runtimeService transformsAtBuild
cloudflare-binding (default) image-service-workerd image-service-workerd image-service-workerd false
cloudflare image-service (cdn-cgi) sharp image-service (cdn-cgi) false
compile image-service-workerd (stub) sharp passthrough true
passthrough noop noop noop false
custom (deprecated) image-service-workerd (stub) sharp user's config.image.service true

When transformsAtBuild is true, images are transformed at build time in Node (via Sharp or a custom service), and the deployed Worker just serves transformed static assets.

Other api facets

  • imageService: 'sharp' throws with guidance to use 'compile' instead
  • imageService: 'custom' deprecated, eventually will be copy paste from their astro config.images to the config.adapter
  • Any integration that sets config.image.service in config:setup is automatically picked up by the compile preset (captured in config:done) (this means integrations like Chris's sweetcorn dithering tool will work with compile)
Ai file-by-file breakdown

1. Rewrite image-config.ts — the normalisation engine

packages/integrations/cloudflare/src/utils/image-config.ts

The old normalizeImageServiceConfig returned { buildService, runtimeService } where both were string modes ('passthrough' | 'cloudflare' | 'compile' | ...). The new version returns a NormalizedImageConfig with full Astro ImageServiceConfig objects for each phase:

interface NormalizedImageConfig {
  buildService: AstroImageServiceConfig;   // what runs during prerendering in workerd
  devService: AstroImageServiceConfig;     // what runs in dev
  runtimeService: AstroImageServiceConfig; // what's bundled into the deployed Worker
  transformsAtBuild: boolean;              // whether Node-side transforms happen after prerender
  serviceEntrypoint?: string;  // which entrypoint to compile as a Node-side Rollup chunk for build-time transforms
}

normalizeImageServiceConfig() handles every config shape — preset strings, bare entrypoints, { entrypoint, config } shorthand, and the full { build, dev, runtime } triple. Unknown entrypoints are auto-detected against WORKERD_COMPATIBLE_ENTRYPOINTS; if the entrypoint isn't in that set, the system assumes it needs Node and enables transformsAtBuild.

setImageConfig() is now a pure function that takes the normalised triple and the current command, and picks the right service and endpoint for Astro's config.image:

// In config:setup
updateConfig({
  image: setImageConfig(normalized, config.image, command, logger),
});

Dev uses devService for both service and endpoint. Build uses buildService for service (what runs during prerendering) but runtimeService for endpoint (the /_image handler bundled into the deployed Worker).

2. Node middleware in dev — vite-plugin-dev-image-middleware.ts

packages/integrations/cloudflare/src/vite-plugin-dev-image-middleware.ts

When devService points to a Node-only service (Sharp, a custom .ts service, etc.), workerd can't load it. This plugin adds a Vite middleware that intercepts /_image requests before they reach the workerd proxy:

server.middlewares.use(async (req, res, next) => {
  if (!req.url?.startsWith(route)) return next();
  if (!jiti) jiti = createJiti(import.meta.url);
  const mod = await jiti.import(entrypoint);
  // ... parseURL, loadSourceImage, transform, respond
});

Why jiti? The dev service entrypoint may be a TypeScript file (./src/my-service.ts). Vite's ssrLoadModule can't be used here because we're in a Vite middleware — we need to load the module outside the Vite module graph. jiti handles TypeScript transpilation at runtime with zero config, making it the right tool for dynamically importing arbitrary TS entrypoints in a Node context.

The middleware loads images either from the Vite dev server (local files via fetch to localhost:${port}) or via fetch for remote URLs (respecting config.image.remotePatterns).

3. Virtual module interceptor — vite-plugin-image-service.ts

packages/integrations/cloudflare/src/vite-plugin-image-service.ts

Astro core resolves virtual:image-service to config.image.service.entrypoint. But in a Cloudflare build, the prerender environment (workerd) and the SSR environment (runtime Worker) need different services. This plugin hijacks virtual:image-service before Astro core can resolve it:

// Generated virtual module:
import { isPrerender } from 'virtual:astro-cloudflare:config';
import prerenderService from '@astrojs/cloudflare/image-service-workerd';
import runtimeService from 'astro/assets/services/noop';
export default isPrerender ? prerenderService : runtimeService;

This keeps Node-only code completely out of all Worker bundles. The isPrerender flag comes from the existing virtual:astro-cloudflare:config module (set by vite-plugin-config.ts).

The second plugin (emitter) compiles the custom image service as a standalone Rollup chunk in the SSR build. This "smuggles" the real service into the server output directory where prerenderer.ts can import() it in Node after prerendering. The chunk is deleted after build (index.ts astro:build:done).

4. Workerd stub gets config-aware hashing

packages/integrations/cloudflare/src/entrypoints/image-service-workerd.ts

The workerd stub generates URLs and hashes during prerendering but doesn't transform pixels. Two additions ensure the stub produces hashes that match what the real service would produce:

propertiesToHash: [...(baseService.propertiesToHash ?? []), '_serviceConfig'],

validateOptions(options, imageConfig) {
  const validated = baseService.validateOptions!(options, imageConfig);
  const config = imageConfig?.service?.config;
  if (config && Object.keys(config).length > 0) {
    (validated as any)._serviceConfig = config;
  }
  return validated;
},

Without this, two services with identical image transforms but different configs (e.g. { quality: 80 } vs { quality: 90 }) would generate the same hash/filename, causing cache collisions. The _serviceConfig field is included in the hash input so different configs produce different filenames.

5. Prerenderer loads custom service from compiled chunk

packages/integrations/cloudflare/src/prerenderer.ts

Previously, collectStaticImages() always switched to Sharp for Node-side transforms. Now it loads the emitted chunk instead:

const servicePath = getServicePath();
if (servicePath) {
  const absolutePath = resolve(fileURLToPath(serverDir), servicePath);
  const mod = await import(pathToFileURL(absolutePath).href);
  globalThis.astroAsset.imageService = {
    ...mod.default,
    async transform(buf, opts, imgConfig) {
      // Re-validate with the compiled service — the workerd stub's
      // validateOptions doesn't know about custom service defaults
      if (svc.validateOptions) opts = await svc.validateOptions(opts, imgConfig);
      return svc.transform(buf, opts, imgConfig);
    },
  };
}

The re-validation step is necessary because the workerd stub ran validateOptions during prerendering but doesn't know about the custom service's defaults or transformations. The compiled service may add/modify options that affect the final transform.

Falls back to Sharp with a warning if no compiled chunk is found (shouldn't happen, but provides a safety net).

6. Integration wiring in index.ts

packages/integrations/cloudflare/src/index.ts

The integration hooks wire everything together:

config:setup: Normalises the config once at the top of the integration. Conditionally adds the image service interceptor (when build and runtime services differ) and dev middleware (when dev service needs Node). The IMAGES binding logic now checks actual entrypoints instead of string modes.

config:done: Captures the final config.image.service.entrypoint after all integrations have run. This is how compile automatically picks up services set by other integrations

build:start: Passes the new hasTransformAtBuildService, getServicePath, and logger to the prerenderer.

build:done: Deletes the emitted image service chunk — it was only needed during the build for Node-side transforms, not at runtime.

7. Tests

packages/integrations/cloudflare/test/

Four new test files covering:

  • image-config.test.js — exhaustive tests for expandPreset, normalizeImageServiceConfig, resolveEndpoint, and setImageConfig across all config shapes
  • image-service-plugin.test.js — unit tests for the interceptor and emitter plugins (resolveId, load, applyToEnvironment, emitFile/generateBundle lifecycle)
  • dev-image-middleware.test.js — middleware registration, route matching, base path handling
  • image-service-workerd.test.js — config-aware hashing (different configs produce different hash inputs, absent config doesn't inject _serviceConfig)
withastro/astro

Changes

Fix created by the triage bot. I added some comments and the changeset.

Testing

I tested locally, but preferred to not add one. A unit test didn't trigger the issue, and an integration tests was very slow and memory consuming.

Docs

N/A

withastro/starlight

Description

  • Closes #3721
  • This PR updates our default font stack in an attempt to handle the cases described in the linked issue
  • It kind of does the opposite of #3549, bringing back -apple-system and BlinkMacSystemFont fonts and removing the newer system-ui and ui-sans-serif families.

Todo

We should try to test on a broad range of browsers and devices:

macOS
  • macOS — English (@HiDeoo & @delucis)
    • Chrome (v145): Tested pages in various languages on an English-language macOS (15.7.3 and 26.3) install, no visual change after this PR
    • Firefox (v148): Same as above
    • Edge (v145): Same as above
    • Safari (v26.2): Same as above
Windows
  • Windows 10 Pro — English (@HiDeoo)
    • Chrome (v145): Tested pages in various languages, no visual change after this PR
    • Firefox (v147): Same as above
    • Edge (v145): Same as above
  • Windows — Japanese (@mehm8128 and @tats-u)
    • 🚨✅ Japanese characters are now displayed with Segoe UI instead of system-ui (see comment)
    • 🚨✅ Firefox: Simplified Chinese characters are now displayed correctly on a Japanese machine (see comment)
  • Windows 11 — Simplified Chinese (@tsavpyn)
    • 🚨✅ Firefox (v147): Latin fontface has changed, Simplified Chinese is unchanged, Japanese characters are now displayed correctly, e.g. image instead of image (see comment)
iOS
  • iOS 26.3 — English (@HiDeoo)
    • Safari (v26.3): Tested pages in various languages, no visual change after this PR
  • ipadOS 26.3 — English (@HiDeoo)
    • Safari (v26.3): Tested pages in various languages, no visual change after this PR
Linux
  • Endeavour OS virtual machine hosted on Windows — English (English host) (@HiDeoo)
    • Firefox (v146): Tested pages in various languages, no visual change after this PR
    • Chrome (v145): Same as above
  • Fedora 43 virtual machine hosted on Windows - English (English host) (@HiDeoo)
    • Firefox (v147): Tested pages in various languages, no visual change after this PR
    • Chrome (v145): Same as above
  • Ubuntu 24.04.4 virtual machine hosted on Windows - English (English host) (@HiDeoo)
    • 🚨❓ Firefox (v147): Tested pages in various languages, some visual change after this PR (see comment)
    • 🚨❓ Chrome (v145): Same as above
Android
  • Android 11 (old!) — English (@delucis)
    • Chrome: Tested pages in various languages, no visual change after this PR
    • Firefox: Same as above

I would love help testing this! I don’t have Windows/Linux boxes to test on personally. And testing on machines in CJK locales would be particularly useful.

To test, you can compare the deploy preview for this PR with the live Starlight docs. Check if appearance of fonts change in multiple languages and note any differences if there are any.

withastro/starlight

Description

This PR adds the new Starlight Vintage theme to the theme showcase page.

withastro/astro

Makes ContentLayer unit testable, it was already pretty close! Just needed a couple of features like being able to pass in a contentConfigObserver.

Changes

  • Constructor takes a ContentObservable so it can be provided by unit tests.
  • Moves the singleton to another file, this is what the rest of Astro uses.

Testing

  • Moved over tests suites:
    • content-layer.test.js
    • content-layer-render.test.js

Docs

N/A, just refactor and test changes

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

Patch Changes

  • #3726 8a09b60 Thanks @delucis! - Fixes an issue using components containing scripts inside Starlight’s steps component in versions of Astro >= 5.16.9
withastro/astro

Changes

Backported from 5-legacy, but could not apply the cherry-pick cleanly

see #15589 etc

Testing

Docs

Affects documentation, but should be generated from a comment in the code.

withastro/starlight

Description

withastro/astro

Changes

  • From @matthewp: "while you're in there I would remove experimentalErrorPageHost which is a security nightmare"
  • So this removes the option

Testing

Improves our tests to still check we read files from the filesystem

Docs

withastro/astro

Description

Fixes #14013

On Windows, when the working directory path case differs from the actual filesystem path (e.g. d:\dev vs D:\dev), styles are missing because Astro treats them as different files. The route component paths are computed relative to the root, so if the root has wrong casing, the paths won't match what Vite's module graph uses.

Changes

  • packages/astro/src/core/config/config.ts: resolveRoot() now normalizes the resolved path using fs.realpathSync() to ensure the path casing matches the actual filesystem. Falls back to the original resolved path if realpathSync fails.

  • packages/astro/test/units/config/config-resolve.test.js: Added unit tests for resolveRoot() verifying it returns the real filesystem path.

Testing

The fix ensures that resolveRoot() returns the canonical filesystem path regardless of how the user typed the directory name. This is transparent on case-sensitive systems (Linux/macOS) and fixes the style mismatch on case-insensitive systems (Windows).

withastro/astro

Changes

Closes #15656

I noticed the following warning in my Astro project:

[Shiki] 10 instances have been created. Shiki is supposed to be used as a singleton, consider refactoring your code to cache your highlighter instance; Or call `highlighter.dispose()` to release unused instances.
[Shiki] 20 instances have been created. Shiki is supposed to be used as a singleton, consider refactoring your code to cache your highlighter instance; Or call `highlighter.dispose()` to release unused instances.
[Shiki] 30 instances have been created. Shiki is supposed to be used as a singleton, consider refactoring your code to cache your highlighter instance; Or call `highlighter.dispose()` to release unused instances.

This is due to the fact that Astro creates a new Shiki highlighter instance for each language, and there are many different code block languages in my project.

This PR improves this by using the same highlighter across languages. This approach works because Astro already loads languages dynamically when they haven't been loaded yet (code link).

Testing

Added a new test to ensure that

  1. The same highlighter instance is used for different languages. I not only cache the Shiki highlighter instance, but I also cache the returned wrapper object (code link) for an extra tiny bit of performance improvement.
  2. This cached highlighter instance can highlight new languages.

Docs

Changeset file has been added.

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

Minor Changes

  • #15646 0dd9d00 Thanks @delucis! - Removes redundant fetchpriority attributes from the output of Astro’s <Image> component

    Previously, Astro would always include fetchpriority="auto" on images not using the priority attribute.
    However, this is the default value, so specifying it is redundant. This change omits the attribute by default.

Patch Changes

  • #15661 7150a2e Thanks @ematipico! - Fixes a build error when generating projects with 100k+ static routes.

  • #15603 5bc2b2c Thanks @0xRozier! - Fixes a deadlock that occurred when using SVG images in content collections

  • #15669 d5a888b Thanks @florian-lefebvre! - Removes the cssesc dependency

    This CommonJS dependency could sometimes cause errors because Astro is ESM-only. It is now replaced with a built-in ESM-friendly implementation.

@astrojs/cloudflare@13.0.0-beta.10

Patch Changes

  • #15669 d5a888b Thanks @florian-lefebvre! - Removes the cssesc dependency

    This CommonJS dependency could sometimes cause errors because Astro is ESM-only. It is now replaced with a built-in ESM-friendly implementation.

  • #15648 802426b Thanks @rururux! - Restore and fix <Code /> component functionality on Cloudflare Workers.

  • Updated dependencies []:

    • @astrojs/underscore-redirects@1.0.0

@astrojs/netlify@7.0.0-beta.11

Patch Changes

  • #15665 52a7efd Thanks @matthewp! - Fixes builds that were failing with "Entry module cannot be external" error when using the Netlify adapter

    This error was preventing sites from building after recent internal changes. Your builds should now work as expected without any changes to your code.

  • Updated dependencies []:

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

Changes

I’ve restored the code that was previously reverted and ensured that the tests no longer fail.

Testing

CI should be green.

Docs

N/A

withastro/astro

Changes

  • Removes two nonexistent exports left over from #15640 that are causing linting to fail

Testing

Linting should no longer fail

Docs

n/a

withastro/astro

Changes

  • Updates the default image service to avoid outputting redundant fetchpriority="auto" on images
  • This value is the default value so there is no need to specify it explicitly (see MDN)

Testing

We had two tests that asserted we would add this attribute, so I updated them to assert that we don’t.

There are other tests that check we correctly fetchpriority="high" when users use the priority prop on the <Image> component.

Docs

n/a — no user-facing change in behaviour

withastro/astro

Changes

This PR was vibe coded. I checked the implementation code, but I let the AI porting all tests to be unit.

This PR makes the implementation of i18n more testable.

  • Crates a I18nRouter that accepts a context, and emits decisions. Eventually, this decision is given to the middleware, which decides what to do.
  • The fallback is even simpler, it's just a function that accepts some parameters and emits decisions

Note

I kept the existing tests for safety. The next PR will remove them (or next commit)

Testing

Green CI

Docs

Not needed

withastro/astro

Changes

Closes #15608
Closes #15582

Revert #15582

Unfortunately we can't, in any way possible, to support Shiki with CSP. After extensive research, and realised that I broke things with my previous PR, we can't have a solution that works for everything.

Even with head propagation, markdown files can't be supported.

I added a warning for our users

Testing

CI is green

Docs

withastro/docs#13307

/cc @withastro/maintainers-docs for feedback!

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@cloudflare/workers-types ^4.20260227.0^4.20260228.0 age confidence
svelte (source) ^5.53.0^5.53.1 age confidence

Release Notes

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

v4.20260228.0

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

Changes

Testing

N/A

Docs

Changeset + issue template

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@astrojs/compiler (source) ^3.0.0-beta.0^3.0.0-beta.1 age confidence
@preact/signals (source) 2.7.12.8.1 age confidence
@tailwindcss/vite (source) ^4.1.18^4.2.0 age confidence
acorn ^8.15.0^8.16.0 age confidence
preact (source) ^10.28.3^10.28.4 age confidence
rollup (source) ^4.57.1^4.58.0 age confidence
svelte (source) ^5.51.5^5.53.1 age confidence
tailwindcss (source) ^4.1.18^4.2.0 age confidence
undici (source) ^7.21.0^7.22.0 age confidence
vue (source) ^3.5.27^3.5.28 age confidence

Release Notes

withastro/compiler (@​astrojs/compiler)

v3.0.0-beta.1

Compare Source

Patch Changes
  • 755f046: Fixes a CSS scoping regression where selectors using the nesting selector (&) with pseudo-classes or pseudo-elements (e.g. &:last-of-type, &::before) inside :global() contexts would incorrectly receive a duplicate scope attribute.
  • f89451a: Fixed an issue where explicit <html> and <head> tags were removed from output when a JSX comment appeared between DOCTYPE and the <html> tag.
  • 8275bdd: Fixes a bug where trailing whitespaces were preserved before <style> tags after transformation, in certain cases. Now trailing whitespaces are correctly removed.
  • e329d20: Fix slot attribute stripped inside expression
  • 615eb21: Fix CSS nesting so nested selectors without an ampersand are parsed and scoped correctly.
preactjs/signals (@​preact/signals)

v2.8.1

Compare Source

Patch Changes

v2.8.0

Compare Source

Minor Changes
rollup/rollup (rollup)

v4.58.0

Compare Source

2026-02-20

Features
  • Also support __NO_SIDE_EFFECTS__ annotation before variable declarations declaring function expressions (#​6272)
Pull Requests
nodejs/undici (undici)

v7.22.0

Compare Source

What's Changed

New Contributors

Full Changelog: nodejs/undici@v7.21.0...v7.22.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

Fixes: #15622 Components passed as slots to server:defer components had their <script> tags silently dropped. renderSlotToString separates HTML from render instructions, and only the HTML survived serialization via content.toString().

This appends script instructions to the slot HTML before encryption, so the island response includes the scripts needed for interactivity.

Changes

  • Append type === 'script' render instructions to slot HTML in ServerIslandComponent.getIslandContent() before the payload is encrypted

Testing

Minimal reproduction: https://github.com/jwoyo/astro-server-island-bug

  1. Component with <script> passed as slot to server:defer wrapper
  2. Before: island response contains HTML but no <script> → no interactivity
  3. After: island response includes the script → works

Docs

No docs needed — this is a bug fix restoring expected behavior.

One could argue that may result in duplicate script injection when the same component is also used statically on the page. But deduplication is not feasible at this point in the render pipeline due to concurrent buffering - the need to build idempotent scripts (that don't hurt when executed twice) could be part of the docs.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@preact/signals (source) ^2.7.1^2.8.1 age confidence
preact (source) ^10.28.3^10.28.4 age confidence
preact-render-to-string ^6.6.5^6.6.6 age confidence
svelte (source) ^5.51.5^5.53.1 age confidence
svelte2tsx (source) ^0.7.47^0.7.51 age confidence

Release Notes

preactjs/preact-render-to-string (preact-render-to-string)

v6.6.6

Compare Source

Patch Changes
sveltejs/svelte (svelte)

v5.53.1

Compare Source

Patch Changes
  • fix: handle shadowed function names correctly (#​17753)
sveltejs/language-tools (svelte2tsx)

v0.7.51

Compare Source

Patch Changes
  • fix: respect @ts-ignore etc comments within tags (#​2950)

v0.7.50

Compare Source

Patch Changes
  • fix: detect existing JSDoc @satisfies to prevent duplicate injection (#​2946)

v0.7.49

Compare Source

Patch Changes
  • fix: handle relative imports reaching outside working directory when using --incremental/--tsgo flags (#​2942)

  • fix: support SvelteKit zero types in svelte-check --incremental (#​2939)

v0.7.48

Compare Source

Patch Changes
  • chore: add option to output pure jsdoc-based JS files (#​2932)

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

Fixes #15520

Changes

  • Adds a config() hook to the astroPrefetch Vite plugin that excludes astro/virtual-modules/prefetch.js from Vite's optimizeDeps.
  • When <ClientRouter /> is used, Vite discovers the prefetch module as a transitive dependency and pre-bundles it via esbuild, which doesn't invoke Vite plugin transform hooks. This leaves the placeholder constants (__PREFETCH_PREFETCH_ALL__, etc.) unreplaced, causing a ReferenceError at runtime in the browser.
  • The fix follows the same pattern used by the astro:transitions plugin, which already configures optimizeDeps via its own config() hook.

The triage bot was able to reproduce and confirm the root cause and the fix (labeled P2: has workaround).

Testing

I've verified this fix in my own project where I was hitting the issue. I haven't added a test here since the bug only manifests in a non-workspace npm install environment (Vite resolves differently in workspace setups), and the existing test infrastructure runs within the monorepo workspace. Happy to add one if you can point me toward a good pattern for testing dep optimization behavior.

Docs

N/A -- this is a dev server bug fix with no user-facing API changes. Users who applied the workaround from #15520 can remove the vite.optimizeDeps.exclude entry from their astro.config.mjs after this lands.

withastro/astro

Changes

  • Replace manual docker login with the official docker/login-action@v3.7.0 in the issue triage workflow.
  • This silences the "credentials stored unencrypted" Docker warning that was appearing in CI logs and causing confusion.

Testing

Verified by reviewing the docker/login-action docs — it performs the same GHCR authentication but uses a credential store instead of writing plaintext credentials. Will be validated on the next issue triage run.

Docs

No docs needed — this is an internal CI workflow change with no user-facing impact.

withastro/astro

Changes

From the most recent CI run, after #15545 was merged:
https://github.com/withastro/astro/actions/runs/22320279718/job/64576369787

[opencode] (skill("triage/reproduce.md")) tool:pending  bash — bash
[opencode] (skill("triage/reproduce.md")) > The StackBlitz URL `[https://stackblitz.com/~/github.com/jwoyo/astro-server-island-bug`](https://stackblitz.com/~/github.com/jwoyo/astro-server-island-bug%60) points to a GitHub repo. Let me clone it.
[opencode] (skill("triage/reproduce.md")) tool:running  bash — mkdir -p triage/gh-15622 && git clone https://github.com/jwoyo/astro-server-island-bug.git triage/gh-15622 && rm -rf triage/gh-15622/.git
[proxy:github-git] DENIED: POST /jwoyo/astro-server-island-bug.git/git-upload-pack
  Reason: not allowed by allow-read policy
  To allow: add a policy.allow rule for POST to this path, or use policy: 'allow-all'
CLONE_FAILED

Testing

  • N/A

Docs

  • N/A
withastro/astro

Both workflows fail on forks because they depend on secrets (NETLIFY_PREVIEWS_BUILD_HOOK, CODSPEED_TOKEN) that are only available in the withastro org.

Changes

  • examples-deploy.yml — Add if: ${{ github.repository_owner == 'withastro' }} to the deploy job; add permissions: contents: read (missing permissions block)
  • continuous_benchmark.yml — Add if: ${{ github.repository_owner == 'withastro' }} to the codspeed job

This matches the guard already used in release.yml and other workflows.

Original prompt

This section details on the original issue you should resolve

<issue_title>examples-deploy and continuous_benchmark workflows fail on forks</issue_title>
<issue_description>### Astro Info

`main` branch

If this issue only occurs in one browser, which browser is a problem?

No response

Describe the Bug

When github forks of this repository (with actions enabled) sync the main branch, these workflows fail:
https://github.com/jsoref/astro/actions/workflows/examples-deploy.yml
https://github.com/jsoref/astro/actions/runs/22317394435
https://github.com/jsoref/astro/actions/workflows/continuous_benchmark.yml
https://github.com/jsoref/astro/actions/runs/22317394415

What's the expected result?

Either they should have an if: that is guarded by the github organization (withastro), the github repository (withastro/astro), or there should be a guard in the job steps against the required variables/secrets such that the job doesn't fail.

Link to Minimal Reproducible Example

https://github.com/jsoref/astro/actions/runs/22317394435

Participation

  • I am willing to submit a pull request for this issue.</issue_description>

<agent_instructions>@jsoref is correct, these two workflows should have the same "if withastro/astro" check in the .github/workflows workflow file that others do. This prevents them from running in forks, where they would not be expected to succeed.</agent_instructions>

Comments on the Issue (you are @copilot in this section)


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

withastro/astro

Changes

this adds the following option:

export default defineConfig({
  ...
  image: {
    service: {
      defaultFormat: "original",
    },
  },
});

which defaults to "webp" (our defaults) but allows "original" to keep the file format.

Testing

this was tested on my personal website.

i didn't add tests because it's such a small change, but will do so if requested.

Docs

it should be documented enough, since it doesn't change any defaults.

withastro/astro
withastro/astro

fixes: #15341

Changes

Updated the error filtering logic to support React 19.
Previously, the "Invalid hook call" error (which occurs when using React and Preact integrations together) was filtered out to prevent noise. However, the filtering failed for React 19 because its error message format had changed.
This PR ensures that the new React 19 error messages are correctly identified and filtered, maintaining a clean console output for users.

Testing

Added a regression test to verify that the "Invalid hook call" error is no longer logged when React 19 and Preact are used together.
The hookError utility in the test was adapted from the following implementation:

function hookError() {
const error = console.error;
const errors = [];
console.error = function (...args) {
errors.push(args);
};
return () => {
console.error = error;
return errors;
};
}

Docs

N/A, bug fix

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@cloudflare/vite-plugin (source) ^1.25.0^1.25.2 age confidence
@cloudflare/workers-types ^4.20260213.0^4.20260227.0 age confidence
@netlify/blobs (source) ^10.6.0^10.7.0 age confidence
@netlify/vite-plugin (source) ^2.9.0^2.10.2 age confidence
@tailwindcss/vite (source) ^4.1.18^4.2.0 age confidence
svelte (source) ^5.51.5^5.53.0 age confidence
svelte (source) ^5.50.3^5.53.0 age confidence
tailwindcss (source) ^4.1.18^4.2.0 age confidence
wrangler (source) ^4.65.0^4.67.0 age confidence

Release Notes

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

v1.25.2

Compare Source

Patch Changes

v1.25.1

Compare Source

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

v4.20260227.0

Compare Source

v4.20260219.0

Compare Source

v4.20260218.0

Compare Source

v4.20260217.0

Compare Source

v4.20260214.0

Compare Source

netlify/primitives (@​netlify/blobs)

v10.7.0

Compare Source

Features
netlify/primitives (@​netlify/vite-plugin)

v2.10.2

Compare Source

Dependencies
  • The following workspace dependencies were updated

v2.10.1

Compare Source

Dependencies
  • The following workspace dependencies were updated

v2.10.0

Compare Source

Features
Dependencies
  • The following workspace dependencies were updated
cloudflare/workers-sdk (wrangler)

v4.67.0

Compare Source

Minor Changes
  • #​12401 8723684 Thanks @​jonesphillip! - Add validation retry loops to pipelines setup command

    The wrangler pipelines setup command now prompts users to retry when validation errors occur, instead of failing the entire setup process. This includes:

    • Validation retry prompts for pipeline names, bucket names, and field names
    • A "simple" mode for sink configuration that uses sensible defaults
    • Automatic bucket creation when buckets don't exist
    • Automatic Data Catalog enablement when not already active

    This improves the setup experience by allowing users to correct mistakes without restarting the entire configuration flow.

  • #​12395 aa82c2b Thanks @​cmackenzie1! - Generate typed pipeline bindings from stream schemas

    When running wrangler types, pipeline bindings now generate TypeScript types based on the stream's schema definition. This gives you full autocomplete and type checking when sending data to your pipelines.

    // wrangler.json
    {
    	"pipelines": [
    		{ "binding": "ANALYTICS", "pipeline": "analytics-stream-id" },
    	],
    }

    If your stream has a schema with fields like user_id (string) and event_count (int32), the generated types will be:

    declare namespace Cloudflare {
    	type AnalyticsStreamRecord = { user_id: string; event_count: number };
    	interface Env {
    		ANALYTICS: Pipeline<Cloudflare.AnalyticsStreamRecord>;
    	}
    }

    For unstructured streams or when not authenticated, bindings fall back to the generic Pipeline<PipelineRecord> type.

Patch Changes
  • #​12592 aaa7200 Thanks @​dependabot! - Update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260217.0 1.20260218.0
  • #​12606 2f19a40 Thanks @​dependabot! - Update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260218.0 1.20260219.0
  • #​12604 e2a6600 Thanks @​petebacondarwin! - fix: pass --env flag to auxiliary workers in multi-worker mode

    When running wrangler dev with multiple config files (e.g. -c ./apps/api/wrangler.jsonc -c ./apps/queues/wrangler.jsonc -e=dev), the --env flag was not being passed to auxiliary (non-primary) workers. This meant that environment-specific configuration (such as queue bindings) was not applied to auxiliary workers, causing features like queue consumers to not be triggered in local development.

  • #​12597 0b17117 Thanks @​sdnts! - The maximum allowed delivery and retry delays for Queues is now 24 hours

  • #​12598 ca58062 Thanks @​mattzcarey! - Stop redacting wrangler whoami output in non-interactive mode

    wrangler whoami is explicitly invoked to retrieve account info, so email and account names should always be visible. Redacting them in non-interactive/CI environments makes it difficult for coding agents and automated tools to identify which account to use. Other error messages that may appear unexpectedly in CI logs (e.g. multi-account selection errors) remain redacted.

  • Updated dependencies [f239077, aaa7200, 2f19a40, 5f9f0b4, 452cdc8, 527e4f5, 0b17117]:

v4.66.0

Compare Source

Minor Changes
  • #​12466 caf9b11 Thanks @​petebacondarwin! - Add WRANGLER_CACHE_DIR environment variable and smart cache directory detection

    Wrangler now intelligently detects where to store cache files:

    1. Use WRANGLER_CACHE_DIR env var if set
    2. Use existing cache directory if found (node_modules/.cache/wrangler or .wrangler/cache)
    3. Create cache in node_modules/.cache/wrangler if node_modules exists
    4. Otherwise use .wrangler/cache

    This improves compatibility with Yarn PnP, pnpm, and other package managers that don't use traditional node_modules directories, without requiring any configuration.

  • #​12572 936187d Thanks @​dario-piotrowicz! - Ensure the nodejs_compat flag is always applied in autoconfig

    Previously, the autoconfig feature relied on individual framework configurations to specify Node.js compatibility flags, some could set nodejs_compat while others nodejs_als.

    Now instead nodejs_compat is always included as a compatibility flag, this is generally beneficial and the user can always remove the flag afterwards if they want to.

  • #​12560 c4c86f8 Thanks @​taylorlee! - Support --tag and --message flags on wrangler deploy

    They have the same behavior that they do as during wrangler versions upload, as both
    are set on the version.

    The message is also reused for the deployment as well, with the same behavior as used
    during wrangler versions deploy.

Patch Changes
  • #​12543 5a868a0 Thanks @​G4brym! - Fix AI Search binding failing in local dev

    Using AI Search bindings with wrangler dev would fail with "RPC stub points at a non-serializable type". AI Search bindings now work correctly in local development.

  • #​12552 c58e81b Thanks @​dependabot! - Update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260212.0 1.20260213.0
  • #​12568 33a9a8f Thanks @​dependabot! - Update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260213.0 1.20260214.0
  • #​12576 8077c14 Thanks @​dependabot! - Update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260214.0 1.20260217.0
  • #​12466 caf9b11 Thanks @​petebacondarwin! - fix: exclude .wrangler directory from Pages uploads

    The .wrangler directory contains local cache and state files that should never be deployed. This aligns Pages upload behavior with Workers Assets, which already excludes .wrangler via .assetsignore.

  • #​12556 7d2355e Thanks @​ascorbic! - Fix port availability check probing the wrong host when host changes

    memoizeGetPort correctly invalidated its cached port when called with a different host, but then still probed the original host for port availability. This could return a port that was free on the original host but already in use on the requested one, leading to bind failures at startup.

  • #​12562 7ea69af Thanks @​MattieTK! - Support function-based Vite configs in autoconfig setup

    wrangler setup and wrangler deploy --x-autoconfig can now automatically add the Cloudflare Vite plugin to projects that use function-based defineConfig() patterns. Previously, autoconfig would fail with "Cannot modify Vite config: expected an object literal but found ArrowFunctionExpression" for configs like:

    export default defineConfig(({ isSsrBuild }) => ({
    	plugins: [reactRouter(), tsconfigPaths()],
    }));

    This pattern is used by several official framework templates, including React Router's node-postgres and node-custom-server templates. The following defineConfig() patterns are now supported:

    • defineConfig({ ... }) (object literal, already worked)
    • defineConfig(() => ({ ... })) (arrow function with expression body)
    • defineConfig(({ isSsrBuild }) => ({ ... })) (arrow function with destructured params)
    • defineConfig(() => { return { ... }; }) (arrow function with block body)
    • defineConfig(function() { return { ... }; }) (function expression)
  • #​12548 5cc7158 Thanks @​dario-piotrowicz! - Fix .assetsignore formatting when autoconfig creates a new file

    Previously, when wrangler setup or wrangler deploy --x-autoconfig created a new .assetsignore file via autoconfig, it would add unnecessary leading empty lines before the wrangler-specific entries. Empty separator lines should only be added when appending to an existing .assetsignore file. This fix ensures newly created .assetsignore files start cleanly without leading blank lines.

  • #​12556 7d2355e Thanks @​ascorbic! - Improve error message when port binding is blocked by a sandbox or security policy

    When running wrangler dev inside a restricted environment (such as an AI coding agent sandbox or locked-down container), the port availability check would fail with a raw EPERM error. This now provides a clear message explaining that a sandbox or security policy is blocking network access, rather than the generic permission error that previously pointed at the file system.

  • #​12545 c9d0f9d Thanks @​dario-piotrowicz! - Improve framework detection when multiple frameworks are found

    When autoconfig detects multiple frameworks in a project, Wrangler now applies smarter logic to select the most appropriate one. Selecting the wrong one is acceptable locally where the user can change the detected framework, in CI an error is instead thrown.

  • #​12548 5cc7158 Thanks @​dario-piotrowicz! - Add trailing newline to generated package.json and wrangler.jsonc files

  • #​12548 5cc7158 Thanks @​dario-piotrowicz! - Fix .gitignore formatting when autoconfig creates a new file

    Previously, when wrangler setup or wrangler deploy created a new .gitignore file via autoconfig, it would add unnecessary leading empty lines before the wrangler-specific entries. Empty separator lines should only be added when appending to an existing .gitignore file. This fix ensures newly created .gitignore files start cleanly without leading blank lines.

  • #​12545 c9d0f9d Thanks @​dario-piotrowicz! - Throw actionable error when autoconfig is run in the root of a workspace

    When running Wrangler commands that trigger auto-configuration (like wrangler dev or wrangler deploy) in the root directory of a monorepo workspace, a helpful error is now shown directing users to run the command in a specific project's directory instead.

  • Updated dependencies [5a868a0, c58e81b, 33a9a8f, 8077c14, caf9b11, 9a565d5, 7f18183, 39491f9, 43c462a]:


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
@astrojs/rss (source) ^4.0.15-beta.3^4.0.15 age confidence
@astrojs/sitemap (source) ^3.6.1-beta.3^3.7.0 age confidence
@​flue/cli ^0.0.32^0.0.44 age confidence
@​flue/client ^0.0.18^0.0.27 age confidence
@preact/signals (source) ^2.7.1^2.8.1 age confidence
@tailwindcss/vite (source) ^4.1.18^4.2.0 age confidence
fast-xml-parser ^5.3.6^5.3.7 age confidence
is-wsl ^3.1.0^3.1.1 age confidence
pnpm (source) 10.29.310.30.1 age confidence
preact (source) ^10.28.3^10.28.4 age confidence
svelte (source) ^5.51.5^5.53.0 age confidence
tailwindcss (source) ^4.1.18^4.2.0 age confidence
turbo (source) ^2.8.7^2.8.10 age confidence
typescript-eslint (source) ^8.55.0^8.56.0 age confidence

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
preactjs/signals (@​preact/signals)

v2.8.1

Compare Source

Patch Changes

v2.8.0

Compare Source

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

v4.2.0

Compare Source

Added
  • Add mauve, olive, mist, and taupe color palettes to the default theme (#​19627)
  • Add @tailwindcss/webpack package to run Tailwind CSS as a webpack plugin (#​19610)
  • Add pbs-* and pbe-* utilities for padding-block-start and padding-block-end (#​19601)
  • Add mbs-* and mbe-* utilities for margin-block-start and margin-block-end (#​19601)
  • Add scroll-pbs-* and scroll-pbe-* utilities for scroll-padding-block-start and scroll-padding-block-end (#​19601)
  • Add scroll-mbs-* and scroll-mbe-* utilities for scroll-margin-block-start and scroll-margin-block-end (#​19601)
  • Add border-bs-* and border-be-* utilities for border-block-start and border-block-end (#​19601)
  • Add inline-*, min-inline-*, max-inline-* utilities for inline-size, min-inline-size, and max-inline-size (#​19612)
  • Add block-*, min-block-*, max-block-* utilities for block-size, min-block-size, and max-block-size (#​19612)
  • Add inset-s-*, inset-e-*, inset-bs-*, inset-be-* utilities for inset-inline-start, inset-inline-end, inset-block-start, and inset-block-end (#​19613)
  • Add font-features-* utility for font-feature-settings (#​19623)
Fixed
  • Prevent double @supports wrapper for color-mix values (#​19450)
  • Allow whitespace around @source inline() argument (#​19461)
  • Emit comment when source maps are saved to files when using @tailwindcss/cli (#​19447)
  • Detect utilities containing capital letters followed by numbers (#​19465)
  • Fix class extraction for Rails' strict locals (#​19525)
  • Align @utility name validation with Oxide scanner rules (#​19524)
  • Fix infinite loop when using @variant inside @custom-variant (#​19633)
  • Allow multiples of .25 in aspect-* fractions (e.g. aspect-8.5/11) (#​19688)
  • Ensure changes to external files listed via @source trigger a full page reload when using @tailwindcss/vite (#​19670)
  • Improve performance of Oxide scanner in bigger projects by reducing file system walks (#​19632)
  • Ensure import aliases in Astro v5 work without crashing when using @tailwindcss/vite (#​19677)
  • Allow escape characters in @utility names to improve support with formatters such as Biome (#​19626)
  • Fix incorrect canonicalization results when canonicalizing multiple times (#​19675)
  • Add .jj to default ignored content directories (#​19687)
Deprecated
  • Deprecate start-* and end-* utilities in favor of inset-s-* and inset-e-* utilities (#​19613)
NaturalIntelligence/fast-xml-parser (fast-xml-parser)

v5.3.7: CJS typing fix

Compare Source

What's Changed

New Contributors

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

sindresorhus/is-wsl (is-wsl)

v3.1.1

Compare Source

  • Fix detection of WSL with custom kernels 3846912

pnpm/pnpm (pnpm)

v10.30.1: pnpm 10.30.1

Compare Source

Patch Changes

  • Use the /-/npm/v1/security/audits/quick endpoint as the primary audit endpoint, falling back to /-/npm/v1/security/audits when it fails #​10649.

Platinum Sponsors

Bit

Gold Sponsors

Sanity Discord Vite
SerpApi CodeRabbit Workleap
Stackblitz Nx

v10.30.0: pnpm 10.30

Compare Source

Minor Changes

  • pnpm why now shows a reverse dependency tree. The searched package appears at the root with its dependents as branches, walking back to workspace roots. This replaces the previous forward-tree output which was noisy and hard to read for deeply nested dependencies.

Patch Changes

  • Revert pnpm why dependency pruning to prefer correctness over memory consumption. Reverted PR: #​7122.
  • Optimize pnpm why and pnpm list performance in workspaces with many importers by sharing the dependency graph and materialization cache across all importers instead of rebuilding them independently for each one #​10596.

Platinum Sponsors

Bit

Gold Sponsors

Sanity Discord Vite
SerpApi CodeRabbit Workleap
Stackblitz Nx
preactjs/preact (preact)

v10.28.4

Compare Source

Fixes

Performance

sveltejs/svelte (svelte)

v5.53.0

Compare Source

Minor Changes
  • feat: allow comments in tags (#​17671)

  • feat: allow error boundaries to work on the server (#​17672)

Patch Changes
  • fix: use TrustedHTML to test for customizable <select> support, where necessary (#​17743)

  • fix: ensure head effects are kept in the effect tree (#​17746)

  • chore: deactivate current_batch by default in unset_context (#​17738)

v5.52.0

Compare Source

Minor Changes
  • feat: support TrustedHTML in {@&#8203;html} expressions (#​17701)
Patch Changes
  • fix: repair dynamic component truthy/falsy hydration mismatches (#​17737)

  • fix: re-run non-render-bound deriveds on the server (#​17674)

vercel/turborepo (turbo)

v2.8.10: Turborepo v2.8.10

Compare Source

What's Changed

create-turbo
Changelog

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

v2.8.9

Compare Source

v2.8.8: Turborepo v2.8.8

Compare Source

What's Changed

@​turbo/codemod
Examples
Changelog

New Contributors

Full Changelog: vercel/turborepo@v2.8.7...v2.8.8

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

v8.56.0

Compare Source

🚀 Features
❤️ Thank You

See GitHub Releases for more information.

You can read about our versioning strategy and releases on our website.


Configuration

📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

withastro/astro

Changes

  • Replaces Object.prototype.toString.call() with instanceof for isHTMLString detection
  • Reorders renderChild type dispatch to check strings first (most common child type)
  • Eliminates O(N²) head element deduplication by using a Set
  • Renders array children and template expressions directly to the destination without buffering when synchronous, falling back to BufferedRenderer only when a Promise is encountered
  • Adds targeted rendering benchmarks (rendering-perf.bench.js) covering many-components, many-expressions, many-head-elements, many-slots, large-array, and static-heavy page shapes

Codspeed results: all benchmarks improve or stay flat, no regressions on .md or .mdx routes. The .astro page benchmark (10K-item list) doubles in throughput.

Research done with help from Claude. Benchmarks by Claude.

Testing

New benchmarks in benchmark/bench/rendering-perf.bench.js and existing benchmark/bench/render.bench.js.

Results from local tests, compared to main:

rendering-perf.bench.js (non-streaming)

Bench Original (Hz) Final (Hz) Total change
many-components 2,517 3,918 +56%
many-expressions 669 1,291 +93%
many-head-elements 7,662 11,997 +57%
many-slots 4,200 5,700 +36%
large-array 81 170 +110%
static-heavy 7,705 9,047 +17%

render.bench.js (realistic pages)

Bench Original (Hz) Final (Hz) Total change
.astro streaming 64.8 128.1 +98%
.astro non-streaming 62.4 129.0 +107%

Docs

Internal optimizations only — no public API or behavior changes. No docs needed.

withastro/astro

Fixes #15576

This adds a temporary workaround for a Svelte bug where components extract the class property with a null default (like let { class: className = null } = $props();). The SSR output incorrectly renders class="" instead of omitting the attribute entirely.

The fix post-processes the SSR HTML output to remove empty class attributes, matching native Svelte behavior until the upstream issue is resolved.

Tests verify the fix works correctly in both build and dev modes.

withastro/astro

Summary

Fixes #15575

  • Preserve astroContentImageFlag through the Vite resolution pipeline in vite-plugin-content-assets.ts so downstream plugins can detect content collection images
  • Return plain ImageMetadata for content collection SVGs in vite-plugin-assets.ts instead of creating full Astro components (which import createComponent from the server runtime and cause a circular module dependency deadlock with TLA)

Root Cause

When SVG images are used in content collection image() fields:

  1. content-assets.mjs imports them with ?astroContentImageFlag
  2. The content asset plugin stripped this flag during resolution
  3. The assets ESM plugin didn't know the SVG came from a content collection, so it called makeSvgComponent() which imports from runtime/server/index.js
  4. Combined with top-level await (TLA) in page components, this created a circular dependency deadlock causing Node.js to silently exit with code 0

Fix

The astroContentImageFlag is now preserved through resolution so the assets plugin can distinguish content collection SVGs (which only need metadata) from directly imported SVGs (which need full component rendering).

Test plan

  • New regression test: content-collection-tla-svg.test.js (YAML collection + SVG image() field + TLA with getCollection)
  • Existing core-image tests pass (100/100)
  • Existing core-image-svg tests pass (11/11)
  • Existing content-layer tests pass (59/59)

🤖 Generated with Claude Code

withastro/astro

Summary

Fixes #15439

<script> and <style> tags inside JSX expressions (e.g. {cond && <script>...</script>}) were losing syntax highlighting and IntelliSense because their content was scoped as plain TSX instead of JavaScript/CSS.

Changes to astro.tmLanguage.src.yaml:

  • New injection rule (L:meta.embedded.expression.astro - meta.embedded.block): Injects the existing #tags-lang pattern into expression scopes so <script>/<style> tags are properly recognized inside expressions and create the correct scope structure (meta.script.astro / meta.style.astro).
  • Narrowed injection exclusions: Changed - (meta source) to - (meta.embedded.block source) in all 12 language injection selectors. This allows them to fire inside expressions (where source.tsx is present from the interpolation contentName) while still preventing double-injection.

Before

Content inside <script> in expressions was scoped as source.tsx:

source.astro meta.embedded.expression.astro source.tsx

After

Content is now properly injected with source.js / source.css:

source.astro meta.embedded.expression.astro source.tsx meta.scope.tag.script.astro meta.script.astro meta.embedded.block.astro source.js

Test plan

  • All 20 existing grammar snapshot tests pass unchanged (zero regressions)
  • Added script/expression.astro test fixture covering <script> in ternary and && expressions
  • Added style/expression.astro test fixture covering <style> in ternary and && expressions
  • Verified snapshots show correct source.js / source.css scoping for script/style content inside expressions

🤖 Generated with Claude Code

withastro/astro

Changes

  • Fixes grammar and spelling

Testing

I'm not adding my tests in this PR, but I used my tooling to identify errors and then validated that I fixed most of them (some items identified by the tooling are false positives, and some would probably require more energy to discuss, so I've left them be):

Note that there are a bunch of fixes that my tooling didn't identify which I made later -- especially while trying to read the contributing file--I call them "in the neighborhood" fixes. (I also added some checks to my catalog of grammar errors based on things I found here...)


I prefer to have upstream CI pass before I make a PR, but the 6!==7 thing failed consistently in full CI and didn't fail in CI when I deleted everything else. There was one CI failure that just popped up in the last run. On Discord and in the docs it appears there's some understanding that there are some flaky tests, so I'm posting anyway. -- None of my changes seemed to be particularly close to the tests that failed (my initial run did have one set of real tests that I had to fix, but I fixed that quickly).

Docs

I don't think any changes to docs should be necessary.

withastro/astro

Docs

  • Make this a minor since its a new option.
  • Add a code example
  • Set the correct version number
withastro/astro

Changes

This a small refactor to speedup our linting step in CI. Here's the changes

  • Move the biome linting in its own step, using its own action because it doesn't need Node.js, pnpm, etc. it will be fast.
  • The former lint step now runs first knip and then eslint. knip is objectively faster, so it gives us faster feedback
  • Removed the needs of build from the former lint step. The step, already, builds the whole monorepo, so there's no need to wait for the Build step to understand if something is red

Plus, upgraded Biome because it allows to run multiple reporters, as you can see from the changes.

Testing

Locally tested that the Biome command still works

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 5-legacy, this PR will be updated.

Releases

astro@5.18.0

Minor Changes

  • #15589 b7dd447 Thanks @qzio! - Adds a new security.actionBodySizeLimit option to configure the maximum size of Astro Actions request bodies.

    This lets you increase the default 1 MB limit when your actions need to accept larger payloads. For example, actions that handle file uploads or large JSON payloads can now opt in to a higher limit.

    If you do not set this option, Astro continues to enforce the 1 MB default to help prevent abuse.

    // astro.config.mjs
    export default defineConfig({
      security: {
        actionBodySizeLimit: 10 * 1024 * 1024, // set to 10 MB
      },
    });

Patch Changes

  • #15594 efae11c Thanks @qzio! - Fix X-Forwarded-Proto validation when allowedDomains includes both protocol and hostname fields. The protocol check no longer fails due to hostname mismatch against the hardcoded test URL.
withastro/astro

Changes

  • Sort collections and their entries by key at all three serialization points in MutableDataStore (toString, writeAssetImports, writeModuleImports) to ensure deterministic output regardless of concurrent processing order.

Fixes #15592

Testing

  • Tests updated

Docs

N/A, bug fix

withastro/astro

Changes

Refactors the checkOrigin middleware to be a port of go's csrf protection.

Ref: https://cs.opensource.google/go/go/+/refs/tags/go1.26.0:src/net/http/csrf.go;l=206

Ref article by the one of go author: https://words.filippo.io/csrf/

Testing

One test was added to check the green path.

Docs

Since this PR don't change the security.checkOrigin variable, no docs should need update.
However, since the new implementation checks not only the origin, but also sec-fetch-site maybe the variable name should change?

withastro/astro

Changes

backports #15560 to 5.x

Testing

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/cloudflare@13.0.0-beta.9

Major Changes

  • #15435 957b9fe Thanks @rururux! - Changes the default image service from compile to cloudflare-binding. Image services options that resulted in broken images in development due to Node JS incompatiblities have now been updated to use the noop passthrough image service in dev mode. - (Cloudflare v13 and Astro6 upgrade guidance)

Minor Changes

  • #15435 957b9fe Thanks @rururux! - Adds support for configuring the image service as an object with separate build and runtime options

    It is now possible to set both a build-time and runtime service independently. Currently, 'compile' is the only available build time option. The supported runtime options are 'passthrough' (default) and 'cloudflare-binding':

    import { defineConfig } from 'astro/config';
    import cloudflare from '@astrojs/cloudflare';
    
    export default defineConfig({
      adapter: cloudflare({
        imageService: { build: 'compile', runtime: 'cloudflare-binding' },
      }),
    });

    See the Cloudflare adapter imageService docs for more information about configuring your image service.

  • #15556 8fb329b Thanks @florian-lefebvre! - Adds support for more @cloudflare/vite-plugin options

    The adapter now accepts the following options from Cloudflare's Vite plugin:

    • auxiliaryWorkers
    • configPath
    • inspectorPort
    • persistState
    • remoteBindings
    • experimental.headersAndRedirectsDevModeSupport

    For example, you can now set inspectorPort to provide a custom port for debugging your Workers:

    // astro.config.mjs
    import { defineConfig } from 'astro/config';
    import cloudflare from '@astrojs/cloudflare';
    
    export default defineConfig({
      adapter: cloudflare({
        inspectorPort: 3456,
      }),
    });

Patch Changes

  • #15565 30cd6db Thanks @ematipico! - Fixes an issue where the use of the Code component would result in an unexpected error.

  • #15588 425ea16 Thanks @rururux! - Fixes an issue where esbuild would throw a "Top-level return cannot be used inside an ECMAScript module" error during dependency scanning in certain environments.

  • #15636 5ecd04c Thanks @florian-lefebvre! - Adds an error when running on Stackblitz, since workerd doesn't support it

  • Updated dependencies []:

    • @astrojs/underscore-redirects@1.0.0

astro@6.0.0-beta.15

Minor Changes

  • #15471 32b4302 Thanks @ematipico! - Adds a new experimental flag queuedRendering to enable a queue-based rendering engine

    The new engine is based on a two-pass process, where the first pass
    traverses the tree of components, emits an ordered queue, and then the queue is rendered.

    The new engine does not use recursion, and comes with two customizable options.

    Early benchmarks showed significant speed improvements and memory efficiency in big projects.

    Queue-rendered based

    The new engine can be enabled in your Astro config with experimental.queuedRendering.enabled set to true, and can be further customized with additional sub-features.

    // astro.config.mjs
    export default defineConfig({
      experimental: {
        queuedRendering: {
          enabled: true,
        },
      },
    });

    Pooling

    With the new engine enabled, you now have the option to have a pool of nodes that can be saved and reused across page rendering. Node pooling has no effect when rendering pages on demand (SSR) because these rendering requests don't share memory. However, it can be very useful for performance when building static pages.

    // astro.config.mjs
    export default defineConfig({
      experimental: {
        queuedRendering: {
          enabled: true,
          poolSize: 2000, // store up to 2k nodes to be reused across renderers
        },
      },
    });

    Content caching

    The new engine additionally unlocks a new contentCache option. This allows you to cache values of nodes during the rendering phase. This is currently a boolean feature with no further customization (e.g. size of cache) that uses sensible defaults for most large content collections:

    When disabled, the pool engine won't cache strings, but only types.

    // astro.config.mjs
    export default defineConfig({
      experimental: {
        queuedRendering: {
          enabled: true,
          contentCache: true, // enable re-use of node values
        },
      },
    });

    For more information on enabling and using this feature in your project, see the experimental queued rendering docs for more details.

  • #15543 d43841d Thanks @Princesseuh! - Adds a new experimental.rustCompiler flag to opt into the experimental Rust-based Astro compiler

    This experimental compiler is faster, provides better error messages, and generally has better support for modern JavaScript, TypeScript, and CSS features.

    After enabling in your Astro config, the @astrojs/compiler-rs package must also be installed into your project separately:

    import { defineConfig } from 'astro/config';
    
    export default defineConfig({
      experimental: {
        rustCompiler: true,
      },
    });

    This new compiler is still in early development and may exhibit some differences compared to the existing Go-based compiler. Notably, this compiler is generally more strict in regard to invalid HTML syntax and may throw errors in cases where the Go-based compiler would have been more lenient. For example, unclosed tags (e.g. <p>My paragraph) will now result in errors.

    For more information about using this experimental feature in your project, especially regarding expected differences and limitations, please see the experimental Rust compiler reference docs. To give feedback on the compiler, or to keep up with its development, see the RFC for a new compiler for Astro for more information and discussion.

Patch Changes

  • #15565 30cd6db Thanks @ematipico! - Fixes an issue where the use of the Astro internal logger couldn't work with Cloudflare Vite plugin.

  • #15562 e14a51d Thanks @florian-lefebvre! - Removes types for the astro:ssr-manifest module, which was removed

  • #15435 957b9fe Thanks @rururux! - Improves compatibility of the built-in image endpoint with runtimes that don't support CJS dependencies correctly

  • #15640 4c1a801 Thanks @ematipico! - Reverts the support of Shiki with CSP. Unfortunately, after exhaustive tests, the highlighter can't be supported to cover all cases.

    Adds a warning when both Content Security Policy (CSP) and Shiki syntax highlighting are enabled, as they are incompatible due to Shiki's use of inline styles

  • #15605 f6473fd Thanks @ascorbic! - Improves .astro component SSR rendering performance by up to 2x.

    This includes several optimizations to the way that Astro generates and renders components on the server. These are mostly micro-optimizations, but they add up to a significant improvement in performance. Most pages will benefit, but pages with many components will see the biggest improvement, as will pages with lots of strings (e.g. text-heavy pages with lots of HTML elements).

  • #15514 999a7dd Thanks @veeceey! - Fixes font flash (FOUT) during ClientRouter navigation by preserving inline <style> elements and font preload links in the head during page transitions.

    Previously, @font-face declarations from the <Font> component were removed and re-inserted on every client-side navigation, causing the browser to re-evaluate them.

  • #15580 a92333c Thanks @ematipico! - Fixes a build error when generating projects with a large number of static routes

  • #15549 be1c87e Thanks @0xRozier! - Fixes an issue where original (unoptimized) images from prerendered pages could be kept in the build output during SSR builds.

  • #15565 30cd6db Thanks @ematipico! - Fixes an issue where the use of the Code component would result in an unexpected error.

  • #15585 98ea30c Thanks @matthewp! - Add a default body size limit for server actions to prevent oversized requests from exhausting memory.

  • #15565 30cd6db Thanks @ematipico! - Fixes an issue where the new Astro v6 development server didn't log anything when navigating the pages.

  • #15591 1ed07bf Thanks @renovate! - Upgrades devalue to v5.6.3

  • #15633 9d293c2 Thanks @jwoyo! - Fixes a case where <script> tags from components passed as slots to server islands were not included in the response

  • #15586 35bc814 Thanks @matthewp! - Fixes an issue where allowlists were not being enforced when handling remote images

@astrojs/rss@4.0.15-beta.4

Patch Changes

@astrojs/node@10.0.0-beta.5

Patch Changes

@astrojs/preact@5.0.0-beta.4

Patch Changes

  • #15619 bbfa7c8 Thanks @rururux! - Fixed an issue where the Preact integration would incorrectly intercept React 19 components, triggering "Invalid hook call" error logs.

@astrojs/svelte@8.0.0-beta.3

Patch Changes

withastro/astro

Changes

To enable upload of larger files, make the action request body limit configurable changesets.

Testing

Docs

This PR doesn't touch docs.

NOTE:

I'm not sure if this should go against main or 5-legacy.
But I need this (or something like this) in the current "stable" version of astro.

withastro/astro

fixes: #15518

Changes

In the previous implementation of the Cloudflare Workers integration, the following error occurred when esbuild attempted to scan dependencies by loading the code:

✘ [ERROR] Top-level return cannot be used inside an ECMAScript module

This pull request addresses this issue with the following changes:

  • Modified esbuild input: Before passing code to esbuild, return statements are now replaced with throw . This logic is based on the implementation found in vite-plugin-astro/compile.ts. To ensure source maps remain accurate, the replacement includes padding to maintain the original character count.
  • Added comments explaining potential errors that might arise from this change in specific edge cases.

Testing

  • Verified that the Top-level return cannot be ... error no longer occurs.
  • Added a test case to ensure that the replacement logic does not break the syntax (which would previously trigger a Failed to run dependency scan ... error).

Docs

N/A

withastro/astro

Changes

  • Enforce remote image allowlists when inferring remote sizes and image endpoints
  • Cherry-picked from e01e98b
withastro/astro

Changes

  • Add a default 1MB limit for action request bodies and enforce when Content-Length is missing
  • Cherry-picked from 522f880
withastro/astro

Description

When build.format is set to 'file', Astro outputs pages with .html extensions (e.g., about.html). However, the sitemap integration was generating URLs without extensions (e.g., /about instead of /about.html), leading to incorrect sitemap entries.

Changes

  • Added a check in the sitemap URL generation to append .html when build.format === 'file'
  • Updated the corresponding test to expect .html extensions
  • Added changeset

Fixes #15526

withastro/starlight

Description

  • Follow up to #3713
  • Documents the use of code backticks to escape filenames like __init__.py that otherwise break because the _ is interpreted as Markdown syntax

Docs preview: https://deploy-preview-3714--astro-starlight.netlify.app/components/file-tree/#escape-special-characters

withastro/astro

This PR contains the following updates:

Package Change Age Confidence
svelte (source) 5.50.35.51.5 age confidence

GitHub Vulnerability Alerts

CVE-2026-27119

In certain circumstances, the server-side rendering output of an <option> element does not properly escape its content, potentially allowing HTML injection in the SSR output. Client-side rendering is not affected.

CVE-2026-27121

Versions of svelte prior to 5.51.5 are vulnerable to cross-site scripting (XSS) during server-side rendering. When using spread syntax to render attributes from untrusted data, event handler properties are included in the rendered HTML output. If an application spreads user-controlled or external data as element attributes, an attacker can inject malicious event handlers that execute in victims' browsers.

CVE-2026-27122

When using <svelte:element this={tag}> in server-side rendering, the provided tag name is not validated or sanitized before being emitted into the HTML output. If the tag string contains unexpected characters, it can result in HTML injection in the SSR output. Client-side rendering is not affected.

CVE-2026-27125

In server-side rendering, attribute spreading on elements (e.g. <div {...attrs}>) enumerates inherited properties from the object's prototype chain rather than only own properties. In environments where Object.prototype has already been polluted — a precondition outside of Svelte's control — this can cause unexpected attributes to appear in SSR output or cause SSR to throw errors. Client-side rendering is not affected.


Release Notes

sveltejs/svelte (svelte)

v5.51.5

Compare Source

Patch Changes

v5.51.4

Compare Source

Patch Changes
  • chore: proactively defer effects in pending boundary (#​17734)

  • fix: detect and error on non-idempotent each block keys in dev mode (#​17732)

v5.51.3

Compare Source

Patch Changes
  • fix: prevent event delegation logic conflicting between svelte instances (#​17728)

  • fix: treat CSS attribute selectors as case-insensitive for HTML enumerated attributes (#​17712)

  • fix: locate Rollup annontaion friendly to JS downgraders (#​17724)

  • fix: run effects in pending snippets (#​17719)

v5.51.2

Compare Source

Patch Changes
  • fix: take async into consideration for dev delegated handlers (#​17710)

  • fix: emit state_referenced_locally warning for non-destructured props (#​17708)

v5.51.1

Compare Source

Patch Changes
  • fix: don't crash on undefined document.contentType (#​17707)

  • fix: use symbols for encapsulated event delegation (#​17703)

v5.51.0

Compare Source

Minor Changes
  • feat: Use TrustedTypes for HTML handling where supported (#​16271)
Patch Changes
  • fix: sanitize template-literal-special-characters in SSR attribute values (#​17692)

  • fix: follow-up formatting in print() — flush block-level elements into separate sequences (#​17699)

  • fix: preserve delegated event handlers as long as one or more root components are using them (#​17695)


Configuration

📅 Schedule: Branch creation - "" (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.

🔕 Ignore: Close this PR and you won't be reminded about these updates again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

withastro/astro

Changes

Taken from the triage bot.

Closes #15578

Testing

Added a new test, which failed before the fix.

Docs

N/A

withastro/astro

Changes

Adds a new experimental Route Caching API and Route Rules for controlling SSR response caching. See the RFC for full details.

Route caching gives you a platform-agnostic way to cache server-rendered responses, based on web standard cache headers. You set caching directives in your routes using Astro.cache (in .astro pages) or context.cache (in API routes and middleware), and Astro translates them into the appropriate headers or runtime behavior depending on your adapter. You can also define cache rules for routes declaratively in your config using experimental.routeRules, without modifying route code.

Getting started

Enable the feature by configuring experimental.cache with a cache provider in your Astro config:

// astro.config.mjs
import { defineConfig } from 'astro/config';
import node from '@astrojs/node';
import { memoryCache } from 'astro/config';

export default defineConfig({
  adapter: node({ mode: 'standalone' }),
  experimental: {
    cache: {
      provider: memoryCache(),
    },
  },
});

Using Astro.cache and context.cache

In .astro pages, use Astro.cache.set() to control caching:

---
// src/pages/index.astro
Astro.cache.set({
  maxAge: 120,       // Cache for 2 minutes
  swr: 60,           // Serve stale for 1 minute while revalidating
  tags: ['home'],    // Tag for targeted invalidation
});
---
<html><body>Cached page</body></html>

In API routes and middleware, use context.cache:

// src/pages/api/data.ts
export function GET(context) {
  context.cache.set({
    maxAge: 300,
    tags: ['api', 'data'],
  });
  return Response.json({ ok: true });
}

Cache options

cache.set() accepts the following options:

  • maxAge (number): Time in seconds the response is considered fresh.
  • swr (number): Stale-while-revalidate window in seconds. During this window, stale content is served while a fresh response is generated in the background.
  • tags (string[]): Cache tags for targeted invalidation. Tags accumulate across multiple set() calls within a request.
  • lastModified (Date): When multiple set() calls provide lastModified, the most recent date wins.
  • etag (string): Entity tag for conditional requests.

Call cache.set(false) to explicitly opt out of caching for a request.

Multiple calls to cache.set() within a single request are merged: scalar values use last-write-wins, lastModified uses most-recent-wins, and tags accumulate.

Invalidation

Purge cached entries by tag or path using cache.invalidate():

// Invalidate all entries tagged 'data'
await context.cache.invalidate({ tags: ['data'] });

// Invalidate a specific path
await context.cache.invalidate({ path: '/api/data' });

Config-level route rules

Use experimental.routeRules to set default cache options for routes without modifying route code. Supports Nitro-style shortcuts for ergonomic configuration:

import { memoryCache } from 'astro/config';

export default defineConfig({
  experimental: {
    cache: {
      provider: memoryCache(),
    },
    routeRules: {
      // Shortcut form (Nitro-style)
      '/api/*': { swr: 600 },

      // Full form with nested cache
      '/products/*': { cache: { maxAge: 3600, tags: ['products'] } },
    },
  },
});

Route patterns support static paths, dynamic parameters ([slug]), and rest parameters ([...path]). Per-route cache.set() calls merge with (and can override) the config-level defaults.

You can also read the current cache state via cache.options:

const { maxAge, swr, tags } = context.cache.options;

Cache providers

Cache behavior is determined by the configured cache provider. There are two types:

  • CDN providers set response headers (e.g. CDN-Cache-Control, Cache-Tag) and let the CDN handle caching. Astro strips these headers before sending the response to the client.
  • Runtime providers implement onRequest() to intercept and cache responses in-process, adding an X-Astro-Cache header (HIT/MISS/STALE) for observability.

Built-in memory cache provider

Astro includes a built-in in-memory LRU cache provider. Import memoryCache from astro/config to configure it.

Features:

  • In-memory LRU cache with configurable max entries (default: 1000)
  • Stale-while-revalidate support
  • Tag-based and path-based invalidation
  • X-Astro-Cache response header: HIT, MISS, or STALE

Writing a custom cache provider

A cache provider is a module that exports a factory function as its default export:

import type { CacheProviderFactory } from 'astro';

const factory: CacheProviderFactory = (config) => {
  return {
    name: 'my-cache-provider',
    // For CDN-style: set response headers
    setHeaders(options) {
      const headers = new Headers();
      if (options.maxAge !== undefined) {
        headers.set('CDN-Cache-Control', `max-age=${options.maxAge}`);
      }
      return headers;
    },
    // For runtime-style: intercept requests (optional)
    async onRequest(context, next) {
      // ... check cache, call next(), store response
    },
    // Handle invalidation
    async invalidate(options) {
      // ... purge by tags or path
    },
  };
};

export default factory;

Error handling

If you use Astro.cache or context.cache without enabling the feature, Astro throws an AstroError with the name CacheNotEnabled and a message explaining how to configure it. If the configured provider cannot be resolved, Astro throws CacheProviderNotFound at build time.

Testing

Adds comprehensive test suite

Docs

withastro/docs#13305

withastro/astro

Changes

  • clear the dev route cache when content collections change so slug pages re-evaluate getStaticPaths
  • add an HMR test that updates content and verifies slug route output refreshes
  • Fixes #15555

Testing

  • test/hmr-markdown.test.js updated

Docs

  • N/A, bug fix
withastro/astro

Changes

  • Update the peerDependency for @astrojs/node to include the fix regarding memory exhaustion.

Testing

N/A, package.json change only

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 5-legacy, this PR will be updated.

Releases

astro@5.17.3

Patch Changes

  • #15564 522f880 Thanks @matthewp! - Add a default body size limit for server actions to prevent oversized requests from exhausting memory.

  • #15569 e01e98b Thanks @matthewp! - Respect image allowlists when inferring remote image sizes and reject remote redirects.

@astrojs/node@9.5.4

Patch Changes

  • #15564 522f880 Thanks @matthewp! - Add a default body size limit for server actions to prevent oversized requests from exhausting memory.

  • #15572 ef851bf Thanks @matthewp! - Upgrade astro package support

    astro@5.17.3 includes a fix to prevent Action payloads from exhausting memory. @astrojs/node now depends on this version of Astro as a minimum requirement.

withastro/astro

Changes

  • Enforce allowlists for remote inferSize and reject remote redirects in image fetch paths.
  • Add minimal tests for disallowed inferSize and redirect rejection.
  • Include a changeset.

Testing

  • New test cases added

Docs

  • N/A, bug fix
withastro/astro

Changes

Closes #15558

Did some research and textContent is generally safer than innerText, so it's safe to use.

Testing

Added a test

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

astro@6.0.0-beta.14

Patch Changes

  • #15573 d789452 Thanks @matthewp! - Clear the route cache on content changes so slug pages reflect updated data during dev.

  • #15560 170ed89 Thanks @z0mt3c! - Fix X-Forwarded-Proto validation when allowedDomains includes both protocol and hostname fields. The protocol check no longer fails due to hostname mismatch against the hardcoded test URL.

  • #15563 e959698 Thanks @ematipico! - Fixes an issue where warnings would be logged during the build using one of the official adapters

withastro/astro

Changes

Closes #15284
Closes #15310

This PR address three things

The debug package

Removed it. It's old, not ESM friendly, and it doesn't work with CF. I eventually found obug, a drop-in replacement. Thank you e18e. They will add it to the website soon.

The other problem is that debug is contained in our dependencies too, especially in the rehype-remark rabbit hole. It's pulled in our runtime via Code component. I used an alias to replace it. Thank you vite

Code doesn't work with CF

Not sure why and how it worked before, but Code started to fail, even in our tests. Not sure what changed in these past weeks/months, because it used to work during the refactor to vite environment APIs.

I tried and tried with a coding agent, and the result was always the same: workerd in dev mode can't run the WASM engined used by shiki. Solution? Use the JavaScript engine. It works with this one.

Logging

We lost of our logging or requests in our dev server. Mainly this bit:

if (isLoggedRequest(pathname)) {
const timeEnd = performance.now();
logger.info(
null,
req({
url: pathname,
method: incomingRequest.method,
statusCode,
isRewrite,
reqTime: timeEnd - timeStart,
}),
);
}

Which I restored in this PR via an abstract method, which is implemented only in our dev pipelines. While doing so, I realised that things started to fail because we were pulling Node.js code, so I did the only sane thing and split the utilities/messages in runtime VS node.

Testing

Current CI should pass. Manually tested that DEBUG= still works, --verbose still works and I see logs in dev.

I updated biome.jsonc to match any file that contains runtime in their name. It should match more files.

Docs

N/A

withastro/astro
  • Add a default 1 MB action request body cap to avoid oversized payloads exhausting memory
  • Enforce the limit for chunked bodies by buffering with a hard cap and returning 413

Testing

  • New test added to the Actions test with a large buffer in the body.

Docs

N/A, bug fix

withastro/astro

Changes

Closes #15509

Testing

Unfortunately this issue doesn't occur with linked packages

Docs

N/A

withastro/astro

Changes

  • 2nd take on #15418 which didn't reach consensus
  • It updates the node adapter as little as possible to new APIs, taking deprecations into account

Testing

Should pass

Docs

Changeset

withastro/astro

The protocol validation in validateForwardedHeaders() passed the full pattern object to matchPattern(), which also checked hostname against the hardcoded test URL (example.com). Pass only { protocol } to matchPattern() so that only the protocol field is validated; the host+proto combination is already checked in the host validation block below.

Fixes #15559

Changes

  • Pass { protocol: pattern.protocol } instead of the full pattern to matchPattern() in the protocol validation block
  • Changeset included

Testing

Added 4 unit tests in node.test.js covering the reverse proxy case (socket.encrypted: false):

  • Accepts forwarded https when allowedDomains has protocol + hostname
  • Rejects forwarded http when only https is allowed
  • Accepts forwarded https with wildcard hostname pattern
  • Constructs correct URL behind reverse proxy with all forwarded headers

Docs

No docs changes needed — this restores the documented behavior of security.allowedDomains.

withastro/astro

Changes

Refactored astro-attrs.test.js (file, fixtures) to the new unit test format.
Moved React-dependent test cases to integrations/react/test/react-component.test.js to avoid unnecessary dependencies in the core package, as discussed.

Testing

Migrated existing test cases to the new format without adding new functional tests.
Added @ts-check to the test files and included some comments to suppress linting warnings from Biome and fix type errors.

Docs

N/A. This change is limited to test files only.

withastro/astro

Changes

  • Addresses https://github.com/orgs/withastro/projects/21/views/1?pane=issue&itemId=154871760 (feedback from James: we should be able to forward some options to the cf vite plugin)
  • The CF adapter now accepts relevant options from the vite plugin. I chose to use Pick instead of Omit to avoid conflicts with our own options and control better what we support
  • I checked the CF docs on what these options were doing before adding support for them and it made sense to me. I basically omitted all the ones that we already set
  • I had to rely on globalThis to pass options to astro preview

Testing

Manual

Docs

withastro/astro

Changes

  • Updates or adds jsdocs for AstroAdapter, adapting from v6 docs

Testing

N/A

Docs

Changeset

withastro/astro

Summary

Fixes #15503

  • Delete original (unoptimized) images from prerendered pages in SSR builds instead of keeping them in the client _astro directory
  • Track referencedImages in the prerender environment for server builds, so directly-referenced originals (e.g., <img src={img.src}>) are preserved
  • Remove the !env.isSSR guard that blocked all original image deletion in server mode — staticImages only contains images from prerendered pages, so it's safe to clean up unreferenced originals

Changes

File What
packages/astro/src/assets/vite-plugin-assets.ts Only skip referencedImages tracking for the SSR environment (not prerender)
packages/astro/src/assets/build/generate.ts Remove !env.isSSR guard so unreferenced originals are deleted in SSR builds
packages/astro/test/image-deletion.test.js Add SSR test section verifying deletion behavior
test/fixtures/core-image-deletion-ssr/ New minimal fixture with prerendered + SSR pages

Test plan

  • Existing SSG image deletion tests still pass (5/5)
  • New SSR image deletion tests pass (2/2): originals only used for optimization are deleted, directly referenced originals are preserved
  • Full core-image test suite passes (100/100)
  • SSR assets test passes (1/1)

🤖 Generated with Claude Code

withastro/astro
  • option for adding additional langs

  • tests

  • changeset

  • cleanup test

  • cleanup test

  • cleanup

  • clarify changeset

  • Update .changeset/tangy-tables-jog.md

  • add more details to changeset

  • add more details to changeset

  • Update .changeset/tangy-tables-jog.md

  • Update .changeset/tangy-tables-jog.md

  • minor not patch

  • Apply suggestions from code review


Changes

Testing

Docs

withastro/astro

Changes

  • New: Add proxies support to the triage workflow. Replaces manual GH_TOKEN env passing with a safer github proxy from @flue/client/proxies.
  • Chore: Improve triage skills — add explicit SCOPE instructions to all sub-skills, promote git blame in verify skill, refine comment template formatting.
  • Chore: Improve AGENTS.md - add environment guide (prefer node -e over python), add bgproc (by @ascorbic!) to help agents manage background dev servers.
  • Chore: Bump @flue/cli to 0.0.43 and @flue/client to 0.0.27.

And two unrelated things:

  • New: Add analyze-github-action-logs skill for debugging CI logs. Useful for powering a prompt like "review the last 10 completed github action runs of type XXX for issues or potential improvements"
  • Refactor: Clean up our other issue-* workflows (issue-opened, issue-needs-repro, issue-wontfix).

Testing

No good way to test CI locally, will need to test post-merge.

Docs

No docs needed.

withastro/astro

Changes

Adds a new experimental flag to use the Rust compiler instead of the Go one. This requires users to install @astrojs/compiler-rs in their project manually.

Testing

I edited some tests so that they pass on both the old and the new compiler:

  • Two tests had invalid HTML
  • LightningCSS does some CSS stuff slightly differently, and not all the minification options are currently enabled in the new compiler because of some issues so I had to change the asserts

Apart from that, I believe that all tests pass on both compilers.

Docs

There's a JSDoc and withastro/docs#13303

withastro/astro

fixes: #15521

Changes

Updated HTML attribute handling to support the "until-found" value for the hidden attribute.
Previously, the hidden attribute was only treated as a boolean. it now correctly handles both boolean and string values.

Testing

Added tests to verify that both standard boolean values and the new "until-found" value are handled correctly.
Since Cheerio does not yet support "until-found", I have used regular expressions to validate this specific value in the output.

Docs

N/A, bug fix

withastro/astro

Changes

  • No code changes, tests only

Testing

  • Moves astro-response.test.js to a unit test, nothing here depends on a build.
  • Added a test-helpers.js and added a createManifest which is something all of the tests need.

Docs

N/A, tests only

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

Major Changes

Minor Changes

  • #15529 a509941 Thanks @florian-lefebvre! - Adds a new build-in font provider npm to access fonts installed as NPM packages

    You can now add web fonts specified in your package.json through Astro's type-safe Fonts API. The npm font provider allows you to add fonts either from locally installed packages in node_modules or from a CDN.

    Set fontProviders.npm() as your fonts provider along with the required name and cssVariable values, and add options as needed:

    import { defineConfig, fontProviders } from 'astro/config';
    
    export default defineConfig({
      experimental: {
        fonts: [
          {
            name: 'Roboto',
            provider: fontProviders.npm(),
            cssVariable: '--font-roboto',
          },
        ],
      },
    });

    See the NPM font provider reference documentation for more details.

  • #15548 5b8f573 Thanks @florian-lefebvre! - Adds a new optional embeddedLangs prop to the <Code /> component to support languages beyond the primary lang

    This allows, for example, highlighting .vue files with a <script setup lang="tsx"> block correctly:

    ---
    import { Code } from 'astro:components';
    
    const code = `
    <script setup lang="tsx">
    const Text = ({ text }: { text: string }) => <div>{text}</div>;
    </script>
    
    <template>
      <Text text="hello world" />
    </template>`;
    ---
    
    <Code {code} lang="vue" embeddedLangs={['tsx']} />

    See the <Code /> component documentation for more details.

  • #15483 7be3308 Thanks @florian-lefebvre! - Adds streaming option to the createApp() function in the Adapter API, mirroring the same functionality available when creating a new App instance

    An adapter's createApp() function now accepts streaming (defaults to true) as an option. HTML streaming breaks a document into chunks to send over the network and render on the page in order. This normally results in visitors seeing your HTML as fast as possible but factors such as network conditions and waiting for data fetches can block page rendering.

    HTML streaming helps with performance and generally provides a better visitor experience. In most cases, disabling streaming is not recommended.

    However, when you need to disable HTML streaming (e.g. your host only supports non-streamed HTML caching at the CDN level), you can opt out of the default behavior by passing streaming: false to createApp():

    import { createApp } from 'astro/app/entrypoint';
    
    const app = createApp({ streaming: false });

    See more about the createApp() function in the Adapter API reference.

Patch Changes

@astrojs/mdx@5.0.0-beta.8

Major Changes

Patch Changes

  • Updated dependencies [84d6efd]:
    • @astrojs/markdown-remark@7.0.0-beta.7

@astrojs/markdown-remark@7.0.0-beta.7

Major Changes

@astrojs/markdoc@1.0.0-beta.11

Patch Changes

  • Updated dependencies [84d6efd]:
    • @astrojs/markdown-remark@7.0.0-beta.7
withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@cloudflare/vite-plugin (source) ^1.23.0^1.25.0 age confidence
@cloudflare/workers-types ^4.20260131.0^4.20260213.0 age confidence
@netlify/blobs (source) ^10.5.0^10.6.0 age confidence
@netlify/vite-plugin (source) ^2.8.0^2.9.0 age confidence
@types/react (source) ^18.3.27^18.3.28 age confidence
@vercel/functions (source) ^3.4.0^3.4.2 age confidence
@vercel/nft ^1.3.0^1.3.1 age confidence
@vercel/routing-utils (source) ^5.3.2^5.3.3 age confidence
@vitejs/plugin-vue (source) ^6.0.3^6.0.4 age confidence
fastify (source) ^5.7.2^5.7.4 age confidence
svelte (source) ^5.49.1^5.50.3 age confidence
vue (source) ^3.5.27^3.5.28 age confidence
wrangler (source) ^4.61.1^4.65.0 age confidence

Release Notes

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

v1.25.0

Compare Source

Minor Changes
  • #​12535 bd06ad2 Thanks @​edmundhung! - Set { serverHandler: false } automatically when using @vitejs/plugin-rsc

    By default, @vitejs/plugin-rsc adds dev and preview server middleware that imports the RSC entry in Node.js. This fails with cloudflare:* imports (ERR_UNSUPPORTED_ESM_URL_SCHEME) and is unnecessary since the Cloudflare plugin handles requests via workerd. Users no longer need to pass rsc({ serverHandler: false }) manually.

Patch Changes

v1.24.0

Compare Source

Minor Changes
  • #​12446 1231a2e Thanks @​jamesopstad! - Infer upload_source_maps setting in the output Worker config from the build.sourcemap setting in the Vite config.

    If build.sourcemap is enabled for a Worker environment, as in the following example, "upload_source_maps": true will now automatically be added to the output wrangler.json file.
    This removes the need to additionally specify the upload_source_maps property in the input Worker config.

    export default defineConfig({
    	environments: {
    		my_worker: {
    			build: {
    				sourcemap: true,
    			},
    		},
    	},
    	plugins: [cloudflare()],
    });

    Note that if upload_source_maps is set in the input Worker config, this value will take precedence.
    This makes it possible to generate source maps without uploading them.

Patch Changes

v1.23.1

Compare Source

Patch Changes
  • #​12381 98283fa Thanks @​jamesopstad! - Avoid collecting nodejs_compat warnings during dependency optimization.

    Previously, a custom plugin was provided during dependency optimization to collect warnings when Node.js built-ins were imported and the nodejs_compat flag was not enabled.
    Because optimized dependencies are cached, the warning was only displayed when dependencies changed.
    Additionally, it sometimes included false positives from dependencies that were no longer used.
    We now always externalize Node.js built-ins during dependency optimization and collect the warnings at runtime.
    This is more consistent with how warnings are collected for direct imports of Node.js built-ins.

  • Updated dependencies [ee9b81f, 63f1adb, ba13de9, 447daa3, fe3af35, bd4bb98, dab4bc9, 83adb2c, 18c0784]:

    • wrangler@​4.63.0
    • miniflare@​4.20260205.0
cloudflare/workerd (@​cloudflare/workers-types)

v4.20260213.0

Compare Source

v4.20260212.0

Compare Source

v4.20260210.0

Compare Source

v4.20260207.0

Compare Source

v4.20260206.0

Compare Source

v4.20260205.0

Compare Source

netlify/primitives (@​netlify/blobs)

v10.6.0

Compare Source

Features
Dependencies
netlify/primitives (@​netlify/vite-plugin)

v2.9.0

Compare Source

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

v3.4.2

Compare Source

Patch Changes
vercel/nft (@​vercel/nft)

v1.3.1

Compare Source

Bug Fixes
vercel/vercel (@​vercel/routing-utils)

v5.3.3

Compare Source

Patch Changes
  • Services routing improvements: (#​15018)

    • Fix route ownership scoping so parent service catch-alls (e.g. Vite SPA fallback) don't capture sibling service prefixes
    • Move shared ownership-guard helpers (getOwnershipGuard, scopeRouteSourceToOwnership) to @vercel/routing-utils
    • Place runtime service function outputs under internal /_svc/<service>/index namespace to prevent filesystem path leakage
    • Block /_svc as a reserved routePrefix in service validation
    • Scope all builder-emitted routes (not just route-owning builders) to their service ownership before merging
cloudflare/workers-sdk (wrangler)

v4.65.0

Compare Source

Minor Changes
  • #​12473 b900c5a Thanks @​petebacondarwin! - Add CF_PAGES environment variables to wrangler pages dev

    wrangler pages dev now automatically injects Pages-specific environment variables (CF_PAGES, CF_PAGES_BRANCH, CF_PAGES_COMMIT_SHA, CF_PAGES_URL) for improved dev/prod parity. This enables frameworks like SvelteKit to auto-detect the Pages environment during local development.

    • CF_PAGES is set to "1" to indicate the Pages environment
    • CF_PAGES_BRANCH defaults to the current git branch (or "local" if not in a git repo)
    • CF_PAGES_COMMIT_SHA defaults to the current git commit SHA (or a placeholder if not in a git repo)
    • CF_PAGES_URL is set to a simulated commit preview URL (e.g., https://<sha>.<project-name>.pages.dev)

    These variables are displayed with their actual values in the bindings table during startup, making it easy to verify what branch and commit SHA were detected.

    These variables can be overridden by user-defined vars in the Wrangler configuration, .env, .dev.vars, or via CLI flags.

  • #​12464 10a1c4a Thanks @​petebacondarwin! - Allow deleting KV namespaces by name

    You can now delete a KV namespace by providing its name as a positional argument:

    wrangler kv namespace delete my-namespace

    This aligns the delete command with the create command, which also accepts a namespace name.
    The existing --namespace-id and --binding flags continue to work as before.

  • #​12382 d7b492c Thanks @​dario-piotrowicz! - Add Pages detection to autoconfig flows

    When running the autoconfig logic (via wrangler setup, wrangler deploy --x-autoconfig, or the programmatic autoconfig API), Wrangler now detects when a project appears to be a Pages project and handles it appropriately:

    • For wrangler deploy, it warns the user but still allows them to proceed
    • For wrangler setup and the programmatic autoconfig API, it throws a fatal error
  • #​12461 8809411 Thanks @​penalosa! - Support type: inherit bindings when using startWorker()

    This is an internal binding type that should not be used by external users of the API

  • #​12515 1a9eddd Thanks @​ascorbic! - Add --json flag to wrangler whoami for machine-readable output

    wrangler whoami --json now outputs structured JSON containing authentication status, auth type, email, accounts, and token permissions. When the user is not authenticated, the command exits with a non-zero status code and outputs {"loggedIn":false}, making it easy to check auth status in shell scripts without parsing text output.

    # Parse the JSON output
    wrangler whoami --json | jq '.accounts'
    
    # Check if authenticated in a script. Returns 0 if authenticated, non-zero if not.
    if wrangler whoami --json > /dev/null 2>&1; then
      echo "Authenticated"
    else
      echo "Not authenticated"
    fi
    
Patch Changes
  • #​12437 ad817dd Thanks @​MattieTK! - fix: use project's package manager in wranger autoconfig

    wrangler setup now correctly detects and uses the project's package manager based on lockfiles (pnpm-lock.yaml, yarn.lock, bun.lockb, package-lock.json) and the packageManager field in package.json. Previously, it would fall back to the package manager used to execute the command when run directly from the terminal, causing failures in pnpm and yarn workspace projects if the wrong manager was used in this step due to the workspace: protocol not being supported by npm.

    This change leverages the package manager detection already performed by @netlify/build-info during framework detection, ensuring consistent behaviour across the autoconfig process.

  • #​12541 f7fa326 Thanks @​dependabot! - Update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260210.0 1.20260212.0
  • #​12498 734792a Thanks @​dario-piotrowicz! - Fix: make sure that remote proxy sessions's logs can be silenced when the wrangler log level is set to "none"

  • #​12135 cc5ac22 Thanks @​edmundhung! - Fix spurious config diffs when bindings from local and remote config are shown in different order

    When comparing local and remote Worker configurations, binding arrays like kv_namespaces would incorrectly show additions and removals if the elements were in a different order. The diff now correctly recognizes these as equivalent by reordering remote arrays to match the local config's order before comparison.

  • #​12476 62a8d48 Thanks @​MattieTK! - fix: use unscoped binary name for OpenNext autoconfig command overrides

    The build, deploy, and version command overrides in the Next.js (OpenNext) autoconfig handler used the scoped package name @opennextjs/cloudflare, which pnpm interprets as a workspace filter rather than a binary name. This caused wrangler deploy --x-autoconfig to fail for pnpm-based Next.js projects with ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL. Changed to use the unscoped binary name opennextjs-cloudflare, which resolves correctly across all package managers.

  • #​12516 84252b7 Thanks @​edmundhung! - Stop proxying localhost requests when proxy environment variables are set

    When HTTP_PROXY or HTTPS_PROXY is configured, all fetch requests including ones to localhost were routed through the proxy. This caused wrangler dev and the Vite plugin to fail with "TypeError: fetch failed" because the proxy can't reach local addresses.

    This switches from ProxyAgent to undici's EnvHttpProxyAgent, which supports the NO_PROXY environment variable. When NO_PROXY is not set, it defaults to localhost,127.0.0.1,::1 so local requests are never proxied.

    The NO_PROXY config only applies to the request destination, not the proxy server address. So a proxy running on localhost (e.g. HTTP_PROXY=http://127.0.0.1:11451) still works for outbound API calls.

  • #​12506 e5efa5d Thanks @​sesteves! - Fix wrangler r2 sql query displaying [object Object] for nested values

    SQL functions that return complex types such as arrays of objects (e.g. approx_top_k) were rendered as [object Object] in the table output because String() was called directly on non-primitive values. These values are now serialized with JSON.stringify so they display as readable JSON strings.

  • #​11725 be9745f Thanks @​dario-piotrowicz! - Fix incorrect logic during autoconfiguration (when running wrangler setup or wrangler deploy --x-autoconfig) that caused parts of the project's package.json file, removed during the process, to incorrectly be added back

  • #​12458 122791d Thanks @​jkoe-cf! - Remove default values for delivery delay and message retention and update messaging on limits

    Fixes the issue of the default maximum message retention (365400 seconds) being longer than the maximum allowed retention period for free tier users (86400 seconds).

    Previous:

    • Wrangler set a default value of 365400 seconds max message retention if the setting was not explicitly provided in the Wrangler configuration.
    • The maximum retention period was documented as 1209600 seconds for all queues users because it was required to be on paid tier.
    • Wrangler also set a default value of 0 seconds for delivery delay if the setting was not explicitly provided in the Wrangler configuration.

    Updated:

    • Wrangler no longer sets a default value for max message retention so that the default can be applied at the API.
    • The maximum retention period is now documented as 86400 seconds for free tier queues and 1209600 seconds for paid tier queues
    • Wrangler also no longer sets a default value for delivery delay so that the default can be applied at the API.
  • #​12513 41e18aa Thanks @​pombosilva! - Add confirmation prompt when deploying workflows with names that belong to different workers.

    When deploying a workflow with a name that already exists and is currently associated with a different worker script, Wrangler will now display a warning and prompt for confirmation before proceeding. This helps prevent accidentally overriding workflows.

    In non-interactive environments this check is skipped by default. Use the --strict flag to enable the check in non-interactive environments, which will cause the deployment to fail if workflow conflicts are detected.

  • Updated dependencies [f7fa326, 7aaa2a5, d06ad09]:

    • miniflare@​4.20260212.0

v4.64.0

Compare Source

Minor Changes
  • #​12433 2acb277 Thanks @​martinezjandrew! - Updated registries delete subcommand to handle new API response that now returns a secrets store secret reference after deletion. Wrangler will now prompt the user if they want to delete the associated secret. If so, added new logic to retrieve a secret by its name. The subcommand will then delete the secret.

  • #​12307 e02b5f5 Thanks @​dario-piotrowicz! - Improve autoconfig telemetry with granular event tracking

    Adds detailed telemetry events to track the autoconfig workflow, including process start/end, detection, and configuration phases. Each event includes a unique session ID (appId), CI detection, framework information, and success/error status to help diagnose issues and understand usage patterns.

  • #​12474 8ba1d11 Thanks @​petebacondarwin! - Add wrangler pages deployment delete command to delete Pages deployments via CLI

    You can now delete a Pages deployment directly from the command line:

    wrangler pages deployment delete <deployment-id> --project-name <name>

    Use the --force (or -f) flag to skip the confirmation prompt, which is useful for CI/CD automation.

  • #​12307 e02b5f5 Thanks @​dario-piotrowicz! - Include all common telemetry properties in ad-hoc telemetry events

    Previously, only command-based telemetry events (e.g., "wrangler command started/completed") included the full set of common properties. Ad-hoc events sent via sendAdhocEvent were missing important context like OS information, CI detection, and session tracking.

    Now, all telemetry events include the complete set of common properties:

    • amplitude_session_id and amplitude_event_id for session tracking
    • wranglerVersion (and major/minor/patch variants)
    • osPlatform, osVersion, nodeVersion
    • packageManager
    • configFileType
    • isCI, isPagesCI, isWorkersCI
    • isInteractive
    • isFirstUsage
    • hasAssets
    • agent
  • #​12479 fd902aa Thanks @​dario-piotrowicz! - Add framework selection prompt during autoconfig

    When running autoconfig in interactive mode, users are now prompted to confirm or change the detected framework. This allows correcting misdetected frameworks or selecting a framework when none was detected, defaulting to "Static" in that case.

  • #​12465 961705c Thanks @​petebacondarwin! - Add --json flag to wrangler pages project list command

    You can now use the --json flag to output the project list as clean JSON instead of a formatted table. This enables easier programmatic processing and scripting workflows.

    > wrangler pages project list --json
    
    [
      {
        "Project Name": "my-pages-project",
        "Project Domains": "my-pages-project-57h.pages.dev",
        "Git Provider": "No",
        "Last Modified": "23 hours ago"
      },
      ...
    ]
  • #​12470 21ac7ab Thanks @​petebacondarwin! - Add WRANGLER_COMMAND environment variable to custom build commands

    When using a custom build command in wrangler.toml, you can now detect whether wrangler dev or wrangler deploy triggered the build by reading the WRANGLER_COMMAND environment variable.

    This variable will be set to "dev", "deploy", "versions upload", or "types" depending on which command invoked the build. This allows you to customize your build process based on the deployment context.

    Example usage in a build script:

    if [ "$WRANGLER_COMMAND" = "dev" ]; then
      echo "Building for development..."
    else
      echo "Building for production..."
    fi
Patch Changes
  • #​12468 5d56487 Thanks @​petebacondarwin! - Add debug logs for git branch detection in wrangler pages deploy command

    When running wrangler pages deploy, the command automatically detects git information (branch, commit hash, commit message, dirty state) from the local repository. Previously, when this detection failed, there was no way to troubleshoot the issue.

    Now, running with WRANGLER_LOG=debug will output detailed information about:

    • Whether a git repository is detected
    • Each git command being executed and its result
    • The detected values (branch, commit hash, commit message, dirty status)
    • Any errors that occur during detection

    Example usage:

    WRANGLER_LOG=debug wrangler pages deploy ./dist --project-name=my-project
  • #​12447 c8dda16 Thanks @​dario-piotrowicz! - fix: Throw a descriptive error when autoconfig cannot detect an output directory

    When running wrangler setup or wrangler deploy --x-autoconfig on a project where the output directory cannot be detected, you will now see a clear error message explaining what's missing (e.g., "Could not detect a directory containing the static (html, css and js) files for the project") instead of a generic configuration error. This makes it easier to understand and resolve the issue.

  • #​12440 555b32a Thanks @​dependabot! - Update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260205.0 1.20260206.0
  • #​12485 d636d6a Thanks @​dependabot! - Update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260206.0 1.20260207.0
  • #​12502 bf8df0c Thanks @​dependabot! - Update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260207.0 1.20260210.0
  • #​12280 988dea9 Thanks @​penalosa! - Fix wrangler init failing with Yarn Classic

    When using Yarn Classic (v1.x), running wrangler init or wrangler init --from-dash would fail because Yarn Classic doesn't properly handle version specifiers with special characters like ^ in yarn create commands. Yarn would install the package correctly but then fail to find the binary because it would look for a path like .yarn/bin/create-cloudflare@^2.5.0 instead of .yarn/bin/create-cloudflare.

    This fix removes the version specifier from the default C3 command entirely. Since C3 has had auto-update behavior for over two years, specifying a version is no longer necessary and removing it resolves the Yarn Classic compatibility issue.

  • #​12486 1f1c3ce Thanks @​vicb! - Bump esbuild to 0.27.3

    This update includes several bug fixes from esbuild versions 0.27.1 through 0.27.3. See the esbuild changelog for details.

  • #​12472 62635a0 Thanks @​petebacondarwin! - Improve D1 database limit error message to match Cloudflare dashboard

    When attempting to create a D1 database after reaching your account's limit, the CLI now shows a more helpful error message with actionable guidance instead of the raw API error.

    The new message includes:

    • A clear explanation that the account limit has been reached
    • A link to D1 documentation
    • Commands to list and delete databases
  • #​12411 355c6da Thanks @​jbwcloudflare! - Fix wrangler pages deploy to respect increased file count limits

  • #​12449 bfd17cd Thanks @​penalosa! - fix: Display unsafe metadata separately from bindings

    Unsafe metadata are not bindings and should not be displayed in the bindings table. They are now printed as a separate JSON block.

    Before:

    Your Worker has access to the following bindings:
    Binding                               Resource
    env.extra_data ("interesting value")  Unsafe Metadata
    env.more_data ("dubious value")       Unsafe Metadata
    

    After:

    The following unsafe metadata will be attached to your Worker:
    {
      "extra_data": "interesting value",
      "more_data": "dubious value"
    }
    
  • #​12463 3388c84 Thanks @​petebacondarwin! - Add User-Agent header to remote dev inspector WebSocket connections

    When running wrangler dev --remote, the inspector WebSocket connection now includes a User-Agent header (wrangler/<version>). This resolves issues where WAF rules blocking empty User-Agent headers prevented remote dev mode from working with custom domains.

  • #​12421 937425c Thanks @​ryanking13! - Fix Python Workers deployment failing on Windows due to path separator handling

    Previously, deploying Python Workers on Windows would fail because the backslash path separator (\) was not properly handled, causing the entire full path to be treated as a single filename. The deployment process now correctly normalizes paths to use forward slashes on all platforms.

  • Updated dependencies [2d90127, 555b32a, d636d6a, bf8df0c, 312b5eb, ce9dc01]:

v4.63.0

Compare Source

Minor Changes
  • #​12386 447daa3 Thanks @​NuroDev! - Added new "open local explorer" hotkey for experimental/WIP local resource explorer

    When running wrangler dev with the experimental local explorer feature enabled, you can now press the e hotkey to open the local resource explorer UI in your browser.

Patch Changes
  • #​11350 ee9b81f Thanks @​dario-piotrowicz! - fix: improve error message when the entrypoint is incorrect

    Error messages for incorrect entrypoint configuration have been improved to provide clearer and more actionable feedback. The updated messages help users understand what went wrong and how to fix their configuration.

  • #​12402 63f1adb Thanks @​dependabot! - Update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260131.0 1.20260203.0
  • #​12418 ba13de9 Thanks @​dependabot! - Update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260203.0 1.20260205.0
  • #​12216 fe3af35 Thanks @​ichernetsky-cf! - Deprecate 'wrangler cloudchamber apply' in favor of 'wrangler deploy'

  • #​12368 bd4bb98 Thanks @​KianNH! - Preserve Containers configuration when using versions commands

    Previously, commands like wrangler versions upload would inadvertently disable Containers on associated Durable Object namespaces because the containers property was being omitted from the API request body.

  • #​12396 dab4bc9 Thanks @​petebacondarwin! - fix: redact email addresses and account names in non-interactive mode

    To prevent sensitive information from being exposed in public CI logs, email addresses and account names are now redacted when running in non-interactive mode (e.g., CI environments). Account IDs remain visible to aid debugging.

  • #​12378 18c0784 Thanks @​X6TXY! - Truncate Pages commit messages at UTF-8 boundaries to avoid invalid UTF-8

  • Updated dependencies [63f1adb, ba13de9, 83adb2c]:

    • miniflare@​4.20260205.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
@astrojs/compiler (source) ^2.13.0^2.13.1 age confidence
ovsx (source) ^0.10.8^0.10.9 age confidence
semver ^7.7.3^7.7.4 age confidence
svelte (source) ^5.49.1^5.50.3 age confidence

Release Notes

withastro/compiler (@​astrojs/compiler)

v2.13.1

Compare Source

Patch Changes
  • 357b8fe: Fixes a panic when parsing files with a closing frontmatter fence (---) but no opening fence. The compiler now returns a helpful diagnostic error instead of crashing.
  • cba568f: Fixes the "Unterminated string literal" error when using multiline attribute values on components.
eclipse/openvsx (ovsx)

v0.10.9

Compare Source

Fixes
  • Support custom registry url including a subpath (#​1542)
Changes
  • Move ovsx script to bin directory (#​1538)
  • Disable the automatic execution of lifecycle scripts by yarn (#​1546)
Dependencies
  • Bump lodash from 4.17.21 to 4.17.23 (#​1567)
  • Bump tar from 6.2.1 to 7.5.7

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

  • Deprecates NodeApp in favor of App + utilities: createRequest() and writeResponse()
  • Deprecates loadManifest() and loadApp(). These are unused and were forgotten
  • Reorganizes the app/* related entrypoints to make clearer what is exported, and have more control (allowed to spot loadManifest(), loadApp(), and a few more things not tackled in this PR)
  • All usages have been updated, except for the node adapter which will have a dedicated PR: #15418

Testing

Updated

Docs

withastro/astro
  • fixes bad lockfile introduced by #15480
withastro/astro

This PR contains the following updates:

Package Change Age Confidence
@playwright/test (source) 1.58.11.58.2 age confidence
@preact/signals (source) 2.6.22.7.1 age confidence
@types/react (source) ^18.3.27^18.3.28 age confidence
@vitejs/plugin-vue (source) ^6.0.3^6.0.4 age confidence
magicast ^0.5.1^0.5.2 age confidence
p-limit ^7.2.0^7.3.0 age confidence
postcss-preset-env (source) ^11.1.2^11.1.3 age confidence
semver ^7.7.3^7.7.4 age confidence
svelte (source) ^5.49.1^5.50.3 age confidence
undici (source) ^7.19.2^7.21.0 age confidence
vue (source) ^3.5.27^3.5.28 age confidence

Release Notes

microsoft/playwright (@​playwright/test)

v1.58.2

Compare Source

preactjs/signals (@​preact/signals)

v2.7.1

Compare Source

Patch Changes

v2.7.0

Compare Source

Minor Changes
  • #​861 5794b04 Thanks @​andrewiggins! - Add useModel hook for using Models in components

    The new useModel hook provides a convenient way to use Models (created with createModel) within React and Preact components. It handles:

    • Creating the model instance lazily on first render
    • Maintaining the same instance across re-renders
    • Automatically disposing the model when the component unmounts
    import { createModel, signal } from "@&#8203;preact/signals-core";
    import { useModel } from "@&#8203;preact/signals-react"; // or "@&#8203;preact/signals"
    
    const CountModel = createModel(() => ({
    	count: signal(0),
    	increment() {
    		this.count.value++;
    	},
    }));
    
    function Counter() {
    	const model = useModel(CountModel);
    	return <button onClick={() => model.increment()}>{model.count}</button>;
    }

    For models that require constructor arguments, wrap in a factory function:

    const CountModel = createModel((initialCount: number) => ({
      count: signal(initialCount),
    }));
    
    function Counter() {
      const model = useModel(() => new CountModel(5));
      return <div>{model.count}</div>;
    }
Patch Changes
unjs/magicast (magicast)

v0.5.2

Compare Source

   🚀 Features
    View changes on GitHub
csstools/postcss-plugins (postcss-preset-env)

v11.1.3

Compare Source

February 6, 2026

nodejs/undici (undici)

v7.21.0

Compare Source

What's Changed

New Contributors

Full Changelog: nodejs/undici@v7.20.0...v7.21.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
@preact/signals (source) ^2.6.2^2.7.1 age confidence
@types/react (source) ^18.3.27^18.3.28 age confidence
@vitejs/plugin-react (source) ^5.1.2^5.1.4 age confidence
@vitejs/plugin-vue (source) ^6.0.3^6.0.4 age confidence
@vitejs/plugin-vue-jsx (source) ^5.1.3^5.1.4 age confidence
@vue/compiler-sfc (source) ^3.5.27^3.5.28 age confidence
svelte (source) ^5.49.1^5.50.3 age confidence
svelte (source) 5.49.15.50.3 age confidence
vite-plugin-vue-devtools (source) ^8.0.5^8.0.6 age confidence
vue (source) ^3.5.27^3.5.28 age confidence

Release Notes

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

v5.1.4

Compare Source

Fix canSkipBabel not accounting for babel.overrides (#​1098)

When configuring babel.overrides without top-level plugins or presets, Babel was incorrectly skipped. The canSkipBabel function now checks for overrides.length to ensure override configurations are processed.

sveltejs/svelte (svelte)

v5.50.3

Compare Source

Patch Changes
  • fix: take into account nodeName case sensitivity on XHTML pages (#​17689)

  • fix: render multiple and selected attributes as empty strings for XHTML compliance (#​17689)

  • fix: always lowercase HTML elements, for XHTML compliance (#​17664)

  • fix: freeze effects-inside-deriveds when disconnecting, unfreeze on reconnect (#​17682)

  • fix: propagate $effect errors to <svelte:boundary> (#​17684)

v5.50.2

Compare Source

Patch Changes
  • fix: resolve effect_update_depth_exceeded when using bind:value on <select> with derived state in legacy mode (#​17645)

  • fix: don't swallow DOMException when media.play() fails in bind:paused (#​17656)

  • chore: provide proper public type for parseCss result (#​17654)

  • fix: robustify blocker calculation (#​17676)

  • fix: reduce if block nesting (#​17662)

v5.50.1

Compare Source

Patch Changes
  • fix: render boolean attribute values as empty strings for XHTML compliance (#​17648)

  • fix: prevent async render tag hydration mismatches (#​17652)

v5.50.0

Compare Source

Minor Changes
  • feat: allow use of createContext when instantiating components programmatically (#​17575)
Patch Changes
  • fix: ensure infinite effect loops are cleared after flushing (#​17601)

  • fix: allow {#key NaN} (#​17642)

  • fix: detect store in each block expression regardless of AST shape (#​17636)

  • fix: treat <menu> like <ul>/<ol> for a11y role checks (#​17638)

  • fix: add vite-ignore comment inside dynamic crypto import (#​17623)

  • chore: wrap JSDoc URLs in @see and @link tags (#​17617)

  • fix: properly hydrate already-resolved async blocks (#​17641)

  • fix: emit each_key_duplicate error in production (#​16724)

  • fix: exit resolved async blocks on correct node when hydrating (#​17640)

v5.49.2

Compare Source

Patch Changes
  • chore: remove SvelteKit data attributes from elements.d.ts (#​17613)

  • fix: avoid erroneous async derived expressions for blocks (#​17604)

  • fix: avoid Cloudflare warnings about not having the "node:crypto" module (#​17612)

  • fix: reschedule effects inside unskipped branches (#​17604)


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

  • unifont added a npm provider a few days ago, this adds support for it (unjs/unifont#322)

Testing

Updated

Docs

withastro/astro

This PR contains the following updates:

Package Change Age Confidence Type Update Pending
@astrojs/rss (source) ^4.0.15-beta.3^4.0.15 age confidence dependencies patch
@astrojs/sitemap (source) ^3.6.1-beta.3^3.7.0 age confidence dependencies minor
@codspeed/vitest-plugin (source) 5.1.05.2.0 age confidence devDependencies minor
@playwright/test (source) 1.58.11.58.2 age confidence devDependencies patch
@preact/signals (source) ^2.7.0^2.7.1 age confidence dependencies patch 2.8.0
@types/prismjs (source) 1.26.51.26.6 age confidence devDependencies patch
fast-xml-parser ^5.3.4^5.3.5 age confidence dependencies patch 5.3.6
node (source) 24.13.024.13.1 age confidence patch
node 24.13.0-bullseye24.13.1-bullseye age confidence final patch
node 24-bookworm-slim24.13.1-bookworm-slim age confidence final minor
pnpm (source) 10.28.210.29.3 age confidence packageManager minor
svelte (source) ^5.49.2^5.50.3 age confidence dependencies patch 5.51.2 (+2)
turbo (source) ^2.8.3^2.8.7 age confidence devDependencies patch 2.8.9 (+1)
typescript-eslint (source) ^8.54.0^8.55.0 age confidence devDependencies minor
valibot (source) ^1.0.0^1.2.0 age confidence devDependencies patch
vue (source) ^3.5.27^3.5.28 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
CodSpeedHQ/codspeed-node (@​codspeed/vitest-plugin)

v5.2.0

Compare Source

🎉 What's Changed

This release brings support for the memory instrument, which enables you to track memory usage, heap allocations, and memory leaks in your benchmarks.

📚 Details

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

microsoft/playwright (@​playwright/test)

v1.58.2

Compare Source

preactjs/signals (@​preact/signals)

v2.7.1

Compare Source

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

v5.3.5

Compare Source

nodejs/node (node)

v24.13.1

Compare Source

pnpm/pnpm (pnpm)

v10.29.3

Compare Source

v10.29.2

Compare Source

v10.29.1: pnpm 10.29.1

Compare Source

Minor Changes

  • The pnpm dlx / pnpx command now supports the catalog: protocol. Example: pnpm dlx shx@catalog:.
  • Support configuring auditLevel in the pnpm-workspace.yaml file #​10540.
  • Support bare workspace: protocol without version specifier. It is now treated as workspace:* and resolves to the concrete version during publish #​10436.

Patch Changes

  • Fixed pnpm list --json returning incorrect paths when using global virtual store #​10187.

  • Fix pnpm store path and pnpm store status using workspace root for path resolution when storeDir is relative #​10290.

  • Fixed pnpm run -r failing with "No projects matched the filters" when an empty pnpm-workspace.yaml exists #​10497.

  • Fixed a bug where catalogMode: strict would write the literal string "catalog:" to pnpm-workspace.yaml instead of the resolved version specifier when re-adding an existing catalog dependency #​10176.

  • Fixed the documentation URL shown in pnpm completion --help to point to the correct page at https://pnpm.io/completion #​10281.

  • Skip local file: protocol dependencies during pnpm fetch. This fixes an issue where pnpm fetch would fail in Docker builds when local directory dependencies were not available #​10460.

  • Fixed pnpm audit --json to respect the --audit-level setting for both exit code and output filtering #​10540.

  • update tar to version 7.5.7 to fix security issue

    Updating the version of dependency tar to 7.5.7 because the previous one have a security vulnerability reported here: CVE-2026-24842

  • Fix pnpm audit --fix replacing reference overrides (e.g. $foo) with concrete versions #​10325.

  • Fix shamefullyHoist set via updateConfig in .pnpmfile.cjs not being converted to publicHoistPattern #​10271.

  • pnpm help should correctly report if the currently running pnpm CLI is bundled with Node.js #​10561.

  • Add a warning when the current directory contains the PATH delimiter character. On macOS, folder names containing forward slashes (/) appear as colons (:) at the Unix layer. Since colons are PATH separators in POSIX systems, this breaks PATH injection for node_modules/.bin, causing binaries to not be found when running commands like pnpm exec #​10457.

Platinum Sponsors

Bit

Gold Sponsors

Discord CodeRabbit Workleap
Stackblitz Vite
sveltejs/svelte (svelte)

v5.50.3

Compare Source

Patch Changes
  • fix: take into account nodeName case sensitivity on XHTML pages (#​17689)

  • fix: render multiple and selected attributes as empty strings for XHTML compliance (#​17689)

  • fix: always lowercase HTML elements, for XHTML compliance (#​17664)

  • fix: freeze effects-inside-deriveds when disconnecting, unfreeze on reconnect (#​17682)

  • fix: propagate $effect errors to <svelte:boundary> (#​17684)

v5.50.2

Compare Source

Patch Changes
  • fix: resolve effect_update_depth_exceeded when using bind:value on <select> with derived state in legacy mode (#​17645)

  • fix: don't swallow DOMException when media.play() fails in bind:paused (#​17656)

  • chore: provide proper public type for parseCss result (#​17654)

  • fix: robustify blocker calculation (#​17676)

  • fix: reduce if block nesting (#​17662)

v5.50.1

Compare Source

Patch Changes
  • fix: render boolean attribute values as empty strings for XHTML compliance (#​17648)

  • fix: prevent async render tag hydration mismatches (#​17652)

vercel/turborepo (turbo)

v2.8.7: Turborepo v2.8.7

Compare Source

What's Changed

Changelog

Full Changelog: vercel/turborepo@v2.8.6...v2.8.7

v2.8.6: Turborepo v2.8.6

Compare Source

What's Changed

Changelog

Full Changelog: vercel/turborepo@v2.8.5...v2.8.6

v2.8.5: Turborepo v2.8.5

Compare Source

What's Changed

@​turbo/codemod
@​turbo/repository
Changelog

Full Changelog: vercel/turborepo@v2.8.4...v2.8.5

v2.8.4: Turborepo v2.8.4

Compare Source

What's Changed

create-turbo
eslint
Examples
Changelog

Full Changelog: vercel/turborepo@v2.8.3...v2.8.4

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

v8.55.0

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

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

Changes

  • Fix: Labeling. Refactor selectTriageLabels to use exact labels instead of inferring from comment body
  • Fix: Use git diff main instead of git status to detect if a fix is available to push. Useful when a previous step gets ambitious and commits. Should be less likely with @flue/client@0.0.18 but still good to protect against.
  • Chore: Pass issueDetails to the comment.md skill so it has issue context in its context.
  • Chore: use pnpm install --no-frozen-lockfile flag as much as possible, especially in reproduce.md. This was causing 3 install attempts per run.
  • Chore: update @flue/cli to 0.0.32 and @flue/client to 0.0.18. Tell LLM to read the skill directly, reduce context confusion.

Testing

  • No testing for CI

Docs

  • No docs for CI
withastro/astro

Changes

  • Fix: Revert AGENTS.md back to older format, and fixed the syntax issue instead. This was 1/2 of the slow down in the latest version, was that agents didn't understand these instructions or how to use these scripts in a more granular way, so ended up running the full top pnpm test too often.
  • Chore: Bumped @flue/cli from 0.0.30 to 0.0.31. This was the other half of the slow down, which is disabling subagents. We're already splitting up the job into sub-agents ourselves with the 5 step process. In practice, the agent never seems to give the right context to the sub-agent, so it ends up re-doing a ton of work (ex: redoes all past steps manually instead of just reading the report.md file, because the parent didn't tell it that it existed).
  • Fix: Triage reproduction skill now copies from local examples/ templates instead of scaffolding with create-astro, avoiding issues with create-astro versions not matching the monorepo and causing weird symlink problems + installing the repo into the wrong, not-git-ignored location.

Testing

  • No testing for CI

Docs

  • No docs for CI
withastro/astro

These test various scenarios where Astro.locals is used, such as when passed down from an adapter. Converted to unit tests and removed the fixture.

Changes

  • No code changes

Testing

  • Removed ssr-local.test.js and associated fixture
  • Added new app/locals.test.js with the same tests inlined

Docs

N/A, just test refactor.

withastro/astro

This is similar to #15516 but refactors tests around responses to various scenarios, such as trailing slash behavior.

Changes

  • No code changes

Testing

  • Tests behaviors like the ability for components to manipulate headers and various trailing slash things (like excessive number of slashes

Docs

N/A, bug fix.

withastro/astro

This took ssr-error-pages.test.js which was testing how we handle error pages, like for example rendering the 404.astro route when the page route returned a 400, and then converted those to error tests.

Note that the tests are a little verbose at present. Further refactors, especially around routing, will make these smaller.

Changes

  • No code changes, only tests.

Testing

  • Converted every test case in ssr-error-pages.test.js into a unit test.
  • Deleted the unused fixture.

Docs

N/A, test improvement only

withastro/astro

Fixes #15465

What

During client-side navigation with <ClientRouter />, the swapHeadElements() function removes all head elements that don't match one of two conditions: having data-astro-transition-persist, or being a <link rel="stylesheet"> with a matching href.

This means inline <style> tags -- including the @font-face declarations injected by the experimental <Font> component -- get removed from the DOM and re-appended on every navigation. The browser then re-evaluates the @font-face rules, which triggers font-display: swap and produces a visible font flash even though the font files are already cached.

Fix

Extended persistedHeadElement() to also preserve:

  1. Inline <style> elements -- matched by comparing textContent. If the exact same style content exists in both the old and new head, the existing node is kept in place.
  2. Font preload links (<link rel="preload" as="font">) -- matched by href, similar to how stylesheet links are already handled.

This is a small, targeted change to a single function. The existing behavior for all other head elements is unchanged.

Testing

Ran the existing view-transitions.test.js suite -- both tests pass.

withastro/astro

Lots of small improvements as we finally start to get some broken / incomplete triage runs back from the auto-triage bot.

Summary

  • New: Docker sandbox for issue triage: Run the LLM (OpenCode server) inside an isolated Docker container during triage workflows so untrusted reproduction code never has access to secrets. Adds a Dockerfile.sandbox, a GHCR build workflow, and updates the triage workflow to use --sandbox. Moves the compiler clone into .compiler/ (gitignored) so it's accessible inside the container's bind mount.
  • New: Add a verify step to the triage pipeline that checks whether reported behavior is intentional before attempting a fix. Fixes issues where the bot just trusted the submitting user's expected behavior as truth vs. potentially confused/incorrect on expected behavior.
  • New: Make diagnose and fix skills aware of the withastro/compiler repo (cloned as a sibling in CI). Fixes issues tracked back to the compiler, where the bot was trying to work around the issue in our astro codebase instead of pointing responsibility to the compiler.
  • New: Add a feasibility check to the fix skill for browser/runtime compatibility. Hopefully fixes issues where the bot suggests code that wouldn't run on modern browsers.
  • Fix: For some reason the reproduction instructions were gone (or never there?) so we hadn't been downloading repos/stackblitz, and probably spending quite a lot of time trying to figure out the bug without a reproduction. Kind of surprised by the success rate at reproductions, given this, but I guess everyone is including enough detail without it for the LLM to go off of.
  • Chore: Ensure all skills explicitly read report.md before appending to it
  • Chore: Simplify the diagnose skill's review step
  • Chore: Refactor issue-triage.ts into composable helper functions.
  • Chore: Ignore triage folder from eslint
  • Chore: Tidy up AGENTS.md, simplified the project layout section
  • Chore: Bump @flue/cli to 0.0.20 and @flue/client to 0.0.12

Testing

No good way to test CI locally, so will need to test a bit post-merge.

withastro/astro

Summary

Testing

  • Bunch of new tests + migrating off of fixtures (likely more to still do.
withastro/astro

Changes

  • wait to bind shortcuts until the server is actually ready, like vite's cli does
  • means stuff like o will be queued in stdin until vite is running
  • fixes #15433

Testing

I tested this by linking it into a project. I didn't add any programmatic tests since I don't know how I would do that here.

Docs

Don't think this needs docs?

withastro/astro

Changes

  • Skip SSR renderer imports in SSR builds when the renderers are only used in prerendered pages.
  • Add a changeset.
  • Fixes #15502
  • The result is not bundling framework code which can be larger than all of Astro.

Testing

  • node packages/astro/test/ssr-renderers-static-vue.test.js
  • Add a fixture + test that covers framework usage in prerendered pages with API-only SSR.

Docs

  • N/A, bug fix.
withastro/astro

Changes

  • Test commands were wrong, those commands don't even work.
  • Clarifies how to run with pnpm and the different ways to run individual tests.
withastro/astro

Changes

Vite keeps a cache of server-rendered module results. When content collection markdown changes, we were invalidating those modules, but in a way Vite treats as a “non‑HMR” invalidation. In Vite 7 that can leave the server-side cache in place, so the next reload still uses the old content.

By marking these invalidations as HMR invalidations (still a full reload on the page), Vite updates its HMR bookkeeping and clears the cached result the dev server would otherwise reuse. That forces the markdown to be reprocessed on the next request, so changes show up without restarting.

The 3rd argument to invalidateModule() is key, it tells Vite that this isHmr.

Reference: https://github.com/vitejs/vite/blob/a2aab8de9490c0fcc8936c5a7f6da795312c289e/packages/vite/src/node/server/moduleGraph.ts#L166-L234

Testing

  • New test added that edits a markdown file and then reloads the page.

Docs

  • N/A, bug fix.
withastro/astro

Summary

  • tighten the TextMate grammar so only exact style/script tags open language scopes
  • add a snapshot fixture covering lowercase component tags like <styled.button>

Fixes #14680.

Tests

  • New snapshot test.

Docs

N/A, bug fix

withastro/astro

Changes

Refactor edgeMiddleware option into a more generic middlewareMode, creating space for future options.

  • Deprecate edgeMiddleware in core and all adapters
  • Create new Adapter Feature called middlewareMode
  • Implement and expose the option in the included adapters.
  • Automatically map edgeMiddleware to middlewareMode: edge for backwards compatibility
  • Add middlewareMode to the SSR manifest

Context

Currently, middleware runs on static pages during build, and on dynamic pages after build. There is the need to customize this behavior, specifically to run middleware on static pages, for example to add an authentication check.

Some adapters have a way to implement this using edgeMiddleware, but this is not possible for all adapters, since not all environments support edge middleware. It would be better to have a generic way to define when middleware should run. We call this new option middlewareMode.

In this first PR, I'm focusing on preparing the configuration for these new features, without adding them yet. In a subsequent PR, implementations for on-request and always options for middlewareMode will be added.

Mode Build-time (prerendered pages) Request-time (SSR pages) Request-time (prerendered pages) Use case
"classic" (default) Today's default. Middleware affects static pages only at build time.
"always" Middleware runs everywhere. Good for auth, A/B testing, personalization on all pages.
"on-request" Middleware only runs at request time. For runtime-only concerns (auth headers, sessions).
"edge" ❌ (separate bundle) ❌ (separate bundle) Middleware deployed as a separate edge function (Vercel, Netlify). Formerly known as edgeMiddleware config option.

Related discussions:

Testing

Since this is a refactor that should not change any existing functionality, no new tests were added. Existing tests should pass.

Docs

withastro/docs#13277

/cc @withastro/maintainers-docs for feedback!

withastro/astro

Changes

  • Fix issue labeling (no longer messes with labels if reproduction failed)
  • Fix issue labeling (pkg/priority labels should now work)
  • Fix comment token to use houston instead of generic [github-actions] bot

Testing

  • CI

Docs

  • CI
withastro/astro

Changes

  • Adds needs repro label if reproduction was not possible
  • Adds p* and pkg:* labels if reproduction was possible

Testing

  • CI only, no change to Astro, impossible to test locally but can debug live if anything breaks.

Docs

  • CI only, no change to Astro.
withastro/astro

Changes

  • prevent boolean server.allowedHosts from being merged into an array
  • fixes #15472

Testing

  • add a unit test covering boolean allowedHosts merges
    • node packages/astro/test/units/config/config-merge.test.js

Docs

  • N/A bug fix
withastro/astro

Changes

  • Adds back the "view fix" link which wasn't working with auto-triage

Testing

  • CI only, no change to Astro, impossible to test locally.

Docs

  • CI only, no change to Astro.
withastro/astro

Summary

This PR improves execution speed and reduces memory overhead by parallelizing file-system tasks and optimizing regular expression instantiation.

  • Concurrent File Tasks: Refactored sequential file operations to run concurrently using Promise.all.
    • Impact: Node.js utilizes libuv's internal thread pool (defaulting to 4 threads) to handle I/O operations. By offloading these tasks in parallel rather than sequentially, we maximize resource utilization, significantly reducing total execution time.
    • CI/CD Benefit: Faster job completion directly translates to reduced runner minutes and lower CI/CD pipeline costs.
  • Regex Optimization: Moved RegExp object creation out of loops.
    • Impact: Instantiating a regex inside a loop forces the V8 engine to allocate memory for a new object on every iteration. Moving it to the outer scope allows V8 to reuse the object and leverage its "hot" optimization (JIT-compiling the regex to native code), reducing heap churn and garbage collection frequency.

Testing

Docs

withastro/astro

Changes

  • Improves the new adapter API by allowing to pass streaming to createApp(), matching App

Testing

N/A

Docs

withastro/astro

Changes

Skips language tools CI tests if language tools or related files didn’t change

Testing

Hah

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.

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

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

Major Changes

  • #15535 dfe2e22 Thanks @florian-lefebvre! - Deprecates loadManifest() and loadApp() from astro/app/node (Adapter API) - (v6 upgrade guidance)

  • #15461 9f21b24 Thanks @florian-lefebvre! - BREAKING CHANGE to the v6 beta Adapter API only: renames entryType to entrypointResolution and updates possible values

    Astro 6 introduced a way to let adapters have more control over the entrypoint by passing entryType: 'self' to setAdapter(). However during beta development, the name was unclear and confusing.

    entryType is now renamed to entrypointResolution and its possible values are updated:

    • legacy-dynamic becomes explicit.
    • self becomes auto.

    If you are building an adapter with v6 beta and specifying entryType, update it:

    setAdapter({
        // ...
    -    entryType: 'legacy-dynamic'
    +    entrypointResolution: 'explicit'
    })
    
    setAdapter({
        // ...
    -    entryType: 'self'
    +    entrypointResolution: 'auto'
    })
  • #15461 9f21b24 Thanks @florian-lefebvre! - Deprecates createExports() and start() (Adapter API) - (v6 upgrade guidance)

  • #15535 dfe2e22 Thanks @florian-lefebvre! - Deprecates NodeApp from astro/app/node (Adapter API) - (v6 upgrade guidance)

  • #15407 aedbbd8 Thanks @ematipico! - Changes how styles of responsive images are emitted - (v6 upgrade guidance)

Minor Changes

  • #15535 dfe2e22 Thanks @florian-lefebvre! - Exports new createRequest() and writeResponse() utilities from astro/app/node

    To replace the deprecated NodeApp.createRequest() and NodeApp.writeResponse() methods, the astro/app/node module now exposes new createRequest() and writeResponse() utilities. These can be used to convert a NodeJS IncomingMessage into a web-standard Request and stream a web-standard Response into a NodeJS ServerResponse:

    import { createApp } from 'astro/app/entrypoint';
    import { createRequest, writeResponse } from 'astro/app/node';
    import { createServer } from 'node:http';
    
    const app = createApp();
    
    const server = createServer(async (req, res) => {
      const request = createRequest(req);
      const response = await app.render(request);
      await writeResponse(response, res);
    });
  • #15407 aedbbd8 Thanks @ematipico! - Adds support for responsive images when security.csp is enabled, out of the box.

    Astro's implementation of responsive image styles has been updated to be compatible with a configured Content Security Policy.

    Instead of, injecting style elements at runtime, Astro will now generate your styles at build time using a combination of class="" and data-* attributes. This means that your processed styles are loaded and hashed out of the box by Astro.

    If you were previously choosing between Astro's CSP feature and including responsive images on your site, you may now use them together.

Patch Changes

@astrojs/cloudflare@13.0.0-beta.8

Major Changes

  • #15480 e118214 Thanks @alexanderniebuhr! - Drops official support for Cloudflare Pages in favor of Cloudflare Workers

    The Astro Cloudflare adapter now only supports deployment to Cloudflare Workers by default in order to comply with Cloudflare's recommendations for new projects. If you are currently deploying to Cloudflare Pages, consider migrating to Workers by following the Cloudflare guide for an optimal experience and full feature support.

Patch Changes

  • #15478 ee519e5 Thanks @matthewp! - Fixes fully static sites to not output server-side worker code. When all routes are prerendered, the _worker.js directory is now removed from the build output.

  • Updated dependencies []:

    • @astrojs/underscore-redirects@1.0.0

@astrojs/db@0.19.0-beta.4

Patch Changes

@astrojs/markdoc@1.0.0-beta.10

Patch Changes

  • #15457 6e8da44 Thanks @AhmadYasser1! - Fixes custom attributes on Markdoc's built-in {% table %} tag causing "Invalid attribute" validation errors.

    In Markdoc, table exists as both a tag ({% table %}) and a node (the inner table structure). When users defined custom attributes on either nodes.table or tags.table, the attributes weren't synced to the counterpart, causing validation to fail on whichever side was missing the declaration.

    The fix automatically syncs custom attribute declarations between tags and nodes that share the same name, so users can define attributes on either side and have them work correctly.

@astrojs/netlify@7.0.0-beta.10

Patch Changes

@astrojs/vercel@10.0.0-beta.5

Patch Changes

astro-vscode@2.16.9-beta.0

Patch Changes

  • #15496 eb7cdda Thanks @matthewp! - Fix syntax highlighting for lowercase component tags that start with "style" or "script".
withastro/astro

Changes

  • This PR drops official Cloudflare Pages support from the adapter fully

Background

withastro/astro

Changes

This is ongoing, will batch a bunch of stuff here so that I'm not spamming PRs. Unfortunately CI stuff is impossible to test locally so will be a bit noisier than usual post-merge of #15476

  • Add "concurrency" so that we only run one run per issue at a time. When new comment comes in, cancel the old run and start a new one (slower, but more accurate vs. stale comments). Update: we can't do this, since we post a comment in the workflow, it would cancel itself. Keeping concurrency, we'll see how this plays out in practice. If absolutely needed, we could move posting the final comment out of the workflow and to a final step in the .yml file.
  • switched from pnpm i -g to npm i -g for agent-browser in the CI workflow. pnpm i -g doesn't run build scripts, which agent-browser needs to function properly. Currently broken I think until this merges.
  • version updates
  • workflow wording improvements
withastro/astro

Changes

  • Fully static Cloudflare sites no longer output unnecessary _worker.js directory
  • Detects fully static sites by checking if all non-internal routes are prerendered in astro:routes:resolved
  • Removes _worker.js directory in astro:build:done for static sites
  • Changes staticOutput adapter support from 'unsupported' to 'stable'

Testing

  • Added new test fixture packages/integrations/cloudflare/test/fixtures/static/ with a fully static site
  • Added static.test.js that verifies _worker.js directory is not present after build
  • All existing Cloudflare tests pass

Docs

No docs changes needed - this is a bug fix that makes static sites work as expected without generating unnecessary server code.

withastro/astro

Changes

Testing

  • Yup

Docs

N/A

withastro/astro

Changes

  • Internal GitHub repo changes only, no impact on astro, packages, etc.
  • Adds an auto-triage CI workflow for every new issue! See video below.
  • Still early, but I've run it on a few test issues now (you can see results in https://github.com/FredKSchott/astro/issues) and it's gotten good enough now that it is pretty universally useful.
  • It's scope/impact is pretty limited, only ability is that it will leave a new comment to help maintainers and users who are reading the issue. Also limited to only run on new issues created after Feb 10th.
  • Proposing we merge this to enable as an experiment for at least 24 hours to see how it goes! We can then disable it and iterate some more, or just leave it on and iterate on it as we go.
Workflows2.mp4

Testing

Docs

  • No user facing code, mostly CI stuff. If anything is confusing to maintainers please let me know and I can keep improving!
withastro/astro

Changes

Fixes some edge cases in the MDX optimize option

mdx({ optimize: true }) enables our rehypeOptimizeStatic() plugin which turns as much of the AST as possible into static HTML to speed up rendering.

As part of this, it looks for a user-declared components variable, which in MDX is used to override specific nodes with a custom component, e.g. export const components = { a: MyLinkComponent } renders all Markdown links ([text](link)) using the custom component. It extracts the keys in that object, and then skips optimizing the parts of the document tree that contain that kind of node.

The logic to do this previously was quite basic and could fail to correctly extract the keys in some scenarios, like not having the export separated by new lines. This change fixes support those cases.

Notes

  • Found this while investigating #14611. It technically does not fix that issue — the behaviour described there by OP is expected — but this fixes an issue described by another user later in the thread.

  • In terms of performance, this change does moderately more work: it iterates over some arrays instead of just looking at the first entry each time. However, I think it should not be too big an impact: this code is already gated by a regular expression check, so only runs on relevant nodes, max. 1 per document, and in most cases these are very small arrays (1–10 entries).

  • I also noticed while testing this that we never optimise top-level nodes (see the skipped test in this PR). I’m not 100% sure that was intentional: it makes for some odd behaviour where <Content components={{ p: MyP }} /> will override for top-level paragraphs but not for any nested ones. It would be a breaking change, but we should probably also optimise the top-level nodes where we can.

Testing

Added a test to the fixture to cover the case this fixes.

Docs

N/A — bug fix only.

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

Patch Changes

  • c13b536 Thanks @matthewp! - Improves Host header handling for SSR deployments behind proxies

@astrojs/node@9.5.3

Patch Changes

  • c13b536 Thanks @matthewp! - Improves error page loading to read from disk first before falling back to configured host
withastro/astro

Changes

  • Add Host header validation against configured allowedDomains
  • Rename rewrite-forwarded-headers.ts to validate-headers.ts since it does host validation now too.
  • In Node adapter, read error page from disk to prevent going to network.

Testing

Docs

N/A, bug fix

withastro/astro

Changes

Added a new experimental engine that is queue based. The engine comes with also a caching system , which can be configured.

The rendering engine also uses batching: all adjacent synchronous nodes that are simple (e.g. strings) are concatenated so that we use one single write.

This is an opt-in engine, and the objective is to consider this a valid evolution of how we render components in Astro.

The explanation of the features is the changeset, but I'm happy to answer any question or doing a deep dive of certain parts of the features.

The feature was created with the help of an AI agent, and I reviewed the majority of the code.

Testing

Many unit tests added to test the new feature.

Docs

withastro/docs#13299

withastro/starlight

Description

  • Uses exports wildcards in package.json to improve maintenance
  • Required moving non exported things to another non nested directory. I chose components-internals but it could be anywhere else really
withastro/astro

Changes

  • Renames entryType to entrypointResolution
  • Renames legacy-dynamic to explicit
  • Renames self to auto
  • Deprecates entrypointResolution: 'explicit'

Testing

Updated

Docs

withastro/astro

Changes

  • Updates the new adapter API to support passing serverEntrypoint instead of rollupOptions.input for simpler cases

Testing

Tests added

Docs

withastro/astro

Changes

  • I recently updated context.csp to be undefined and warn when unavailable, to match sessions
  • However, that caused it to always warn in dev since we don't support CSP in dev at the moment
  • This PR skips the warning in dev

Testing

N/A

Docs

Changeset

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

Major Changes

Minor Changes

  • #15460 ee7e53f Thanks @florian-lefebvre! - Updates the Adapter API to allow providing a serverEntrypoint when using entryType: 'self'

    Astro 6 introduced a new powerful yet simple Adapter API for defining custom server entrypoints. You can now call setAdapter() with the entryType: 'self' option and specify your custom serverEntrypoint:

    export function myAdapter() {
      return {
        name: 'my-adapter',
        hooks: {
          'astro:config:done': ({ setAdapter }) => {
            setAdapter({
              name: 'my-adapter',
              entryType: 'self',
              serverEntrypoint: 'my-adapter/server.js',
              supportedAstroFeatures: {
                // ...
              },
            });
          },
        },
      };
    }

    If you need further customization at the Vite level, you can omit serverEntrypoint and instead specify your custom server entrypoint with vite.build.rollupOptions.input.

Patch Changes

  • #15454 b47a4e1 Thanks @Fryuni! - Fixes a race condition in the content layer which could result in dropped content collection entries.

  • #15450 50c9129 Thanks @florian-lefebvre! - Fixes a case where build.serverEntry would not be respected when using the new Adapter API

  • #15473 d653b86 Thanks @matthewp! - Improves Host header handling for SSR deployments behind proxies

@astrojs/cloudflare@13.0.0-beta.7

Patch Changes

  • #15452 e1aa3f3 Thanks @matthewp! - Fixes server-side dependencies not being discovered ahead of time during development

    Previously, imports in .astro file frontmatter were not scanned by Vite's dependency optimizer, causing a "new dependencies optimized" message and page reload when the dependency was first encountered. Astro is now able to scan these dependencies ahead of time.

  • #15450 50c9129 Thanks @florian-lefebvre! - Fixes a case where build.serverEntry would not be respected when using the new Adapter API

  • Updated dependencies []:

    • @astrojs/underscore-redirects@1.0.0

@astrojs/mdx@5.0.0-beta.7

Patch Changes

  • #15475 36fc0e0 Thanks @delucis! - Fixes edge cases where an export const components = {...} declaration would fail to be detected with the optimize option enabled

@astrojs/netlify@7.0.0-beta.9

Patch Changes

@astrojs/node@10.0.0-beta.4

Patch Changes

  • #15473 d653b86 Thanks @matthewp! - Improves error page loading to read from disk first before falling back to configured host

@astrojs/vercel@10.0.0-beta.4

Patch Changes

withastro/astro

Changes

  • Adds syncTagNodeAttributes() to packages/integrations/markdoc/src/runtime.ts that runs after config setup
  • In Markdoc, table exists as both a tag ({% table %}) and a node (the inner table structure). Attributes on the tag propagate to the child node in the AST, so both schemas must declare the same attributes for Markdoc.validate() to pass
  • When users configure custom attributes on nodes.table or tags.table, this function syncs the attribute declarations to the counterpart, preventing "Invalid attribute" validation errors
  • Only runs for names that exist in both Markdoc.tags and Markdoc.nodes (currently only table)

Testing

  • Added test/render-table-attrs.test.js with build + dev tests using a fixture that configures nodes.table with a custom background attribute
  • All 79 markdoc tests pass (77 existing + 2 new)

Docs

  • No docs changes needed. This is a bug fix that makes existing documented behavior work correctly.

Fixes #14220

withastro/astro

Changes

Fixes #13832

The <style>astro-island,astro-slot,astro-static-slot{display:contents}</style> tag was rendered inline in the <body> alongside hydration scripts when the first hydrated component was encountered. This caused HTML validation errors since <style> tags should be in the <head>.

Approach

Build (SSG): Island styles are added to <head> via BuildPipeline.headElements() only for pages that actually use hydrated components, using the pagesByHydratedComponent map populated during the build analysis phase. This is precise — pages without islands get no extra styles.

Dev / SSR: Island styles continue to be inlined in <body> by getPrescripts() as a fallback, since the dev pipeline does not have per-page hydration information at head-render time.

A new islandStylesInHead flag on SSRMetadata prevents duplication when both mechanisms would otherwise apply.

Files changed

  • packages/astro/src/core/build/pipeline.ts — Add island styles to headElements() for pages with hydrated components
  • packages/astro/src/core/render-context.ts — Detect if pipeline already added island styles, set metadata flag
  • packages/astro/src/runtime/server/scripts.ts — Skip inline <style> when island styles are already in head; keep inline fallback for dev/SSR
  • packages/astro/src/types/public/internal.ts — Add islandStylesInHead to SSRMetadata
  • packages/astro/test/0-css.test.js — Update test to verify island styles are in <head>

Testing

  • All 5 previously failing CI tests now pass (Vue, astro-basic, astro-partial-html, content-collections-render, 0-css)
  • Build passes cleanly
  • CodSpeed reports +10.31% performance improvement on hybrid build benchmark

Docs

No documentation changes needed — this is a rendering behavior fix.

withastro/astro

Changes

When multiple store.set() calls triggered overlapping writes, the second write could be silently dropped because #writeFileAtomic retried with stale serialized data. Writes are now queued at the writeToDisk() level so that each write re-serializes fresh data.

Testing

There is a new unit test reproducing the scenario and validating the correct behavior.

Docs

No change is needed in docs.

withastro/astro

Changes

  • Adds an esbuild plugin that extracts frontmatter from .astro files during Vite's dependency optimization scan phase
  • This allows server-side imports in .astro frontmatter to be discovered ahead of time, avoiding the "new dependencies optimized" message and page reload during dev

Previously, Vite's scanner only looked for <script> tags in .astro files, missing the frontmatter section where server-side imports live. This caused npm dependencies like ms to be discovered lazily on first request.

This is only done in the Cloudflare adapter because dependency optimization is not needed in Node.js where these deps are external.

Testing

Added a new test fixture ssr-deps with a test that:

  1. Starts a dev server
  2. Clears the Vite cache
  3. Makes a request to a page that imports a third-party dependency (ms) in frontmatter
  4. Verifies no "new dependencies optimized" log message appears

Docs

N/A, bug fix

withastro/astro

Changes

This PR refactors how shiki styles are emitted by Astro. Up until now, styles were emitted as inline styles using the style attribute.

After this PR, styles are emitted via a <style> tag, placed in the <head> of the the document. With this solution, CSP is supported out of the box, when enabled.

I didn't use @shiki/transformers because their current code doesn't work for us, so I copied their code and added some changes so that we can track all styles.

Note

I used Claude Code to steer it towards the correct solution: virtual module with .css extension, generating new tests and update the existing ones to assert with the new requirements.

I reviewed and rewrote some parts of the code

Testing

Updated existing tests, added new tests.

Docs

I don't think it needs some updates, as this is an implementation detail, I think.

withastro/astro

Changes

Testing

Should pass

Docs

Changeset

withastro/astro

Changes

Testing

Docs

withastro/astro

Closes #14464

Changes

Fixes Astro.rewrite returning 404 when rewriting to a URL with non-ASCII characters (e.g., /redirected/héllo).

  • In findRouteToRewrite, the distURL href comparison now uses the encoded pathname instead of decodedPathname, since url.href values are always percent-encoded
  • Added a dynamic route fixture with non-ASCII characters (/redirected/[slug] with héllo param)

Testing

Added tests for all three modes:

  • Dev: fetching /redirected/h%C3%A9llo renders the index page
  • Build (SSG): /redirected/héllo/index.html is generated correctly
  • SSR: request to /redirected/h%C3%A9llo renders the index page

All 63 rewrite-related tests pass, including the 3 new ones.

Docs

No docs changes needed — this is a bug fix for existing Astro.rewrite behavior.

withastro/astro

This PR contains the following updates:

Package Change Age Confidence Type Update Pending
@astrojs/rss (source) ^4.0.15-beta.3^4.0.15 age confidence dependencies patch
@astrojs/sitemap (source) ^3.6.1-beta.3^3.7.0 age confidence dependencies minor
@preact/signals (source) ^2.6.2^2.7.0 age confidence dependencies minor 2.7.1
@types/react (source) ^18.3.27^18.3.28 age confidence dependencies patch
@types/react (source) ^18.3.27^18.3.28 age confidence devDependencies patch
alpinejs (source) ^3.15.6^3.15.8 age confidence dependencies patch
node 24.12.0-bullseye24.13.0-bullseye age confidence final minor
p-limit ^7.2.0^7.3.0 age confidence dependencies patch
semver ^7.7.3^7.7.4 age confidence dependencies patch
svelte (source) ^5.49.1^5.49.2 age confidence dependencies patch 5.50.0
turbo (source) ^2.8.1^2.8.3 age confidence devDependencies 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
preactjs/signals (@​preact/signals)

v2.7.0

Compare Source

Minor Changes
  • #​861 5794b04 Thanks @​andrewiggins! - Add useModel hook for using Models in components

    The new useModel hook provides a convenient way to use Models (created with createModel) within React and Preact components. It handles:

    • Creating the model instance lazily on first render
    • Maintaining the same instance across re-renders
    • Automatically disposing the model when the component unmounts
    import { createModel, signal } from "@&#8203;preact/signals-core";
    import { useModel } from "@&#8203;preact/signals-react"; // or "@&#8203;preact/signals"
    
    const CountModel = createModel(() => ({
    	count: signal(0),
    	increment() {
    		this.count.value++;
    	},
    }));
    
    function Counter() {
    	const model = useModel(CountModel);
    	return <button onClick={() => model.increment()}>{model.count}</button>;
    }

    For models that require constructor arguments, wrap in a factory function:

    const CountModel = createModel((initialCount: number) => ({
      count: signal(initialCount),
    }));
    
    function Counter() {
      const model = useModel(() => new CountModel(5));
      return <div>{model.count}</div>;
    }
Patch Changes
nodejs/node (node)

v24.13.0: 2026-01-13, Version 24.13.0 'Krypton' (LTS), @​marco-ippolito

Compare Source

This is a security release.

Notable Changes

lib:

Commits
npm/node-semver (semver)

v7.7.4

Compare Source

Bug Fixes
Documentation
Dependencies
Chores
sveltejs/svelte (svelte)

v5.49.2

Compare Source

Patch Changes
  • chore: remove SvelteKit data attributes from elements.d.ts (#​17613)

  • fix: avoid erroneous async derived expressions for blocks (#​17604)

  • fix: avoid Cloudflare warnings about not having the "node:crypto" module (#​17612)

  • fix: reschedule effects inside unskipped branches (#​17604)


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

fixes #15319, fixes #15437

From @Princesseuh:

Updates the default option for the Cloudflare adapter to use the bindings by default, and fix the dev experience on all the other settings. In v6 sharp cannot work in dev anymore because it doesn't run in workerd, so everything became passthrough.

Additionally, this PR changes how we do the picomatch excludes to ensure we don't import CJS at runtime in the endpoint. Sucks that picomatch is still in CJS.

Docs: withastro/docs#13267

Original comment here

Changes

Previously, an error occurred when using the Cloudflare adapter in combination with the <Image /> component. This issue is caused by Astro's default behavior: when no image entrypoint is specified in a development environment, it defaults to astro/assets/endpoint/dev.

const endpointEntrypoint =
settings.config.image.endpoint.entrypoint === undefined // If not set, use default endpoint
? mode === 'dev'
? 'astro/assets/endpoint/dev'
: 'astro/assets/endpoint/generic'
: settings.config.image.endpoint.entrypoint;

Since this default dev entrypoint depends on Vite, it attempts to bundle Vite as a dependency during the development server build, leading to the error.
import { type AnymatchFn, isFileLoadingAllowed, type ResolvedConfig } from 'vite';

To resolve this, I have updated the Cloudflare adapter to automatically use @astrojs/cloudflare/image-endpoint as the image entrypoint for development.
There might be a more optimal way to specify this configuration, but I couldn't come up with a better alternative at this time.
I am submitting this PR as-is for initial review.

Testing

I have updated compile-image-service.test.js, which is affected by this change, to include tests for the development server.
While it may be necessary to add tests covering all imageService options, I have left it as is for now to facilitate the review process.

Docs

N/A

withastro/astro

The only service accepted by the adapter that could use sharp at runtime is custom

If someone ignores the adapter types we are also covered by:

default:
if (config.service.entrypoint === 'astro/assets/services/sharp') {
logger.warn(
`The current configuration does not support image optimization. To allow your project to build with the original, unoptimized images, the image service has been automatically switched to the 'passthrough' option. See https://docs.astro.build/en/reference/configuration-reference/#imageservice`,
);
return { ...config, service: passthroughImageService() };
}
return { ...config };

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/cloudflare@13.0.0-beta.6

Major Changes

  • #15345 840fbf9 Thanks @matthewp! - Removes the cloudflareModules adapter option

    The cloudflareModules option has been removed because it is no longer necessary. Cloudflare natively supports importing .sql, .wasm, and other module types.

    What should I do?

    Remove the cloudflareModules option from your Cloudflare adapter configuration if you were using it:

    import cloudflare from '@astrojs/cloudflare';
    
    export default defineConfig({
      adapter: cloudflare({
    -   cloudflareModules: true
      })
    });

Minor Changes

  • #15077 a164c77 Thanks @matthewp! - Adds support for prerendering pages using the workerd runtime.

    The Cloudflare adapter now uses the new setPrerenderer() API to prerender pages via HTTP requests to a local preview server running workerd, instead of using Node.js. This ensures prerendered pages are built using the same runtime that serves them in production.

Patch Changes

  • #15432 e2ad69e Thanks @OliverSpeir! - Removes unneccessary warning about sharp from being printed at start of dev server and build

  • Updated dependencies [a164c77, a18d727]:

    • @astrojs/internal-helpers@0.8.0-beta.1
    • @astrojs/underscore-redirects@1.0.0

@astrojs/vercel@10.0.0-beta.3

Major Changes

  • #15413 736216b Thanks @florian-lefebvre! - Removes the deprecated @astrojs/vercel/serverless and @astrojs/vercel/static exports. Use the @astrojs/vercel export instead

Minor Changes

Patch Changes

  • Updated dependencies [a164c77, a18d727]:
    • @astrojs/internal-helpers@0.8.0-beta.1

astro@6.0.0-beta.10

Minor Changes

  • #15231 3928b87 Thanks @rururux! - Adds a new optional getRemoteSize() method to the Image Service API.

    Previously, inferRemoteSize() had a fixed implementation that fetched the entire image to determine its dimensions.
    With this new helper function that extends inferRemoteSize(), you can now override or extend how remote image metadata is retrieved.

    This enables use cases such as:

    • Caching: Storing image dimensions in a database or local cache to avoid redundant network requests.
    • Provider APIs: Using a specific image provider's API (like Cloudinary or Vercel) to get dimensions without downloading the file.

    For example, you can add a simple cache layer to your existing image service:

    const cache = new Map();
    
    const myService = {
      ...baseService,
      async getRemoteSize(url, imageConfig) {
        if (cache.has(url)) return cache.get(url);
    
        const result = await baseService.getRemoteSize(url, imageConfig);
        cache.set(url, result);
        return result;
      },
    };

    See the Image Services API reference documentation for more information.

  • #15077 a164c77 Thanks @matthewp! - Updates the Integration API to add setPrerenderer() to the astro:build:start hook, allowing adapters to provide custom prerendering logic.

    The new API accepts either an AstroPrerenderer object directly, or a factory function that receives the default prerenderer:

    'astro:build:start': ({ setPrerenderer }) => {
      setPrerenderer((defaultPrerenderer) => ({
        name: 'my-prerenderer',
        async setup() {
          // Optional: called once before prerendering starts
        },
        async getStaticPaths() {
          // Returns array of { pathname: string, route: RouteData }
          return defaultPrerenderer.getStaticPaths();
        },
        async render(request, { routeData }) {
          // request: Request
          // routeData: RouteData
          // Returns: Response
        },
        async teardown() {
          // Optional: called after all pages are prerendered
        }
      }));
    }

    Also adds the astro:static-paths virtual module, which exports a StaticPaths class for adapters to collect all prerenderable paths from within their target runtime. This is useful when implementing a custom prerenderer that runs in a non-Node environment:

    // In your adapter's request handler (running in target runtime)
    import { App } from 'astro/app';
    import { StaticPaths } from 'astro:static-paths';
    
    export function createApp(manifest) {
      const app = new App(manifest);
    
      return {
        async fetch(request) {
          const { pathname } = new URL(request.url);
    
          // Expose endpoint for prerenderer to get static paths
          if (pathname === '/__astro_static_paths') {
            const staticPaths = new StaticPaths(app);
            const paths = await staticPaths.getAll();
            return new Response(JSON.stringify({ paths }));
          }
    
          // Normal request handling
          return app.render(request);
        },
      };
    }

    See the adapter reference for more details on implementing a custom prerenderer.

  • #15345 840fbf9 Thanks @matthewp! - Adds a new emitClientAsset function to astro/assets/utils for integration authors. This function allows emitting assets that will be moved to the client directory during SSR builds, useful for assets referenced in server-rendered content that need to be available on the client.

    import { emitClientAsset } from 'astro/assets/utils';
    
    // Inside a Vite plugin's transform or load hook
    const handle = emitClientAsset(this, {
      type: 'asset',
      name: 'my-image.png',
      source: imageBuffer,
    });

Patch Changes

  • #15423 c5ea720 Thanks @matthewp! - Improves error message when a dynamic redirect destination does not match any existing route.

    Previously, configuring a redirect like /categories/[category]/categories/[category]/1 in static output mode would fail with a misleading "getStaticPaths required" error. Now, Astro detects this early and provides a clear error explaining that the destination does not match any existing route.

  • #15444 10b0422 Thanks @AhmadYasser1! - Fixes Astro.rewrite returning 404 when rewriting to a URL with non-ASCII characters

    When rewriting to a path containing non-ASCII characters (e.g., /redirected/héllo), the route lookup compared encoded distURL hrefs against decoded pathnames, causing the comparison to always fail and resulting in a 404. This fix compares against the encoded pathname instead.

  • #15419 a18d727 Thanks @ematipico! - Fixes an issue where the add command could accept any arbitrary value, leading the possible command injections. Now add and --add accepts
    values that are only acceptable npmjs.org names.

  • #15345 840fbf9 Thanks @matthewp! - Fixes an issue where .sql files (and other non-asset module types) were incorrectly moved to the client assets folder during SSR builds, causing "no such module" errors at runtime.

    The ssrMoveAssets function now reads the Vite manifest to determine which files are actual client assets (CSS and static assets like images) and only moves those, leaving server-side module files in place.

  • #15422 68770ef Thanks @matthewp! - Upgrade to @astrojs/compiler@3.0.0-beta

  • Updated dependencies [a164c77, a18d727]:

    • @astrojs/internal-helpers@0.8.0-beta.1
    • @astrojs/markdown-remark@7.0.0-beta.6

@astrojs/markdoc@1.0.0-beta.9

Minor Changes

  • #15345 840fbf9 Thanks @matthewp! - Uses Astro's new emitClientAsset API for image emission in content collections

Patch Changes

  • Updated dependencies [a164c77, a18d727]:
    • @astrojs/internal-helpers@0.8.0-beta.1
    • @astrojs/markdown-remark@7.0.0-beta.6

@astrojs/netlify@7.0.0-beta.8

Minor Changes

Patch Changes

  • Updated dependencies [a164c77, a18d727]:
    • @astrojs/internal-helpers@0.8.0-beta.1
    • @astrojs/underscore-redirects@1.0.0

@astrojs/vue@6.0.0-beta.1

Minor Changes

  • #15425 0317e99 Thanks @ocavue! - Updates @vitejs/plugin-vue to v6, @vitejs/plugin-vue-jsx to v5, and vite-plugin-vue-devtools to v8. No changes are needed from users.

@astrojs/internal-helpers@0.8.0-beta.1

Minor Changes

  • #15077 a164c77 Thanks @matthewp! - Adds normalizePathname() utility function for normalizing URL pathnames to match the canonical form used by route generation.

  • #15419 a18d727 Thanks @ematipico! - Adds a new /cli specifier and the utility NPM_PACKAGE_NAME_REGEX.

create-astro@5.0.0-beta.4

Patch Changes

  • #15419 a18d727 Thanks @ematipico! - Fixes an issue where --add could accept any kind of string, leading to different errors. Now --add accepts only values of valid integrations and adapters.

  • #15419 a18d727 Thanks @ematipico! - Fixes an issue where the add command could accept any arbitrary value, leading the possible command injections. Now add and --add accepts
    values that are only acceptable npmjs.org names.

@astrojs/mdx@5.0.0-beta.6

Patch Changes

  • Updated dependencies []:
    • @astrojs/markdown-remark@7.0.0-beta.6

@astrojs/node@10.0.0-beta.3

Patch Changes

  • Updated dependencies [a164c77, a18d727]:
    • @astrojs/internal-helpers@0.8.0-beta.1

@astrojs/markdown-remark@7.0.0-beta.6

Patch Changes

  • Updated dependencies [a164c77, a18d727]:
    • @astrojs/internal-helpers@0.8.0-beta.1
withastro/astro

Changes

  • Adds early validation in createRedirectRoutes() to detect when a dynamic redirect destination doesn't match any existing route
  • Throws a new InvalidRedirectDestination error with a clear message instead of the misleading "getStaticPaths required" error
  • Only applies to static output mode (server mode handles dynamic redirects at runtime)

Closes #12036. Supersedes #14161 which was closed due to inactivity.

Testing

Added test case in packages/astro/test/redirects.test.js that reproduces the issue and verifies the new error message.

Docs

N/A, bug fix

withastro/astro

Changes

  • Upgrades to the beta version of the compiler

Testing

N/A

Docs

N/A

withastro/astro

Changes

Left over logging was left in the last beta, this should fix it

Testing

I mean

Docs

N/A

withastro/astro

Changes

Closes #15420

I refactored the solution to make more generic and apply it to --add and astro add. We have a generic regex that checks wether the name follows the npmjs naming convention. If not, we throw an error.

I preferred to have this regex inside the internal helpers, so both create-astro and astro can use the same source of truth.

Note

Solution designed by me. Code and tests generated via AI. I checked all the code

Testing

Added various tests.

Added new tests. Tested manually

Docs

N/A

withastro/astro

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

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

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/cloudflare@13.0.0-beta.5

Major Changes

Patch Changes

  • Updated dependencies []:
    • @astrojs/underscore-redirects@1.0.0

astro@6.0.0-beta.9

Patch Changes

withastro/astro

Changes

Found this issue while I was working on images + CSP. Decided to open a different PR.

Testing

Manually tested, and confirmed that I don't see headers in dev. Existing tests should pass.

Docs

N/A

withastro/astro

Changes

This PR fixes the following error found in ecosystem-ci:

[ERROR] [vite] Internal server error: The specifiers must be a non-empty string. Received ""
https://github.com/vitejs/vite-ecosystem-ci/actions/runs/21699933912/job/62578172408#step:7:1774

This error was happening because astro's internal base middleware was assigning a string without the starting / to req.url.

Testing

Tested on ecosystem-ci: https://github.com/vitejs/vite-ecosystem-ci/actions/runs/21707585317/job/62602560591

Docs

No user facing change

withastro/astro

Changes

  • Updates the netlify and vercel adapters to the new adapter API
  • The vercel adapter is updated to use web request/response now that Vercel supports it
  • I'll tackle node in a distinct PR as it should require bigger changes

Testing

Updated

Docs

Changesets, no docs needed

withastro/astro

Changes

  • Depends on #15400
  • Improves the AstroAdapter type to better reflect reality, by using a discriminated union
  • Cleans up a few internals around legacy adapters

Testing

Should pass

Docs

Changeset, withastro/docs#13229

withastro/astro

Changes

Let's see if this fixes the failures.

Testing

Green benchmarks

Docs

withastro/astro

Changes

Adds support for responsive images with CSP.

The solution was to refactor how the styles for responsive images are computed. Until now, they are computed at runtime and injected in the style attribute. This can't be supported via CSP for many reasons.

This PR moves the generation of the styles inside a virtual module, which generates the styles in a static way based on the configuration provided by the user.

The solution uses data attributes, no class names.

Note

The code was generated via Claude Code

Testing

Existing tests should pass. One test was updated due to how --fit and --pos are injected.
One test was moved to E2E because styles emitted via virtual modules are injected by vite after rendering, client side.

Docs

I still need to identify if this is a breaking change or not, and if it needs some docs update.

withastro/astro

This PR contains the following updates:

Package Type Update Change Age Confidence
lockFileMaintenance All locks refreshed
@volar/language-core (source) devDependencies patch ~2.4.27~2.4.28 age confidence
@volar/kit (source) dependencies patch ~2.4.27~2.4.28 age confidence
@volar/language-core (source) dependencies patch ~2.4.27~2.4.28 age confidence
@volar/language-server (source) devDependencies patch ~2.4.27~2.4.28 age confidence
@volar/language-server (source) dependencies patch ~2.4.27~2.4.28 age confidence
@volar/language-service (source) dependencies patch ~2.4.27~2.4.28 age confidence
@volar/test-utils (source) devDependencies patch ~2.4.27~2.4.28 age confidence
@volar/typescript (source) dependencies patch ~2.4.27~2.4.28 age confidence
@volar/typescript (source) devDependencies patch ~2.4.27~2.4.28 age confidence
@volar/vscode (source) devDependencies patch ~2.4.27~2.4.28 age confidence
prettier (source) dependencies patch ^3.8.0^3.8.1 age confidence
svelte (source) dependencies patch ^5.0.0^5.49.1 age confidence

🔧 This Pull Request updates lock files to use the latest dependency versions.


Configuration

📅 Schedule: Branch creation - "before 4am on monday" (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

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Type Update Change Pending Age Confidence
lockFileMaintenance All locks refreshed
@preact/signals (source) dependencies minor 2.5.12.6.2 2.7.0 age confidence
preact (source) dependencies patch ^10.28.2^10.28.3 age confidence
unist-util-visit dependencies patch ^5.0.0^5.1.0 age confidence
cheerio (source) devDependencies minor 1.1.21.2.0 age confidence
shiki (source) devDependencies patch ^3.21.0^3.22.0 age confidence
vite (source) devDependencies patch ^7.1.7^7.3.1 age confidence
svelte (source) dependencies patch ^5.46.1^5.49.1 age confidence
vue (source) dependencies patch ^3.5.26^3.5.27 age confidence
solid-js (source) dependencies patch ^1.9.10^1.9.11 age confidence
autoprefixer dependencies patch ^10.4.23^10.4.24 age confidence
react (source) dependencies patch ^19.2.3^19.2.4 age confidence
react-dom (source) dependencies patch ^19.2.3^19.2.4 age confidence
zod (source) dependencies patch ^4.1.12^4.3.6 age confidence
rollup (source) devDependencies patch ^4.55.1^4.57.1 age confidence
sass devDependencies patch ^1.97.2^1.97.3 age confidence
@astrojs/compiler (source) dependencies minor 0.0.0-render-script-202510031204590.33.0 age confidence
@playwright/test (source) devDependencies minor 1.57.01.58.1 age confidence
@types/http-cache-semantics (source) devDependencies patch ^4.0.4^4.2.0 age confidence
ci-info dependencies patch ^4.3.1^4.4.0 age confidence
fontace dependencies patch ~0.4.0~0.4.1 age confidence
shiki (source) dependencies patch ^3.21.0^3.22.0 age confidence
solid-js (source) devDependencies patch ^1.9.10^1.9.11 age confidence
undici (source) devDependencies patch ^7.19.1^7.19.2 7.20.0 age confidence
vite (source) dependencies patch ^7.1.7^7.3.1 age confidence
zod (source) dependencies patch ^4.0.0^4.3.6 age confidence
sass dependencies patch ^1.97.2^1.97.3 age confidence
@astrojs/mdx (source) dependencies patch ^4.3.5^4.3.13 age confidence
@types/react (source) dependencies patch ^18.3.24^18.3.27 age confidence
@vitejs/plugin-vue (source) dependencies patch ^6.0.2^6.0.3 6.0.4 age confidence
preact (source) dependencies patch ^10.25.4^10.28.3 age confidence
vue (source) dependencies patch ^3.5.25^3.5.27 age confidence
react (source) dependencies patch 19.2.319.2.4 age confidence
react-dom (source) dependencies patch 19.2.319.2.4 age confidence

🔧 This Pull Request updates lock files to use the latest dependency versions.


Release Notes

preactjs/signals (@​preact/signals)

v2.6.2

Compare Source

Patch Changes

v2.6.1

Patch Changes

v2.6.0

Minor Changes
Patch Changes
cheeriojs/cheerio (cheerio)

v1.2.0

Compare Source

What's Changed

New Contributors

Full Changelog: cheeriojs/cheerio@v1.1.2...v1.2.0

facebook/react (react)

v19.2.4: 19.2.4 (January 26th, 2026)

Compare Source

React Server Components
withastro/compiler (@​astrojs/compiler)

v0.33.0

Compare Source

Minor Changes
  • 1adac72: Improve error recovery when using the transform function. The compiler will now properly reject the promise with a useful message and stacktrace rather than print internal errors to stdout.
Patch Changes
  • 68d3c0c: Fix edge case where export type could hang the compiler
  • ec1ddf0: Handle edge case with TypeScript generics handling and our TSX output
  • 23d1fc0: Ignore trailing whitespace in components

v0.32.0

Compare Source

Minor Changes
  • 2404848: Remove pathname option in favour of sourcefile option
  • 2ca86f6: Remove site and projectRoot options in favour of the astroGlobalArgs option
  • edd3e0e: Merge sourcefile and moduleId options as a single filename option. Add a new normalizedFilename option to generate stable hashes instead.
  • 08843bd: Remove experimentalStaticExtraction option. It is now the default.

v0.31.4

Compare Source

Patch Changes
  • 960b853: Rename SerializeOtions interface to SerializeOptions
  • fcab891: Fixes export hoisting edge case
  • 47de01a: Handle module IDs containing quotes

v0.31.3

Compare Source

Patch Changes

v0.31.2

Compare Source

Patch Changes
  • 89c0cee: fix: corner case that component in head expression will case body tag missing
  • 20497f4: Improve fidelity of sourcemaps for frontmatter

v0.31.1

Compare Source

Patch Changes
  • 24dcf7e: Allow script and style before HTML
  • ef391fa: fix: corner case with slot expression in head will cause body tag missing

v0.31.0

Compare Source

Minor Changes

v0.30.1

Compare Source

Patch Changes
  • ff9e7ba: Fix edge case where < was not handled properly inside of expressions
  • f31d535: Fix edge case with Prop detection for TSX output

v0.30.0

Compare Source

Minor Changes
  • 963aaab: Provide the moduleId of the astro component

v0.29.19

Compare Source

Patch Changes
  • 3365233: Replace internal tokenizer state logs with proper warnings

v0.29.18

Compare Source

Patch Changes
  • 80de395: fix: avoid nil pointer dereference in table parsing
  • aa3ad9d: Fix parse output to properly account for the location of self-closing tags
  • b89dec4: Internally, replace astro.ParseFragment in favor of astro.ParseFragmentWithOptions. We now check whether an error handler is passed when calling astro.ParseFragmentWithOptions

v0.29.17

Compare Source

Patch Changes
  • 1e7e098: Add warning for invalid spread attributes
  • 3cc6f55: Fix handling of unterminated template literal attributes
  • 48c5677: Update default internalURL to astro/runtime/server/index.js
  • 2893f33: Fix a number of table and expression related bugs

v0.29.16

Compare Source

Patch Changes
  • ec745f4: Self-closing tags will now retreive "end" positional data
  • a6c2822: Fix a few TSX output errors

v0.29.15

Compare Source

Patch Changes
  • 5f6e69b: Fix expression literal handling

v0.29.14

Compare Source

Patch Changes

v0.29.13

Compare Source

Patch Changes
  • 8f3e488: Fix regression introduced to parse handling in the last patch

v0.29.12

Compare Source

Patch Changes
  • a41982a: Fix expression edge cases, improve literal parsing

v0.29.11

Compare Source

Patch Changes

v0.29.10

Compare Source

Patch Changes
  • 07a65df: Print \r when printing TSX output
  • 1250d0b: Add warning when define:vars won't work because of compilation limitations

v0.29.9

Compare Source

Patch Changes
  • 1fe92c0: Fix TSX sourcemaps on Windows (take 4)

v0.29.8

Compare Source

Patch Changes
  • 01b62ea: Fix sourcemap bug on Windows (again x2)

v0.29.7

Compare Source

Patch Changes
  • 108c6c9: Fix TSX sourcemap bug on Windows (again)

v0.29.6

Compare Source

Patch Changes
  • 4b3fafa: Fix TSX sourcemaps on Windows

v0.29.5

Compare Source

Patch Changes
  • 73a2b69: Use an IIFE for define:vars scripts

v0.29.4

Compare Source

Patch Changes
  • 4381efa: Return proper diagnostic code for warnings

v0.29.3

Compare Source

Patch Changes
  • 85e1d31: AST: move start position of elements to the first index of their opening tag

v0.29.2

Compare Source

Patch Changes
  • 035829b: AST: move end position of elements to the last index of their end tag

v0.29.1

Compare Source

Patch Changes
  • a99c014: Ensure comment and text nodes have end positions when generating an AST from parse

v0.29.0

Compare Source

Minor Changes
  • fd2fc28: Fix some utf8 compatability issues
Patch Changes
  • 4b68670: TSX: fix edge case with spread attribute printing
  • 6b204bd: Fix bug with trailing style tags being moved into the html element
  • 66fe230: Fix: include element end location in parse AST

v0.28.1

Compare Source

Patch Changes
  • aac8c89: Fix end tag sourcemappings for TSX mode
  • d7f3288: TSX: Improve self-closing tag behavior and mappings
  • 75dd7cc: Fix spread attribute mappings

v0.28.0

Compare Source

Minor Changes
  • 5da0dc2: Add resolvePath option to control hydration path resolution
  • e816a61: Remove metadata export if resolvePath option provided

v0.27.2

Compare Source

Patch Changes
  • 959f96b: Fix "missing sourcemap" issue
  • 94f6f3e: Fix edge case with multi-line comment usage
  • 85a654a: Fix parse causing a compiler panic when a component with a client directive was imported but didn't have a matching import
  • 5e32cbe: Improvements to TSX output

v0.27.1

Compare Source

Patch Changes

v0.27.0

Compare Source

Minor Changes
  • c770e7b: The compiler will now return diagnostics and unique error codes to be handled by the consumer. For example:

    import type { DiagnosticSeverity, DiagnosticCode } from '@&#8203;astrojs/compiler/types';
    import { transform } from '@&#8203;astrojs/compiler';
    
    async function run() {
      const { diagnostics } = await transform(file, opts);
    
      function log(severity: DiagnosticSeverity, message: string) {
        switch (severity) {
          case DiagnosticSeverity.Error:
            return console.error(message);
          case DiagnosticSeverity.Warning:
            return console.warn(message);
          case DiagnosticSeverity.Information:
            return console.info(message);
          case DiagnosticSeverity.Hint:
            return console.info(message);
        }
      }
    
      for (const diagnostic of diagnostics) {
        let message = diagnostic.text;
        if (diagnostic.hint) {
          message += `\n\n[hint] ${diagnostic.hint}`;
        }
    
        // Or customize messages for a known DiagnosticCode
        if (diagnostic.code === DiagnosticCode.ERROR_UNMATCHED_IMPORT) {
          message = `My custom message about an unmatched import!`;
        }
        log(diagnostic.severity, message);
      }
    }
Patch Changes
  • 0b24c24: Implement automatic typing for Astro.props in the TSX output

v0.26.1

Compare Source

Patch Changes
  • 920898c: Handle edge case with noscript tags
  • 8ee78a6: handle slots that contains the head element
  • 244e43e: Do not hoist import inside object
  • b8cd954: Fix edge case with line comments and export hoisting
  • 52ebfb7: Fix parse/tsx output to gracefully handle invalid HTML (style outside of body, etc)
  • 884efc6: Fix edge case with multi-line export hoisting

v0.26.0

Compare Source

Minor Changes
  • 0be58ab: Improve sourcemap support for TSX output
Patch Changes
  • e065e29: Prevent head injection from removing script siblings

v0.25.2

Compare Source

Patch Changes
  • 3a51b8e: Ensure that head injection occurs if there is only a hoisted script

v0.25.1

Compare Source

Patch Changes
  • 41fae67: Do not scope empty style blocks
  • 1ab8280: fix(#​517): fix edge case with TypeScript transform
  • a3678f9: Fix import.meta.env usage above normal imports

v0.25.0

Compare Source

Minor Changes
  • 6446ea3: Make Astro styles being printed after user imports
Patch Changes
  • 51bc60f: Fix edge cases with getStaticPaths where valid JS syntax was improperly handled

v0.24.0

Compare Source

Minor Changes
  • 6ebcb4f: Allow preprocessStyle to return an error
Patch Changes
  • abda605: Include filename when calculating scope

v0.23.5

Compare Source

Patch Changes
  • 6bc8e0b: Prevent import assertion from being scanned too soon

v0.23.4

Compare Source

Patch Changes
  • 3b9f0d2: Remove css print escape for experimentalStaticExtraction

v0.23.3

Compare Source

Patch Changes
  • 7693d76: Fix resolution of .jsx modules

v0.23.2

Compare Source

Patch Changes
  • 167ad21: Improve handling of namespaced components when they are multiple levels deep
  • 9283258: Fix quotations in pre-quoted attributes
  • 76fcef3: Better handling for imports which use special characters

v0.23.1

Compare Source

Patch Changes
  • 79376f3: Fix regression with expression rendering

v0.23.0

Compare Source

Minor Changes
  • d8448e2: Prevent printing the doctype in the JS output
Patch Changes
  • a28c3d8: Fix handling of unbalanced quotes in expression attributes
  • 28d1d4d: Fix handling of TS generics inside of expressions
  • 356d3b6: Prevent wraping module scripts with scope

v0.22.1

Compare Source

Patch Changes
  • 973103c: Prevents unescaping attribute expressions

v0.22.0

Compare Source

Minor Changes
  • 558c9dd: Generate a stable scoped class that does NOT factor in local styles. This will allow us to safely do style HMR without needing to update the DOM as well.
  • c19cd8c: Update Astro's CSS scoping algorithm to implement zero-specificity scoping, according to RFC0012.

v0.21.0

Compare Source

Minor Changes
  • 8960d82: New handling for define:vars scripts and styles
Patch Changes
  • 4b318d5: Do not attempt to hoist styles or scripts inside of <noscript>

v0.20.0

Compare Source

Minor Changes
  • 48d33ff: Removes compiler special casing for the Markdown component
  • 4a5352e: Removes limitation where imports/exports must be at the top of an .astro file. Fixes various edge cases around getStaticPaths hoisting.
Patch Changes
  • 245d73e: Add support for HTML minification by passing compact: true to transform.
  • 3ecdd24: Update TSX output to also generate TSX-compatible code for attributes containing dots

v0.19.0

Compare Source

Minor Changes
  • fcb4834: Removes fallback for the site configuration
Patch Changes
  • 02add77: Fixes many edge cases around tables when used with components, slots, or expressions
  • b23dd4d: Fix handling of unmatched close brace in template literals
  • 9457a91: Fix issue with { in template literal attributes
  • c792161: Fix nested expression handling with a proper expression tokenizer stack

v0.18.2

Compare Source

Patch Changes

v0.18.1

Compare Source

Patch Changes
  • aff2f23: Warning on client: usage on scripts

v0.18.0

Compare Source

Minor Changes
  • 4b02776: Fix handling of slot attribute used inside of expressions
Patch Changes
  • 62d2a8e: Properly handle nested expressions that return multiple elements
  • 571d6b9: Ensure html and body elements are scoped

v0.17.1

Compare Source

Patch Changes
  • 3885217: Support <slot is:inline /> and preserve slot attribute when not inside component
  • ea94a26: Fix issue with fallback content inside of slots

v0.17.0

Compare Source

Minor Changes
  • 3a9d166: Add renderHead injection points

v0.16.1

Compare Source

Patch Changes
  • 9fcc43b: Build JS during the release

v0.16.0

Compare Source

Minor Changes
  • 470efc0: Adds component metadata to the TransformResult
Patch Changes

v0.15.2

Compare Source

Patch Changes
  • f951822: Fix wasm parse to save attribute namespace
  • 5221e09: Fix serialize spread attribute

v0.15.1

Compare Source

Patch Changes
  • 26cbcdb: Prevent side-effectual CSS imports from becoming module metadata

v0.15.0

Compare Source

Minor Changes
  • 702e848: Trailing space at the end of Astro files is now stripped from Component output.
Patch Changes
  • 3a1a24b: Fix long-standing bug where a class attribute inside of a spread prop will cause duplicate class attributes
  • 62faceb: Fixes an issue where curly braces in <math> elements would get parsed as expressions instead of raw text.

v0.14.3

Compare Source

Patch Changes
  • 6177620: Fix edge case with expressions inside of tables
  • 79b1ed6: Provides a better error message when we can't match client:only usage to an import statement
  • a4e1957: Fix Astro scoping when class:list is used
  • fda859a: Fix json escape

v0.14.2

Compare Source

Patch Changes
  • 6f30e2e: Fix edge case with nested expression inside <>
  • 15e3ff8: Fix panic when using a <slot /> in head
  • c048567: Fix edge case with select elements and expression children
  • 13d2fc2: Fix #​340, fixing behavior of content after an expression inside of 9e37a72: Fix issue when multiple client-only components are used 67993d5: Add support for block comment only expressions, block comment only shorthand attributes and block comments in shorthand attributes 59fbea2: Fix #​343, edge case with inside component 049dadf: Fix usage of expressions inside caption and colgroup elements v0.14.1 Compare Source Patch Changes 1a82892: Fix bug with <script src> not being hoisted v0.14.0 Compare Source Minor Changes c0da4fe: Implements RFC0016, the new script and style behavior. v0.13.2 Compare Source Patch Changes 014370d: Fix issue with named slots in element da831c1: Fix handling of RegExp literals in frontmatter v0.13.1 Compare Source Patch Changes 2f8334c: Update parse and serialize functions to combine attributes and directives, fix issue with serialize not respecting attributes. b308955: Add self-close option to serialize util v0.13.0 Compare Source Minor Changes [ce3f1a5](https: Configuration 📅 Schedule: Branch creation - "before 4am on monday" (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 Type Update Change Pending Age Confidence
lockFileMaintenance All locks refreshed
vue (source) dependencies patch ^3.5.26^3.5.27 age confidence
@vue/compiler-sfc (source) dependencies patch ^3.5.26^3.5.27 age confidence
cheerio (source) devDependencies minor 1.1.21.2.0 age confidence
solid-js (source) devDependencies patch ^1.9.10^1.9.11 age confidence
svelte (source) dependencies minor 5.46.45.49.1 age confidence
svelte (source) devDependencies patch ^5.46.1^5.49.1 age confidence
@preact/preset-vite dependencies patch ^2.10.2^2.10.3 age confidence
@preact/signals (source) dependencies patch ^2.5.1^2.6.2 2.7.0 age confidence
svelte (source) dependencies patch ^5.46.1^5.49.1 age confidence
svelte2tsx (source) dependencies patch ^0.7.46^0.7.47 age confidence
@vitejs/plugin-vue (source) dependencies patch ^6.0.2^6.0.3 6.0.4 age confidence
vite (source) dependencies patch ^7.1.7^7.3.1 age confidence
vue (source) devDependencies patch ^3.5.26^3.5.27 age confidence
preact (source) devDependencies patch ^10.28.2^10.28.3 age confidence

🔧 This Pull Request updates lock files to use the latest dependency versions.


Release Notes

cheeriojs/cheerio (cheerio)

v1.2.0

Compare Source

What's Changed

New Contributors

Full Changelog: cheeriojs/cheerio@v1.1.2...v1.2.0

sveltejs/svelte (svelte)

v5.49.1

Compare Source

Patch Changes
  • fix: merge consecutive large text nodes (#​17587)

  • fix: only create async functions in SSR output when necessary (#​17593)

  • fix: properly separate multiline html blocks from each other in print() (#​17319)

  • fix: prevent unhandled exceptions arising from dangling promises in <script> (#​17591)

v5.49.0

Compare Source

Minor Changes
  • feat: allow passing ShadowRootInit object to custom element shadow option (#​17088)
Patch Changes
  • fix: throw for unset createContext get on the server (#​17580)

  • fix: reset effects inside skipped branches (#​17581)

  • fix: preserve old dependencies when updating reaction inside fork (#​17579)

  • fix: more conservative assignment_value_stale warnings (#​17574)

  • fix: disregard popover elements when determining whether an element has content (#​17367)

  • fix: fire introstart/outrostart events after delay, if specified (#​17567)

  • fix: increment signal versions when discarding forks (#​17577)

v5.48.5

Compare Source

Patch Changes
  • fix: run boundary onerror callbacks in a microtask, in case they result in the boundary's destruction (#​17561)

  • fix: prevent unintended exports from namespaces (#​17562)

  • fix: each block breaking with effects interspersed among items (#​17550)

v5.48.4

Compare Source

Patch Changes
  • fix: avoid duplicating escaped characters in CSS AST (#​17554)

v5.48.3

Compare Source

Patch Changes
  • fix: hydration failing with settled async blocks (#​17539)

  • fix: add pointer and touch events to a11y_no_static_element_interactions warning (#​17551)

  • fix: handle false dynamic components in SSR (#​17542)

  • fix: avoid unnecessary block effect re-runs after async work completes (#​17535)

  • fix: avoid using dev-mode array.includes wrapper on internal array checks (#​17536)

v5.48.2

Compare Source

Patch Changes
  • fix: export wait function from internal client index (#​17530)

v5.48.1

Compare Source

Patch Changes
  • fix: hoist snippets above const in same block (#​17516)

  • fix: properly hydrate await in {@&#8203;html} (#​17528)

  • fix: batch resolution of async work (#​17511)

  • fix: account for empty statements when visiting in transform async (#​17524)

  • fix: avoid async overhead for already settled promises (#​17461)

  • fix: better code generation for const tags with async dependencies (#​17518)

v5.48.0

Compare Source

Minor Changes
  • feat: export parseCss from svelte/compiler (#​17496)
Patch Changes
  • fix: handle non-string values in svelte:element this attribute (#​17499)

  • fix: faster deduplication of dependencies (#​17503)

v5.47.1

Compare Source

Patch Changes
  • fix: trigger selectedcontent reactivity (#​17486)

v5.47.0

Compare Source

Minor Changes
  • feat: customizable <select> elements (#​17429)
Patch Changes
  • fix: mark subtree of svelte boundary as dynamic (#​17468)

  • fix: don't reset static elements with debug/snippets (#​17477)


Configuration

📅 Schedule: Branch creation - "before 4am on monday" (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 Type Update Change Pending Age Confidence
lockFileMaintenance All locks refreshed
@vercel/functions (source) dependencies patch ^3.3.6^3.4.0 3.4.1 age confidence
cheerio (source) devDependencies minor 1.1.21.2.0 age confidence
fastify (source) devDependencies patch ^5.7.0^5.7.2 5.7.4 (+1) age confidence
@astrojs/mdx (source) dependencies patch ^4.3.5^4.3.13 age confidence
@netlify/vite-plugin (source) dependencies patch ^2.7.19^2.8.0 age confidence
@types/react (source) dependencies patch ^18.3.24^18.3.27 age confidence
vite (source) dependencies patch ^7.1.7^7.3.1 age confidence
@vitejs/plugin-vue (source) dependencies patch ^6.0.2^6.0.3 6.0.4 age confidence
svelte (source) dependencies patch ^5.46.1^5.49.1 age confidence
vue (source) dependencies patch ^3.5.26^3.5.27 age confidence
solid-js (source) dependencies patch ^1.9.10^1.9.11 age confidence
svelte (source) dependencies patch ^5.46.3^5.49.1 age confidence
vue (source) dependencies patch ^3.5.25^3.5.27 age confidence
@cloudflare/workers-types devDependencies patch ^4.20260124.0^4.20260131.0 4.20260203.0 age confidence
rollup (source) devDependencies patch ^4.55.1^4.57.1 age confidence

🔧 This Pull Request updates lock files to use the latest dependency versions.


Release Notes

cheeriojs/cheerio (cheerio)

v1.2.0

Compare Source

What's Changed

New Contributors

Full Changelog: cheeriojs/cheerio@v1.1.2...v1.2.0


Configuration

📅 Schedule: Branch creation - "before 4am on monday" (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 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.8

Minor Changes

  • #15258 d339a18 Thanks @ematipico! - Stabilizes the adapter feature experimentalStatiHeaders. If you were using this feature in any of the supported adapters, you'll need to change the name of the flag:

    export default defineConfig({
      adapter: netlify({
    -    experimentalStaticHeaders: true
    +    staticHeaders: true
      })
    })

Patch Changes

  • #15167 4fca170 Thanks @HiDeoo! - Fixes an issue where CSS from unused components, when using content collections, could be incorrectly included between page navigations in development mode.

  • #15268 54e5cc4 Thanks @rururux! - fix: avoid creating unused images during build in Picture component

  • #15133 53b125b Thanks @HiDeoo! - Fixes an issue where adding or removing <style> tags in Astro components would not visually update styles during development without restarting the development server.

  • Updated dependencies [80f0225]:

    • @astrojs/markdown-remark@7.0.0-beta.5

@astrojs/netlify@7.0.0-beta.7

Minor Changes

  • #15258 d339a18 Thanks @ematipico! - Stabilizes the adapter feature experimentalStatiHeaders. If you were using this feature in any of the supported adapters, you'll need to change the name of the flag:

    export default defineConfig({
      adapter: netlify({
    -    experimentalStaticHeaders: true
    +    staticHeaders: true
      })
    })

Patch Changes

  • Updated dependencies []:
    • @astrojs/underscore-redirects@1.0.0

@astrojs/node@10.0.0-beta.2

Minor Changes

  • #15258 d339a18 Thanks @ematipico! - Stabilizes the adapter feature experimentalStatiHeaders. If you were using this feature in any of the supported adapters, you'll need to change the name of the flag:

    export default defineConfig({
      adapter: netlify({
    -    experimentalStaticHeaders: true
    +    staticHeaders: true
      })
    })

@astrojs/vercel@10.0.0-beta.2

Minor Changes

  • #15258 d339a18 Thanks @ematipico! - Stabilizes the adapter feature experimentalStatiHeaders. If you were using this feature in any of the supported adapters, you'll need to change the name of the flag:

    export default defineConfig({
      adapter: netlify({
    -    experimentalStaticHeaders: true
    +    staticHeaders: true
      })
    })

@astrojs/markdoc@1.0.0-beta.8

Patch Changes

  • Updated dependencies [80f0225]:
    • @astrojs/markdown-remark@7.0.0-beta.5

@astrojs/mdx@5.0.0-beta.5

Patch Changes

  • Updated dependencies [80f0225]:
    • @astrojs/markdown-remark@7.0.0-beta.5

@astrojs/markdown-remark@7.0.0-beta.5

Patch Changes

  • #15297 80f0225 Thanks @rururux! - Fixes a case where code blocks generated by prism would include the is:raw attribute in the final output
withastro/astro

This PR contains the following updates:

Package Change Age Confidence Type Update Pending
@astrojs/rss (source) ^4.0.15-beta.3^4.0.15 age confidence dependencies patch
@astrojs/sitemap (source) ^3.6.1-beta.3^3.7.0 age confidence dependencies minor
@playwright/test (source) 1.58.01.58.1 age confidence devDependencies patch
@preact/signals (source) ^2.6.1^2.6.2 age confidence dependencies patch 2.7.0
alpinejs (source) ^3.15.5^3.15.6 age confidence dependencies patch 3.15.8 (+1)
node (source) 22.20.022.22.0 age confidence minor
node 22-bullseye22.21.1-bullseye age confidence final minor 22.22.0
open-props ^1.7.17^1.7.23 age confidence dependencies patch
pnpm (source) 10.28.010.28.2 age confidence packageManager patch
preact (source) ^10.28.2^10.28.3 age confidence dependencies patch
shiki (source) ^3.21.0^3.22.0 age confidence dependencies minor
turbo (source) ^2.8.0^2.8.1 age confidence devDependencies patch 2.8.3 (+1)

Release Notes

withastro/astro (@​astrojs/rss)

v4.0.15

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`
        },
      }),
    ],
    
    
microsoft/playwright (@​playwright/test)

v1.58.1

Compare Source

Highlights

#​39036 fix(msedge): fix local network permissions
#​39037 chore: update cft download location
#​38995 chore(webkit): disable frame sessions on fronzen builds

Browser Versions
  • Chromium 145.0.7632.6
  • Mozilla Firefox 146.0.1
  • WebKit 26.0
nodejs/node (node)

v22.22.0: 2026-01-13, Version 22.22.0 'Jod' (LTS), @​marco-ippolito

Compare Source

This is a security release.

Notable Changes

lib:

  • (CVE-2025-59465) add TLSSocket default error handler
  • (CVE-2025-55132) disable futimes when permission model is enabled
    lib,permission:
  • (CVE-2025-55130) require full read and write to symlink APIs
    src:
  • (CVE-2025-59466) rethrow stack overflow exceptions in async_hooks
    src,lib:
  • (CVE-2025-55131) refactor unsafe buffer creation to remove zero-fill toggle
    tls:
  • (CVE-2026-21637) route callback exceptions through error handlers
Commits

v22.21.1: 2025-10-28, Version 22.21.1 'Jod' (LTS), @​aduh95

Compare Source

Commits

v22.21.0: 2025-10-20, Version 22.21.0 'Jod' (LTS), @​aduh95

Compare Source

Notable Changes
  • [1486fedea1] - (SEMVER-MINOR) cli: add --use-env-proxy (Joyee Cheung) #​59151
  • [bedaaa11fc] - (SEMVER-MINOR) http: support http proxy for fetch under NODE_USE_ENV_PROXY (Joyee Cheung) #​57165
  • [af8b5fa29d] - (SEMVER-MINOR) http: add shouldUpgradeCallback to let servers control HTTP upgrades (Tim Perry) #​59824
  • [42102594b1] - (SEMVER-MINOR) http,https: add built-in proxy support in http/https.request and Agent (Joyee Cheung) #​58980
  • [686ac49b82] - (SEMVER-MINOR) src: add percentage support to --max-old-space-size (Asaf Federman) #​59082
Commits
argyleink/open-props (open-props)

v1.7.23

Compare Source

31 January 2026

  • Add commit message input to version-bump workflow #585
  • ✂️ 1.7.23 74515a5

v1.7.22

Compare Source

31 January 2026

  • Add id-token permission to version-bump workflow #584
  • Add TypeScript types to submodule exports #582
  • [WIP] Fix issue with npm_publish workflow not triggering #583
  • ✂️ 1.7.22 ef7acc0

v1.7.21

Compare Source

31 January 2026

  • Add non-adaptive shadows.light.min.css and shadows.dark.min.css exports #580
  • Inject docsite version from package.json at build time #578
  • ✂️ 1.7.21 1368169

v1.7.20

Compare Source

31 January 2026

v1.7.19

Compare Source

31 January 2026

  • Add workflow_dispatch action for version bumping #577
  • Update NPM Publish workflow to latest action versions #576
  • chore: bump version to 1.7.19 1f63fef
pnpm/pnpm (pnpm)

v10.28.2: pnpm 10.28.2

Compare Source

Patch Changes

  • Security fix: prevent path traversal in directories.bin field.

  • When pnpm installs a file: or git: dependency, it now validates that symlinks point within the package directory. Symlinks to paths outside the package root are skipped to prevent local data from being leaked into node_modules.

    This fixes a security issue where a malicious package could create symlinks to sensitive files (e.g., /etc/passwd, ~/.ssh/id_rsa) and have their contents copied when the package is installed.

    Note: This only affects file: and git: dependencies. Registry packages (npm) have symlinks stripped during publish and are not affected.

  • Fixed optional dependencies to request full metadata from the registry to get the libc field, which is required for proper platform compatibility checks #​9950.

Platinum Sponsors

Bit

Gold Sponsors

Discord CodeRabbit Workleap
Stackblitz Vite

v10.28.1

Compare Source

preactjs/preact (preact)

v10.28.3

Compare Source

Fixes
Maintenance
shikijs/shiki (shiki)

v3.22.0

Compare Source

   🚀 Features
    View changes on GitHub

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 #15151
  • Updates the dev middleware to ignore query params

Testing

Manually

Docs

Changeset

withastro/starlight

Add Formware help center site to the showcase.

Site: https://formware.io/help/

withastro/astro

Changes

  • Closes #15363
  • I tried a few things and it turns out because we have references to @cloudflare/workers-types when building etc, we can avoid doing weird things with types
  • It also allowed removing the Request type augmentation we were doing as part of astro sync, because wrangler types already handles it

Testing

Manually in repro, manually in the custom-entryfile fixture, preview release tested with user's repro

Docs

Changeset

withastro/astro

Updates astro add cloudflare to use workerd's compatibility date when scaffolding wrangler.jsonc, instead of the current date.

Adds a /info export to @astrojs/cloudflare that re-exports getLocalWorkerdCompatibilityDate from the vite plugin

Tested manually by adding cloudflare to examples/minimal with this little hack

// Line 794 packages/astro/src/cli/add/index.ts
async function resolveRangeToInstallSpecifier(name: string, range: string): Promise<string> {
+    if (name === '@astrojs/cloudflare') return '@astrojs/cloudflare@workspace:*';
     const versions = await fetchPackageVersions(name);
withastro/astro

Changes

  • Fixes content collection loaders that use dynamic imports (await import(), import.meta.glob()) failing during build with "Vite module runner has been closed"
  • Refactors sync to keep the Vite server alive through both content config loading and content layer sync phases
  • Adds regression test for dynamic imports in loaders

Fixes #12689

Testing

Added a test case to content-layer.test.js that creates a collection loader using await import() to load data. This test failed before the fix and passes after.

Docs

N/A, bug fix

withastro/astro

Changes

  • Fix Preact components failing to render in Cloudflare dev mode
  • Include @astrojs/preact/server.js in Vite's optimizeDeps
  • Previously, server.js was explicitly excluded, causing preact-render-to-string to load a separate Preact instance from user components, breaking hooks
  • Fixes #15361

Testing

  • Added e2e test for Preact component with useEffect and client:load in the Cloudflare fixture

Docs

No docs changes needed - this is a bug fix for existing functionality.

withastro/astro

Changes

What the title says

Testing

CI

Docs

N/A

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

Patch Changes

withastro/astro

Changes

Testing

Docs

withastro/astro

Changes

  • Fix React slot rendering to skip empty SlotString values and avoid emitting empty <astro-slot> nodes (prevents React hydration mismatches for conditional slots).
  • Add a regression fixture (slots.astro + ConditionalSlot.jsx) and test to validate empty slots don’t render <astro-slot> while filled slots still do.

Minimal example that was causing hydration error:

  <ReactComponent client:load>
    {show ? <span slot="my-slot-name">Visible</span> : null}
  </ReactComponent>

Testing

New test case added.

Docs

  • No docs updates needed (internal integration fix + tests only).
withastro/astro

Changes

Testing

N/A

Docs

N/A

withastro/astro

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence
zod (source) ^3.25.76^4.3.6 age confidence

Release Notes

colinhacks/zod (zod)

v4.3.6

Compare Source

Commits:

v4.3.5

Compare Source

Commits:

v4.3.4

Compare Source

Commits:

v4.3.3

Compare Source

v4.3.2

Compare Source

v4.3.1

Compare Source

Commits:

  • 0fe8840 allow non-overwriting extends with refinements. 4.3.1

v4.3.0

Compare Source

This is Zod's biggest release since 4.0. It addresses several of Zod's longest-standing feature requests.

z.fromJSONSchema()

Convert JSON Schema to Zod (#​5534, #​5586)

You can now convert JSON Schema definitions directly into Zod schemas. This function supports JSON Schema "draft-2020-12", "draft-7", "draft-4", and OpenAPI 3.0.

import * as z from "zod";

const schema = z.fromJSONSchema({
  type: "object",
  properties: {
    name: { type: "string", minLength: 1 },
    age: { type: "integer", minimum: 0 },
  },
  required: ["name"],
});

schema.parse({ name: "Alice", age: 30 }); // ✅

The API should be considered experimental. There are no guarantees of 1:1 "round-trip soundness": MySchema > z.toJSONSchema() > z.fromJSONSchema(). There are several features of Zod that don't exist in JSON Schema and vice versa, which makes this virtually impossible.

Features supported:

  • All primitive types (string, number, integer, boolean, null, object, array)
  • String formats (email, uri, uuid, date-time, date, time, ipv4, ipv6, and more)
  • Composition (anyOf, oneOf, allOf)
  • Object constraints (additionalProperties, patternProperties, propertyNames)
  • Array constraints (prefixItems, items, minItems, maxItems)
  • $ref for local references and circular schemas
  • Custom metadata is preserved

z.xor() — exclusive union (#​5534)

A new exclusive union type that requires exactly one option to match. Unlike z.union() which passes if any option matches, z.xor() fails if zero or more than one option matches.

const schema = z.xor([z.string(), z.number()]);

schema.parse("hello"); // ✅
schema.parse(42);      // ✅
schema.parse(true);    // ❌ zero matches

When converted to JSON Schema, z.xor() produces oneOf instead of anyOf.

z.looseRecord() — partial record validation (#​5534)

A new record variant that only validates keys matching the key schema, passing through non-matching keys unchanged. This is used to represent patternProperties in JSON Schema.

const schema = z.looseRecord(z.string().regex(/^S_/), z.string());

schema.parse({ S_name: "John", other: 123 });
// ✅ { S_name: "John", other: 123 }
// only S_name is validated, "other" passes through

.exactOptional() — strict optional properties (#​5589)

A new wrapper that makes a property key-optional (can be omitted) but does not accept undefined as an explicit value.

const schema = z.object({
  a: z.string().optional(),      // accepts `undefined`
  b: z.string().exactOptional(), // does not accept `undefined`
});

schema.parse({});                  // ✅
schema.parse({ a: undefined });    // ✅
schema.parse({ b: undefined });    // ❌

This makes it possible to accurately represent the full spectrum of optionality expressible using exactOptionalPropertyTypes.

.apply()

A utility method for applying arbitrary transformations to a schema, enabling cleaner schema composition. (#​5463)

const setCommonChecks = <T extends z.ZodNumber>(schema: T) => {
  return schema.min(0).max(100);
};

const schema = z.number().apply(setCommonChecks).nullable();

.brand() cardinality

The .brand() method now accepts a second argument to control whether the brand applies to input, output, or both. Closes #​4764, #​4836.

// output only (default)
z.string().brand<"UserId">();           // output is branded (default)
z.string().brand<"UserId", "out">();    // output is branded
z.string().brand<"UserId", "in">();     // input is branded
z.string().brand<"UserId", "inout">();  // both are branded

Type predicates on .refine() (#​5575)

The .refine() method now supports type predicates to narrow the output type:

const schema = z.string().refine((s): s is "a" => s === "a");

type Input = z.input<typeof schema>;   // string
type Output = z.output<typeof schema>; // "a"

ZodMap methods: min, max, nonempty, size (#​5316)

ZodMap now has parity with ZodSet and ZodArray:

const schema = z.map(z.string(), z.number())
  .min(1)
  .max(10)
  .nonempty();

schema.size; // access the size constraint

.with() alias for .check() (359c0db)

A new .with() method has been added as a more readable alias for .check(). Over time, more APIs have been added that don't qualify as "checks". The new method provides a readable alternative that doesn't muddy semantics.

z.string().with(
  z.minLength(5),
  z.toLowerCase()
);

// equivalent to:
z.string().check(
  z.minLength(5),
  z.trim(),
  z.toLowerCase()
);
z.slugify() transform

Transform strings into URL-friendly slugs. Works great with .with():

// Zod
z.string().slugify().parse("Hello World");           // "hello-world"

// Zod Mini
// using .with() for explicit check composition
z.string().with(z.slugify()).parse("Hello World");   // "hello-world"

z.meta() and z.describe() in Zod Mini (947b4eb)

Zod Mini now exports z.meta() and z.describe() as top-level functions for adding metadata to schemas:

import * as z from "zod/mini";

// add description
const schema = z.string().with(
  z.describe("A user's name"),
);

// add arbitrary metadata
const schema2 = z.number().with(
  z.meta({ deprecated: true })
);

New locales

import * as z from "zod";
import { uz } from "zod/locales";

z.config(uz());






Bug fixes

All of these changes fix soundness issues in Zod. As with any bug fix there's some chance of breakage if you were intentionally or unintentionally relying on this unsound behavior.

⚠️ .pick() and .omit() disallowed on object schemas containing refinements (#​5317)

Using .pick() or .omit() on object schemas with refinements now throws an error. Previously, this would silently drop the refinements, leading to unexpected behavior.

const schema = z.object({
  password: z.string(),
  confirmPassword: z.string(),
}).refine(data => data.password === data.confirmPassword);

schema.pick({ password: true });
// 4.2: refinement silently dropped ⚠️
// 4.3: throws error ❌

Migration: The easiest way to migrate is to create a new schema using the shape of the old one.

const newSchema = z.object(schema.shape).pick({ ... })
⚠️ .extend() disallowed on refined schemas (#​5317)

Similarly, .extend() now throws on schemas with refinements. Use .safeExtend() if you need to extend refined schemas.

const schema = z.object({ a: z.string() }).refine(/* ... */);

// 4.2: refinement silently dropped ⚠️
// 4.3: throws error ✅
schema.extend({ b: z.number() });
// error: object schemas containing refinements cannot be extended. use `.safeExtend()` instead.
⚠️ Stricter object masking methods (#​5581)

Object masking methods (.pick(), .omit()) now validate that the keys provided actually exist in the schema:

const schema = z.object({ a: z.string() });

// 4.3: throws error for unrecognized keys
schema.pick({ nonexistent: true });
// error: unrecognized key: "nonexistent"

Additional changes

  • Fixed JSON Schema generation for z.iso.time with minute precision (#​5557)
  • Fixed error details for tuples with extraneous elements (#​5555)
  • Fixed includes method params typing to accept string | $ZodCheckIncludesParams (#​5556)
  • Fixed numeric formats error messages to be inclusive (#​5485)
  • Fixed implementAsync inferred type to always be a promise (#​5476)
  • Tightened E.164 regex to require a non-zero leading digit and 7–15 digits total (#​5524)
  • Fixed Dutch (nl) error strings (#​5529)
  • Convert Date instances to numbers in minimum/maximum checks (#​5351)
  • Improved numeric keys handling in z.record() (#​5585)
  • Lazy initialization of ~standard schema property (#​5363)
  • Functions marked as @__NO_SIDE_EFFECTS__ for better tree-shaking (#​5475)
  • Improved metadata tracking across child-parent relationships (#​5578)
  • Improved locale translation approach (#​5584)
  • Dropped id uniqueness enforcement at registry level (#​5574)

v4.2.1

Compare Source

v4.2.0

Compare Source

Features

Implement Standard JSON Schema

standard-schema/standard-schema#134

Implement z.fromJSONSchema()
const jsonSchema = {
  type: "object",
  properties: {
    name: { type: "string" },
    age: { type: "number" }
  },
  required: ["name"]
};

const schema = z.fromJSONSchema(jsonSchema);
Implement z.xor()
const schema = z.xor(
  z.object({ type: "user", name: z.string() }),
  z.object({ type: "admin", role: z.string() })
);
// Exactly one of the schemas must match
Implement z.looseRecord()
const schema = z.looseRecord(z.string(), z.number());
// Allows additional properties beyond those defined

Commits:

v4.1.13

Compare Source

v4.1.12

Compare Source

Commits:

v4.1.11

Compare Source

Commits:

v4.1.10

Compare Source

Commits:

v4.1.9

Compare Source

Commits:

v4.1.8

Compare Source

Commits:

v4.1.7

Compare Source

Commits:

v4.1.6

Compare Source

v4.1.5

Compare Source

Commits:

v4.1.4

Compare Source

Commits:

  • 3291c61 fix(v4): toJSONSchema - wrong tuple with null output when targeting openapi-3.0 (#​5156)
  • 23f41c7 test(v4): toJSONSchema - use validateOpenAPI30Schema in all relevant scenarios (#​5163)
  • 0a09fd2 Update installation instructions
  • 4ea5fec 4.1.4

v4.1.3

Compare Source

Commits:

  • 98ff675 Drop stringToBoolean
  • a410616 Fix typo
  • 0cf4589 fix(v4): toJSONSchema - add missing oneOf inside items in tuple conversion (#​5146)
  • 8bf0c16 fix(v4): toJSONSchema tuple path handling for draft-7 with metadata IDs (#​5152)
  • 5c5fa90 fix(v4): toJSONSchema - wrong record output when targeting openapi-3.0 (#​5141)
  • 87b97cc docs(codecs): update example to use payloadSchema (#​5150)
  • 309f358 fix(v4): toJSONSchema - output numbers with exclusive range correctly when targeting openapi-3.0 (#​5139)
  • 1e71ca9 docs: fix refine fn to encode works properly (#​5148)
  • a85ec3c fix(docs): correct example to use LooseDog instead of Dog (#​5136)
  • 3e98274 4.1.3

v4.1.2

Compare Source

Commits:

v4.1.1

Compare Source

Commits:

v4.1.0

Compare Source

The first minor version since the introduction of Zod 4 back in May. This version contains a number of features that barely missed the cut for the 4.0 release. With Zod 4 stable and widely adopted, there's more time to resume feature development.

Codecs

This is the flagship feature of this release. Codecs are a new API & schema type that encapsulates a bi-directional transformation. It's a huge missing piece in Zod that's finally filled, and it unlocks some totally new ways to use Zod.

const stringToDate = z.codec(
  z.iso.datetime(),  // input schema: ISO date string
  z.date(),          // output schema: Date object
  {
    decode: (isoString) => new Date(isoString), 
    encode: (date) => date.toISOString(),
  }
);

New top-level functions are added for processing inputs in the forward direction ("decoding") and backward direction ("encoding").

stringToDate.decode("2025-08-21T20:59:45.500Z")
// => Date

stringToDate.encode(new Date())
// => "2025-08-21T20:59:45.500Z"

Note — For bundle size reasons, these new methods have not added to Zod Mini schemas. Instead, this functionality is available via equivalent top-level functions.

// equivalent at runtime
z.decode(stringToDate, "2024-01-15T10:30:00.000Z");
z.encode(stringToDate, new Date());
.parse() vs .decode()

Both .parse() and decode() process data in the "forward" direction. They behave identically at runtime.

stringToDate.parse("2025-08-21T20:59:45.500Z");
stringToDate.decode("2025-08-21T20:59:45.500Z");

There is an important difference however. While .parse() accepts any input, .decode() expects a strongly typed input. That is, it expects an input of type string, whereas .parse() accepts unknown.

stringToDate.parse(Symbol('not-a-string'));
// => fails at runtime, but no TypeScript error

stringToDate.decode(Symbol("not-a-string"));
//                     ^ ❌ Argument of type 'symbol' is not assignable to parameter of type 'Date'. ts(2345)

This is a highly requested feature unto itself:

Encoding

You can use any Zod schema with .encode(). The vast majority of Zod schemas are non-transforming (the input and output types are identical) so .decode() and .encode() behave identically. Only certain schema types change their behavior:

  • Codecs — runs from B->A and executes the encode transform during encoding
  • Pipes — these execute B->A instead of A->B
  • Defaults and prefaults — Only applied in the forward direction
  • Catch — Only applied in the forward direction

Note — To avoid increasing bundle size unnecessarily, these new methods are not available on Zod Mini schemas. For those schemas, equivalent top-level functions are provided.

The usual async and safe variants exist as well:

// decode methods
stringToDate.decode("2024-01-15T10:30:00.000Z")
await stringToDate.decodeAsync("2024-01-15T10:30:00.000Z")
stringToDate.safeDecode("2024-01-15T10:30:00.000Z")
await stringToDate.safeDecodeAsync("2024-01-15T10:30:00.000Z")

// encode methods
stringToDate.encode(new Date())
await stringToDate.encodeAsync(new Date())
stringToDate.safeEncode(new Date())
await stringToDate.safeEncodeAsync(new Date())
Example codecs

Below are some "worked examples" for some commonly-needed codecs. These examples are all tested internally for correctness. Just copy/paste them into your project as needed. There is a more comprehensive set available at zod.dev/codecs.

stringToBigInt

Converts bigint into a serializable form.

const stringToBigInt = z.codec(z.string(), z.bigint(), {
  decode: (str) => BigInt(str),
  encode: (bigint) => bigint.toString(),
});

stringToBigInt.decode("12345");  // => 12345n
stringToBigInt.encode(12345n);   // => "12345"
json

Parses/stringifies JSON data.

const jsonCodec = z.codec(z.string(), z.json(), {
  decode: (jsonString, ctx) => {
    try {
      return JSON.parse(jsonString);
    } catch (err: any) {
      ctx.issues.push({
        code: "invalid_format",
        format: "json_string",
        input: jsonString,
        message: err.message,
      });
      return z.NEVER;
    }
  },
  encode: (value) => JSON.stringify(value),
});

To further validate the data, .pipe() the result of this codec into another schema.

const Params = z.object({ name: z.string(), age: z.number() });
const JsonToParams = jsonCodec.pipe(Params);

JsonToParams.decode('{"name":"Alice","age":30}');  // => { name: "Alice", age: 30 }
JsonToParams.encode({ name: "Bob", age: 25 });     // => '{"name":"Bob","age":25}'
Further reading

For more examples and a technical breakdown of how encoding works, reads theannouncement blog post and new Codecs docs page. The docs page contains implementations for several other commonly-needed codecs:

.safeExtend()

The existing way to add additional fields to an object is to use .extend().

const A = z.object({ a: z.string() })
const B = A.extend({ b: z.string() })

Unfortunately this is a bit of a misnomer, as it allows you to overwrite existing fields. This means the result of .extend() may not literally extend the original type (in the TypeScript sense).

const A = z.object({ a: z.string() }) // { a: string }
const B = A.extend({ a: z.number() }) // { a: number }

To enforce true extends logic, Zod 4.1 introduces a new .safeExtend() method. This statically enforces that the newly added properties conform to the existing ones.

z.object({ a: z.string() }).safeExtend({ a: z.number().min(5) }); // ✅
z.object({ a: z.string() }).safeExtend({ a: z.any() }); // ✅
z.object({ a: z.string() }).safeExtend({ a: z.number() });
//                                       ^  ❌ ZodNumber is not assignable 

Importantly, this new API allows you to safely extend objects containing refinements.

const AB = z.object({ a: z.string(), b: z.string() }).refine(val => val.a === val.b);
const ABC = AB.safeExtend({ c: z.string() });
// ABC includes the refinements defined on AB

Previously (in Zod 4.x) any refinements attached to the base schema were dropped in the extended result. This was too unexpected. It now throws an error. (Zod 3 did not support extension of refined objects either.)

z.hash()

A new top-level string format for validating hashes produced using various common algorithms & encodings.

const md5Schema = z.hash("md5");          
// => ZodCustomStringFormat<"md5_hex">

const sha256Base64 = z.hash("sha256", { enc: "base64" }); 
// => ZodCustomStringFormat<"sha256_base64">

The following hash algorithms and encodings are supported. Each cell provides information about the expected number of characters/padding.

Algorithm / Encoding "hex" "base64" "base64url"
"md5" 32 24 (22 + "==") 22
"sha1" 40 28 (27 + "=") 27
"sha256" 64 44 (43 + "=") 43
"sha384" 96 64 (no padding) 64
"sha512" 128 88 (86 + "==") 86

z.hex()

To validate hexadecimal strings of any length.

const hexSchema = z.hex();

hexSchema.parse("123abc");    // ✅ "123abc"
hexSchema.parse("DEADBEEF");  // ✅ "DEADBEEF" 
hexSchema.parse("xyz");       // ❌ ZodError

Additional changes

  1. z.uuid() now supports the "Max UUID" (FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF) per the RFC
  2. $ZodFunction is now a subtype of $ZodType

Commits

v4.0.17

Compare Source

Commits:

v4.0.16

Compare Source

Commits:

v4.0.15

Compare Source

Commits:

v4.0.14

Compare Source

Commits:

v4.0.13

Compare Source

Commits:

v4.0.12

Compare Source

Commits:

v4.0.11

Compare Source

Commits:

v4.0.10

Compare Source

Commits:

v4.0.9

Compare Source

Commits:

v4.0.8

Compare Source

Commits:

v4.0.7

Compare Source

Commits:

v4.0.6

Compare Source

Commits:


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.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

withastro/starlight

Add Actionbase documentation site to the showcase.

withastro/astro

Changes

  • Closes #15311
  • I was looking at writing tests then updating the implementation of collapseDuplicateSlashes() when I realized...we don't even use this function anymore!
  • So I went through all the exports of the path submodule and removed any unused one

Testing

Should pass

Docs

Changeset

withastro/astro

Changes

  • I added a new option to @astrojs/react, appEntrypoint. It looks a whole lot like the Vue integration’s appEntrypoint option and it functions nearly identically. Specify a path to a file that has a default-exported component and that component will be used to wrap every React island.
  • I added Astro.locals to the render context and am passing Astro.locals through to appEntrypoint’s component as a prop called locals. The prop is only set in a server environment; clientside it’s just undefined. Removed for now but you can see the change here (it’s pretty minimal)

Testing

New tests added that cover appEntrypoint in general as well as the locals prop.

Docs

PR with docs update is here: withastro/docs#13208

withastro/astro

Changes

This fixes a bug in the image service where inferSize was not correctly deleted when the image was not remote.

Testing

There was no existing test related to inferSize. This PR doesn't add any.

Docs

There is no impact on docs. This only fixes undocumented behavior that also had no effect apart from emitting useless HTML attributes.


Last fetched:  |  Scheduled refresh: Every Saturday

See Customizing GitHub Activity Pages to configure your own

Inspired by prs.atinux.com