AstroEco is Contributing…
Display your GitHub pull requests using astro-loader-github-prs
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:
-
In
packages/astro/src: I pass themetadatato therender.ssr.check()function. Notice that this matches the existing signature of thecheck()function. -
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:loadcomponents, andclient:onlycomponents. -
In
packages/integrations/preact: I reuse theinclude/excludeoptions passed to the integration. During the SSR phase, these options are used to check the component path frommetadata.componentUrl.For now, I only update
@astrojs/preactin 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/reactand 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.
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
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
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
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
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
1a323e5Thanks @jcayzac! - Fix regression where SVG images in content collectionimage()fields could not be rendered as inline components. This behavior is now restored while preserving the TLA deadlock fix. -
#15693
4db2089Thanks @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
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.
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
- This works now: https://deploy-preview-2060--astro-www-2.netlify.app/themes/
Docs
N/A, bug fix
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
optimizeShikioption 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
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
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
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
5b99e90Thanks @leekeh! - Adds a newmiddlewareModeadapter feature to replace the previousedgeMiddlewareoption.This feature only impacts adapter authors. If your adapter supports
edgeMiddleware, you should upgrade to the newmiddlewareModeoption to specify the middleware mode for your adapter as soon as possible. TheedgeMiddlewarefeature 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
cb625b6Thanks @qzio! - Adds a newsecurity.actionBodySizeLimitoption 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
5b99e90Thanks @leekeh! - Adds newmiddlewareModeadapter feature and deprecatesedgeMiddlewareoptionThe
edgeMiddlewareoption is now deprecated and will be removed in a future major release, so users should transition to using the newmiddlewareModefeature as soon as possible.export default defineConfig({ adapter: netlify({ - edgeMiddleware: true + middlewareMode: 'edge' }) })
Patch Changes
-
#15679
19ba822Thanks @matthewp! - Fixes server-rendered routes returning 404 errorsA 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
5b99e90Thanks @leekeh! - Adds newmiddlewareModeadapter feature and deprecatesedgeMiddlewareoptionThe
edgeMiddlewareoption is now deprecated and will be removed in a future release, so users should transition to using the newmiddlewareModefeature as soon as possible.export default defineConfig({ adapter: vercel({ - edgeMiddleware: true + middlewareMode: 'edge' }) })
@astrojs/cloudflare@13.0.0-beta.11
Patch Changes
-
#15495
5b99e90Thanks @leekeh! - Refactors to usemiddlewareModeadapter feature (set toclassic) -
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
5b99e90Thanks @leekeh! - Refactors to usemiddlewareModeadapter feature (set toclassic) -
#15657
cb625b6Thanks @qzio! - Adds a newsecurity.actionBodySizeLimitoption 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
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
Changes
- Vendors
cssescand 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
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"]andlibReplacement: false - Removes some unused things in language tools
Testing
Should pass!
Docs
- Changeset
- withastro/docs#13319
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
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
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'insteadimageService: 'custom'deprecated, eventually will be copy paste from their astro config.images to the config.adapter- Any integration that sets
config.image.serviceinconfig:setupis automatically picked up by thecompilepreset (captured inconfig: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 forexpandPreset,normalizeImageServiceConfig,resolveEndpoint, andsetImageConfigacross all config shapesimage-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 handlingimage-service-workerd.test.js— config-aware hashing (different configs produce different hash inputs, absent config doesn't inject_serviceConfig)
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
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-systemandBlinkMacSystemFontfonts and removing the newersystem-uiandui-sans-seriffamilies.
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)
- Windows 11 — Simplified Chinese (@tsavpyn)
- 🚨✅ Firefox (v147): Latin fontface has changed, Simplified Chinese is unchanged, Japanese characters are now displayed correctly, e.g.
instead of
(see comment)
- 🚨✅ Firefox (v147): Latin fontface has changed, Simplified Chinese is unchanged, Japanese characters are now displayed correctly, e.g.
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.
Description
This PR adds the new Starlight Vintage theme to the theme showcase page.
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
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
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.
Description
- Closes #3712
- This PR adds a hotfix for the
<Steps>component to work around withastro/astro#15627
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
- Changeset
- withastro/docs#13310
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 usingfs.realpathSync()to ensure the path casing matches the actual filesystem. Falls back to the original resolved path ifrealpathSyncfails. -
packages/astro/test/units/config/config-resolve.test.js: Added unit tests forresolveRoot()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).
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
- 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.
- This cached highlighter instance can highlight new languages.
Docs
Changeset file has been added.
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
0dd9d00Thanks @delucis! - Removes redundantfetchpriorityattributes from the output of Astro’s<Image>componentPreviously, Astro would always include
fetchpriority="auto"on images not using thepriorityattribute.
However, this is the default value, so specifying it is redundant. This change omits the attribute by default.
Patch Changes
-
#15661
7150a2eThanks @ematipico! - Fixes a build error when generating projects with 100k+ static routes. -
#15603
5bc2b2cThanks @0xRozier! - Fixes a deadlock that occurred when using SVG images in content collections -
#15669
d5a888bThanks @florian-lefebvre! - Removes thecssescdependencyThis 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
d5a888bThanks @florian-lefebvre! - Removes thecssescdependencyThis CommonJS dependency could sometimes cause errors because Astro is ESM-only. It is now replaced with a built-in ESM-friendly implementation.
-
#15648
802426bThanks @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
52a7efdThanks @matthewp! - Fixes builds that were failing with "Entry module cannot be external" error when using the Netlify adapterThis 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
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
Changes
- Removes two nonexistent exports left over from #15640 that are causing linting to fail
Testing
Linting should no longer fail
Docs
n/a
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
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
I18nRouterthat 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
Changes
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
/cc @withastro/maintainers-docs for feedback!
This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @cloudflare/workers-types | ^4.20260227.0 → ^4.20260228.0 |
||
| svelte (source) | ^5.53.0 → ^5.53.1 |
Release Notes
Configuration
📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
Changes
- Addresses https://github.com/orgs/withastro/projects/21/views/1?pane=issue&itemId=159371241
workerddoesn't work on Stackblitz, which causes weird errors. We now throw a clean error when running in a webcontainer- Updates the issue template to mention github for repros
Testing
N/A
Docs
Changeset + issue template
This PR contains the following updates:
Release Notes
withastro/compiler (@astrojs/compiler)
v3.0.0-beta.1
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 expression615eb21: Fix CSS nesting so nested selectors without an ampersand are parsed and scoped correctly.
preactjs/signals (@preact/signals)
v2.8.1
Patch Changes
- #883
849413fThanks @JoviDeCroock! - Ensure that re-mounting components preserve the DOM updaters correctly
v2.8.0
Minor Changes
- #878
4aa565bThanks @JoviDeCroock! - Support returning a plain array in thewhenof aForcomponent
rollup/rollup (rollup)
v4.58.0
2026-02-20
Features
- Also support
__NO_SIDE_EFFECTS__annotation before variable declarations declaring function expressions (#6272)
Pull Requests
- #6256: docs: document PreRenderedChunk properties including isDynamicEntry and isImplicitEntry (@njg7194, @lukastaegert)
- #6259: docs: Correct typo and improve sentence structure in docs for
output.experimentalMinChunkSize(@millerick, @lukastaegert) - #6260: fix(deps): update rust crate swc_compiler_base to v47 (@renovate[bot], @lukastaegert)
- #6261: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6262: Avoid unnecessary cloning of the code string (@lukastaegert)
- #6263: fix(deps): update minor/patch updates (@renovate[bot], @lukastaegert)
- #6265: chore(deps): lock file maintenance (@renovate[bot])
- #6267: fix(deps): update minor/patch updates (@renovate[bot])
- #6268: chore(deps): update dependency eslint-plugin-unicorn to v63 (@renovate[bot], @lukastaegert)
- #6269: chore(deps): update dependency lru-cache to v11 (@renovate[bot])
- #6270: chore(deps): lock file maintenance (@renovate[bot])
- #6272: forward NO_SIDE_EFFECTS annotations to function expressions in variable declarations (@lukastaegert)
nodejs/undici (undici)
v7.22.0
What's Changed
- docs: fix syntax highlighting in WebSocket.md by @styfle in #4814
- fix: use OR operator in includesCredentials per WHATWG URL Standard by @jackhax in #4816
- feat(dispatcher/env-http-proxy-agent): strip leading dot and asterisk by @SuperOleg39 in #4676
- fix: route WebSocket upgrades through onRequestUpgrade by @mcollina in #4787
- build(deps-dev): bump esbuild from 0.25.12 to 0.27.3 by @dependabot[bot] in #4821
- fix(deduplicate): do not deduplicate non-safe methods by default by @mcollina in #4818
- feat: Support async cache stores in revalidation by @marcopiraccini in #4826
New Contributors
- @jackhax made their first contribution in #4816
- @marcopiraccini made their first contribution in #4826
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.
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 inServerIslandComponent.getIslandContent()before the payload is encrypted
Testing
Minimal reproduction: https://github.com/jwoyo/astro-server-island-bug
- Component with
<script>passed as slot toserver:deferwrapper - Before: island response contains HTML but no
<script>→ no interactivity - 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.
This PR contains the following updates:
Release Notes
preactjs/preact-render-to-string (preact-render-to-string)
v6.6.6
Patch Changes
- #446
b7b288cThanks @JoviDeCroock! - Fix issues regarding streaming full HTML documents
sveltejs/svelte (svelte)
v5.53.1
Patch Changes
- fix: handle shadowed function names correctly (#17753)
sveltejs/language-tools (svelte2tsx)
v0.7.51
Patch Changes
- fix: respect
@ts-ignoreetc comments within tags (#2950)
v0.7.50
Patch Changes
- fix: detect existing JSDoc
@satisfiesto prevent duplicate injection (#2946)
v0.7.49
Patch Changes
-
fix: handle relative imports reaching outside working directory when using
--incremental/--tsgoflags (#2942) -
fix: support SvelteKit zero types in svelte-check --incremental (#2939)
v0.7.48
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.
Fixes #15520
Changes
- Adds a
config()hook to theastroPrefetchVite plugin that excludesastro/virtual-modules/prefetch.jsfrom Vite'soptimizeDeps. - When
<ClientRouter />is used, Vite discovers the prefetch module as a transitive dependency and pre-bundles it via esbuild, which doesn't invoke Vite plugintransformhooks. This leaves the placeholder constants (__PREFETCH_PREFETCH_ALL__, etc.) unreplaced, causing aReferenceErrorat runtime in the browser. - The fix follows the same pattern used by the
astro:transitionsplugin, which already configuresoptimizeDepsvia its ownconfig()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.
Changes
- Replace manual
docker loginwith the officialdocker/login-action@v3.7.0in 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.
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
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— Addif: ${{ github.repository_owner == 'withastro' }}to thedeployjob; addpermissions: contents: read(missing permissions block)continuous_benchmark.yml— Addif: ${{ github.repository_owner == 'withastro' }}to thecodspeedjob
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-deployandcontinuous_benchmarkworkflows fail on forks</issue_title>
<issue_description>### Astro Info`main` branchIf 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
mainbranch, 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/22317394415What'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/workflowsworkflow 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)
- Fixes #15624
💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.
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.
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:
astro/packages/integrations/mdx/test/mdx-plus-react.test.js
Lines 6 to 16 in 1cc62dc
| 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
This PR contains the following updates:
Release Notes
cloudflare/workers-sdk (@cloudflare/vite-plugin)
v1.25.2
Patch Changes
- Updated dependencies [
f239077,aaa7200,2f19a40,8723684,e2a6600,5f9f0b4,452cdc8,527e4f5,aa82c2b,0b17117,ca58062]:- miniflare@4.20260219.0
- wrangler@4.67.0
- @cloudflare/unenv-preset@2.14.0
v1.25.1
Patch Changes
cloudflare/workerd (@cloudflare/workers-types)
v4.20260227.0
v4.20260219.0
v4.20260218.0
v4.20260217.0
v4.20260214.0
netlify/primitives (@netlify/vite-plugin)
v2.10.2
Dependencies
- The following workspace dependencies were updated
- dependencies
- @netlify/dev bumped from 4.11.1 to 4.11.2
- dependencies
v2.10.1
Dependencies
- The following workspace dependencies were updated
- dependencies
- @netlify/dev bumped from 4.11.0 to 4.11.1
- dependencies
v2.10.0
Features
Dependencies
- The following workspace dependencies were updated
- dependencies
- @netlify/dev bumped from 4.10.0 to 4.11.0
- dependencies
cloudflare/workers-sdk (wrangler)
v4.67.0
Minor Changes
-
#12401
8723684Thanks @jonesphillip! - Add validation retry loops to pipelines setup commandThe
wrangler pipelines setupcommand 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
aa82c2bThanks @cmackenzie1! - Generate typed pipeline bindings from stream schemasWhen 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.If your stream has a schema with fields like
user_id(string) andevent_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
aaa7200Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260217.0 1.20260218.0 -
#12606
2f19a40Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260218.0 1.20260219.0 -
#12604
e2a6600Thanks @petebacondarwin! - fix: pass--envflag to auxiliary workers in multi-worker modeWhen running
wrangler devwith multiple config files (e.g.-c ./apps/api/wrangler.jsonc -c ./apps/queues/wrangler.jsonc -e=dev), the--envflag 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
0b17117Thanks @sdnts! - The maximum allowed delivery and retry delays for Queues is now 24 hours -
#12598
ca58062Thanks @mattzcarey! - Stop redactingwrangler whoamioutput in non-interactive modewrangler whoamiis 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]:- miniflare@4.20260219.0
- @cloudflare/unenv-preset@2.14.0
v4.66.0
Minor Changes
-
#12466
caf9b11Thanks @petebacondarwin! - AddWRANGLER_CACHE_DIRenvironment variable and smart cache directory detectionWrangler now intelligently detects where to store cache files:
- Use
WRANGLER_CACHE_DIRenv var if set - Use existing cache directory if found (
node_modules/.cache/wrangleror.wrangler/cache) - Create cache in
node_modules/.cache/wranglerifnode_modulesexists - Otherwise use
.wrangler/cache
This improves compatibility with Yarn PnP, pnpm, and other package managers that don't use traditional
node_modulesdirectories, without requiring any configuration. - Use
-
#12572
936187dThanks @dario-piotrowicz! - Ensure thenodejs_compatflag is always applied in autoconfigPreviously, the autoconfig feature relied on individual framework configurations to specify Node.js compatibility flags, some could set
nodejs_compatwhile othersnodejs_als.Now instead
nodejs_compatis always included as a compatibility flag, this is generally beneficial and the user can always remove the flag afterwards if they want to. -
#12560
c4c86f8Thanks @taylorlee! - Support--tagand--messageflags onwrangler deployThey 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
duringwrangler versions deploy.
Patch Changes
-
#12543
5a868a0Thanks @G4brym! - Fix AI Search binding failing in local devUsing AI Search bindings with
wrangler devwould fail with "RPC stub points at a non-serializable type". AI Search bindings now work correctly in local development. -
#12552
c58e81bThanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260212.0 1.20260213.0 -
#12568
33a9a8fThanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260213.0 1.20260214.0 -
#12576
8077c14Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260214.0 1.20260217.0 -
#12466
caf9b11Thanks @petebacondarwin! - fix: exclude.wranglerdirectory from Pages uploadsThe
.wranglerdirectory contains local cache and state files that should never be deployed. This aligns Pages upload behavior with Workers Assets, which already excludes.wranglervia.assetsignore. -
#12556
7d2355eThanks @ascorbic! - Fix port availability check probing the wrong host when host changesmemoizeGetPortcorrectly 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
7ea69afThanks @MattieTK! - Support function-based Vite configs in autoconfig setupwrangler setupandwrangler deploy --x-autoconfigcan now automatically add the Cloudflare Vite plugin to projects that use function-baseddefineConfig()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-postgresandnode-custom-servertemplates. The followingdefineConfig()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
5cc7158Thanks @dario-piotrowicz! - Fix.assetsignoreformatting when autoconfig creates a new filePreviously, when
wrangler setuporwrangler deploy --x-autoconfigcreated a new.assetsignorefile 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.assetsignorefile. This fix ensures newly created.assetsignorefiles start cleanly without leading blank lines. -
#12556
7d2355eThanks @ascorbic! - Improve error message when port binding is blocked by a sandbox or security policyWhen running
wrangler devinside a restricted environment (such as an AI coding agent sandbox or locked-down container), the port availability check would fail with a rawEPERMerror. 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
c9d0f9dThanks @dario-piotrowicz! - Improve framework detection when multiple frameworks are foundWhen 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
5cc7158Thanks @dario-piotrowicz! - Add trailing newline to generatedpackage.jsonandwrangler.jsoncfiles -
#12548
5cc7158Thanks @dario-piotrowicz! - Fix.gitignoreformatting when autoconfig creates a new filePreviously, when
wrangler setuporwrangler deploycreated a new.gitignorefile 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.gitignorefile. This fix ensures newly created.gitignorefiles start cleanly without leading blank lines. -
#12545
c9d0f9dThanks @dario-piotrowicz! - Throw actionable error when autoconfig is run in the root of a workspaceWhen running Wrangler commands that trigger auto-configuration (like
wrangler devorwrangler 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]:- miniflare@4.20260217.0
- @cloudflare/unenv-preset@2.13.0
Configuration
📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
This PR contains the following updates:
Release Notes
withastro/astro (@astrojs/rss)
v4.0.15
Patch Changes
- #15199
d8e64efThanks @ArmandPhilippot! - Fixes the links to Astro Docs so that they match the current docs structure.
withastro/astro (@astrojs/sitemap)
v3.7.0
Minor Changes
-
#14471
4296373Thanks @Slackluky! - Adds the ability to split sitemap generation into chunks based on customizable logic. This allows for better management of large sitemaps and improved performance. The newchunksoption in the sitemap configuration allows users to define functions that categorize sitemap items into different chunks. Each chunk is then written to a separate sitemap file.integrations: [ sitemap({ serialize(item) { th return item }, chunks: { // this property will be treated last on the configuration 'blog': (item) => { // will produce a sitemap file with `blog` name (sitemap-blog-0.xml) if (/blog/.test(item.url)) { // filter path that will be included in this specific sitemap file item.changefreq = 'weekly'; item.lastmod = new Date(); item.priority = 0.9; // define specific properties for this filtered path return item; } }, 'glossary': (item) => { if (/glossary/.test(item.url)) { item.changefreq = 'weekly'; item.lastmod = new Date(); item.priority = 0.7; return item; } } // the rest of the path will be stored in `sitemap-pages.0.xml` }, }), ],
v3.6.1
Patch Changes
- #15033
dd06779Thanks @florian-lefebvre! - Updates how routes are retrieved to avoid relying on a deprecated API
preactjs/signals (@preact/signals)
v2.8.1
Patch Changes
- #883
849413fThanks @JoviDeCroock! - Ensure that re-mounting components preserve the DOM updaters correctly
v2.8.0
Minor Changes
- #878
4aa565bThanks @JoviDeCroock! - Support returning a plain array in thewhenof aForcomponent
tailwindlabs/tailwindcss (@tailwindcss/vite)
v4.2.0
Added
- Add mauve, olive, mist, and taupe color palettes to the default theme (#19627)
- Add
@tailwindcss/webpackpackage to run Tailwind CSS as a webpack plugin (#19610) - Add
pbs-*andpbe-*utilities forpadding-block-startandpadding-block-end(#19601) - Add
mbs-*andmbe-*utilities formargin-block-startandmargin-block-end(#19601) - Add
scroll-pbs-*andscroll-pbe-*utilities forscroll-padding-block-startandscroll-padding-block-end(#19601) - Add
scroll-mbs-*andscroll-mbe-*utilities forscroll-margin-block-startandscroll-margin-block-end(#19601) - Add
border-bs-*andborder-be-*utilities forborder-block-startandborder-block-end(#19601) - Add
inline-*,min-inline-*,max-inline-*utilities forinline-size,min-inline-size, andmax-inline-size(#19612) - Add
block-*,min-block-*,max-block-*utilities forblock-size,min-block-size, andmax-block-size(#19612) - Add
inset-s-*,inset-e-*,inset-bs-*,inset-be-*utilities forinset-inline-start,inset-inline-end,inset-block-start, andinset-block-end(#19613) - Add
font-features-*utility forfont-feature-settings(#19623)
Fixed
- Prevent double
@supportswrapper forcolor-mixvalues (#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
@utilityname validation with Oxide scanner rules (#19524) - Fix infinite loop when using
@variantinside@custom-variant(#19633) - Allow multiples of
.25inaspect-*fractions (e.g.aspect-8.5/11) (#19688) - Ensure changes to external files listed via
@sourcetrigger 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
@utilitynames to improve support with formatters such as Biome (#19626) - Fix incorrect canonicalization results when canonicalizing multiple times (#19675)
- Add
.jjto default ignored content directories (#19687)
Deprecated
- Deprecate
start-*andend-*utilities in favor ofinset-s-*andinset-e-*utilities (#19613)
NaturalIntelligence/fast-xml-parser (fast-xml-parser)
v5.3.7: CJS typing fix
What's Changed
- Unexport
X2jOptionsat declaration site by @Drarig29 in #787
New Contributors
- @Drarig29 made their first contribution in #787
Full Changelog: NaturalIntelligence/fast-xml-parser@v5.3.6...v5.3.7
pnpm/pnpm (pnpm)
v10.30.1: pnpm 10.30.1
Patch Changes
- Use the
/-/npm/v1/security/audits/quickendpoint as the primary audit endpoint, falling back to/-/npm/v1/security/auditswhen it fails #10649.
Platinum Sponsors
|
|
Gold Sponsors
|
|
|
|
|
|
|
|
|
|
|
v10.30.0: pnpm 10.30
Minor Changes
pnpm whynow 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 whydependency pruning to prefer correctness over memory consumption. Reverted PR: #7122. - Optimize
pnpm whyandpnpm listperformance 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
|
|
Gold Sponsors
|
|
|
|
|
|
|
|
|
|
|
preactjs/preact (preact)
v10.28.4
Fixes
- Fix crash where a synchronous effect render unmounts the tree (#5026, thanks @JoviDeCroock)
Performance
- Core size optimizations (#5022, thanks @JoviDeCroock)
- Hooks size optimizations (#5021, thanks @JoviDeCroock)
- Make oldProps diffing more compact (#5004) (#5019, thanks @JoviDeCroock)
- Compat size optimizations (#5020, thanks @JoviDeCroock)
- Land size optimization separately (#5018, thanks @JoviDeCroock)
sveltejs/svelte (svelte)
v5.53.0
Minor Changes
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
Minor Changes
- feat: support TrustedHTML in
{@​html}expressions (#17701)
Patch Changes
vercel/turborepo (turbo)
v2.8.10: Turborepo v2.8.10
What's Changed
create-turbo
- fix: Sanitize git command inputs in create-turbo by @anthonyshew in #11876
Changelog
- fix: Move
node-plopto dependencies soPlopTypesresolves for consumers by @anthonyshew in #11862 - chore: Use 2024 edition in more packages, do not ignore some clippy l… by @ognevny in #11860
- perf: Optimize hot-path hash computation by avoiding clones and using unstable sorts by @anthonyshew in #11872
- perf: Replace twox-hash with xxhash-rust and optimize file hashing by @anthonyshew in #11874
- fix: Restrict credential file permissions to owner-only by @anthonyshew in #11870
- perf: Reduce allocations in globwalk by @anthonyshew in #11528
- perf: Replace O(V³) Floyd-Warshall with O(V+E) DFS in watch mode subgraph creation by @anthonyshew in #11878
- feat: Generate LLM-friendly markdown alongside --profile trace output by @anthonyshew in #11880
- feat: Make
--profileand--anon-profilefilename optional by @anthonyshew in #11883 - perf: Batch per-package git subprocess calls into repo-wide index by @anthonyshew in #11887
- perf: Parallelize and pre-build RepoGitIndex by @anthonyshew in #11889
- perf: Pre-compile glob exclusion filter and cache path prefix in file hashing by @anthonyshew in #11891
Full Changelog: vercel/turborepo@v2.8.9...v2.8.10
v2.8.9
v2.8.8: Turborepo v2.8.8
What's Changed
@turbo/codemod
Examples
- docs: Replace mysql refs with postgres by @kyedavey in #11827
Changelog
- fix: Use private blob store access in agents app by @anthonyshew in #11811
- fix: Pass non-empty body when initializing blob log files by @anthonyshew in #11812
- docs: Geistdocs update by @haydenbleasel in #11807
- fix: Allow overwriting existing blobs in run updates and log appends by @anthonyshew in #11813
- docs: Geistdocs update 2 by @haydenbleasel in #11814
- fix: Set 5-hour timeout on security audit sandbox by @anthonyshew in #11815
- fix: Resolve Windows TUI hang caused by portable-pty 0.9.0 ConPTY changes by @anthonyshew in #11816
- fix: Repair audit fixer log streaming and replace git push with patch upload by @anthonyshew in #11818
- chore: Small stuff for agent fixer by @anthonyshew in #11819
- chore: Bump tonic to 0.14 by @anthonyshew in #11820
- fix: Pin @turbo/gen version to match the running turbo binary by @anthonyshew in #11822
- fix: Use
secret_key_overridein tests to eliminate env var race condition by @anthonyshew in #11824 - fix: Avoid panic in sandboxed environments by removing system-configuration dependency by @anthonyshew in #11828
- fix: Harden token protection with
secrecycrate and close exposure gaps by @anthonyshew in #11831 - fix: Clean up orphaned Windows child processes on shutdown by @anthonyshew in #11829
- chore: Update lockfile for release by @anthonyshew in #11840
- fix: Sync lockfile with @turbo/gen optionalDependencies by @anthonyshew in #11845
New Contributors
- @haydenbleasel made their first contribution in #11807
- @kyedavey made their first contribution in #11827
Full Changelog: vercel/turborepo@v2.8.7...v2.8.8
typescript-eslint/typescript-eslint (typescript-eslint)
v8.56.0
🚀 Features
- support ESLint v10 (#12057)
❤️ Thank You
- Brad Zacher @bradzacher
- Joshua Chen
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.
Changes
- Replaces
Object.prototype.toString.call()withinstanceofforisHTMLStringdetection - Reorders
renderChildtype 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
BufferedRendereronly when aPromiseis 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.
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.
Summary
Fixes #15575
- Preserve
astroContentImageFlagthrough the Vite resolution pipeline invite-plugin-content-assets.tsso downstream plugins can detect content collection images - Return plain
ImageMetadatafor content collection SVGs invite-plugin-assets.tsinstead of creating full Astro components (which importcreateComponentfrom the server runtime and cause a circular module dependency deadlock with TLA)
Root Cause
When SVG images are used in content collection image() fields:
content-assets.mjsimports them with?astroContentImageFlag- The content asset plugin stripped this flag during resolution
- The assets ESM plugin didn't know the SVG came from a content collection, so it called
makeSvgComponent()which imports fromruntime/server/index.js - 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 + SVGimage()field + TLA withgetCollection) - Existing
core-imagetests pass (100/100) - Existing
core-image-svgtests pass (11/11) - Existing
content-layertests pass (59/59)
🤖 Generated with Claude Code
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-langpattern 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 (wheresource.tsxis present from the interpolationcontentName) 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.astrotest fixture covering<script>in ternary and&&expressions - Added
style/expression.astrotest fixture covering<style>in ternary and&&expressions - Verified snapshots show correct
source.js/source.cssscoping for script/style content inside expressions
🤖 Generated with Claude Code
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):
- This was roughly the list of items my tooling identified: https://github.com/jsoref/astro/actions/runs/22241218963/attempts/1#summary-64345017746
- This is what my tooling thinks after the changes here:
https://github.com/jsoref/astro/actions/runs/22241219924/attempts/1#summary-64345020614
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.
Docs
- Make this a minor since its a new option.
- Add a code example
- Set the correct version number
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
buildfrom 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
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
b7dd447Thanks @qzio! - Adds a newsecurity.actionBodySizeLimitoption 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
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
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?
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
957b9feThanks @rururux! - Changes the default image service fromcompiletocloudflare-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
957b9feThanks @rururux! - Adds support for configuring the image service as an object with separatebuildandruntimeoptionsIt 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
imageServicedocs for more information about configuring your image service. -
#15556
8fb329bThanks @florian-lefebvre! - Adds support for more@cloudflare/vite-pluginoptionsThe adapter now accepts the following options from Cloudflare's Vite plugin:
auxiliaryWorkersconfigPathinspectorPortpersistStateremoteBindingsexperimental.headersAndRedirectsDevModeSupport
For example, you can now set
inspectorPortto 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
30cd6dbThanks @ematipico! - Fixes an issue where the use of theCodecomponent would result in an unexpected error. -
#15588
425ea16Thanks @rururux! - Fixes an issue whereesbuildwould throw a "Top-level return cannot be used inside an ECMAScript module" error during dependency scanning in certain environments. -
#15636
5ecd04cThanks @florian-lefebvre! - Adds an error when running on Stackblitz, sinceworkerddoesn't support it -
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.0
astro@6.0.0-beta.15
Minor Changes
-
#15471
32b4302Thanks @ematipico! - Adds a new experimental flagqueuedRenderingto enable a queue-based rendering engineThe 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.enabledset totrue, 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
contentCacheoption. 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
d43841dThanks @Princesseuh! - Adds a newexperimental.rustCompilerflag to opt into the experimental Rust-based Astro compilerThis 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-rspackage 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
30cd6dbThanks @ematipico! - Fixes an issue where the use of the Astro internal logger couldn't work with Cloudflare Vite plugin. -
#15562
e14a51dThanks @florian-lefebvre! - Removes types for theastro:ssr-manifestmodule, which was removed -
#15435
957b9feThanks @rururux! - Improves compatibility of the built-in image endpoint with runtimes that don't support CJS dependencies correctly -
#15640
4c1a801Thanks @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
f6473fdThanks @ascorbic! - Improves.astrocomponent 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
999a7ddThanks @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-facedeclarations from the<Font>component were removed and re-inserted on every client-side navigation, causing the browser to re-evaluate them. -
#15580
a92333cThanks @ematipico! - Fixes a build error when generating projects with a large number of static routes -
#15549
be1c87eThanks @0xRozier! - Fixes an issue where original (unoptimized) images from prerendered pages could be kept in the build output during SSR builds. -
#15565
30cd6dbThanks @ematipico! - Fixes an issue where the use of theCodecomponent would result in an unexpected error. -
#15585
98ea30cThanks @matthewp! - Add a default body size limit for server actions to prevent oversized requests from exhausting memory. -
#15565
30cd6dbThanks @ematipico! - Fixes an issue where the new Astro v6 development server didn't log anything when navigating the pages. -
#15591
1ed07bfThanks @renovate! - Upgradesdevalueto v5.6.3 -
#15633
9d293c2Thanks @jwoyo! - Fixes a case where<script>tags from components passed as slots to server islands were not included in the response -
#15586
35bc814Thanks @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
-
#15562
e14a51dThanks @florian-lefebvre! - Updates to new Adapter API introduced in v6 -
#15585
98ea30cThanks @matthewp! - Add a default body size limit for server actions to prevent oversized requests from exhausting memory.
@astrojs/preact@5.0.0-beta.4
Patch Changes
- #15619
bbfa7c8Thanks @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
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.
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,
returnstatements are now replaced withthrow. This logic is based on the implementation found invite-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
Changes
- Enforce remote image allowlists when inferring remote sizes and image endpoints
- Cherry-picked from e01e98b
Changes
- Add a default 1MB limit for action request bodies and enforce when Content-Length is missing
- Cherry-picked from 522f880
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
.htmlwhenbuild.format === 'file' - Updated the corresponding test to expect
.htmlextensions - Added changeset
Fixes #15526
Description
- Follow up to #3713
- Documents the use of code backticks to escape filenames like
__init__.pythat 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
This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| svelte (source) | 5.50.3 → 5.51.5 |
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
Patch Changes
-
fix: check to make sure
svelte:elementtags are valid during SSR (73098bb26c6f06e7fd1b0746d817d2c5ee90755f) -
fix: misc option escaping and backwards compatibility (#17741)
-
fix: strip event handlers during SSR (
a0c7f289156e9fafaeaf5ca14af6c06fe9b9eae5) -
fix: replace usage of
for inwithfor of Object.keys(f89c7ddd7eebaa1ef3cc540400bec2c9140b330c) -
fix: always escape option body in SSR (
f7c80da18c215e3727c2a611b0b8744cc6e504c5) -
chore: upgrade
devalue(#17739)
v5.51.4
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
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
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
Patch Changes
-
fix: don't crash on undefined
document.contentType(#17707) -
fix: use symbols for encapsulated event delegation (#17703)
v5.51.0
Minor Changes
- feat: Use
TrustedTypesfor HTML handling where supported (#16271)
Patch Changes
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.
Changes
Taken from the triage bot.
Closes #15578
Testing
Added a new test, which failed before the fix.
Docs
N/A
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 multipleset()calls within a request.lastModified(Date): When multipleset()calls providelastModified, 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 anX-Astro-Cacheheader (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-Cacheresponse header:HIT,MISS, orSTALE
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
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
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
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
522f880Thanks @matthewp! - Add a default body size limit for server actions to prevent oversized requests from exhausting memory. -
#15569
e01e98bThanks @matthewp! - Respect image allowlists when inferring remote image sizes and reject remote redirects.
@astrojs/node@9.5.4
Patch Changes
-
#15564
522f880Thanks @matthewp! - Add a default body size limit for server actions to prevent oversized requests from exhausting memory. -
#15572
ef851bfThanks @matthewp! - Upgrade astro package supportastro@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.
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
Changes
Closes #15558
Did some research and textContent is generally safer than innerText, so it's safe to use.
Testing
Added a test
Docs
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
main is currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, run changeset pre exit on main.
Releases
astro@6.0.0-beta.14
Patch Changes
-
#15573
d789452Thanks @matthewp! - Clear the route cache on content changes so slug pages reflect updated data during dev. -
#15560
170ed89Thanks @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
e959698Thanks @ematipico! - Fixes an issue where warnings would be logged during the build using one of the official adapters
Changes
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:
astro/packages/astro/src/vite-plugin-astro-server/route.ts
Lines 271 to 283 in f2955fb
| 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
- 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
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
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 tomatchPattern()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
httpswhenallowedDomainshas protocol + hostname - Rejects forwarded
httpwhen onlyhttpsis allowed - Accepts forwarded
httpswith 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.
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.
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
Pickinstead ofOmitto 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
globalThisto pass options toastro preview
Testing
Manual
Docs
- Changeset
- withastro/docs#13278
Changes
- Updates or adds jsdocs for
AstroAdapter, adapting from v6 docs
Testing
N/A
Docs
Changeset
Summary
Fixes #15503
- Delete original (unoptimized) images from prerendered pages in SSR builds instead of keeping them in the client
_astrodirectory - Track
referencedImagesin the prerender environment for server builds, so directly-referenced originals (e.g.,<img src={img.src}>) are preserved - Remove the
!env.isSSRguard that blocked all original image deletion in server mode —staticImagesonly 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
-
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
- What does this change?
- Be short and concise. Bullet points can help!
- Before/after screenshots can help as well.
- Don't forget a changeset! Run
pnpm changeset. - See https://contribute.docs.astro.build/docs-for-code-changes/changesets/ for more info on writing changesets.
Testing
Docs
Changes
- New: Add
proxiessupport to the triage workflow. Replaces manualGH_TOKENenv passing with a safergithubproxy from@flue/client/proxies. - Chore: Improve triage skills — add explicit
SCOPEinstructions to all sub-skills, promote git blame in verify skill, refine comment template formatting. - Chore: Improve AGENTS.md - add environment guide (prefer
node -eover python), addbgproc(by @ascorbic!) to help agents manage background dev servers. - Chore: Bump
@flue/clito 0.0.43 and@flue/clientto 0.0.27.
And two unrelated things:
- New: Add
analyze-github-action-logsskill 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.
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
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
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
createManifestwhich is something all of the tests need.
Docs
N/A, tests only
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
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
- #15451
84d6efdThanks @ematipico! - Changes how styles applied to code blocks are emitted to support CSP - (v6 upgrade guidance)
Minor Changes
-
#15529
a509941Thanks @florian-lefebvre! - Adds a new build-in font providernpmto access fonts installed as NPM packagesYou can now add web fonts specified in your
package.jsonthrough Astro's type-safe Fonts API. Thenpmfont provider allows you to add fonts either from locally installed packages innode_modulesor from a CDN.Set
fontProviders.npm()as your fonts provider along with the requirednameandcssVariablevalues, and addoptionsas 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
5b8f573Thanks @florian-lefebvre! - Adds a new optionalembeddedLangsprop to the<Code />component to support languages beyond the primarylangThis allows, for example, highlighting
.vuefiles 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
7be3308Thanks @florian-lefebvre! - Addsstreamingoption to thecreateApp()function in the Adapter API, mirroring the same functionality available when creating a newAppinstanceAn adapter's
createApp()function now acceptsstreaming(defaults totrue) 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: falsetocreateApp():import { createApp } from 'astro/app/entrypoint'; const app = createApp({ streaming: false });
See more about the
createApp()function in the Adapter API reference.
Patch Changes
-
#15542
9760404Thanks @rururux! - Improves rendering by preservinghidden="until-found"value in attribues -
#15550
58df907Thanks @florian-lefebvre! - Improves the JSDoc annotations for theAstroAdaptertype -
#15507
07f6610Thanks @matthewp! - Avoid bundling SSR renderers when only API endpoints are dynamic -
#15459
a4406b4Thanks @florian-lefebvre! - Fixes a case wherecontext.cspwas logging warnings in development that should be logged in production only -
Updated dependencies [
84d6efd]:- @astrojs/markdown-remark@7.0.0-beta.7
@astrojs/mdx@5.0.0-beta.8
Major Changes
- #15451
84d6efdThanks @ematipico! - Changes how styles applied to code blocks are emitted to support CSP - (v6 upgrade guidance)
Patch Changes
- Updated dependencies [
84d6efd]:- @astrojs/markdown-remark@7.0.0-beta.7
@astrojs/markdown-remark@7.0.0-beta.7
Major Changes
- #15451
84d6efdThanks @ematipico! - Changes how styles applied to code blocks are emitted to support CSP - (v6 upgrade guidance)
@astrojs/markdoc@1.0.0-beta.11
Patch Changes
- Updated dependencies [
84d6efd]:- @astrojs/markdown-remark@7.0.0-beta.7
This PR contains the following updates:
Release Notes
cloudflare/workers-sdk (@cloudflare/vite-plugin)
v1.25.0
Minor Changes
-
#12535
bd06ad2Thanks @edmundhung! - Set{ serverHandler: false }automatically when using@vitejs/plugin-rscBy default,
@vitejs/plugin-rscadds dev and preview server middleware that imports the RSC entry in Node.js. This fails withcloudflare:*imports (ERR_UNSUPPORTED_ESM_URL_SCHEME) and is unnecessary since the Cloudflare plugin handles requests via workerd. Users no longer need to passrsc({ serverHandler: false })manually.
Patch Changes
-
#12521
a8183dbThanks @edmundhung! - AvoidThe WebSocket is undefinederror when frameworks create a child Vite server during buildReact Router creates a child Vite dev server during production builds to compile route files. This could previously cause an intermittent
The WebSocket is undefinedassertion error. -
Updated dependencies [
ad817dd,b900c5a,f7fa326,734792a,7aaa2a5,cc5ac22,62a8d48,84252b7,e5efa5d,d06ad09,10a1c4a,be9745f,d7b492c,122791d,8809411,1a9eddd,41e18aa]:- wrangler@4.65.0
- miniflare@4.20260212.0
v1.24.0
Minor Changes
-
#12446
1231a2eThanks @jamesopstad! - Inferupload_source_mapssetting in the output Worker config from thebuild.sourcemapsetting in the Vite config.If build.sourcemap is enabled for a Worker environment, as in the following example,
"upload_source_maps": truewill now automatically be added to the outputwrangler.jsonfile.
This removes the need to additionally specify theupload_source_mapsproperty in the input Worker config.export default defineConfig({ environments: { my_worker: { build: { sourcemap: true, }, }, }, plugins: [cloudflare()], });
Note that if
upload_source_mapsis set in the input Worker config, this value will take precedence.
This makes it possible to generate source maps without uploading them.
Patch Changes
-
#12393
fd8b3e5Thanks @BlankParticle! - Provide proxy shared secret to Miniflare so that the Worker receives the original Host header -
Updated dependencies [
5d56487,2d90127,2acb277,c8dda16,e02b5f5,8ba1d11,555b32a,d636d6a,bf8df0c,e02b5f5,988dea9,1f1c3ce,62635a0,fd902aa,312b5eb,961705c,355c6da,bfd17cd,3388c84,ce9dc01,21ac7ab,937425c]:- wrangler@4.64.0
- miniflare@4.20260210.0
- @cloudflare/unenv-preset@2.12.1
v1.23.1
Patch Changes
-
#12381
98283faThanks @jamesopstad! - Avoid collectingnodejs_compatwarnings 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_compatflag 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
v4.20260212.0
v4.20260210.0
v4.20260207.0
v4.20260206.0
v4.20260205.0
netlify/primitives (@netlify/blobs)
v10.6.0
Features
Dependencies
- The following workspace dependencies were updated
- dependencies
- @netlify/runtime-utils bumped from 2.2.1 to 2.3.0
- dependencies
netlify/primitives (@netlify/vite-plugin)
v2.9.0
Features
Dependencies
- The following workspace dependencies were updated
- dependencies
- @netlify/dev bumped from 4.9.0 to 4.10.0
- dependencies
vercel/vercel (@vercel/functions)
v3.4.2
Patch Changes
- Updated dependencies [
3760ea1e97fdc45dae36c64138023e1b1a075467]:- @vercel/oidc@3.2.0
vercel/vercel (@vercel/routing-utils)
v5.3.3
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>/indexnamespace to prevent filesystem path leakage - Block
/_svcas 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
Minor Changes
-
#12473
b900c5aThanks @petebacondarwin! - Add CF_PAGES environment variables towrangler pages devwrangler pages devnow 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_PAGESis set to"1"to indicate the Pages environmentCF_PAGES_BRANCHdefaults to the current git branch (or"local"if not in a git repo)CF_PAGES_COMMIT_SHAdefaults to the current git commit SHA (or a placeholder if not in a git repo)CF_PAGES_URLis 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
10a1c4aThanks @petebacondarwin! - Allow deleting KV namespaces by nameYou 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-idand--bindingflags continue to work as before. -
#12382
d7b492cThanks @dario-piotrowicz! - Add Pages detection to autoconfig flowsWhen 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 setupand the programmatic autoconfig API, it throws a fatal error
- For
-
#12461
8809411Thanks @penalosa! - Supporttype: inheritbindings when using startWorker()This is an internal binding type that should not be used by external users of the API
-
#12515
1a9edddThanks @ascorbic! - Add--jsonflag towrangler whoamifor machine-readable outputwrangler whoami --jsonnow 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
ad817ddThanks @MattieTK! - fix: use project's package manager in wranger autoconfigwrangler setupnow correctly detects and uses the project's package manager based on lockfiles (pnpm-lock.yaml,yarn.lock,bun.lockb,package-lock.json) and thepackageManagerfield inpackage.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 theworkspace:protocol not being supported by npm.This change leverages the package manager detection already performed by
@netlify/build-infoduring framework detection, ensuring consistent behaviour across the autoconfig process. -
#12541
f7fa326Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260210.0 1.20260212.0 -
#12498
734792aThanks @dario-piotrowicz! - Fix: make sure that remote proxy sessions's logs can be silenced when the wrangler log level is set to "none" -
#12135
cc5ac22Thanks @edmundhung! - Fix spurious config diffs when bindings from local and remote config are shown in different orderWhen comparing local and remote Worker configurations, binding arrays like
kv_namespaceswould 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
62a8d48Thanks @MattieTK! - fix: use unscoped binary name for OpenNext autoconfig command overridesThe 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 causedwrangler deploy --x-autoconfigto fail for pnpm-based Next.js projects withERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL. Changed to use the unscoped binary nameopennextjs-cloudflare, which resolves correctly across all package managers. -
#12516
84252b7Thanks @edmundhung! - Stop proxying localhost requests when proxy environment variables are setWhen
HTTP_PROXYorHTTPS_PROXYis configured, all fetch requests including ones tolocalhostwere routed through the proxy. This causedwrangler devand the Vite plugin to fail with "TypeError: fetch failed" because the proxy can't reach local addresses.This switches from
ProxyAgentto undici'sEnvHttpProxyAgent, which supports theNO_PROXYenvironment variable. WhenNO_PROXYis not set, it defaults tolocalhost,127.0.0.1,::1so local requests are never proxied.The
NO_PROXYconfig 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
e5efa5dThanks @sesteves! - Fixwrangler r2 sql querydisplaying[object Object]for nested valuesSQL functions that return complex types such as arrays of objects (e.g.
approx_top_k) were rendered as[object Object]in the table output becauseString()was called directly on non-primitive values. These values are now serialized withJSON.stringifyso they display as readable JSON strings. -
#11725
be9745fThanks @dario-piotrowicz! - Fix incorrect logic during autoconfiguration (when runningwrangler setuporwrangler deploy --x-autoconfig) that caused parts of the project'spackage.jsonfile, removed during the process, to incorrectly be added back -
#12458
122791dThanks @jkoe-cf! - Remove default values for delivery delay and message retention and update messaging on limitsFixes 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
1209600seconds 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
1209600seconds 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
41e18aaThanks @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
--strictflag 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
Minor Changes
-
#12433
2acb277Thanks @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
e02b5f5Thanks @dario-piotrowicz! - Improve autoconfig telemetry with granular event trackingAdds 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
8ba1d11Thanks @petebacondarwin! - Addwrangler pages deployment deletecommand to delete Pages deployments via CLIYou 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
e02b5f5Thanks @dario-piotrowicz! - Include all common telemetry properties in ad-hoc telemetry eventsPreviously, only command-based telemetry events (e.g., "wrangler command started/completed") included the full set of common properties. Ad-hoc events sent via
sendAdhocEventwere missing important context like OS information, CI detection, and session tracking.Now, all telemetry events include the complete set of common properties:
amplitude_session_idandamplitude_event_idfor session trackingwranglerVersion(and major/minor/patch variants)osPlatform,osVersion,nodeVersionpackageManagerconfigFileTypeisCI,isPagesCI,isWorkersCIisInteractiveisFirstUsagehasAssetsagent
-
#12479
fd902aaThanks @dario-piotrowicz! - Add framework selection prompt during autoconfigWhen 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
961705cThanks @petebacondarwin! - Add--jsonflag towrangler pages project listcommandYou can now use the
--jsonflag 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
21ac7abThanks @petebacondarwin! - AddWRANGLER_COMMANDenvironment variable to custom build commandsWhen using a custom build command in
wrangler.toml, you can now detect whetherwrangler devorwrangler deploytriggered the build by reading theWRANGLER_COMMANDenvironment 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
5d56487Thanks @petebacondarwin! - Add debug logs for git branch detection inwrangler pages deploycommandWhen 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=debugwill 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
c8dda16Thanks @dario-piotrowicz! - fix: Throw a descriptive error when autoconfig cannot detect an output directoryWhen running
wrangler setuporwrangler deploy --x-autoconfigon 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
555b32aThanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260205.0 1.20260206.0 -
#12485
d636d6aThanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260206.0 1.20260207.0 -
#12502
bf8df0cThanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260207.0 1.20260210.0 -
#12280
988dea9Thanks @penalosa! - Fixwrangler initfailing with Yarn ClassicWhen using Yarn Classic (v1.x), running
wrangler initorwrangler init --from-dashwould fail because Yarn Classic doesn't properly handle version specifiers with special characters like^inyarn createcommands. 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.0instead 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
1f1c3ceThanks @vicb! - Bump esbuild to 0.27.3This update includes several bug fixes from esbuild versions 0.27.1 through 0.27.3. See the esbuild changelog for details.
-
#12472
62635a0Thanks @petebacondarwin! - Improve D1 database limit error message to match Cloudflare dashboardWhen 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
355c6daThanks @jbwcloudflare! - Fixwrangler pages deployto respect increased file count limits -
#12449
bfd17cdThanks @penalosa! - fix: Display unsafe metadata separately from bindingsUnsafe 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 MetadataAfter:
The following unsafe metadata will be attached to your Worker: { "extra_data": "interesting value", "more_data": "dubious value" } -
#12463
3388c84Thanks @petebacondarwin! - Add User-Agent header to remote dev inspector WebSocket connectionsWhen running
wrangler dev --remote, the inspector WebSocket connection now includes aUser-Agentheader (wrangler/<version>). This resolves issues where WAF rules blocking empty User-Agent headers prevented remote dev mode from working with custom domains. -
#12421
937425cThanks @ryanking13! - Fix Python Workers deployment failing on Windows due to path separator handlingPreviously, 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]:- miniflare@4.20260210.0
- @cloudflare/unenv-preset@2.12.1
v4.63.0
Minor Changes
-
#12386
447daa3Thanks @NuroDev! - Added new "open local explorer" hotkey for experimental/WIP local resource explorerWhen running
wrangler devwith the experimental local explorer feature enabled, you can now press theehotkey to open the local resource explorer UI in your browser.
Patch Changes
-
#11350
ee9b81fThanks @dario-piotrowicz! - fix: improve error message when the entrypoint is incorrectError 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
63f1adbThanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260131.0 1.20260203.0 -
#12418
ba13de9Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To workerd 1.20260203.0 1.20260205.0 -
#12216
fe3af35Thanks @ichernetsky-cf! - Deprecate 'wrangler cloudchamber apply' in favor of 'wrangler deploy' -
#12368
bd4bb98Thanks @KianNH! - Preserve Containers configuration when usingversionscommandsPreviously, commands like
wrangler versions uploadwould inadvertently disable Containers on associated Durable Object namespaces because thecontainersproperty was being omitted from the API request body. -
#12396
dab4bc9Thanks @petebacondarwin! - fix: redact email addresses and account names in non-interactive modeTo 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
18c0784Thanks @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.
This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| @astrojs/compiler (source) | ^2.13.0 → ^2.13.1 |
||
| ovsx (source) | ^0.10.8 → ^0.10.9 |
||
| semver | ^7.7.3 → ^7.7.4 |
||
| svelte (source) | ^5.49.1 → ^5.50.3 |
Release Notes
eclipse/openvsx (ovsx)
v0.10.9
Fixes
- Support custom registry url including a subpath (#1542)
Changes
- Move
ovsxscript tobindirectory (#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.
Changes
- Deprecates
NodeAppin favor ofApp+ utilities:createRequest()andwriteResponse() - Deprecates
loadManifest()andloadApp(). These are unused and were forgotten - Reorganizes the
app/*related entrypoints to make clearer what is exported, and have more control (allowed to spotloadManifest(),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
- Changesets
- withastro/docs#13271
- fixes bad lockfile introduced by #15480
This PR contains the following updates:
Release Notes
preactjs/signals (@preact/signals)
v2.7.1
Patch Changes
- #870
c8636faThanks @JoviDeCroock! - Prevent scheduled effects from highjacking the execution-context
v2.7.0
Minor Changes
-
#861
5794b04Thanks @andrewiggins! - AdduseModelhook for using Models in componentsThe new
useModelhook provides a convenient way to use Models (created withcreateModel) 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 "@​preact/signals-core"; import { useModel } from "@​preact/signals-react"; // or "@​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
-
#865
4872968Thanks @JoviDeCroock! - Revert #728 - this might entail work in prefresh but currently the presence ofuesStatemakes every sCU bail -
Updated dependencies [
19ac39b]:- @preact/signals-core@1.13.0
csstools/postcss-plugins (postcss-preset-env)
v11.1.3
February 6, 2026
- Updated
@csstools/postcss-text-decoration-shorthandto5.0.2(patch)
nodejs/undici (undici)
v7.21.0
What's Changed
- build(deps): bump actions/setup-node from 6.0.0 to 6.2.0 by @dependabot[bot] in #4796
- test: restore global dispatcher after fetch tests by @mcollina in #4790
- Add missing
closemethod to WebSocketStream interface by @piotr-cz in #4802 - fix: error stream instead of canceling by @KhafraDev in #4804
- Fix clientTtl cleanup race in Agent by @mcollina in #4807
- feat(#4230): Implement pingInterval for dispatching PING frames by @metcoder95 in #4296
- fix: handle undefined __filename in bundled environments by @mcollina in #4812
- fix: set finalizer only for fetch responses by @tsctx in #4803
New Contributors
- @piotr-cz made their first contribution in #4802
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.
This PR contains the following updates:
Release Notes
vitejs/vite-plugin-react (@vitejs/plugin-react)
v5.1.4
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
Patch Changes
-
fix: take into account
nodeNamecase sensitivity on XHTML pages (#17689) -
fix: render
multipleandselectedattributes 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
$effecterrors to<svelte:boundary>(#17684)
v5.50.2
Patch Changes
-
fix: resolve
effect_update_depth_exceededwhen usingbind:valueon<select>with derived state in legacy mode (#17645) -
fix: don't swallow
DOMExceptionwhenmedia.play()fails inbind:paused(#17656) -
chore: provide proper public type for
parseCssresult (#17654) -
fix: robustify blocker calculation (#17676)
-
fix: reduce if block nesting (#17662)
v5.50.1
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
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
@seeand@linktags (#17617) -
fix: properly hydrate already-resolved async blocks (#17641)
-
fix: emit
each_key_duplicateerror in production (#16724) -
fix: exit resolved async blocks on correct node when hydrating (#17640)
v5.49.2
Patch Changes
Configuration
📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
Changes
- unifont added a npm provider a few days ago, this adds support for it (unjs/unifont#322)
Testing
Updated
Docs
- Changeset
- withastro/docs#13270
This PR contains the following updates:
| Package | Change | Age | Confidence | Type | Update | Pending |
|---|---|---|---|---|---|---|
| @astrojs/rss (source) | ^4.0.15-beta.3 → ^4.0.15 |
dependencies | patch | |||
| @astrojs/sitemap (source) | ^3.6.1-beta.3 → ^3.7.0 |
dependencies | minor | |||
| @codspeed/vitest-plugin (source) | 5.1.0 → 5.2.0 |
devDependencies | minor | |||
| @playwright/test (source) | 1.58.1 → 1.58.2 |
devDependencies | patch | |||
| @preact/signals (source) | ^2.7.0 → ^2.7.1 |
dependencies | patch | 2.8.0 |
||
| @types/prismjs (source) | 1.26.5 → 1.26.6 |
devDependencies | patch | |||
| fast-xml-parser | ^5.3.4 → ^5.3.5 |
dependencies | patch | 5.3.6 |
||
| node (source) | 24.13.0 → 24.13.1 |
patch | ||||
| node | 24.13.0-bullseye → 24.13.1-bullseye |
final | patch | |||
| node | 24-bookworm-slim → 24.13.1-bookworm-slim |
final | minor | |||
| pnpm (source) | 10.28.2 → 10.29.3 |
packageManager | minor | |||
| svelte (source) | ^5.49.2 → ^5.50.3 |
dependencies | patch | 5.51.2 (+2) |
||
| turbo (source) | ^2.8.3 → ^2.8.7 |
devDependencies | patch | 2.8.9 (+1) |
||
| typescript-eslint (source) | ^8.54.0 → ^8.55.0 |
devDependencies | minor | |||
| valibot (source) | ^1.0.0 → ^1.2.0 |
devDependencies | patch | |||
| vue (source) | ^3.5.27 → ^3.5.28 |
dependencies | patch |
Release Notes
withastro/astro (@astrojs/rss)
v4.0.15
Patch Changes
- #15199
d8e64efThanks @ArmandPhilippot! - Fixes the links to Astro Docs so that they match the current docs structure.
withastro/astro (@astrojs/sitemap)
v3.7.0
Minor Changes
-
#14471
4296373Thanks @Slackluky! - Adds the ability to split sitemap generation into chunks based on customizable logic. This allows for better management of large sitemaps and improved performance. The newchunksoption in the sitemap configuration allows users to define functions that categorize sitemap items into different chunks. Each chunk is then written to a separate sitemap file.integrations: [ sitemap({ serialize(item) { th return item }, chunks: { // this property will be treated last on the configuration 'blog': (item) => { // will produce a sitemap file with `blog` name (sitemap-blog-0.xml) if (/blog/.test(item.url)) { // filter path that will be included in this specific sitemap file item.changefreq = 'weekly'; item.lastmod = new Date(); item.priority = 0.9; // define specific properties for this filtered path return item; } }, 'glossary': (item) => { if (/glossary/.test(item.url)) { item.changefreq = 'weekly'; item.lastmod = new Date(); item.priority = 0.7; return item; } } // the rest of the path will be stored in `sitemap-pages.0.xml` }, }), ],
v3.6.1
Patch Changes
- #15033
dd06779Thanks @florian-lefebvre! - Updates how routes are retrieved to avoid relying on a deprecated API
CodSpeedHQ/codspeed-node (@codspeed/vitest-plugin)
v5.2.0
🎉 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
- feat: add memory profiling support by @not-matthias in #70
Full Changelog: CodSpeedHQ/codspeed-node@v5.1.0...v5.2.0
preactjs/signals (@preact/signals)
v2.7.1
Patch Changes
- #870
c8636faThanks @JoviDeCroock! - Prevent scheduled effects from highjacking the execution-context
pnpm/pnpm (pnpm)
v10.29.3
v10.29.2
v10.29.1: pnpm 10.29.1
Minor Changes
- The
pnpm dlx/pnpxcommand now supports thecatalog:protocol. Example:pnpm dlx shx@catalog:. - Support configuring
auditLevelin thepnpm-workspace.yamlfile #10540. - Support bare
workspace:protocol without version specifier. It is now treated asworkspace:*and resolves to the concrete version during publish #10436.
Patch Changes
-
Fixed
pnpm list --jsonreturning incorrect paths when using global virtual store #10187. -
Fix
pnpm store pathandpnpm store statususing workspace root for path resolution whenstoreDiris relative #10290. -
Fixed
pnpm run -rfailing with "No projects matched the filters" when an emptypnpm-workspace.yamlexists #10497. -
Fixed a bug where
catalogMode: strictwould write the literal string"catalog:"topnpm-workspace.yamlinstead of the resolved version specifier when re-adding an existing catalog dependency #10176. -
Fixed the documentation URL shown in
pnpm completion --helpto point to the correct page at https://pnpm.io/completion #10281. -
Skip local
file:protocol dependencies duringpnpm fetch. This fixes an issue wherepnpm fetchwould fail in Docker builds when local directory dependencies were not available #10460. -
Fixed
pnpm audit --jsonto respect the--audit-levelsetting 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 --fixreplacing reference overrides (e.g.$foo) with concrete versions #10325. -
Fix
shamefullyHoistset viaupdateConfigin.pnpmfile.cjsnot being converted topublicHoistPattern#10271. -
pnpm helpshould 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 likepnpm exec#10457.
Platinum Sponsors
|
|
Gold Sponsors
|
|
|
|
|
|
|
sveltejs/svelte (svelte)
v5.50.3
Patch Changes
-
fix: take into account
nodeNamecase sensitivity on XHTML pages (#17689) -
fix: render
multipleandselectedattributes 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
$effecterrors to<svelte:boundary>(#17684)
v5.50.2
Patch Changes
-
fix: resolve
effect_update_depth_exceededwhen usingbind:valueon<select>with derived state in legacy mode (#17645) -
fix: don't swallow
DOMExceptionwhenmedia.play()fails inbind:paused(#17656) -
chore: provide proper public type for
parseCssresult (#17654) -
fix: robustify blocker calculation (#17676)
-
fix: reduce if block nesting (#17662)
v5.50.1
Patch Changes
vercel/turborepo (turbo)
v2.8.7: Turborepo v2.8.7
What's Changed
Changelog
- fix: Keep stdin alive for persistent tasks in stream mode by @anthonyshew in #11793
- feat: Add internal agents app for repo automation by @anthonyshew in #11799
- chore: Add env vars by @anthonyshew in #11800
- fix: Handle subpath package imports in
turbo boundariesby @anthonyshew in #11798 - feat: Add dashboard with run tracking and live logs for agent sandboxes by @anthonyshew in #11802
- fix: Normalize bare LF to CRLF in TUI output to prevent garbled logs by @anthonyshew in #11804
Full Changelog: vercel/turborepo@v2.8.6...v2.8.7
v2.8.6: Turborepo v2.8.6
What's Changed
Changelog
- chore: Add internal agents app for repo automation by @anthonyshew in #11781
- feat: Add internal agents app for repo automation by @anthonyshew in #11783
- chore: Manual audits by @anthonyshew in #11785
- chore: Fixing audit agent by @anthonyshew in #11786
- chore: Still iterating on sec audit fixer by @anthonyshew in #11787
- fix: Emit space for empty vt100 cells to fix TUI repaint on task switch by @anthonyshew in #11789
Full Changelog: vercel/turborepo@v2.8.5...v2.8.6
v2.8.5: Turborepo v2.8.5
What's Changed
@turbo/codemod
- fix: Upgrade tsdown to fix valibot and diff vulnerabilities by @anthonyshew in #11766
- fix: Upgrade semver to fix ReDoS vulnerability by @anthonyshew in #11765
@turbo/repository
- fix: Rename cli workspace package to avoid false audit match by @anthonyshew in #11767
Changelog
- fix: Add Vary: Accept header to docs markdown endpoint by @molebox in #11759
- chore: Agentic workflows app by @anthonyshew in #11773
- chore: Add internal agents app for repo automation by @anthonyshew in #11776
- chore: Update reproduction request message by @anthonyshew in #11778
- Revert "fix: Upgrade node-plop to 0.32.3" by @anthonyshew in #11780
Full Changelog: vercel/turborepo@v2.8.4...v2.8.5
v2.8.4: Turborepo v2.8.4
What's Changed
create-turbo
- fix: Upgrade semver to fix ReDoS vulnerability by @anthonyshew in #11683
- fix: Upgrade inquirer to remove lodash dependency by @anthonyshew in #11709
- fix: Upgrade tsdown in create-turbo to resolve valibot ReDoS vulnerability by @anthonyshew in #11702
- fix: Upgrade jest to v30 to resolve brace-expansion ReDoS vulnerability by @anthonyshew in #11706
eslint
- fix: Upgrade Next.js to 16.1.5 to fix DoS vulnerabilities by @anthonyshew in #11681
- fix: Upgrade eslint to v10 to resolve @eslint/plugin-kit ReDoS vulnerability by @anthonyshew in #11705
Examples
Changelog
- fix: Upgrade tar to 7.5.7 to address security vulnerabilities by @anthonyshew in #11680
- fix: Upgrade ts-json-schema-generator to fix glob command injection vulnerability by @anthonyshew in #11684
- fix: Upgrade fumadocs and shiki in docs to resolve mdast-util-to-hast vulnerability by @anthonyshew in #11704
- fix: Replace ts-node with tsx to resolve diff DoS vulnerability by @anthonyshew in #11708
- fix: Upgrade bytes to >=1.11.1 to fix RUSTSEC-2026-0007 by @anthonyshew in #11715
- chore: Update ratatui dependencies (paste blocked upstream) by @anthonyshew in #11717
- Revert "chore: Update ratatui dependencies (paste blocked upstream)" by @anthonyshew in #11722
- fix: Upgrade ratatui to 0.30.0 to drop unmaintained paste crate by @anthonyshew in #11723
- chore: Upgrade reqwest toward addressing RUSTSEC-2025-0134 by @anthonyshew in #11718
- fix(docs): Fix code syntax highlighting by using correct Shiki CSS variable names by @anthonyshew in #11726
- fix: Upgrade async-io to 2.x to drop unmaintained instant crate by @anthonyshew in #11719
- fix: Migrate from unmaintained serde_yaml to serde_yml by @anthonyshew in #11720
- fix: Upgrade test-case and merge to drop unmaintained proc-macro-error by @anthonyshew in #11721
- fix: Upgrade indicatif to 0.18.3 to drop unmaintained number_prefix by @anthonyshew in #11716
- refactor: Centralize configuration resolution funnel by @anthonyshew in #11727
- fix: Upgrade rustls chain to resolve RUSTSEC-2025-0134 by @anthonyshew in #11739
- fix: Upgrade test-case to resolve transitive proc-macro-error by @anthonyshew in #11737
- fix: Upgrade pest/pest_derive to resolve yanked version by @anthonyshew in #11734
- fix: Upgrade git2 to fix RUSTSEC-2026-0008 by @anthonyshew in #11729
- fix: Upgrade pprof to fix RUSTSEC-2024-0408 by @anthonyshew in #11730
- fix: Upgrade portable-pty to resolve RUSTSEC-2017-0008 by @anthonyshew in #11732
- fix: Upgrade oxc_resolver to resolve yanked papaya dependency by @anthonyshew in #11733
- fix: Upgrade futures/futures-util to resolve yanked futures-util 0.3.30 by @anthonyshew in #11735
- fix: Replace unic-segment with unicode-segmentation in globwatch by @anthonyshew in #11736
- fix: Replace
serde_ymlwithserde_yaml_ngto fix RUSTSEC-2025-0067/0068 by @anthonyshew in #11755 - fix: Replace
oxc_resolverwithunrs_resolverto fix yankedpapayadependency by @anthonyshew in #11754 - fix: Upgrade node-plop to 0.32.3 by @anthonyshew in #11756
- docs: Capitalizaiton in update github-actions.mdx by @anthonyshew in #11762
Full Changelog: vercel/turborepo@v2.8.3...v2.8.4
typescript-eslint/typescript-eslint (typescript-eslint)
v8.55.0
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
Bug Fixes
- transition: avoid unexpected
cancelledparameter in transitiondonecallback (#14391) (6798853) - compiler-sfc: add resolution trying for
.mts/.ctsfiles (#14402) (c09d41f), closes vuejs/router#2611 - compiler-sfc: no params were generated when using withDefaults (#12823) (b0a1f05), closes #12822
- reactivity: add
__v_skipflag toEffectScopeto prevent reactive conversion (#14359) (48b7552), closes #14357 - runtime-core: avoid retaining el on cached text vnodes during static traversal (#14419) (4ace79a), closes #14134
- runtime-core: prevent child component updates when style remains unchanged (#12825) (57866b5), closes #12826
- runtime-core: properly handle async component update before resolve (#11619) (e71c26c), closes #11617
- runtime-dom: handle null/undefined handler in withModifiers (#14362) (261de54), closes #14361
- teleport: properly handling disabled teleport target anchor (#14417) (d7bcd85), closes #14412
- transition-group: correct move translation under scale via element rect (#14360) (0243a79), closes #14356
- useTemplateRef: don't update setup ref for useTemplateRef key (#12756) (fc40ca0), closes #12749
Configuration
📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
Changes
- Fix: Labeling. Refactor selectTriageLabels to use exact labels instead of inferring from comment body
- Fix: Use
git diff maininstead ofgit statusto 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.18but 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-lockfileflag 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
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 testtoo 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.mdfile, 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-astroversions 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
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.
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.
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
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:
- Inline
<style>elements -- matched by comparingtextContent. If the exact same style content exists in both the old and new head, the existing node is kept in place. - Font preload links (
<link rel="preload" as="font">) -- matched byhref, 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.
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
verifystep 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.
Summary
- add a Router abstraction with unit tests covering routing priority and base/trailingSlash behavior
- refactor route manifest creation to accept in-memory entries for unit testing
- migrate routing integration tests to routing unit suites and remove user-route-priority fixture
- Added a README.md to document the public APIs. That's the best way to see how the new router is used.
Testing
- Bunch of new tests + migrating off of fixtures (likely more to still do.
Changes
- wait to bind shortcuts until the server is actually ready, like vite's cli does
- means stuff like
owill 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?
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.
Changes
- Test commands were wrong, those commands don't even work.
- Clarifies how to run with
pnpmand the different ways to run individual tests.
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.
- Closes #15464.
Testing
- New test added that edits a markdown file and then reloads the page.
Docs
- N/A, bug fix.
Summary
- tighten the TextMate grammar so only exact
style/scripttags 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
Changes
Refactor edgeMiddleware option into a more generic middlewareMode, creating space for future options.
- Deprecate
edgeMiddlewarein core and all adapters - Create new Adapter Feature called
middlewareMode - Implement and expose the option in the included adapters.
- Automatically map
edgeMiddlewaretomiddlewareMode: edgefor backwards compatibility - Add
middlewareModeto 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
/cc @withastro/maintainers-docs for feedback!
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
Changes
- Adds
needs reprolabel if reproduction was not possible - Adds
p*andpkg:*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.
Changes
- prevent boolean
server.allowedHostsfrom being merged into an array - fixes #15472
Testing
- add a unit test covering boolean
allowedHostsmergesnode packages/astro/test/units/config/config-merge.test.js
Docs
- N/A bug fix
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.
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
RegExpobject 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
Changes
- Improves the new adapter API by allowing to pass
streamingtocreateApp(), matchingApp
Testing
N/A
Docs
- Changeset
- withastro/docs#13273
Changes
Skips language tools CI tests if language tools or related files didn’t change
Testing
Hah
Docs
N/A
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
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
dfe2e22Thanks @florian-lefebvre! - DeprecatesloadManifest()andloadApp()fromastro/app/node(Adapter API) - (v6 upgrade guidance) -
#15461
9f21b24Thanks @florian-lefebvre! - BREAKING CHANGE to the v6 beta Adapter API only: renamesentryTypetoentrypointResolutionand updates possible valuesAstro 6 introduced a way to let adapters have more control over the entrypoint by passing
entryType: 'self'tosetAdapter(). However during beta development, the name was unclear and confusing.entryTypeis now renamed toentrypointResolutionand its possible values are updated:legacy-dynamicbecomesexplicit.selfbecomesauto.
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
9f21b24Thanks @florian-lefebvre! - DeprecatescreateExports()andstart()(Adapter API) - (v6 upgrade guidance) -
#15535
dfe2e22Thanks @florian-lefebvre! - DeprecatesNodeAppfromastro/app/node(Adapter API) - (v6 upgrade guidance) -
#15407
aedbbd8Thanks @ematipico! - Changes how styles of responsive images are emitted - (v6 upgrade guidance)
Minor Changes
-
#15535
dfe2e22Thanks @florian-lefebvre! - Exports newcreateRequest()andwriteResponse()utilities fromastro/app/nodeTo replace the deprecated
NodeApp.createRequest()andNodeApp.writeResponse()methods, theastro/app/nodemodule now exposes newcreateRequest()andwriteResponse()utilities. These can be used to convert a NodeJSIncomingMessageinto a web-standardRequestand stream a web-standardResponseinto a NodeJSServerResponse: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
aedbbd8Thanks @ematipico! - Adds support for responsive images whensecurity.cspis 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=""anddata-*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
-
#15508
2c6484aThanks @KTibow! - Fixes behavior when shortcuts are used before server is ready -
#15497
a93c81dThanks @matthewp! - Fix dev reloads for content collection Markdown updates under Vite 7. -
#15535
dfe2e22Thanks @florian-lefebvre! - Fixes the types ofcreateApp()exported fromastro/app/entrypoint -
#15491
6c60b05Thanks @matthewp! - Fixes a case where settingvite.server.allowedHosts: truewas turned into an invalid array
@astrojs/cloudflare@13.0.0-beta.8
Major Changes
-
#15480
e118214Thanks @alexanderniebuhr! - Drops official support for Cloudflare Pages in favor of Cloudflare WorkersThe 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
ee519e5Thanks @matthewp! - Fixes fully static sites to not output server-side worker code. When all routes are prerendered, the_worker.jsdirectory 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
6e8da44Thanks @AhmadYasser1! - Fixes custom attributes on Markdoc's built-in{% table %}tag causing "Invalid attribute" validation errors.In Markdoc,
tableexists as both a tag ({% table %}) and a node (the inner table structure). When users defined custom attributes on eithernodes.tableortags.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
-
#15461
9f21b24Thanks @florian-lefebvre! - Updates to new Adapter API introduced in v6 -
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.0
@astrojs/vercel@10.0.0-beta.5
Patch Changes
- #15461
9f21b24Thanks @florian-lefebvre! - Updates to new Adapter API introduced in v6
astro-vscode@2.16.9-beta.0
Patch Changes
Changes
- This PR drops official Cloudflare Pages support from the adapter fully
Background
- Cloudflare itself suggest to Migrate https://developers.cloudflare.com/workers/static-assets/migration-guides/migrate-from-pages/
- Workers has more support of upcoming features https://developers.cloudflare.com/workers/static-assets/migration-guides/migrate-from-pages/#compatibility-matrix
- Other frameworks did the same
- Cloudflare's own vite plugin, which we heavily use right now, does not support Pages.
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.ymlfile. - switched from
pnpm i -gtonpm i -gforagent-browserin the CI workflow.pnpm i -gdoesn't run build scripts, which agent-browser needs to function properly. Currently broken I think until this merges. - version updates
- workflow wording improvements
Changes
- Fully static Cloudflare sites no longer output unnecessary
_worker.jsdirectory - Detects fully static sites by checking if all non-internal routes are prerendered in
astro:routes:resolved - Removes
_worker.jsdirectory inastro:build:donefor static sites - Changes
staticOutputadapter support from'unsupported'to'stable'
Testing
- Added new test fixture
packages/integrations/cloudflare/test/fixtures/static/with a fully static site - Added
static.test.jsthat verifies_worker.jsdirectory 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.
Changes
- Updates and simplifies a test that was flaky
- Example failing run of the old test: https://github.com/withastro/astro/actions/runs/21918847401/job/63293530577?pr=15475#step:8:5262
Testing
- Yup
Docs
N/A
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
- No user facing code, mostly CI stuff. But has had extensive testing over the last few days/weeks, including some real-world data seen here: https://github.com/FredKSchott/astro/issues
Docs
- No user facing code, mostly CI stuff. If anything is confusing to maintainers please let me know and I can keep improving!
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.
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
@astrojs/node@9.5.3
Patch Changes
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
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
Description
- Uses exports wildcards in package.json to improve maintenance
- Required moving non exported things to another non nested directory. I chose
components-internalsbut it could be anywhere else really
Changes
- Renames
entryTypetoentrypointResolution - Renames
legacy-dynamictoexplicit - Renames
selftoauto - Deprecates
entrypointResolution: 'explicit'
Testing
Updated
Docs
- Changesets
- withastro/docs#13253
- Warning on default (T&D feedback)
Changes
- Updates the new adapter API to support passing
serverEntrypointinstead ofrollupOptions.inputfor simpler cases
Testing
Tests added
Docs
- Changeset
- withastro/docs#13246
Changes
- I recently updated
context.cspto 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
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
- #15180
8780ff2Thanks @Princesseuh! - Adds support for converting SVGs to raster images (PNGs, WebP, etc) to the default Sharp image service - (v6 upgrade guidance)
Minor Changes
-
#15460
ee7e53fThanks @florian-lefebvre! - Updates the Adapter API to allow providing aserverEntrypointwhen usingentryType: 'self'Astro 6 introduced a new powerful yet simple Adapter API for defining custom server entrypoints. You can now call
setAdapter()with theentryType: 'self'option and specify your customserverEntrypoint: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
serverEntrypointand instead specify your custom server entrypoint withvite.build.rollupOptions.input.
Patch Changes
-
#15454
b47a4e1Thanks @Fryuni! - Fixes a race condition in the content layer which could result in dropped content collection entries. -
#15450
50c9129Thanks @florian-lefebvre! - Fixes a case wherebuild.serverEntrywould not be respected when using the new Adapter API -
#15473
d653b86Thanks @matthewp! - Improves Host header handling for SSR deployments behind proxies
@astrojs/cloudflare@13.0.0-beta.7
Patch Changes
-
#15452
e1aa3f3Thanks @matthewp! - Fixes server-side dependencies not being discovered ahead of time during developmentPreviously, imports in
.astrofile 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
50c9129Thanks @florian-lefebvre! - Fixes a case wherebuild.serverEntrywould 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
36fc0e0Thanks @delucis! - Fixes edge cases where anexport const components = {...}declaration would fail to be detected with theoptimizeoption enabled
@astrojs/netlify@7.0.0-beta.9
Patch Changes
-
#15460
ee7e53fThanks @florian-lefebvre! - Updates to use the new Adapter API -
#15450
50c9129Thanks @florian-lefebvre! - Fixes a case wherebuild.serverEntrywould not be respected when using the new Adapter API -
Updated dependencies []:
- @astrojs/underscore-redirects@1.0.0
@astrojs/node@10.0.0-beta.4
Patch Changes
- #15473
d653b86Thanks @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
-
#15460
ee7e53fThanks @florian-lefebvre! - Updates to use the new Adapter API -
#15450
50c9129Thanks @florian-lefebvre! - Fixes a case wherebuild.serverEntrywould not be respected when using the new Adapter API
Changes
- Adds
syncTagNodeAttributes()topackages/integrations/markdoc/src/runtime.tsthat runs after config setup - In Markdoc,
tableexists 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 forMarkdoc.validate()to pass - When users configure custom attributes on
nodes.tableortags.table, this function syncs the attribute declarations to the counterpart, preventing "Invalid attribute" validation errors - Only runs for names that exist in both
Markdoc.tagsandMarkdoc.nodes(currently onlytable)
Testing
- Added
test/render-table-attrs.test.jswith build + dev tests using a fixture that configuresnodes.tablewith a custombackgroundattribute - 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
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 toheadElements()for pages with hydrated componentspackages/astro/src/core/render-context.ts— Detect if pipeline already added island styles, set metadata flagpackages/astro/src/runtime/server/scripts.ts— Skip inline<style>when island styles are already in head; keep inline fallback for dev/SSRpackages/astro/src/types/public/internal.ts— AddislandStylesInHeadtoSSRMetadatapackages/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.
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.
- Fixes #15453
Testing
There is a new unit test reproducing the scenario and validating the correct behavior.
Docs
No change is needed in docs.
Changes
- Adds an esbuild plugin that extracts frontmatter from
.astrofiles during Vite's dependency optimization scan phase - This allows server-side imports in
.astrofrontmatter 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:
- Starts a dev server
- Clears the Vite cache
- Makes a request to a page that imports a third-party dependency (
ms) in frontmatter - Verifies no "new dependencies optimized" log message appears
Docs
N/A, bug fix
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.
Changes
- Addresses https://github.com/orgs/withastro/projects/21/views/1?pane=issue&itemId=154972939
- Fixes a case where
serverEntrywouldn't work when passing input like@astrojs/netlify/server.jsto rollup
Testing
Should pass
Docs
Changeset
Changes
- What does this change?
- Be short and concise. Bullet points can help!
- Before/after screenshots can help as well.
- Don't forget a changeset! Run
pnpm changeset. - See https://contribute.docs.astro.build/docs-for-code-changes/changesets/ for more info on writing changesets.
Testing
Docs
Closes #14464
Changes
Fixes Astro.rewrite returning 404 when rewriting to a URL with non-ASCII characters (e.g., /redirected/héllo).
- In
findRouteToRewrite, thedistURLhref comparison now uses the encodedpathnameinstead ofdecodedPathname, sinceurl.hrefvalues are always percent-encoded - Added a dynamic route fixture with non-ASCII characters (
/redirected/[slug]withhélloparam)
Testing
Added tests for all three modes:
- Dev: fetching
/redirected/h%C3%A9llorenders the index page - Build (SSG):
/redirected/héllo/index.htmlis generated correctly - SSR: request to
/redirected/h%C3%A9llorenders 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.
This PR contains the following updates:
| Package | Change | Age | Confidence | Type | Update | Pending |
|---|---|---|---|---|---|---|
| @astrojs/rss (source) | ^4.0.15-beta.3 → ^4.0.15 |
dependencies | patch | |||
| @astrojs/sitemap (source) | ^3.6.1-beta.3 → ^3.7.0 |
dependencies | minor | |||
| @preact/signals (source) | ^2.6.2 → ^2.7.0 |
dependencies | minor | 2.7.1 |
||
| @types/react (source) | ^18.3.27 → ^18.3.28 |
dependencies | patch | |||
| @types/react (source) | ^18.3.27 → ^18.3.28 |
devDependencies | patch | |||
| alpinejs (source) | ^3.15.6 → ^3.15.8 |
dependencies | patch | |||
| node | 24.12.0-bullseye → 24.13.0-bullseye |
final | minor | |||
| p-limit | ^7.2.0 → ^7.3.0 |
dependencies | patch | |||
| semver | ^7.7.3 → ^7.7.4 |
dependencies | patch | |||
| svelte (source) | ^5.49.1 → ^5.49.2 |
dependencies | patch | 5.50.0 |
||
| turbo (source) | ^2.8.1 → ^2.8.3 |
devDependencies | patch |
Release Notes
withastro/astro (@astrojs/rss)
v4.0.15
Patch Changes
- #15199
d8e64efThanks @ArmandPhilippot! - Fixes the links to Astro Docs so that they match the current docs structure.
withastro/astro (@astrojs/sitemap)
v3.7.0
Minor Changes
-
#14471
4296373Thanks @Slackluky! - Adds the ability to split sitemap generation into chunks based on customizable logic. This allows for better management of large sitemaps and improved performance. The newchunksoption in the sitemap configuration allows users to define functions that categorize sitemap items into different chunks. Each chunk is then written to a separate sitemap file.integrations: [ sitemap({ serialize(item) { th return item }, chunks: { // this property will be treated last on the configuration 'blog': (item) => { // will produce a sitemap file with `blog` name (sitemap-blog-0.xml) if (/blog/.test(item.url)) { // filter path that will be included in this specific sitemap file item.changefreq = 'weekly'; item.lastmod = new Date(); item.priority = 0.9; // define specific properties for this filtered path return item; } }, 'glossary': (item) => { if (/glossary/.test(item.url)) { item.changefreq = 'weekly'; item.lastmod = new Date(); item.priority = 0.7; return item; } } // the rest of the path will be stored in `sitemap-pages.0.xml` }, }), ],
v3.6.1
Patch Changes
- #15033
dd06779Thanks @florian-lefebvre! - Updates how routes are retrieved to avoid relying on a deprecated API
preactjs/signals (@preact/signals)
v2.7.0
Minor Changes
-
#861
5794b04Thanks @andrewiggins! - AdduseModelhook for using Models in componentsThe new
useModelhook provides a convenient way to use Models (created withcreateModel) 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 "@​preact/signals-core"; import { useModel } from "@​preact/signals-react"; // or "@​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
-
#865
4872968Thanks @JoviDeCroock! - Revert #728 - this might entail work in prefresh but currently the presence ofuesStatemakes every sCU bail -
Updated dependencies [
19ac39b]:- @preact/signals-core@1.13.0
nodejs/node (node)
v24.13.0: 2026-01-13, Version 24.13.0 'Krypton' (LTS), @marco-ippolito
This is a security release.
Notable Changes
lib:
- (CVE-2025-59465) add TLSSocket default error handler (RafaelGSS) nodejs-private/node-private#797
- (CVE-2025-55132) disable futimes when permission model is enabled (RafaelGSS) nodejs-private/node-private#748
lib,permission: - (CVE-2025-55130) require full read and write to symlink APIs (RafaelGSS) nodejs-private/node-private#760
src: - (CVE-2025-59466) rethrow stack overflow exceptions in async_hooks (Matteo Collina) nodejs-private/node-private#773
src,lib: - (CVE-2025-55131) refactor unsafe buffer creation to remove zero-fill toggle (Сковорода Никита Андреевич) nodejs-private/node-private#759
tls: - (CVE-2026-21637) route callback exceptions through error handlers (Matteo Collina) nodejs-private/node-private#796
Commits
- [
2092785d01] - deps: update c-ares to v1.34.6 (Node.js GitHub Bot) #60997 - [
3e58b7f2af] - deps: update undici to 7.18.2 (Node.js GitHub Bot) #61283 - [
4ba536a5a6] - (CVE-2025-59465) lib: add TLSSocket default error handler (RafaelGSS) nodejs-private/node-private#797 - [
89adaa21fd] - (CVE-2025-55132) lib: disable futimes when permission model is enabled (RafaelGSS) nodejs-private/node-private#748 - [
7302b4dae1] - (CVE-2025-55130) lib,permission: require full read and write to symlink APIs (RafaelGSS) nodejs-private/node-private#760 - [
ac030753c4] - (CVE-2025-59466) src: rethrow stack overflow exceptions in async_hooks (Matteo Collina) nodejs-private/node-private#773 - [
20075692fe] - (CVE-2025-55131) src,lib: refactor unsafe buffer creation to remove zero-fill toggle (Сковорода Никита Андреевич) nodejs-private/node-private#759 - [
20591b0618] - (CVE-2026-21637) tls: route callback exceptions through error handlers (Matteo Collina) nodejs-private/node-private#796
npm/node-semver (semver)
v7.7.4
Bug Fixes
a29faa5#835 cli: pass options to semver.valid() for loose version validation (#835) (@mldangelo)
Documentation
1d28d5e#836 fix typos and update -n CLI option documentation (#836) (@mldangelo)
Dependencies
Chores
44d7130#824 bump @npmcli/eslint-config from 5.1.0 to 6.0.0 (#824) (@dependabot[bot])7073576#820 reorder parameters in invalid-versions.js test (#820) (@reggi)5816d4c#829 bump @npmcli/template-oss from 4.28.0 to 4.28.1 (#829) (@dependabot[bot], @npm-cli-bot)
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.
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.
astro/packages/astro/src/assets/endpoint/config.ts
Lines 24 to 29 in 840fbf9
| 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
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:
astro/packages/integrations/cloudflare/src/utils/image-config.ts
Lines 49 to 56 in 840fbf9
| 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 }; |
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
840fbf9Thanks @matthewp! - Removes thecloudflareModulesadapter optionThe
cloudflareModulesoption 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
cloudflareModulesoption 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
a164c77Thanks @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
e2ad69eThanks @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
736216bThanks @florian-lefebvre! - Removes the deprecated@astrojs/vercel/serverlessand@astrojs/vercel/staticexports. Use the@astrojs/vercelexport instead
Minor Changes
- #15413
736216bThanks @florian-lefebvre! - Updates the implementation to use the new Adapter API
Patch Changes
astro@6.0.0-beta.10
Minor Changes
-
#15231
3928b87Thanks @rururux! - Adds a new optionalgetRemoteSize()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 extendsinferRemoteSize(), 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
a164c77Thanks @matthewp! - Updates the Integration API to addsetPrerenderer()to theastro:build:starthook, allowing adapters to provide custom prerendering logic.The new API accepts either an
AstroPrerendererobject 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-pathsvirtual module, which exports aStaticPathsclass 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
840fbf9Thanks @matthewp! - Adds a newemitClientAssetfunction toastro/assets/utilsfor 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
c5ea720Thanks @matthewp! - Improves error message when a dynamic redirect destination does not match any existing route.Previously, configuring a redirect like
/categories/[category]→/categories/[category]/1in 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
10b0422Thanks @AhmadYasser1! - FixesAstro.rewritereturning 404 when rewriting to a URL with non-ASCII charactersWhen rewriting to a path containing non-ASCII characters (e.g.,
/redirected/héllo), the route lookup compared encodeddistURLhrefs against decoded pathnames, causing the comparison to always fail and resulting in a 404. This fix compares against the encoded pathname instead. -
#15419
a18d727Thanks @ematipico! - Fixes an issue where theaddcommand could accept any arbitrary value, leading the possible command injections. Nowaddand--addaccepts
values that are only acceptable npmjs.org names. -
#15345
840fbf9Thanks @matthewp! - Fixes an issue where.sqlfiles (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
ssrMoveAssetsfunction 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
68770efThanks @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
840fbf9Thanks @matthewp! - Uses Astro's newemitClientAssetAPI 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
- #15413
736216bThanks @florian-lefebvre! - Updates the implementation to use the new Adapter API
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
0317e99Thanks @ocavue! - Updates@vitejs/plugin-vueto v6,@vitejs/plugin-vue-jsxto v5, andvite-plugin-vue-devtoolsto v8. No changes are needed from users.
@astrojs/internal-helpers@0.8.0-beta.1
Minor Changes
-
#15077
a164c77Thanks @matthewp! - AddsnormalizePathname()utility function for normalizing URL pathnames to match the canonical form used by route generation. -
#15419
a18d727Thanks @ematipico! - Adds a new/clispecifier and the utilityNPM_PACKAGE_NAME_REGEX.
create-astro@5.0.0-beta.4
Patch Changes
-
#15419
a18d727Thanks @ematipico! - Fixes an issue where--addcould accept any kind of string, leading to different errors. Now--addaccepts only values of valid integrations and adapters. -
#15419
a18d727Thanks @ematipico! - Fixes an issue where theaddcommand could accept any arbitrary value, leading the possible command injections. Nowaddand--addaccepts
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
@astrojs/markdown-remark@7.0.0-beta.6
Patch Changes
Changes
- Adds early validation in
createRedirectRoutes()to detect when a dynamic redirect destination doesn't match any existing route - Throws a new
InvalidRedirectDestinationerror 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
Changes
- Upgrades to the beta version of the compiler
Testing
N/A
Docs
N/A
Changes
Left over logging was left in the last beta, this should fix it
Testing
I mean
Docs
N/A
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
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
-
#15400
41eb284Thanks @florian-lefebvre! - Removes theworkerEntryPointoption, which wasn't used anymore. Set themainfield of your wrangler config insteadSee how to migrate
Patch Changes
- Updated dependencies []:
- @astrojs/underscore-redirects@1.0.0
astro@6.0.0-beta.9
Patch Changes
-
#15415
cc3c46cThanks @ematipico! - Fixes an issue where CSP headers were incorrectly injected in the development server. -
#15412
c546563Thanks @florian-lefebvre! - Improves theAstroAdaptertype and how legacy adapters are handled -
#15421
bf62b6fThanks @Princesseuh! - Removes unintended logging
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
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
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
Changes
- Depends on #15400
- Improves the
AstroAdaptertype 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
Changes
Let's see if this fixes the failures.
Testing
Green benchmarks
Docs
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.
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 |
||
| @volar/kit (source) | dependencies | patch | ~2.4.27 → ~2.4.28 |
||
| @volar/language-core (source) | dependencies | patch | ~2.4.27 → ~2.4.28 |
||
| @volar/language-server (source) | devDependencies | patch | ~2.4.27 → ~2.4.28 |
||
| @volar/language-server (source) | dependencies | patch | ~2.4.27 → ~2.4.28 |
||
| @volar/language-service (source) | dependencies | patch | ~2.4.27 → ~2.4.28 |
||
| @volar/test-utils (source) | devDependencies | patch | ~2.4.27 → ~2.4.28 |
||
| @volar/typescript (source) | dependencies | patch | ~2.4.27 → ~2.4.28 |
||
| @volar/typescript (source) | devDependencies | patch | ~2.4.27 → ~2.4.28 |
||
| @volar/vscode (source) | devDependencies | patch | ~2.4.27 → ~2.4.28 |
||
| prettier (source) | dependencies | patch | ^3.8.0 → ^3.8.1 |
||
| svelte (source) | dependencies | patch | ^5.0.0 → ^5.49.1 |
🔧 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.
ℹ️ Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
🔧 This Pull Request updates lock files to use the latest dependency versions.
Release Notes
preactjs/signals (@preact/signals)
v2.6.2
Patch Changes
- #858
e4bbb66Thanks @JoviDeCroock! - Fix issue where unmounted vnodes could update with signals
v2.6.1
Patch Changes
- #836
ac5032eThanks @JoviDeCroock! - Ensure that theForandShowcomponent have display-names
v2.6.0
Minor Changes
- #819
8a8b0d1Thanks @JoviDeCroock! - Remove the need for enter/exit component and track the effects normally
Patch Changes
-
#827
f17889bThanks @JoviDeCroock! - Add mangle entry for _debugCallback -
Updated dependencies [
f17889b]:- @preact/signals-core@1.12.2
cheeriojs/cheerio (cheerio)
v1.2.0
What's Changed
.val()now supports button values by @kaioduarte in #4175.find()now properly scopes:scopeselectors by @T0nd0Tara in #4967- The
isHtmlutility now runtime-validates input types by @Mallikarjun-0 in #4523
New Contributors
- @noritaka1166 made their first contribution in #4740
- @kaioduarte made their first contribution in #4175
- @Mallikarjun-0 made their first contribution in #4523
- @T0nd0Tara made their first contribution in #4967
Full Changelog: cheeriojs/cheerio@v1.1.2...v1.2.0
facebook/react (react)
v19.2.4: 19.2.4 (January 26th, 2026)
React Server Components
- Add more DoS mitigations to Server Actions, and harden Server Components (#35632 by @gnoff, @lubieowoce, @sebmarkbage, @unstubbable)
withastro/compiler (@astrojs/compiler)
v0.33.0
Minor Changes
1adac72: Improve error recovery when using thetransformfunction. 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 whereexport typecould hang the compilerec1ddf0: Handle edge case with TypeScript generics handling and our TSX output23d1fc0: Ignore trailing whitespace in components
v0.32.0
Minor Changes
2404848: Removepathnameoption in favour ofsourcefileoption2ca86f6: RemovesiteandprojectRootoptions in favour of theastroGlobalArgsoptionedd3e0e: MergesourcefileandmoduleIdoptions as a singlefilenameoption. Add a newnormalizedFilenameoption to generate stable hashes instead.08843bd: RemoveexperimentalStaticExtractionoption. It is now the default.
v0.31.4
Patch Changes
960b853: RenameSerializeOtionsinterface toSerializeOptionsfcab891: Fixes export hoisting edge case47de01a: Handle module IDs containing quotes
v0.31.3
Patch Changes
v0.31.2
Patch Changes
89c0cee: fix: corner case that component in head expression will case body tag missing20497f4: Improve fidelity of sourcemaps for frontmatter
v0.31.1
Patch Changes
24dcf7e: Allowscriptandstylebefore HTMLef391fa: fix: corner case with slot expression in head will cause body tag missing
v0.31.0
Minor Changes
abdddeb: Update Go to 1.19
v0.30.1
Patch Changes
ff9e7ba: Fix edge case where<was not handled properly inside of expressionsf31d535: Fix edge case with Prop detection for TSX output
v0.30.0
Minor Changes
963aaab: Provide the moduleId of the astro component
v0.29.19
Patch Changes
3365233: Replace internal tokenizer state logs with proper warnings
v0.29.18
Patch Changes
80de395: fix: avoid nil pointer dereference in table parsingaa3ad9d: Fixparseoutput to properly account for the location of self-closing tagsb89dec4: Internally, replaceastro.ParseFragmentin favor ofastro.ParseFragmentWithOptions. We now check whether an error handler is passed when callingastro.ParseFragmentWithOptions
v0.29.17
Patch Changes
1e7e098: Add warning for invalid spread attributes3cc6f55: Fix handling of unterminated template literal attributes48c5677: Update defaultinternalURLtoastro/runtime/server/index.js2893f33: Fix a number oftableandexpressionrelated bugs
v0.29.16
Patch Changes
ec745f4: Self-closing tags will now retreive "end" positional dataa6c2822: Fix a few TSX output errors
v0.29.15
Patch Changes
5f6e69b: Fix expression literal handling
v0.29.14
Patch Changes
v0.29.13
Patch Changes
8f3e488: Fix regression introduced toparsehandling in the last patch
v0.29.12
Patch Changes
a41982a: Fix expression edge cases, improve literal parsing
v0.29.11
Patch Changes
v0.29.10
Patch Changes
07a65df: Print\rwhen printing TSX output1250d0b: Add warning whendefine:varswon't work because of compilation limitations
v0.29.9
Patch Changes
1fe92c0: Fix TSX sourcemaps on Windows (take 4)
v0.29.8
Patch Changes
01b62ea: Fix sourcemap bug on Windows (again x2)
v0.29.7
Patch Changes
108c6c9: Fix TSX sourcemap bug on Windows (again)
v0.29.6
Patch Changes
4b3fafa: Fix TSX sourcemaps on Windows
v0.29.5
Patch Changes
73a2b69: Use an IIFE for define:vars scripts
v0.29.4
Patch Changes
4381efa: Return proper diagnostic code for warnings
v0.29.3
Patch Changes
85e1d31: AST: movestartposition of elements to the first index of their opening tag
v0.29.2
Patch Changes
035829b: AST: move end position of elements to the last index of their end tag
v0.29.1
Patch Changes
a99c014: Ensure comment and text nodes have end positions when generating an AST fromparse
v0.29.0
Minor Changes
fd2fc28: Fix some utf8 compatability issues
Patch Changes
4b68670: TSX: fix edge case with spread attribute printing6b204bd: Fix bug with trailingstyletags being moved into thehtmlelement66fe230: Fix: include element end location inparseAST
v0.28.1
Patch Changes
aac8c89: Fix end tag sourcemappings for TSX moded7f3288: TSX: Improve self-closing tag behavior and mappings75dd7cc: Fix spread attribute mappings
v0.28.0
Minor Changes
5da0dc2: AddresolvePathoption to control hydration path resolutione816a61: Remove metadata export ifresolvePathoption provided
v0.27.2
Patch Changes
959f96b: Fix "missing sourcemap" issue94f6f3e: Fix edge case with multi-line comment usage85a654a: Fixparsecausing a compiler panic when a component with a client directive was imported but didn't have a matching import5e32cbe: Improvements to TSX output
v0.27.1
Patch Changes
v0.27.0
Minor Changes
-
c770e7b: The compiler will now returndiagnosticsand unique error codes to be handled by the consumer. For example:import type { DiagnosticSeverity, DiagnosticCode } from '@​astrojs/compiler/types'; import { transform } from '@​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
Patch Changes
920898c: Handle edge case withnoscripttags8ee78a6: handle slots that contains the head element244e43e: Do not hoist import inside objectb8cd954: Fix edge case with line comments and export hoisting52ebfb7: 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
Minor Changes
0be58ab: Improve sourcemap support for TSX output
Patch Changes
e065e29: Prevent head injection from removing script siblings
v0.25.2
Patch Changes
3a51b8e: Ensure that head injection occurs if there is only a hoisted script
v0.25.1
Patch Changes
41fae67: Do not scope empty style blocks1ab8280: fix(#517): fix edge case with TypeScript transforma3678f9: Fix import.meta.env usage above normal imports
v0.25.0
Minor Changes
6446ea3: Make Astro styles being printed after user imports
Patch Changes
51bc60f: Fix edge cases withgetStaticPathswhere valid JS syntax was improperly handled
v0.24.0
Minor Changes
6ebcb4f: Allow preprocessStyle to return an error
Patch Changes
abda605: Include filename when calculating scope
v0.23.5
Patch Changes
6bc8e0b: Prevent import assertion from being scanned too soon
v0.23.4
Patch Changes
3b9f0d2: Remove css print escape for experimentalStaticExtraction
v0.23.3
Patch Changes
7693d76: Fix resolution of .jsx modules
v0.23.2
Patch Changes
167ad21: Improve handling of namespaced components when they are multiple levels deep9283258: Fix quotations in pre-quoted attributes76fcef3: Better handling for imports which use special characters
v0.23.1
Patch Changes
79376f3: Fix regression with expression rendering
v0.23.0
Minor Changes
d8448e2: Prevent printing the doctype in the JS output
Patch Changes
a28c3d8: Fix handling of unbalanced quotes in expression attributes28d1d4d: Fix handling of TS generics inside of expressions356d3b6: Prevent wraping module scripts with scope
v0.22.1
Patch Changes
973103c: Prevents unescaping attribute expressions
v0.22.0
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
Minor Changes
8960d82: New handling fordefine:varsscripts and styles
Patch Changes
4b318d5: Do not attempt to hoist styles or scripts inside of<noscript>
v0.20.0
Minor Changes
48d33ff: Removes compiler special casing for the Markdown component4a5352e: Removes limitation where imports/exports must be at the top of an.astrofile. Fixes various edge cases aroundgetStaticPathshoisting.
Patch Changes
245d73e: Add support for HTML minification by passingcompact: truetotransform.3ecdd24: Update TSX output to also generate TSX-compatible code for attributes containing dots
v0.19.0
Minor Changes
fcb4834: Removes fallback for the site configuration
Patch Changes
02add77: Fixes many edge cases around tables when used with components, slots, or expressionsb23dd4d: Fix handling of unmatched close brace in template literals9457a91: Fix issue with{in template literal attributesc792161: Fix nested expression handling with a proper expression tokenizer stack
v0.18.2
Patch Changes
v0.18.1
Patch Changes
aff2f23: Warning on client: usage on scripts
v0.18.0
Minor Changes
4b02776: Fix handling ofslotattribute used inside of expressions
Patch Changes
62d2a8e: Properly handle nested expressions that return multiple elements571d6b9: Ensurehtmlandbodyelements are scoped
v0.17.1
Patch Changes
3885217: Support<slot is:inline />and preserve slot attribute when not inside componentea94a26: Fix issue with fallback content inside of slots
v0.17.0
Minor Changes
3a9d166: Add renderHead injection points
v0.16.1
Patch Changes
9fcc43b: Build JS during the release
v0.16.0
Minor Changes
470efc0: Adds component metadata to the TransformResult
Patch Changes
v0.15.2
Patch Changes
v0.15.1
Patch Changes
26cbcdb: Prevent side-effectual CSS imports from becoming module metadata
v0.15.0
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 aclassattribute inside of a spread prop will cause duplicateclassattributes62faceb: Fixes an issue where curly braces in<math>elements would get parsed as expressions instead of raw text.
v0.14.3
Patch Changes
6177620: Fix edge case with expressions inside of tables79b1ed6: Provides a better error message when we can't match client:only usage to an import statementa4e1957: Fix Astro scoping whenclass:listis usedfda859a: Fix json escape
v0.14.2
Patch Changes
6f30e2e: Fix edge case with nested expression inside<>15e3ff8: Fix panic when using a<slot />inheadc048567: Fix edge case withselectelements and expression children13d2fc2: 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.
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 |
|||
| @vue/compiler-sfc (source) | dependencies | patch | ^3.5.26 → ^3.5.27 |
|||
| cheerio (source) | devDependencies | minor | 1.1.2 → 1.2.0 |
|||
| solid-js (source) | devDependencies | patch | ^1.9.10 → ^1.9.11 |
|||
| svelte (source) | dependencies | minor | 5.46.4 → 5.49.1 |
|||
| svelte (source) | devDependencies | patch | ^5.46.1 → ^5.49.1 |
|||
| @preact/preset-vite | dependencies | patch | ^2.10.2 → ^2.10.3 |
|||
| @preact/signals (source) | dependencies | patch | ^2.5.1 → ^2.6.2 |
2.7.0 |
||
| svelte (source) | dependencies | patch | ^5.46.1 → ^5.49.1 |
|||
| svelte2tsx (source) | dependencies | patch | ^0.7.46 → ^0.7.47 |
|||
| @vitejs/plugin-vue (source) | dependencies | patch | ^6.0.2 → ^6.0.3 |
6.0.4 |
||
| vite (source) | dependencies | patch | ^7.1.7 → ^7.3.1 |
|||
| vue (source) | devDependencies | patch | ^3.5.26 → ^3.5.27 |
|||
| preact (source) | devDependencies | patch | ^10.28.2 → ^10.28.3 |
🔧 This Pull Request updates lock files to use the latest dependency versions.
Release Notes
cheeriojs/cheerio (cheerio)
v1.2.0
What's Changed
.val()now supports button values by @kaioduarte in #4175.find()now properly scopes:scopeselectors by @T0nd0Tara in #4967- The
isHtmlutility now runtime-validates input types by @Mallikarjun-0 in #4523
New Contributors
- @noritaka1166 made their first contribution in #4740
- @kaioduarte made their first contribution in #4175
- @Mallikarjun-0 made their first contribution in #4523
- @T0nd0Tara made their first contribution in #4967
Full Changelog: cheeriojs/cheerio@v1.1.2...v1.2.0
sveltejs/svelte (svelte)
v5.49.1
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
Minor Changes
- feat: allow passing
ShadowRootInitobject to custom elementshadowoption (#17088)
Patch Changes
-
fix: throw for unset
createContextget 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
popoverelements 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
Patch Changes
-
fix: run boundary
onerrorcallbacks 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
Patch Changes
- fix: avoid duplicating escaped characters in CSS AST (#17554)
v5.48.3
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
Patch Changes
- fix: export
waitfunction from internal client index (#17530)
v5.48.1
Patch Changes
-
fix: hoist snippets above const in same block (#17516)
-
fix: properly hydrate await in
{@​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
Minor Changes
- feat: export
parseCssfromsvelte/compiler(#17496)
Patch Changes
-
fix: handle non-string values in
svelte:elementthisattribute (#17499) -
fix: faster deduplication of dependencies (#17503)
v5.47.1
Patch Changes
- fix: trigger
selectedcontentreactivity (#17486)
v5.47.0
Minor Changes
- feat: customizable
<select>elements (#17429)
Patch Changes
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.
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 |
||
| cheerio (source) | devDependencies | minor | 1.1.2 → 1.2.0 |
|||
| fastify (source) | devDependencies | patch | ^5.7.0 → ^5.7.2 |
5.7.4 (+1) |
||
| @astrojs/mdx (source) | dependencies | patch | ^4.3.5 → ^4.3.13 |
|||
| @netlify/vite-plugin (source) | dependencies | patch | ^2.7.19 → ^2.8.0 |
|||
| @types/react (source) | dependencies | patch | ^18.3.24 → ^18.3.27 |
|||
| vite (source) | dependencies | patch | ^7.1.7 → ^7.3.1 |
|||
| @vitejs/plugin-vue (source) | dependencies | patch | ^6.0.2 → ^6.0.3 |
6.0.4 |
||
| svelte (source) | dependencies | patch | ^5.46.1 → ^5.49.1 |
|||
| vue (source) | dependencies | patch | ^3.5.26 → ^3.5.27 |
|||
| solid-js (source) | dependencies | patch | ^1.9.10 → ^1.9.11 |
|||
| svelte (source) | dependencies | patch | ^5.46.3 → ^5.49.1 |
|||
| vue (source) | dependencies | patch | ^3.5.25 → ^3.5.27 |
|||
| @cloudflare/workers-types | devDependencies | patch | ^4.20260124.0 → ^4.20260131.0 |
4.20260203.0 |
||
| rollup (source) | devDependencies | patch | ^4.55.1 → ^4.57.1 |
🔧 This Pull Request updates lock files to use the latest dependency versions.
Release Notes
cheeriojs/cheerio (cheerio)
v1.2.0
What's Changed
.val()now supports button values by @kaioduarte in #4175.find()now properly scopes:scopeselectors by @T0nd0Tara in #4967- The
isHtmlutility now runtime-validates input types by @Mallikarjun-0 in #4523
New Contributors
- @noritaka1166 made their first contribution in #4740
- @kaioduarte made their first contribution in #4175
- @Mallikarjun-0 made their first contribution in #4523
- @T0nd0Tara made their first contribution in #4967
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.
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
d339a18Thanks @ematipico! - Stabilizes the adapter featureexperimentalStatiHeaders. 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
4fca170Thanks @HiDeoo! - Fixes an issue where CSS from unused components, when using content collections, could be incorrectly included between page navigations in development mode. -
#15268
54e5cc4Thanks @rururux! - fix: avoid creating unused images during build in Picture component -
#15133
53b125bThanks @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
d339a18Thanks @ematipico! - Stabilizes the adapter featureexperimentalStatiHeaders. 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
d339a18Thanks @ematipico! - Stabilizes the adapter featureexperimentalStatiHeaders. 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
d339a18Thanks @ematipico! - Stabilizes the adapter featureexperimentalStatiHeaders. 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
This PR contains the following updates:
| Package | Change | Age | Confidence | Type | Update | Pending |
|---|---|---|---|---|---|---|
| @astrojs/rss (source) | ^4.0.15-beta.3 → ^4.0.15 |
dependencies | patch | |||
| @astrojs/sitemap (source) | ^3.6.1-beta.3 → ^3.7.0 |
dependencies | minor | |||
| @playwright/test (source) | 1.58.0 → 1.58.1 |
devDependencies | patch | |||
| @preact/signals (source) | ^2.6.1 → ^2.6.2 |
dependencies | patch | 2.7.0 |
||
| alpinejs (source) | ^3.15.5 → ^3.15.6 |
dependencies | patch | 3.15.8 (+1) |
||
| node (source) | 22.20.0 → 22.22.0 |
minor | ||||
| node | 22-bullseye → 22.21.1-bullseye |
final | minor | 22.22.0 |
||
| open-props | ^1.7.17 → ^1.7.23 |
dependencies | patch | |||
| pnpm (source) | 10.28.0 → 10.28.2 |
packageManager | patch | |||
| preact (source) | ^10.28.2 → ^10.28.3 |
dependencies | patch | |||
| shiki (source) | ^3.21.0 → ^3.22.0 |
dependencies | minor | |||
| turbo (source) | ^2.8.0 → ^2.8.1 |
devDependencies | patch | 2.8.3 (+1) |
Release Notes
withastro/astro (@astrojs/rss)
v4.0.15
Patch Changes
- #15199
d8e64efThanks @ArmandPhilippot! - Fixes the links to Astro Docs so that they match the current docs structure.
withastro/astro (@astrojs/sitemap)
v3.7.0
Minor Changes
-
#14471
4296373Thanks @Slackluky! - Adds the ability to split sitemap generation into chunks based on customizable logic. This allows for better management of large sitemaps and improved performance. The newchunksoption in the sitemap configuration allows users to define functions that categorize sitemap items into different chunks. Each chunk is then written to a separate sitemap file.integrations: [ sitemap({ serialize(item) { th return item }, chunks: { // this property will be treated last on the configuration 'blog': (item) => { // will produce a sitemap file with `blog` name (sitemap-blog-0.xml) if (/blog/.test(item.url)) { // filter path that will be included in this specific sitemap file item.changefreq = 'weekly'; item.lastmod = new Date(); item.priority = 0.9; // define specific properties for this filtered path return item; } }, 'glossary': (item) => { if (/glossary/.test(item.url)) { item.changefreq = 'weekly'; item.lastmod = new Date(); item.priority = 0.7; return item; } } // the rest of the path will be stored in `sitemap-pages.0.xml` }, }), ],
microsoft/playwright (@playwright/test)
v1.58.1
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
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
- [
6badf4e6f4] - deps: update c-ares to v1.34.6 (Node.js GitHub Bot) #60997 - [
37509c3ff0] - deps: update undici to 6.23.0 (Matteo Collina) nodejs-private/node-private#791 - [
eb8e41f8db] - (CVE-2025-59465) lib: add TLSSocket default error handler (RafaelGSS) nodejs-private/node-private#797 - [
ebbf942a83] - (CVE-2025-55132) lib: disable futimes when permission model is enabled (RafaelGSS) nodejs-private/node-private#748 - [
6b4849583a] - (CVE-2025-55130) lib,permission: require full read and write to symlink APIs (RafaelGSS) nodejs-private/node-private#760 - [
ddadc31f09] - (CVE-2025-59466) src: rethrow stack overflow exceptions in async_hooks (Matteo Collina) nodejs-private/node-private#773 - [
d4d9f3915f] - (CVE-2025-55131) src,lib: refactor unsafe buffer creation to remove zero-fill toggle (Сковорода Никита Андреевич) nodejs-private/node-private#759 - [
25d6799df6] - (CVE-2026-21637) tls: route callback exceptions through error handlers (Matteo Collina) nodejs-private/node-private#796
v22.21.1: 2025-10-28, Version 22.21.1 'Jod' (LTS), @aduh95
Commits
- [
af33e8e668] - benchmark: remove unused variable from util/priority-queue (Bruno Rodrigues) #59872 - [
6764ce8756] - benchmark: update count to n in permission startup (Bruno Rodrigues) #59872 - [
4e8d99f0dc] - benchmark: update num to n in dgram offset-length (Bruno Rodrigues) #59872 - [
af0a8ba7f8] - benchmark: adjust dgram offset-length len values (Bruno Rodrigues) #59708 - [
78efd1be4a] - benchmark: update num to n in dgram offset-length (Bruno Rodrigues) #59708 - [
df72dc96e9] - console,util: improve array inspection performance (Ruben Bridgewater) #60037 - [
ef67d09f50] - http: improve writeEarlyHints by avoiding for-of loop (Haram Jeong) #59958 - [
23468fd76b] - http2: fix allowHttp1+Upgrade, broken by shouldUpgradeCallback (Tim Perry) #59924 - [
56abc4ac76] - lib: optimize priority queue (Gürgün Dayıoğlu) #60039 - [
ea5cfd98c5] - lib: implement passive listener behavior per spec (BCD1me) #59995 - [
c2dd6eed2f] - process: fix wrong asyncContext under unhandled-rejections=strict (Shima Ryuhei) #60103 - [
81a3055710] - process: fix defaultenvforprocess.execve(Richard Lau) #60029 - [
fe492c7ace] - process: fix hrtime fast call signatures (Renegade334) #59600 - [
76b4cab8fc] - src: bring permissions macros in line with general C/C++ standards (Anna Henningsen) #60053 - [
21970970c7] - src: removeAnalyzeTemporaryDtorsoption from .clang-tidy (iknoom) #60008 - [
609c063e81] - src: remove unused variables from report (Moonki Choi) #60047 - [
987841a773] - src: avoid unnecessary string allocations in SPrintF impl (Anna Henningsen) #60052 - [
6e386c0632] - src: make ToLower/ToUpper input args more flexible (Anna Henningsen) #60052 - [
c3be1226c7] - src: allowstd::string_viewarguments toSPrintF()and friends (Anna Henningsen) #60058 - [
764d35647d] - src: remove unnecessarystd::stringerror messages (Anna Henningsen) #60057 - [
1289ef89ec] - src: remove unnecessary shadowed functions on Utf8Value & BufferValue (Anna Henningsen) #60056 - [
d1fb8a538d] - src: avoid unnecessary string ->char*-> string round trips (Anna Henningsen) #60055 - [
54b439fb5a] - src: filloptions_args,options_envafter vectors are finalized (iknoom) #59945 - [
c7c597e2ca] - src: use RAII for uv_process_options_t (iknoom) #59945 - [
b928ea9716] - test: ensure that the message event is fired (Luigi Pinca) #59952 - [
e4b95a5158] - test: replace diagnostics_channel stackframe in output snapshots (Chengzhong Wu) #60024 - [
4206406694] - test: mark test-web-locks skip on IBM i (SRAVANI GUNDEPALLI) #59996 - [
26394cd5bf] - test: expand tls-check-server-identity coverage (Diango Gavidia) #60002 - [
b58df47995] - test: fix typo of test-benchmark-readline.js (Deokjin Kim) #59993 - [
af3a59dba8] - test: verify tracing channel doesn't swallow unhandledRejection (Gerhard Stöbich) #59974 - [
cee362242b] - timers: fix binding fast call signatures (Renegade334) #59600 - [
40fea57fdd] - tools: add message on auto-fixing js lint issues in gh workflow (Dario Piotrowicz) #59128 - [
aac90d351b] - tools: verify signatures when updating nghttp* (Antoine du Hamel) #60113 - [
9fae03c7d9] - tools: use dependabot cooldown and move tools/doc (Rafael Gonzaga) #59978 - [
81548abdf6] - wasi: fix WasiFunction fast call signature (Renegade334) #59600
v22.21.0: 2025-10-20, Version 22.21.0 'Jod' (LTS), @aduh95
Notable Changes
- [
1486fedea1] - (SEMVER-MINOR) cli: add--use-env-proxy(Joyee Cheung) #59151 - [
bedaaa11fc] - (SEMVER-MINOR) http: support http proxy for fetch underNODE_USE_ENV_PROXY(Joyee Cheung) #57165 - [
af8b5fa29d] - (SEMVER-MINOR) http: addshouldUpgradeCallbackto let servers control HTTP upgrades (Tim Perry) #59824 - [
42102594b1] - (SEMVER-MINOR) http,https: add built-in proxy support inhttp/https.requestandAgent(Joyee Cheung) #58980 - [
686ac49b82] - (SEMVER-MINOR) src: add percentage support to--max-old-space-size(Asaf Federman) #59082
Commits
- [
a71dd592e3] - benchmark: calibrate config dgram multi-buffer (Bruno Rodrigues) #59696 - [
16c4b466f4] - benchmark: calibrate config cluster/echo.js (Nam Yooseong) #59836 - [
53cb9f3b6c] - build: add the missing macro definitions for OpenHarmony (hqzing) #59804 - [
ec5290fe01] - build: do not include custom ESLint rules testing in tarball (Antoine du Hamel) #59809 - [
1486fedea1] - (SEMVER-MINOR) cli: add --use-env-proxy (Joyee Cheung) #59151 - [
1f93913446] - crypto: usereturn awaitwhen returning Promises from async functions (Renegade334) #59841 - [
f488b2ff73] - crypto: use async functions for non-stub Promise-returning functions (Renegade334) #59841 - [
aed9fd5ac4] - crypto: avoid calls topromise.catch()(Renegade334) #59841 - [
37c2d186f0] - deps: update amaro to 1.1.4 (pmarchini) #60044 - [
28aea13419] - deps: update archs files for openssl-3.5.4 (Node.js GitHub Bot) #60101 - [
ddbc1aa0bb] - deps: upgrade openssl sources to openssl-3.5.4 (Node.js GitHub Bot) #60101 - [
badbba2da9] - deps: update googletest to50b8600(Node.js GitHub Bot) #59955 - [
48aaf98a08] - deps: update archs files for openssl-3.5.3 (Node.js GitHub Bot) #59901 - [
e02a562ea6] - deps: upgrade openssl sources to openssl-3.5.3 (Node.js GitHub Bot) #59901 - [
7e0e86cb92] - deps: upgrade npm to 10.9.4 (npm team) #60074 - [
91dda5facf] - deps: update undici to 6.22.0 (Matteo Collina) #60112 - [
3a3220a2f0] - dgram: restore buffer optimization in fixBufferList (Yoo) #59934 - [
09bdcce6b8] - diagnostics_channel: fix race condition with diagnostics_channel and GC (Ugaitz Urien) #59910 - [
b3eeb3bd13] - doc: provide alternative tourl.parse()using WHATWG URL (Steven) #59736 - [
1ddaab1904] - doc: mention reverse proxy and include simple example (Steven) #59736 - [
3b3b71e99c] - doc: mark.envfiles support as stable (Santeri Hiltunen) #59925 - [
d37f67d1bd] - doc: remove optional title prefixes (Aviv Keller) #60087 - [
ca2dff63f9] - doc: fix typo on child_process.md (Angelo Gazzola) #60114 - [
3fca564a05] - doc: add automated migration info to deprecations (Augustin Mauroy) #60022 - [
4bc366fc16] - doc: use "WebAssembly" instead of "Web Assembly" (Tobias Nießen) #59954 - [
4808dbdd9a] - doc: fix typo in section on microtask order (Tobias Nießen) #59932 - [
d6e303d645] - doc: update V8 fast API guidance (René) #58999 - [
0a3a3f729e] - doc: add security escalation policy (Ulises Gascón) #59806 - [
8fd669c70d] - doc: type improvement of filehttp.md(yusheng chen) #58189 - [
9833dc6060] - doc: rephrase dynamic import() description (Nam Yooseong) #59224 - [
2870a73681] - doc,crypto: update subtle.generateKey and subtle.importKey (Filip Skokan) #59851 - [
85818db93c] - fs,win: do not add a second trailing slash in readdir (Gerhard Stöbich) #59847 - [
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 - [
758271ae66] - http: optimize checkIsHttpToken for short strings (방진혁) #59832 - [
42102594b1] - (SEMVER-MINOR) http,https: add built-in proxy support in http/https.request and Agent (Joyee Cheung) #58980 - [
a33ed9bf96] - inspector: ensure adequate memory allocation forBinary::toBase64(René) #59870 - [
34c686be2b] - lib: update inspect output format for subclasses (Miguel Marcondes Filho) #59687 - [
12e553529c] - lib: add source map support for assert messages (Chengzhong Wu) #59751 - [
d2a70571f8] - lib,src: refactor assert to load error source from memory (Chengzhong Wu) #59751 - [
20a9e86b5d] - meta: move Michael to emeritus (Michael Dawson) #60070 - [
c591cca15c] - meta: bump github/codeql-action from 3.30.0 to 3.30.5 (dependabot[bot]) #60089 - [
090ba141b1] - meta: bump codecov/codecov-action from 5.5.0 to 5.5.1 (dependabot[bot]) #60091 - [
a0ba6884a5] - meta: bump actions/stale from 9.1.0 to 10.0.0 (dependabot[bot]) #60092 - [
0feca0c541] - meta: bump actions/setup-node from 4.4.0 to 5.0.0 (dependabot[bot]) #60093 - [
7cd2b42d18] - meta: bump step-security/harden-runner from 2.12.2 to 2.13.1 (dependabot[bot]) #60094 - [
1f3b9d66ac] - meta: bump actions/cache from 4.2.4 to 4.3.0 (dependabot[bot]) #60095 - [
0fedbb3de7] - meta: bump ossf/scorecard-action from 2.4.2 to 2.4.3 (dependabot[bot]) #60096 - [
04590b8267] - meta: bump actions/setup-python from 5.6.0 to 6.0.0 (dependabot[bot]) #60090 - [
2bf0a9318f] - meta: add .npmrc with ignore-scripts=true (Joyee Cheung) #59914 - [
e10dc7b81c] - module: allow overriding linked requests for a ModuleWrap (Chengzhong Wu) #59527 - [
2237142369] - module: link module with a module request record (Chengzhong Wu) #58886 - [
6d24b88fbc] - node-api: added SharedArrayBuffer api (Mert Can Altin) #59071 - [
4cc84c96f4] - node-api: make napi_delete_reference use node_api_basic_env (Jeetu Suthar) #59684 - [
e790eb6b50] - repl: fix cpu overhead pasting big strings to the REPL (Ruben Bridgewater) #59857 - [
99ea08dc43] - repl: add isValidParentheses check before wrap input (Xuguang Mei) #59607 - [
e4a4f63019] - sqlite: fix crash session extension callbacks with workers (Bart Louwers) #59848 - [
42c5544b97] - src: assert memory calc for max-old-space-size-percentage (Asaf Federman) #59460 - [
686ac49b82] - (SEMVER-MINOR) src: add percentage support to --max-old-space-size (Asaf Federman) #59082 - [
84701ff668] - src: clear all linked module caches once instantiated (Chengzhong Wu) #59117 - [
8e182e561f] - src: remove unnecessaryEnvironment::GetCurrent()calls (Moonki Choi) #59814 - [
c9cde35c4d] - src: simplify is_callable by making it a concept (Tobias Nießen) #58169 - [
892b425ee1] - src: rename private fields to follow naming convention (Moonki Choi) #59923 - [
36b68db7f5] - src: reduce the nearest parent package JSON cache size (Michael Smith) #59888 - [
26b40bad02] - src: replace FIXED_ONE_BYTE_STRING with Environment-cached strings (Moonki Choi) #59891 - [
34dcb7dc32] - src: create strings inFIXED_ONE_BYTE_STRINGas internalized (Anna Henningsen) #59826 - [
4d748add05] - src: removestd::arrayoverload ofFIXED_ONE_BYTE_STRING(Anna Henningsen) #59826 - [
bb6fd7c2d1] - src: ensurev8::Eternalis empty before setting it (Anna Henningsen) #59825 - [
7a91282bf9] - src: use simdjson::pad (0hm☘️) #59391 - [
ba00875f01] - stream: use new AsyncResource instead of bind (Matteo Collina) #59867 - [
ebec3ef68b] - (SEMVER-MINOR) test: move http proxy tests to test/client-proxy (Joyee Cheung) #58980 - [
7067d79fb3] - test: mark sea tests flaky on macOS x64 (Richard Lau) #60068 - [
ca1942c9d5] - test: testcase demonstrating issue 59541 (Eric Rannaud) #59801 - [
660d57355e] - test,doc: skip --max-old-space-size-percentage on 32-bit platforms (Asaf Federman) #60144 - [
19a7b1ef26] - tls: load bundled and extra certificates off-thread (Joyee Cheung) #59856 - [
095e7a81fc] - tls: only do off-thread certificate loading on loading tls (Joyee Cheung) #59856 - [
c42c1204c7] - tools: fixtools/make-v8.shfor clang (Richard Lau) #59893 - [
b632a1d98d] - tools: skip test-internet workflow for draft PRs (Michaël Zasso) #59817 - [
6021c3ac76] - tools: copyeditbuild-tarball.yml(Antoine du Hamel) #59808 - [
ef005d0c9b] - typings: update 'types' binding (René) #59692 - [
28ef564ecd] - typings: remove unused imports (Nam Yooseong) #59880 - [
f88752ddb6] - url: replaced slice with at (Mikhail) #59181 - [
24c224960c] - url: add type checking to urlToHttpOptions() (simon-id) #59753 - [
f2fbcc576d] - util: fix debuglog.enabled not being present with callback logger (Ruben Bridgewater) #59858 - [
6277058e43] - vm: sync-ify SourceTextModule linkage (Chengzhong Wu) #59000 - [
5bf21a4309] - vm: explain how to share promises between contexts w/ afterEvaluate (Eric Rannaud) #59801 - [
312b33a083] - vm: "afterEvaluate", evaluate() return a promise from the outer context (Eric Rannaud) #59801 - [
1eadab863c] - win,tools: add description to signature (Martin Costello) #59877 - [
816e1befb1] - zlib: reduce code duplication (jhofstee) #57810
argyleink/open-props (open-props)
v1.7.23
31 January 2026
v1.7.22
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
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
31 January 2026
v1.7.19
31 January 2026
pnpm/pnpm (pnpm)
v10.28.2: pnpm 10.28.2
Patch Changes
-
Security fix: prevent path traversal in
directories.binfield. -
When pnpm installs a
file:orgit: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 intonode_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:andgit: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
libcfield, which is required for proper platform compatibility checks #9950.
Platinum Sponsors
|
|
Gold Sponsors
|
|
|
|
|
|
|
v10.28.1
preactjs/preact (preact)
v10.28.3
Fixes
- Avoid scheduling suspense state udpates (#5006, thanks @JoviDeCroock)
- Resolve some suspense crashes (#4999, thanks @JoviDeCroock)
- Support inheriting namespace through portals (#4993, thanks @JoviDeCroock)
Maintenance
- Update test with addition of
_original(#4989, thanks @JoviDeCroock)
Configuration
📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
Changes
- Fixes #15151
- Updates the dev middleware to ignore query params
Testing
Manually
Docs
Changeset
Add Formware help center site to the showcase.
Changes
- Closes #15363
- I tried a few things and it turns out because we have references to
@cloudflare/workers-typeswhen building etc, we can avoid doing weird things with types - It also allowed removing the
Requesttype augmentation we were doing as part ofastro sync, becausewrangler typesalready handles it
Testing
Manually in repro, manually in the custom-entryfile fixture, preview release tested with user's repro
Docs
Changeset
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);
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
Changes
- Fix Preact components failing to render in Cloudflare dev mode
- Include
@astrojs/preact/server.jsin Vite'soptimizeDeps - Previously,
server.jswas explicitly excluded, causingpreact-render-to-stringto load a separate Preact instance from user components, breaking hooks - Fixes #15361
Testing
- Added e2e test for Preact component with
useEffectandclient:loadin the Cloudflare fixture
Docs
No docs changes needed - this is a bug fix for existing functionality.
Changes
What the title says
Testing
CI
Docs
N/A
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@astrojs/starlight@0.37.6
Patch Changes
- #3645
a562096Thanks @mschoeffmann! - Adds icons for Chrome, Edge, Firefox, and Safari
Changes
- What does this change?
- Be short and concise. Bullet points can help!
- Before/after screenshots can help as well.
- Don't forget a changeset! Run
pnpm changeset. - See https://contribute.docs.astro.build/docs-for-code-changes/changesets/ for more info on writing changesets.
Testing
Docs
Changes
- Fix React slot rendering to skip empty
SlotStringvalues 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).
Changes
- Mode became required in v4. However it's unclear to me which mode we should use, so I went with the recommended one per https://github.com/CodSpeedHQ/action#usage
Testing
N/A
Docs
N/A
ℹ️ 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 |
Release Notes
colinhacks/zod (zod)
v4.3.6
Commits:
9977fb0Add brand.dev to sponsorsf4b7baeUpdate pullfrog.yml (#5634)251d716Clean up workflow_calledd4132fix: add missing User-agent to robots.txt and allow all (#5646)85db85efix: typo in codec.test.ts file (#5628)cbf77bbAvoid non null assertion (#5638)dfbbf1cAvoid re-exported star modules (#5656)762e911Generalize numeric key handlingca3c862v4.3.6
v4.3.5
Commits:
21afffd[Docs] Update migration guide docs for deprecation of message (#5595)e36743eImprove mini treeshaking0cdc0b84.3.5
v4.3.4
Commits:
1a8bea3Add integration testse01cd02Support patternProperties for looserecord (#5592)089e5fbImprove looseRecord docsdecef9cFix lint9443aabDrop iso time in fromJSONSchema66bda74Remove .refine() from ZodMiniTypeb4ab94c4.3.4
v4.3.3
v4.3.2
v4.3.1
Commits:
0fe8840allow non-overwriting extends with refinements. 4.3.1
v4.3.0
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) $reffor 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 matchesWhen 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 brandedType 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.timewith minute precision (#5557) - Fixed error details for tuples with extraneous elements (#5555)
- Fixed
includesmethod params typing to acceptstring | $ZodCheckIncludesParams(#5556) - Fixed numeric formats error messages to be inclusive (#5485)
- Fixed
implementAsyncinferred 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
Dateinstances to numbers inminimum/maximumchecks (#5351) - Improved numeric keys handling in
z.record()(#5585) - Lazy initialization of
~standardschema 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
v4.2.0
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 matchImplement z.looseRecord()
const schema = z.looseRecord(z.string(), z.number());
// Allows additional properties beyond those definedCommits:
af49c08Update docs for JSON Schema conversion ofz.undefined()(#5504)767f320Add.toJSONSchema()method (#5477)e17dcb6Addz.fromJSONSchema(),z.looseRecord(),z.xor()(#5534)
v4.1.13
v4.1.12
Commits:
0b109c3docs(ecosystem): add bupkis to the ecosystem section (#5237)d22ec0ddocs(ecosystem): add upfetch (#5238)c56a4f6docs(ecosystem): addeslint-plugin-zod-x(#5261)a0abcc0docs(metadata.mdx): fix a mistake in an example output (#5248)62bf4e4fix(ZodError): prevent flatten() from crashing on 'toString' key (#5266)02a5840refac(errors): Unify code structure and improve types (#5278)4b1922adocs(content/v4/index): fix zod version (#5289)3fcb20fAdd frrm to ecosystem (#5292)fda4c7cMake docs work without tokenaf44738Fix lint77c3c9fExport bg.ts3b94610v4.1.12
v4.1.11
Commits:
2bed4b34.1.11
v4.1.10
Commits:
v4.1.9
Commits:
v4.1.8
Commits:
v4.1.7
Commits:
0cca351Fix variable name inconsistency in coercion documentation (#5188)aa78c27Add copy/edit buttons76452d4Update button txt937f73cFix tsconfig issue in bench976b436v4.1.6 (#5222)4309c61Fix cidrv6 validation - cidrv6 should reject invalid strings with multiple slashes (#5196)ef95a73feat(locales): Add Lithuanian (lt) locale (#5210)3803f3fdocs: update wrong contents in codeblocks inapi.mdx(#5209)8a47d5cdocs: update coerce example inapi.mdx(#5207)e87db13feat(locales): Add Georgian (ka) locale (#5203)c54b123docs: adds@traversable/zodand@traversable/zod-testto v4 ecosystem (#5194)c27a294Fix two tiny grammatical errors in the docs. (#5193)23a2d66docs: fix broken links in async refinements and transforms references (#5190)845a230fix(locales): Add type name translations to Spanish locale (#5187)27f13d6Improve regex precision and eliminate duplicates in regexes.ts (#5181)a8a52b3fix(v4): fix Khmer and Ukrainian locales (#5177)887e37cUpdate slugse1f1948fix(v4): ensure array defaults are shallow-cloned (#5173)9f65038docs(ecosystem): add DRZL; fix Prisma Zod Generator placement (#5215)aa6f0f0More fixes (#5223)aab33564.1.7
v4.1.6
v4.1.5
Commits:
v4.1.4
Commits:
3291c61fix(v4): toJSONSchema - wrong tuple withnulloutput when targetingopenapi-3.0(#5156)23f41c7test(v4): toJSONSchema - usevalidateOpenAPI30Schemain all relevant scenarios (#5163)0a09fd2Update installation instructions4ea5fec4.1.4
v4.1.3
Commits:
98ff675Drop stringToBooleana410616Fix typo0cf4589fix(v4): toJSONSchema - add missing oneOf inside items in tuple conversion (#5146)8bf0c16fix(v4): toJSONSchema tuple path handling for draft-7 with metadata IDs (#5152)5c5fa90fix(v4): toJSONSchema - wrong record output when targetingopenapi-3.0(#5141)87b97ccdocs(codecs): update example to use payloadSchema (#5150)309f358fix(v4): toJSONSchema - output numbers with exclusive range correctly when targetingopenapi-3.0(#5139)1e71ca9docs: fix refine fn to encode works properly (#5148)a85ec3cfix(docs): correct example to useLooseDoginstead ofDog(#5136)3e982744.1.3
v4.1.2
Commits:
e45e61bImprove codec docs25a4c37fix(v4): toJSONSchema - wrong record tuple output when targetingopenapi-3.0(#5145)0fa4f46Use method form in codecs.mdx940383dUpdate JSON codec and docs3009fa84.1.2
v4.1.1
Commits:
648eb43Remove codecs from sidebare7e39a99Improve codec docse5085beAdd images028b289Add methods10cc9944.1.1
v4.1.0
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->Aand executes theencodetransform during encoding - Pipes — these execute
B->Ainstead ofA->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:
stringToNumberstringToIntstringToBigIntnumberToBigIntisoDatetimeToDateepochSecondsToDateepochMillisToDatejsonCodecutf8ToBytesbytesToUtf8base64ToBytesbase64urlToByteshexToBytesstringToURLstringToHttpURLuriComponentstringToBoolean
.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 ABPreviously (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"); // ❌ ZodErrorAdditional changes
- z.uuid() now supports the "Max UUID" (
FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF) per the RFC $ZodFunctionis now a subtype of$ZodType
Commits
edd4fea- Closes #51275d4a315- Closes #5116f3f0955- Closes #51080114d5b- #51223b077c3- #51211e06af8- #5113b01b6f3— #5052571ab0c— #5051d3ea111— #5049b8e3f87— #4865
v4.0.17
Commits:
v4.0.16
Commits:
d589186fix: ensure keyof returns enum (#5045)4975f3afeat: add discriminator generic (#5044)0a463e3Update speakeasy files12658afFix Edit page buttons47e6604fix:edit this pagebutton, now redirects to correct url using the new path (#5056)7207a2dUpdate Hey API link to Zod v3 plugin (#5060)6887ff3Update Hey API link to Zod plugin (#5059)ffff1aaClone POJO objects during defaulting/prefaultinga227cb3v4.0.16
v4.0.15
Commits:
7e7e346Clean up docsf2949a8[docs] Fix migration guide upgrade command (#5021)d43cf19Fix recursive object initialization errors with check() and other methods (#5018)3de2b63fix: remove redundant Required<> from input and output type definitions (#5033)93553bdAdd needs info03cfa8d4.0.15
v4.0.14
Commits:
99391a8Docs: Fix typo (#5005)e25303eDocs: fix typo (#5008)dbb05efAdd JSON Schema draft-04 output (#4811)b8257d7Improve tuple recursive inference.9bdbc2fAvoid infinite loops in defineLazy. Fixes #4994.af96ad44.0.14
v4.0.13
Commits:
v4.0.12
Commits:
ff83fc9Add eslint-plugin-import-zod (#4848)7c9ce38Update docs for z.property check (#4863)c432577docs: add jwt schema docs (#4867)35e6a6fAdd llms.txt (#4915)3ac7bf0Clean up Edit this Page60a9372Implementllms-full.txt(#5004)73a19704.0.12
v4.0.11
Commits:
8e6a5f8Fix “Edit on Github” link (#4997)930a2f6Fix number of errors in doc (#4993)c762dbbfeat(locale): Add Yoruba (yo) locale (#4996)9a34a3aZod 4.0.11 (#4981)
v4.0.10
Commits:
291c1caAdd should-build scripte32d99bMove should-build scriptd4faf71Add v3 docs (#4972)dfae371Update Jazz img on v3 docsd6cd30dfix #4973 (#4974)1850496Fix typo invalype(#4960)4ec2f87Add Zod Playground to zod 4 ecosystem (#4975)2b571a2Update docs z.enum with object literal example (#4967)813451dv4.0.10 (#4978)
v4.0.9
Commits:
v4.0.8
Commits:
v4.0.7
Commits:
v4.0.6
Commits:
a3e4391Unwiden catch input type (#4870)499df78Add RFC 9562 mentions. Closes #4872d0493f3Doc tweak - spread vs destructuring (#4919)8dad394feat: Icelandic translation (#4920)2ffdae1Bulgarian (bg) translation (#4928)0973135docs: add valype to xToZodConverts (#4930)d257340Remove moduleResolution callout (#4932)075970ddocs: add coercion note to fix compile errors (#4940)b9e8a60Add@hey-api/openapi-tsto Zod 3 ecosystem (#4949)ad7b0ffAdd@hey-api/openapi-tsto Zod 3 ecosystem (#4942)4619109feat(locales): add Danish translations (#4953)cb84a57Point to zod-v3-to-v4 codemod in Zod 4 migration guide (#4954)28a5091Update api.mdx (#4955)7f3cf94Fix URL sup example (#4959)- [
17e7f3b](https://redi
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.
Add Actionbase documentation site to the showcase.
- Site: https://actionbase.io/
- GitHub: https://github.com/kakao/actionbase
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
pathsubmodule and removed any unused one
Testing
Should pass
Docs
Changeset
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 addedRemoved for now but you can see the change here (it’s pretty minimal)Astro.localsto the render context and am passingAstro.localsthrough toappEntrypoint’s component as a prop calledlocals. The prop is only set in a server environment; clientside it’s justundefined.
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
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