AstroEco is Contributing…
Display your GitHub pull requests using astro-loader-github-prs

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@astrojs/cloudflare@12.5.5
Patch Changes
- #13930
acb9b30
Thanks @alexanderniebuhr! - Fixes an issue where setting values forAstro.response
resulted in a Cloudflare runtime exception.
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.34.4
Patch Changes
-
#3205
95d124a
Thanks @sgalcheung! - Fixes an issue preventing to use the<StarlightPage>
component when thedocs
content collection that Starlight uses does not exist. -
#3206
e6ea584
Thanks @HiDeoo! - Fixes a text selection issue for heading with a clickable anchor link when using double click to select text in Chrome and Safari. -
#3233
3064c40
Thanks @torn4dom4n! - Updates Vietnamese UI translations. -
#3248
16c1239
Thanks @HiDeoo! - Prevents icons in the<Card>
component from being shrunk in some narrow viewports. -
#3225
21b93b8
Thanks @randomguy-2650! - Updates German UI translations
Description
Initially spotted by @ArmandPhilippot in Astro Docs, this PR prevents icons in <Card>
components from being shrunk.
Before | After |
---|---|
![]() |
![]() |
Remaining tasks
- Remove the code change in
docs/src/content/docs/index.mdx
only used to make the issue more visible.
Description
The Bag of Tricks for Astro's View Transitions (= view transitions with the <ClientRouter />
)
The Bag of Tricks for View Transitions, @vtbag (= view transitions with the browser native API)
Description
- Closes #3239
Create a createMarkdownTestHelper
method to reduce repeated creation of createMarkdownProcessor, and this method could initialize different parameters in the test method, so we get all tests passed!
Next, I will create a test to reproduce this bug, so that we can better verify the modified code logic.
Add a test(should correctly autolink headings in remote markdown content using rehypeAutolinkHeadings) to reproduce this bug
TypeError: Failed to parse Markdown file "undefined":
Cannot read properties of undefined (reading 'replace')
at normalizePath (/Users/sgalcheung/Documents/....../starlight/packages/starlight/integrations/heading-links.ts:110:14)
at transformer (/Users/sgalcheung/Documents/....../starlight/packages/starlight/integrations/heading-links.ts:34:8)
at wrapped (file:///Users/sgalcheung/Documents/....../starlight/node_modules/.pnpm/trough@2.1.0/node_modules/trough/index.js:115:27)
at next (file:///Users/sgalcheung/Documents/....../starlight/node_modules/.pnpm/trough@2.1.0/node_modules/trough/index.js:65:23)
at done (file:///Users/sgalcheung/Documents/....../starlight/node_modules/.pnpm/trough@2.1.0/node_modules/trough/index.js:148:7)
at then (file:///Users/sgalcheung/Documents/....../starlight/node_modules/.pnpm/trough@2.1.0/node_modules/trough/index.js:158:5)
at wrapped (file:///Users/sgalcheung/Documents/....../starlight/node_modules/.pnpm/trough@2.1.0/node_modules/trough/index.js:136:9)
at next (file:///Users/sgalcheung/Documents/....../starlight/node_modules/.pnpm/trough@2.1.0/node_modules/trough/index.js:65:23)
at done (file:///Users/sgalcheung/Documents/....../starlight/node_modules/.pnpm/trough@2.1.0/node_modules/trough/index.js:148:7)
at then (file:///Users/sgalcheung/Documents/....../starlight/node_modules/.pnpm/trough@2.1.0/node_modules/trough/index.js:158:5)

Changes
This PR adds a new feature and fixes a bug.
Feature
It adds a new experimental adapter feature called staticHeaders
. See the updated section here: https://github.com/withastro/roadmap/blob/feat/rfc-csp/proposals/0055-csp.md#solution-adopted
The adapter feature is intentionally generic, allowing CSP to take advantage of it. It's been called experimental because the first feature to use it is CSP, so we want to make sure we get the API right first.
The PR doesn't update any adapters yet. I will do that in a separate PR.
To support this feature, we now track a new field called cspDestination
within the SSRManifest
. In the manifest, the value is intentionally undefined if the adapter doesn't use the new feature. The final value is eventually calculated at the very end, right before the rendering phase, and that's why the value becomes NonNullable
.
Bug fix
Addresses
Where the meta tag should be rendered as early as possible.
Testing
I updated the tests and added new ones.
Docs
@withastro/maintainers-docs for feedback!

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
astro@5.9.3
Patch Changes
-
#13923
a9ac5ed
Thanks @ematipico! - BREAKING CHANGE to the experimental Content Security Policy (CSP) onlyChanges the behavior of experimental Content Security Policy (CSP) to now serve hashes differently depending on whether or not a page is prerendered:
- Via the
<meta>
element for static pages. - Via the
Response
headercontent-security-policy
for on-demand rendered pages.
This new strategy allows you to add CSP content that is not supported in a
<meta>
element (e.g.report-uri
,frame-ancestors
, and sandbox directives) to on-demand rendered pages.No change to your project code is required as this is an implementation detail. However, this will result in a different HTML output for pages that are rendered on demand. Please check your production site to verify that CSP is working as intended.
To keep up to date with this developing feature, or to leave feedback, visit the CSP Roadmap proposal.
- Via the
-
#13926
953a249
Thanks @ematipico! - Adds a new Astro Adapter Feature calledexperimentalStaticHeaders
to allow your adapter to receive theHeaders
for rendered static pages.Adapters that enable support for this feature can access header values directly, affecting their handling of some Astro features such as Content Security Policy (CSP). For example, Astro will no longer serve the CSP
<meta http-equiv="content-security-policy">
element in static pages to adapters with this support.Astro will serve the value of the header inside a map that can be retrieved from the hook
astro:build:generated
. Adapters can read this mapping and use their hosting headers capabilities to create a configuration file.A new field called
experimentalRouteToHeaders
will contain a map ofMap<IntegrationResolvedRoute, Headers>
where theHeaders
type contains the headers emitted by the rendered static route.To enable support for this experimental Astro Adapter Feature, add it to your
adapterFeatures
in your adapter config:// my-adapter.mjs 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: { experimentalStaticHeaders: true, }, }); }, }, }; }
See the Adapter API docs for more information about providing adapter features.
-
#13697
af83b85
Thanks @benosmac! - Fixes issues with fallback route pattern matching wheni18n.routing.fallbackType
isrewrite
.- Adds conditions for route matching in
generatePath
when building fallback routes and checking for existing translated pages
Now for a route to be matched it needs to be inside a named
[locale]
folder. This fixes an issue whereroute.pattern.test()
incorrectly matched dynamic routes, causing the page to be skipped.- Adds conditions for route matching in
findRouteToRewrite
Now the requested pathname must exist in
route.distURL
for a dynamic route to match. This fixes an issue whereroute.pattern.test()
incorrectly matched dynamic routes, causing the build to fail. - Adds conditions for route matching in
-
#13924
1cd8c3b
Thanks @qw-in! - Fixes an edge case whereisPrerendered
was incorrectly set tofalse
for static redirects. -
#13926
953a249
Thanks @ematipico! - Fixes an issue where the experimental CSPmeta
element wasn't placed in the<head>
element as early as possible, causing these policies to not apply to styles and scripts that came before themeta
element.

Changes
Closes #13875
Previously, isPrerendered
would be false
in statically built configured redirects (notably in middleware).
Testing
I added a test, happy to expand or reorganize. Additionally I've run the full test suite locally and I don't have any new failures (rosetta + devcontainers likely the culprit #12704).
Docs
This is a fix, so I don't think docs are necessary?

Changes
This PR changes how the CSP hashes are served. For static pages, we still serve them via the <meta>
element, but for SSR pages, they are served using the Reponse
headers.
This change partially addresses the following comments, where now the content of the CSP header for SSR pages can support directives that wouldn't be supported in the meta:
After landing this PR, I will move forward with the second part of Matthew's comment, where if there's an adapter, the meta
tag isn't provided anymore for static pages, instead we will use the adapter's hosting capabilities to deliver those hashes:
- https://docs.netlify.com/frameworks-api/#headers
- https://vercel.com/docs/project-configuration#headers
- https://developers.cloudflare.com/pages/configuration/headers/
Testing
Added a new test
Docs
I will update the roadmap PR after this PR is accepted.
I will send a pull request to the docs later.

Changes
I think I saw this bug in the roadmap, or there was an issue? I can't recall. Regardless, with this PR, astro doesn't add the quote to the resources. Only certain resources must have quotes e.g. 'self'
, and users must be responsible for them.
Testing
Tests updated
Docs
Updated the configuration examples. Will need to update the roadmap too

Changes
- Unflags the responsive images feature
- Defaults responsive styles to false
- Makes the
priority
attribute available to all images
Migration Guide
If you were using the experimental responsive images feature, you'll need to update your configuration:
Remove the experimental flag
export default defineConfig({
experimental: {
- responsiveImages: true,
},
});
Update image configuration options
During the experimental phase, default styles were applied automatically to responsive images. Now, you need to explicitly set the responsiveStyles
option to true
if you want these styles applied.
export default defineConfig({
image: {
+ responsiveStyles: true,
},
});
The experimental image configuration options have been renamed:
Before:
export default defineConfig({
image: {
experimentalLayout: 'constrained',
experimentalObjectFit: 'cover',
experimentalObjectPosition: 'center',
experimentalBreakpoints: [640, 750, 828, 1080, 1280],
experimentalDefaultStyles: true,
},
experimental: {
responsiveImages: true,
},
});
After:
export default defineConfig({
image: {
layout: 'constrained',
objectFit: 'cover',
objectPosition: 'center',
breakpoints: [640, 750, 828, 1080, 1280],
responsiveStyles: true, // This is now *false* by default
},
});
The priority
option for the image component
By default, the Astro <Image />
component generates <img>
tags that lazy-load their content by setting loading="lazy"
and decoding="async"
. This improves performance by deferring the loading of images that are not immediately visible in the viewport, and gives the best scores in performance audits like Lighthouse. However, for the main, above-the-fold images, you should tell the browser to load them immediately. Currently you can do this by setting the loading
attribute to "eager"
and decoding
to "sync"
on the <img>
tag, but this is a bit cumbersome. It also does not currently set the fetchpriority
attribute, which is a new HTML attribute that allows you to specify the priority of resource fetching.
This change introduces a new priority
option for the <Image />
and <Picture />
components, which automatically sets the loading
, decoding
, and fetchpriority
attributes to their optimal values for above-the-fold images. It is a boolean prop, and you can use the shorthand syntax by simply adding priority
as a prop to the <Image />
or <Picture />
component. When set, it will apply the following attributes:
loading="eager"
decoding="sync"
fetchpriority="high"
The individual attributes can still be set manually if you need to customize them further.
This option was previously available for experimental responsive images, but now it is a standard feature for all images.
Usage
<Image
src="/path/to/image.jpg"
alt="An example image"
priority
/>
Note
You should only use the priority
option for images that are critical to the initial rendering of the page, and ideally only one image per page. Using it for too many images will lead to performance issues, as it forces the browser to load those images immediately, potentially blocking the rendering of other content.
Testing
Updated test fixtures
Docs
Changes needed beyond the initial planned unflagging:
- renamed
responsiveStyles
option now defaults to false - new
priority
option

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
astro@5.9.2
Patch Changes
-
#13919
423fe60
Thanks @ematipico! - Fixes a bug where Astro added quotes to the CSP resources.Only certain resources require quotes (e.g.
'self'
but nothttps://cdn.example.com
), so Astro no longer adds quotes to any resources. You must now provide the quotes yourself for resources such as'self'
when necessary:export default defineConfig({ experimental: { csp: { styleDirective: { resources: [ - "self", + "'self'", "https://cdn.example.com" ] } } } })
-
#13914
76c5480
Thanks @ematipico! - BREAKING CHANGE to the experimental Content Security Policy feature onlyRemoves support for experimental Content Security Policy (CSP) when using the
<ClientRouter />
component for view transitions.It is no longer possible to enable experimental CSP while using Astro's view transitions. Support was already unstable with the
<ClientRouter />
because CSP required making its underlying implementation asynchronous. This caused breaking changes for several users and therefore, this PR removes support completely.If you are currently using the component for view transitions, please remove the experimental CSP flag as they cannot be used together.
import { defineConfig } from 'astro/config'; export default defineConfig({ experimental: { - csp: true } });
Alternatively, to continue using experimental CSP in your project, you can consider migrating to the browser native View Transition API and remove the
<ClientRouter />
from your project. You may be able to achieve similar results if you are not using Astro's enhancements to the native View Transitions and Navigation APIs.Support might be reintroduced in future releases. You can follow this experimental feature's development in the CSP RFC.

Changes
Depends on withastro/compiler#1081
This PR drops support for view transitions in CSP. Making the function renderTrantion
asynchronous caused some undesirable effects in userland. We already knew that the support was unstable, and this regression made me decide that we aren't ready yet.
Closes #13908
Testing
I removed the tests
Docs
I will send a PR to the docs repository before the release

This PR contains the following updates:
Package | Change | Age | Adoption | Passing | Confidence |
---|---|---|---|---|---|
@types/react (source) | ^18.3.23 -> ^19.1.8 |
||||
@types/react-dom (source) | ^18.3.7 -> ^19.1.6 |
||||
react (source) | ^18.3.1 -> ^19.1.0 |
||||
react-dom (source) | ^18.3.1 -> ^19.1.0 |
Release Notes
facebook/react (react)
v19.1.0
v19.0.0
Below is a list of all new features, APIs, deprecations, and breaking changes. Read React 19 release post and React 19 upgrade guide for more information.
Note: To help make the upgrade to React 19 easier, we’ve published a react@18.3 release that is identical to 18.2 but adds warnings for deprecated APIs and other changes that are needed for React 19. We recommend upgrading to React 18.3.1 first to help identify any issues before upgrading to React 19.
New Features
React
- Actions:
startTransition
can now accept async functions. Functions passed tostartTransition
are called “Actions”. A given Transition can include one or more Actions which update state in the background and update the UI with one commit. In addition to updating state, Actions can now perform side effects including async requests, and the Action will wait for the work to finish before finishing the Transition. This feature allows Transitions to include side effects likefetch()
in the pending state, and provides support for error handling, and optimistic updates. useActionState
: is a new hook to order Actions inside of a Transition with access to the state of the action, and the pending state. It accepts a reducer that can call Actions, and the initial state used for first render. It also accepts an optional string that is used if the action is passed to a formaction
prop to support progressive enhancement in forms.useOptimistic
: is a new hook to update state while a Transition is in progress. It returns the state, and a set function that can be called inside a transition to “optimistically” update the state to expected final value immediately while the Transition completes in the background. When the transition finishes, the state is updated to the new value.use
: is a new API that allows reading resources in render. In React 19,use
accepts a promise or Context. If provided a promise,use
will suspend until a value is resolved.use
can only be used in render but can be called conditionally.ref
as a prop: Refs can now be used as props, removing the need forforwardRef
.- Suspense sibling pre-warming: When a component suspends, React will immediately commit the fallback of the nearest Suspense boundary, without waiting for the entire sibling tree to render. After the fallback commits, React will schedule another render for the suspended siblings to “pre-warm” lazy requests.
React DOM Client
<form> action
prop: Form Actions allow you to manage forms automatically and integrate withuseFormStatus
. When a<form> action
succeeds, React will automatically reset the form for uncontrolled components. The form can be reset manually with the newrequestFormReset
API.<button> and <input> formAction
prop: Actions can be passed to theformAction
prop to configure form submission behavior. This allows using different Actions depending on the input.useFormStatus
: is a new hook that provides the status of the parent<form> action
, as if the form was a Context provider. The hook returns the values:pending
,data
,method
, andaction
.- Support for Document Metadata: We’ve added support for rendering document metadata tags in components natively. React will automatically hoist them into the
<head>
section of the document. - Support for Stylesheets: React 19 will ensure stylesheets are inserted into the
<head>
on the client before revealing the content of a Suspense boundary that depends on that stylesheet. - Support for async scripts: Async scripts can be rendered anywhere in the component tree and React will handle ordering and deduplication.
- Support for preloading resources: React 19 ships with
preinit
,preload
,prefetchDNS
, andpreconnect
APIs to optimize initial page loads by moving discovery of additional resources like fonts out of stylesheet loading. They can also be used to prefetch resources used by an anticipated navigation.
React DOM Server
- Added
prerender
andprerenderToNodeStream
APIs for static site generation. They are designed to work with streaming environments like Node.js Streams and Web Streams. UnlikerenderToString
, they wait for data to load for HTML generation.
React Server Components
- RSC features such as directives, server components, and server functions are now stable. This means libraries that ship with Server Components can now target React 19 as a peer dependency with a react-server export condition for use in frameworks that support the Full-stack React Architecture. The underlying APIs used to implement a React Server Components bundler or framework do not follow semver and may break between minors in React 19.x. See docs for how to support React Server Components.
Deprecations
- Deprecated:
element.ref
access: React 19 supports ref as a prop, so we’re deprecatingelement.ref
in favor ofelement.props.ref
. Accessing will result in a warning. react-test-renderer
: In React 19, react-test-renderer logs a deprecation warning and has switched to concurrent rendering for web usage. We recommend migrating your tests to @testing-library/react or @testing-library/react-native
Breaking Changes
React 19 brings in a number of breaking changes, including the removals of long-deprecated APIs. We recommend first upgrading to 18.3.1
, where we've added additional deprecation warnings. Check out the upgrade guide for more details and guidance on codemodding.
React
- New JSX Transform is now required: We introduced a new JSX transform in 2020 to improve bundle size and use JSX without importing React. In React 19, we’re adding additional improvements like using ref as a prop and JSX speed improvements that require the new transform.
- Errors in render are not re-thrown: Errors that are not caught by an Error Boundary are now reported to window.reportError. Errors that are caught by an Error Boundary are reported to console.error. We’ve introduced
onUncaughtError
andonCaughtError
methods tocreateRoot
andhydrateRoot
to customize this error handling. - Removed:
propTypes
: UsingpropTypes
will now be silently ignored. If required, we recommend migrating to TypeScript or another type-checking solution. - Removed:
defaultProps
for functions: ES6 default parameters can be used in place. Class components continue to supportdefaultProps
since there is no ES6 alternative. - Removed:
contextTypes
andgetChildContext
: Legacy Context for class components has been removed in favor of thecontextType
API. - Removed: string refs: Any usage of string refs need to be migrated to ref callbacks.
- Removed: Module pattern factories: A rarely used pattern that can be migrated to regular functions.
- Removed:
React.createFactory
: Now that JSX is broadly supported, allcreateFactory
usage can be migrated to JSX components. - Removed:
react-test-renderer/shallow
: This has been a re-export of react-shallow-renderer since React 18. If needed, you can continue to use the third-party package directly. We recommend using @testing-library/react or @testing-library/react-native instead.
React DOM
- Removed:
react-dom/test-utils
: We’ve movedact
fromreact-dom/test-utils
to react. All other utilities have been removed. - Removed:
ReactDOM
.render
,ReactDOM
.hydrate
: These have been removed in favor of the concurrent equivalents:ReactDOM
.createRoot
andReactDOM.hydrateRoot
. - Removed:
unmountComponentAtNode
: Removed in favor ofroot.unmount()
. - Removed:
ReactDOM
.findDOMNode
: You can replaceReactDOM
.findDOMNode
with DOM Refs.
Notable Changes
React
<Context>
as a provider: You can now render<Context>
as a provider instead of<Context.Provider>
.- Cleanup functions for refs: When the component unmounts, React will call the cleanup function returned from the ref callback.
useDeferredValue
initial value argument: When provided,useDeferredValue
will return the initial value for the initial render of a component, then schedule a re-render in the background with thedeferredValue
returned.- Support for Custom Elements: React 19 now passes all tests on Custom Elements Everywhere.
- StrictMode changes:
useMemo
anduseCallback
will now reuse the memoized results from the first render, during the second render. Additionally, StrictMode will now double-invoke ref callback functions on initial mount. - UMD builds removed: To load React 19 with a script tag, we recommend using an ESM-based CDN such as esm.sh.
React DOM
- Diffs for hydration errors: In the case of a mismatch, React 19 logs a single error with a diff of the mismatched content.
- Compatibility with third-party scripts and extensions: React will now force a client re-render to fix up any mismatched content caused by elements inserted by third-party JS.
TypeScript Changes
The most common changes can be codemodded with npx types-react-codemod@latest preset-19 ./path-to-your-react-ts-files
.
- Removed deprecated TypeScript types:
ReactChild
(replacement:React.ReactElement | number | string)
ReactFragment
(replacement:Iterable<React.ReactNode>
)ReactNodeArray
(replacement:ReadonlyArray<React.ReactNode>
)ReactText
(replacement:number | string
)VoidFunctionComponent
(replacement:FunctionComponent
)VFC
(replacement:FC
)- Moved to
prop-types
:Requireable
,ValidationMap
,Validator
,WeakValidationMap
- Moved to
create-react-class
:ClassicComponentClass
,ClassicComponent
,ClassicElement
,ComponentSpec
,Mixin
,ReactChildren
,ReactHTML
,ReactSVG
,SFCFactory
- Disallow implicit return in refs: refs can now accept cleanup functions. When you return something else, we can’t tell if you intentionally returned something not meant to clean up or returned the wrong value. Implicit returns of anything but functions will now error.
- Require initial argument to
useRef
: The initial argument is now required to matchuseState
,createContext
etc - Refs are mutable by default: Ref objects returned from
useRef()
are now always mutable instead of sometimes being immutable. This feature was too confusing for users and conflicted with legit cases where refs were managed by React and manually written to. - Strict
ReactElement
typing: The props of React elements now default tounknown
instead ofany
if the element is typed asReactElement
- JSX namespace in TypeScript: The global
JSX
namespace is removed to improve interoperability with other libraries using JSX. Instead, the JSX namespace is available from the React package:import { JSX } from 'react'
- Better
useReducer
typings: MostuseReducer
usage should not require explicit type arguments.
For example,or-useReducer<React.Reducer<State, Action>>(reducer) +useReducer(reducer)
-useReducer<React.Reducer<State, Action>>(reducer) +useReducer<State, Action>(reducer)
All Changes
React
- Add support for async Actions (#26621, #26726, #28078, #28097, #29226, #29618, #29670, #26716 by @acdlite and @sebmarkbage)
- Add
useActionState()
hook to update state based on the result of a Form Action (#27270, #27278, #27309, #27302, #27307, #27366, #27370, #27321, #27374, #27372, #27397, #27399, #27460, #28557, #27570, #27571, #28631, #28788, #29694, #29695, #29694, #29665, #28232, #28319 by @acdlite, @eps1lon, and @rickhanlonii) - Add
use()
API to read resources in render (#25084, #25202, #25207, #25214, #25226, #25247, #25539, #25538, #25537, #25543, #25561, #25620, #25615, #25922, #25641, #25634, #26232, #26536, #26739, #28233 by @acdlite, @MofeiZ, @sebmarkbage, @sophiebits, @eps1lon, and @hansottowirtz) - Add
useOptimistic()
hook to display mutated state optimistically during an async mutation (#26740, #26772, #27277, #27453, #27454, #27936 by @acdlite) - Added an
initialValue
argument touseDeferredValue()
hook (#27500, #27509, #27512, #27888, #27550 by @acdlite) - Support refs as props, warn on
element.ref
access (#28348, #28464, #28731 by @acdlite) - Support Custom Elements (#22184, #26524, #26523, #27511, #24541 by @josepharhar, @sebmarkbage, @gnoff and @eps1lon)
- Add ref cleanup function (#25686, #28883, #28910 by @sammy-SC, @jackpope, and @kassens)
- Sibling pre-rendering replaced by sibling pre-warming (#26380, #26549, #30761, #30800, #30762, #30879, #30934, #30952, #31056, #31452 by @sammy-SC, @acdlite, @gnoff, @jackpope, @rickhanlonii)
- Don’t rethrow errors at the root (#28627, #28641 by @sebmarkbage)
- Batch sync discrete, continuous, and default lanes (#25700 by @tyao1)
- Switch
<Context>
to mean<Context.Provider>
(#28226 by @gaearon) - Changes to StrictMode
- Handle
info
,group
, andgroupCollapsed
in StrictMode logging (#25172 by @timneutkens) - Refs are now attached/detached/attached in StrictMode (#25049 by @sammy-SC)
- Fix
useSyncExternalStore()
hydration in StrictMode (#26791 by @sophiebits) - Always trigger
componentWillUnmount()
in StrictMode (#26842 by @tyao1) - Restore double invoking
useState()
anduseReducer()
initializer functions in StrictMode (#28248 by @eps1lon) - Reuse memoized result from first pass (#25583 by @acdlite)
- Fix
useId()
in StrictMode (#25713 by @gnoff) - Add component name to StrictMode error messages (#25718 by @sammy-SC)
- Handle
- Add support for rendering BigInt (#24580 by @eps1lon)
act()
no longer checksshouldYield
which can be inaccurate in test environments (#26317 by @acdlite)- Warn when keys are spread with props (#25697, #26080 by @sebmarkbage and @kassens)
- Generate sourcemaps for production build artifacts (#26446 by @markerikson)
- Improve stack diffing algorithm (#27132 by @KarimP)
- Suspense throttling lowered from 500ms to 300ms (#26803 by @acdlite)
- Lazily propagate context changes (#20890 by @acdlite and @gnoff)
- Immediately rerender pinged fiber (#25074 by @acdlite)
- Move update scheduling to microtask (#26512 by @acdlite)
- Consistently apply throttled retries (#26611, #26802 by @acdlite)
- Suspend Thenable/Lazy if it's used in React.Children (#28284 by @sebmarkbage)
- Detect infinite update loops caused by render phase updates (#26625 by @acdlite)
- Update conditional hooks warning (#29626 by @sophiebits)
- Update error URLs to go to new docs (#27240 by @rickhanlonii)
- Rename the
react.element
symbol toreact.transitional.element
(#28813 by @sebmarkbage) - Fix crash when suspending in shell during
useSyncExternalStore()
re-render (#27199 by @acdlite) - Fix incorrect “detected multiple renderers" error in tests (#22797 by @eps1lon)
- Fix bug where effect cleanup may be called twice after bailout (#26561 by @acdlite)
- Fix suspending in shell during discrete update (#25495 by @acdlite)
- Fix memory leak after repeated setState bailouts (#25309 by @acdlite)
- Fix
useSyncExternalStore()
dropped update when state is dispatched in render phase (#25578 by @pandaiolo) - Fix logging when rendering a lazy fragment (#30372 by @tom-sherman)
- Remove string refs (#25383, #28322 by @eps1lon and @acdlite)
- Remove Legacy Context (#30319 by @kassens)
- Remove
RefreshRuntime.findAffectedHostInstances
(#30538 by @gaearon) - Remove client caching from
cache()
API (#27977, #28250 by @acdlite and @gnoff) - Remove
propTypes
(#28324, #28326 by @gaearon) - Remove
defaultProps
support, except for classes (#28733 by @acdlite) - Remove UMD builds (#28735 by @gnoff)
- Remove delay for non-transition updates (#26597 by @acdlite)
- Remove
createFactory
(#27798 by @kassens)
React DOM
- Adds Form Actions to handle form submission (#26379, #26674, #26689, #26708, #26714, #26735, #26846, #27358, #28056 by @sebmarkbage, @acdlite, and @jupapios)
- Add
useFormStatus()
hook to provide status information of the last form submission (#26719, #26722, #26788, #29019, #28728, #28413 by @acdlite and @eps1lon) - Support for Document Metadata. Adds
preinit
,preinitModule
,preconnect
,prefetchDNS
,preload
, andpreloadModule
APIs.- #25060, #25243, #25388, #25432, #25436, #25426, #25500, #25480, #25508, #25515, #25514, #25532, #25536, #25534, #25546, #25559, #25569, #25599, #25689, #26106, #26152, #26239, #26237, #26280, #26154, #26256, #26353, #26427, #26450, #26502, #26514, #26531, #26532, #26557, #26871, #26881, #26877, #26873, #26880, #26942, #26938, #26940, #26939, #27030, #27201, #27212, #27217, #27218, #27220, #27224, #27223, #27269, #27260, #27347, #27346, #27361, #27400, #27541, #27610, #28110, #29693, #29732, #29811, #27586, #28069 by @gnoff, @sebmarkbage, @acdlite, @kassens, @sokra, @sweetliquid
- Add
fetchPriority
to<img>
and<link>
(#25927 by @styfle) - Add support for SVG
transformOrigin
prop (#26130 by @arav-ind) - Add support for
onScrollEnd
event (#26789 by @devongovett) - Allow
<hr>
as child of<select>
(#27632 by @SouSingh) - Add support for Popover API (#27981 by @eps1lon)
- Add support for
inert
(#24730 by @eps1lon) - Add support for
imageSizes
andimageSrcSet
(#22550 by @eps1lon) - Synchronously flush transitions in popstate events (#26025, #27559, #27505, #30759 by @tyao1 and @acdlite)
flushSync
exhausts queue even if something throws (#26366 by @acdlite)- Throw error if
react
andreact-dom
versions don’t match (#29236 by @acdlite) - Ensure
srcset
andsrc
are assigned last on<img>
instances (#30340 by @gnoff) - Javascript URLs are replaced with functions that throw errors (#26507, #29808 by @sebmarkbage and @kassens)
- Treat toggle and beforetoggle as discrete events (#29176 by @eps1lon)
- Filter out empty
src
andhref
attributes (unless for<a href=”” />
) (#18513, #28124 by @bvaughn and @eps1lon) - Fix unitless
scale
style property (#25601 by @JonnyBurger) - Fix
onChange
error message for controlled<select>
(#27740 by @Biki-das) - Fix focus restore in child windows after element reorder (#30951 by @ling1726)
- Remove
render
,hydrate
,findDOMNode
,unmountComponentAtNode
,unstable_createEventHandle
,unstable_renderSubtreeIntoContainer
, andunstable_runWithPriority
. MovecreateRoot
andhydrateRoot
toreact-dom/client
. (#28271 by @gnoff) - Remove
test-utils
(#28541 by @eps1lon) - Remove
unstable_flushControlled
(#26397 by @kassens) - Remove legacy mode (#28468 by @gnoff)
- Remove
renderToStaticNodeStream()
(#28873 by @gnoff) - Remove
unstable_renderSubtreeIntoContainer
(#29771 by @kassens)
React DOM Server
- Stable release of React Server Components (Many, many PRs by @sebmarkbage, @acdlite, @gnoff, @sammy-SC, @gaearon, @sophiebits, @unstubbable, @lubieowoce)
- Support Server Actions (#26124, #26632, #27459 by @sebmarkbage and @acdlite)
- Changes to SSR
- Add external runtime which bootstraps hydration on the client for binary transparency (#25437, #26169, #25499 by @MofeiZ and @acdlite)
- Support subresource integrity for
bootstrapScripts
andbootstrapModules
(#25104 by @gnoff) - Fix null bytes written at text chunk boundaries (#26228 by @sophiebits)
- Fix logic around attribute serialization (#26526 by @gnoff)
- Fix precomputed chunk cleared on Node 18 (#25645 by @feedthejim)
- Optimize end tag chunks (#27522 by @yujunjung)
- Gracefully handle suspending in DOM configs (#26768 by @sebmarkbage)
- Check for nullish values on ReactCustomFormAction (#26770 by @sebmarkbage)
- Preload
bootstrapModules
,bootstrapScripts
, and update priority queue (#26754, #26753, #27190, #27189 by @gnoff) - Client render the nearest child or parent suspense boundary if replay errors or is aborted (#27386 by @sebmarkbage)
- Don't bail out of flushing if we still have pending root tasks (#27385 by @sebmarkbage)
- Ensure Resumable State is Serializable (#27388 by @sebmarkbage)
- Remove extra render pass when reverting to client render (#26445 by @acdlite)
- Fix unwinding context during selective hydration (#25876 by @tyao1)
- Stop flowing and then abort if a stream is cancelled (#27405 by @sebmarkbage)
- Pass cancellation reason to abort (#27536 by @sebmarkbage)
- Add
onHeaders
entrypoint option (#27641, #27712 by @gnoff) - Escape
<style>
and<script>
textContent to enable rendering inner content without dangerouslySetInnerHTML (#28870, #28871 by @gnoff) - Fallback to client replaying actions for Blob serialization (#28987 by @sebmarkbage)
- Render Suspense fallback if boundary contains new stylesheet during sync update (#28965 by @gnoff)
- Fix header length tracking (#30327 by @gnoff)
- Use
srcset
to trigger load event on mount (#30351 by @gnoff) - Don't perform work when closing stream (#30497 by @gnoff)
- Allow aborting during render (#30488, #30730 by @gnoff)
- Start initial work immediately (#31079 by @gnoff)
- A transition flowing into a dehydrated boundary no longer suspends when showing fallback (#27230 by @acdlite)
- Fix selective hydration triggers false update loop error (#27439 by @acdlite)
- Warn for Child Iterator of all types but allow Generator Components (#28853 by @sebmarkbage)
- Include regular stack trace in serialized errors (#28684, #28738 by @sebmarkbage)
- Aborting early no longer infinitely suspends (#24751 by @sebmarkbage)
- Fix hydration warning suppression in text comparisons (#24784 by @gnoff)
- Changes to error handling in SSR
- Add diffs to hydration warnings (#28502, #28512 by @sebmarkbage)
- Make Error creation lazy (#24728 by @sebmarkbage)
- Remove recoverable error when a sync update flows into a dehydrated boundary (#25692 by @sebmarkbage)
- Don't "fix up" mismatched text content with suppressedHydrationWarning (#26391 by @sebmarkbage)
- Fix component stacks in errors (#27456 by @sebmarkbage)
- Add component stacks to
onError
(#27761, #27850 by @gnoff and @sebmarkbage) - Throw hydration mismatch errors once (#28502 by @sebmarkbage)
- Add Bun streaming server renderer (#25597 by @colinhacks)
- Add nonce support to bootstrap scripts (#26738 by @danieltott)
- Add
crossorigin
support to bootstrap scripts (#26844 by @HenriqueLimas) - Support
nonce
andfetchpriority
in preload links (#26826 by @liuyenwei) - Add
referrerPolicy
toReactDOM.preload()
(#27096 by @styfle) - Add server condition for
react/jsx-dev-runtime
(#28921 by @himself65) - Export version (#29596 by @unstubbable)
- Rename the secret export of Client and Server internals (#28786, #28789 by @sebmarkbage)
- Remove layout effect warning on server (#26395 by @rickhanlonii)
- Remove
errorInfo.digest
fromonRecoverableError
(#28222 by @gnoff)
ReactTestRenderer
- Add deprecation error to
react-test-renderer
on web (#27903, #28904 by @jackpope and @acdlite) - Render with ConcurrentRoot on web (#28498 by @jackpope)
- Remove
react-test-renderer/shallow
export (#25475, #28497 by @sebmarkbage and @jackpope)
React Reconciler
- Enable suspending commits without blocking render (#26398, #26427 by @acdlite)
- Remove
prepareUpdate
(#26583, #27409 by @sebmarkbage and @sophiebits)
React-Is
- Enable tree shaking (#27701 by @markerikson)
- Remove
isConcurrentMode
andisAsyncMode
methods (#28224 by @gaearon)
useSyncExternalStore
- Remove React internals access (#29868 by @phryneas)
- Fix stale selectors keeping previous store references (#25969 by @jellevoost)
facebook/react (react-dom)
v19.1.0
v19.0.0
Below is a list of all new features, APIs, deprecations, and breaking changes. Read React 19 release post and React 19 upgrade guide for more information.
Note: To help make the upgrade to React 19 easier, we’ve published a react@18.3 release that is identical to 18.2 but adds warnings for deprecated APIs and other changes that are needed for React 19. We recommend upgrading to React 18.3.1 first to help identify any issues before upgrading to React 19.
New Features
React
- Actions:
startTransition
can now accept async functions. Functions passed tostartTransition
are called “Actions”. A given Transition can include one or more Actions which update state in the background and update the UI with one commit. In addition to updating state, Actions can now perform side effects including async requests, and the Action will wait for the work to finish before finishing the Transition. This feature allows Transitions to include side effects likefetch()
in the pending st
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 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.

This PR contains the following updates:
Package | Change | Age | Adoption | Passing | Confidence |
---|---|---|---|---|---|
@sveltejs/vite-plugin-svelte (source) | ^5.0.3 -> ^5.1.0 |
||||
@vitejs/plugin-react (source) | ^4.5.0 -> ^4.5.2 |
||||
cheerio (source) | 1.0.0 -> 1.1.0 |
||||
linkedom | ^0.18.10 -> ^0.18.11 |
||||
preact (source) | ^10.26.8 -> ^10.26.9 |
||||
svelte (source) | ^5.33.14 -> ^5.34.1 |
Release Notes
sveltejs/vite-plugin-svelte (@sveltejs/vite-plugin-svelte)
v5.1.0
Minor Changes
- scope css to js module to enable treeshaking scoped css from unused components. Requires vite 6.2 and svelte 5.26 (#1092)
Patch Changes
- add
svelte > clsx
to optimizeDeps.include to avoid page reload when using vite6 and npm (#1124)
vitejs/vite-plugin-react (@vitejs/plugin-react)
v4.5.2
Suggest @vitejs/plugin-react-oxc
if rolldown-vite is detected #491
Emit a log which recommends @vitejs/plugin-react-oxc
when rolldown-vite
is detected to improve performance and use Oxc under the hood. The warning can be disabled by setting disableOxcRecommendation: false
in the plugin options.
Use optimizeDeps.rollupOptions
instead of optimizeDeps.esbuildOptions
for rolldown-vite #489
This suppresses the warning about optimizeDeps.esbuildOptions
being deprecated in rolldown-vite.
Add Vite 7-beta to peerDependencies range #497
React plugins are compatible with Vite 7, this removes the warning when testing the beta.
cheeriojs/cheerio (cheerio)
v1.1.0
What's Changed
- fix(attributes): support
.prop
on document nodes by @fb55 in https://github.com/cheeriojs/cheerio/pull/4320 - fix(types): fix ExtractedValue type by @ben-tilden in https://github.com/cheeriojs/cheerio/pull/4334
- Add a field
browser
topackage.json
root by @UNIDY2002 in https://github.com/cheeriojs/cheerio/pull/4033 - Upgraded dependencies
Doc Improvements
- docs(blog): fix loading documents url by @TonyRL in https://github.com/cheeriojs/cheerio/pull/4002
- docs: fix function load() link by @ya-luotao in https://github.com/cheeriojs/cheerio/pull/4013
- docs: correct loadBuffer() name in example by @arichardsmith in https://github.com/cheeriojs/cheerio/pull/4270
- Update attr setter jsdoc by @thyming in https://github.com/cheeriojs/cheerio/pull/4469
- docs: use code block for install, mention yarn and bun by @Electroid in https://github.com/cheeriojs/cheerio/pull/4454
- docs: Replace
.html
with.prop
for outerHTML by @fb55 in https://github.com/cheeriojs/cheerio/pull/4321
New Contributors
- @TonyRL made their first contribution in https://github.com/cheeriojs/cheerio/pull/4002
- @ya-luotao made their first contribution in https://github.com/cheeriojs/cheerio/pull/4013
- @arichardsmith made their first contribution in https://github.com/cheeriojs/cheerio/pull/4270
- @UNIDY2002 made their first contribution in https://github.com/cheeriojs/cheerio/pull/4033
- @AzeemSup made their first contribution in https://github.com/cheeriojs/cheerio/pull/4189
- @ben-tilden made their first contribution in https://github.com/cheeriojs/cheerio/pull/4334
- @Electroid made their first contribution in https://github.com/cheeriojs/cheerio/pull/4454
- @thyming made their first contribution in https://github.com/cheeriojs/cheerio/pull/4469
Full Changelog: cheeriojs/cheerio@v1.0.0...v1.1.0
preactjs/preact (preact)
v10.26.9
Fixes
- Export
test-utils
from compat by @rawrmonstar in https://github.com/preactjs/preact/pull/4783 - Escape
style
object value inprecompile
transform by @marvinhagemeister in https://github.com/preactjs/preact/pull/4795 - Fix signal attribute values not working with
precompile
transform by @marvinhagemeister in https://github.com/preactjs/preact/pull/4798
Maintenance
- Bump
browserslist
by @rschristian in https://github.com/preactjs/preact/pull/4785 - Avoid caching so file-saves work first try by @JoviDeCroock in https://github.com/preactjs/preact/pull/4786
- Make previous benchmark results not required by @marvinhagemeister in https://github.com/preactjs/preact/pull/4796
- Point release workflow to 10.x by @marvinhagemeister in https://github.com/preactjs/preact/pull/4797
sveltejs/svelte (svelte)
v5.34.1
Patch Changes
- fix: correctly tag private class state fields (#16132)
v5.34.0
Minor Changes
- feat: add source name logging to
$inspect.trace
(#16060)
Patch Changes
-
fix: add
command
andcommandfor
toHTMLButtonAttributes
(#16117) -
fix: better
$inspect.trace()
output (#16131) -
fix: properly hydrate dynamic css props components and remove element removal (#16118)
v5.33.19
Patch Changes
- fix: reset
is_flushing
ifflushSync
is called and there's no scheduled effect (#16119)
v5.33.18
Patch Changes
v5.33.17
Patch Changes
- chore: update acorn parser
ecmaVersion
to parse import attributes (#16098)
v5.33.16
Patch Changes
-
fix: visit expression when destructuring state declarations (#16081)
-
fix: move xmlns attribute from SVGAttributes to to DOMAttributes (#16080)
v5.33.15
Patch Changes
- fix: invoke parent boundary of deriveds that throw (#16091)
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
Updates compiler and reactivates some view transition e2e tests
Fixes withastro/compiler#1079
Testing
Reactivates skipped view transition e2e tests
Docs
n.a.: bug fix.

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
astro@5.9.1
Patch Changes
-
#13899
7a1303d
Thanks @reknih! - Fix bug where error pages would return invalid bodies if the upstream response was compressed -
#13902
051bc30
Thanks @arHSM! - Fixes a bug where vite virtual module ids were incorrectly added in the dev server -
#13905
81f71ca
Thanks @jsparkdev! - Fixes wrong contents in CSP meta tag. -
#13907
8246bcc
Thanks @martrapp! - Fixes a bug that caused view transition names to be lost. -
#13901
37fa0a2
Thanks @ansg191! - fix fallback not being removed when server island is rendered

Changes
Fixed a bug where the script source and style source were reversed.
Testing
should pass
Docs
N/A

Changes
fixes #13879
Converts \0virtual:module.css
to /@id/__x00__virtual:module.css
, this is the direct reversal of the unwrapId
function in core/utils.ts
Testing
The vite-virtual-modules
e2e test has been added.
This tests if the dev server response contains style
and script
tags with proper data-vite-dev-id
and src
values respectively.
Docs
This is a correctness change in the internal vite-astro-server plugin which does not have public facing documentation.

Changes
- Fixes fallback not being removed/deleted when server island is rendered.
- Fixes #13895
Testing
- Tested locally
- Added E2E test to check that fallback does not exist after server island renders
Docs
Bugfix, no new features or changes
Description
- Adds Fomr to showcase sites

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
astro@5.9.0
Minor Changes
-
#13802
0eafe14
Thanks @ematipico! - Adds experimental Content Security Policy (CSP) supportCSP is an important feature to provide fine-grained control over resources that can or cannot be downloaded and executed by a document. In particular, it can help protect against cross-site scripting (XSS) attacks.
Enabling this feature adds additional security to Astro's handling of processed and bundled scripts and styles by default, and allows you to further configure these, and additional, content types. This new experimental feature has been designed to work in every Astro rendering environment (static pages, dynamic pages and single page applications), while giving you maximum flexibility and with type-safety in mind.
It is compatible with most of Astro's features such as client islands, and server islands, although Astro's view transitions using the
<ClientRouter />
are not yet fully supported. Inline scripts are not supported out of the box, but you can provide your own hashes for external and inline scripts.To enable this feature, add the experimental flag in your Astro config:
// astro.config.mjs import { defineConfig } from 'astro/config'; export default defineConfig({ experimental: { csp: true, }, });
For more information on enabling and using this feature in your project, see the Experimental CSP docs.
For a complete overview, and to give feedback on this experimental API, see the Content Security Policy RFC.
-
#13850
1766d22
Thanks @ascorbic! - Provides a Markdown renderer to content loadersWhen creating a content loader, you will now have access to a
renderMarkdown
function that allows you to render Markdown content directly within your loaders. It uses the same settings and plugins as the renderer used for Markdown files in Astro, and follows any Markdown settings you have configured in your Astro project.This allows you to render Markdown content from various sources, such as a CMS or other data sources, directly in your loaders without needing to preprocess the Markdown content separately.
import type { Loader } from 'astro/loaders'; import { loadFromCMS } from './cms'; export function myLoader(settings): Loader { return { name: 'my-loader', async load({ renderMarkdown, store }) { const entries = await loadFromCMS(); store.clear(); for (const entry of entries) { // Assume each entry has a 'content' field with markdown content store.set(entry.id, { id: entry.id, data: entry, rendered: await renderMarkdown(entry.content), }); } }, }; }
The return value of
renderMarkdown
is an object with two properties:html
andmetadata
. These match therendered
property of content entries in content collections, so you can use them to render the content in your components or pages.--- import { getEntry, render } from 'astro:content'; const entry = await getEntry('my-collection', Astro.params.id); const { Content } = await render(entry); --- <Content />
For more information, see the Content Loader API docs.
-
#13887
62f0668
Thanks @yanthomasdev! - Adds an option for integration authors to suppress adapter warning/errors insupportedAstroFeatures
. This is useful when either an warning/error isn't applicable in a specific context or the default one might conflict and confuse users.To do so, you can add
suppress: "all"
(to suppress both the default and custom message) orsuppress: "default"
(to only suppress the default one):setAdapter({ name: 'my-astro-integration', supportedAstroFeatures: { staticOutput: 'stable', hybridOutput: 'stable', sharpImageService: { support: 'limited', message: "The sharp image service isn't available in the deploy environment, but will be used by prerendered pages on build.", suppress: 'default', }, }, });
For more information, see the Adapter API reference docs.
@astrojs/cloudflare@12.5.4
Patch Changes
-
#13817
b7258f1
Thanks @yanthomasdev! - Clarifies and reduces a few logs when starting the dev server with@astrojs/cloudflare
.Warnings about sharp support will now be suppressed when you have explicitly set an
imageService
option. -
Updated dependencies []:
- @astrojs/underscore-redirects@0.6.1

Resurrection of #13842

This PR contains the following updates:
Package | Change | Age | Adoption | Passing | Confidence |
---|---|---|---|---|---|
@netlify/blobs | ^8.2.0 -> ^9.1.5 |
||||
@netlify/functions | ^3.1.5 -> ^4.1.2 |
||||
execa | ^8.0.1 -> ^9.6.0 |
||||
express (source) | ^4.21.2 -> ^5.1.0 |
Release Notes
sindresorhus/execa (execa)
v9.6.0
- Update dependencies
d49104a
v9.5.3
v9.5.2
Bug fixes
- Fix escaping newlines inside template strings. Thanks @aarondandy! (#1176)
v9.5.1
Bug fixes
- Fix odd characters being printed in
verbose
mode on Windows (thanks @IIIMADDINIII). (#1167)
v9.5.0
Features
- When redirecting
stdout
orstderr
to a file, allow appending instead of overwriting. (#1166)
await execa({stdout: {file: 'output.txt', append: true}})`npm run build`;
v9.4.1
Bug fixes
v9.4.0
Features
- We've created a separate package called nano-spawn. It is similar to Execa but with fewer features, for a much smaller package size. More info.
Bug fixes
- Both
execaNode()
and thepreferLocal
option modify thePATH
environment variable. This release includes some minor improvements to ensure that environment variable remains small (https://github.com/sindresorhus/npm-run-path/pull/20). It also handles a few related edge cases better (https://github.com/sindresorhus/npm-run-path/pull/21).
Documentation
- Small documentation typo fix, thanks @rrthomas! (#1153)
v9.3.1
Thanks @holic and @jimhigson for your contributions!
Bugs
- Do not crash when using a custom Node.js binary without ICU support. (#1144)
Bugs (types)
- Fix type of the
env
option. It was currently failing for Remix or Next.js users. (by @holic) (#1141)
Documentation
- Fix typo in "Inputs" documentation. (by @jimhigson) (#1145)
- Document how to terminate hanging subprocesses. (#1140)
- Document how to add custom logging. (#1131)
v9.3.0
Features
- The
verbose
option can now be a function to customize logging. (#1130)
v9.2.0
This release includes a new set of methods to exchange messages between the current process and a Node.js subprocess, also known as "IPC". This allows passing and returning almost any message type to/from a Node.js subprocess. Also, debugging IPC is now much easier.
Moreover, a new gracefulCancel
option has also been added to terminate a subprocess gracefully.
For a deeper dive-in, please check and share the release post!
Thanks @iiroj for your contribution, @SimonSiefke and @adymorz for reporting the bugs fixed in this release, and @karlhorky for improving the documentation!
Deprecations
- Passing
'ipc'
to thestdio
option has been deprecated. It will be removed in the next major release. Instead, theipc: true
option should be used. (#1056)
- await execa('npm', ['run', 'build'], {stdio: ['pipe', 'pipe', 'pipe', 'ipc']});
+ await execa('npm', ['run', 'build'], {ipc: true});
- The
execaCommand()
method has been deprecated. It will be removed in the next major release. If most cases, the template string syntax should be used instead.
- import {execaCommand} from 'execa';
+ import {execa} from 'execa';
- await execaCommand('npm run build');
+ await execa`npm run build`;
const taskName = 'build';
- await execaCommand(`npm run ${taskName}`);
+ await execa`npm run ${taskName}`;
const commandArguments = ['run', 'task with space'];
await execa`npm ${commandArguments}`;
If the file and/or multiple arguments are supplied as a single string, parseCommandString(command) can split that string into an array. More info. (#1054)
- import {execaCommand} from 'execa';
+ import {execa, parseCommandString} from 'execa';
const commandString = 'npm run task';
- await execaCommand(commandString);
+ const commandArray = parseCommandString(commandString); // ['npm', 'run', 'task']
+ await execa`${commandArray}`;
// Or alternatively:
const [file, ...commandArguments] = commandArray;
await execa(file, commandArguments);
Features
- Add
gracefulCancel
option andgetCancelSignal()
method to terminate a subprocess gracefully.error.isGracefullyCanceled
was also added. (#1109) - Add
error.isForcefullyTerminated
. It istrue
when the subprocess was terminated by theforceKillAfterDelay
option. (#1111) - New methods to simplify exchanging messages between the current process and the subprocess. More info. (#1059, #1061, #1076, #1077, #1079, #1082, #1083, #1086, #1087, #1088, #1089, #1090, #1091, #1092, #1094, #1095, #1098, #1104, #1107)
- The current process sends messages with
subprocess.sendMessage(message)
and receives them withsubprocess.getOneMessage()
.subprocess.getEachMessage()
listens to multiple messages. - The subprocess uses
sendMessage(message)
,getOneMessage()
andgetEachMessage()
instead. Those are the same methods, but imported directly from the'execa'
module.
- The current process sends messages with
- The
ipcInput
option sends an IPC message from the current process to the subprocess as it starts. This enables passing almost any input type to a Node.js subprocess. (#1068) - The
result.ipcOutput
array contains all the IPC messages sent by the subprocess to the current process. This enables returning almost any output type from a Node.js subprocess. (#1067, #1071, #1075) - The error message now contains every IPC message sent by the subprocess. (#1067)
- The
verbose: 'full'
option now logs every IPC message sent by the subprocess, for debugging. More info here and there. (#1063)
Types
- Add
ExecaMethod
,ExecaNodeMethod
andExecaScriptMethod
,ExecaSyncMethod
andExecaScriptSyncMethod
types. (#1066) - Export the
Message
type, for IPC. (#1059) - Fix type of
forceKillAfterDelay: true
option. (#1116)
Bug fixes
- Fix passing a
{file}
to both thestdin
and thestdout
orstderr
options. (#1058) - Fix multiple minor problems with the
cancelSignal
option. (#1108) - Fix accidental publishing of Vim backup files. (#1074)
- Fix
engines.node
field inpackage.json
. Supported Node.js version is^18.19.0
or>=20.5.0
. (by @iiroj) (#1101)
v9.1.0
Features (types)
- Export
TemplateExpression
type. (#1049)
v9.0.2
Bug fixes (types)
- Do not require using
--lib dom
for TypeScript users (#1043, #1044) - Fix type of the
reject
option (#1046)
v9.0.1
Bug fixes (types)
- Fix types not being importable (#1033)
3bdab60
- Fix complexity bug with types (#1037)
6cc519b
- Fix complexity bug with types (#1035)
fee011d
v9.0.0
This major release brings many important features including:
- Split the output into lines, or progressively iterate over them.
- Transform or filter the input/output using simple functions.
- Print the output to the terminal while still retrieving it programmatically.
- Redirect the input/output from/to a file.
- Advanced piping between multiple subprocesses.
- Improved verbose mode, for debugging.
- More detailed errors, including when terminating subprocesses.
- Enhanced template string syntax.
- Global/shared options.
- Web streams and Transform streams support.
- Convert the subprocess to a stream.
- New documentation with many examples.
Please check the release post for a high-level overview! For the full list of breaking changes, features and bug fixes, please read below.
Thanks @younggglcy, @koshic, @am0o0 and @codesmith-emmy for your help!
One of the maintainers @ehmicky is looking for a remote full-time position. Specialized in Node.js back-ends and CLIs, he led Netlify Build, Plugins and Configuration for 2.5 years. Feel free to contact him on his website or on LinkedIn!
Breaking changes (not types)
-
Dropped support for Node.js version
<18.19.0
and20.0.0 - 20.4.0
. (834e372
) -
When the
encoding
option is'buffer'
, the output (result.stdout
,result.stderr
,result.all
) is now anUint8Array
instead of aBuffer
. For more information, see this blog post. (by @younggglcy) (#586)
const {stdout} = await execa('node', ['file.js'], {encoding: 'buffer'});
console.log(stdout); // This is now an Uint8Array
- await execa('node', ['file.js'], {encoding: null});
+ await execa('node', ['file.js'], {encoding: 'buffer'});
- await execa('node', ['file.js'], {encoding: 'utf-8'});
+ await execa('node', ['file.js'], {encoding: 'utf8'});
- await execa('node', ['file.js'], {encoding: 'UTF8'});
+ await execa('node', ['file.js'], {encoding: 'utf8'});
- await execa('node', ['file.js'], {encoding: 'utf-16le'});
+ await execa('node', ['file.js'], {encoding: 'utf16le'});
- await execa('node', ['file.js'], {encoding: 'ucs2'});
+ await execa('node', ['file.js'], {encoding: 'utf16le'});
- await execa('node', ['file.js'], {encoding: 'ucs-2'});
+ await execa('node', ['file.js'], {encoding: 'utf16le'});
- await execa('node', ['file.js'], {encoding: 'binary'});
+ await execa('node', ['file.js'], {encoding: 'latin1'});
- Passing a file path to
subprocess.pipeStdout()
,subprocess.pipeStderr()
andsubprocess.pipeAll()
has been removed. Instead, a{file: './path'}
object should be passed to thestdout
orstderr
option. (#752)
- await execa('node', ['file.js']).pipeStdout('output.txt');
+ await execa('node', ['file.js'], {stdout: {file: 'output.txt'}});
- await execa('node', ['file.js']).pipeStderr('output.txt');
+ await execa('node', ['file.js'], {stderr: {file: 'output.txt'}});
- await execa('node', ['file.js']).pipeAll('output.txt');
+ await execa('node', ['file.js'], {
+ stdout: {file: 'output.txt'},
+ stderr: {file: 'output.txt'},
+});
- Passing a writable stream to
subprocess.pipeStdout()
,subprocess.pipeStderr()
andsubprocess.pipeAll()
has been removed. Instead, the stream should be passed to thestdout
orstderr
option. If the stream does not have a file descriptor,['pipe', stream]
should be passed instead. (#752)
- await execa('node', ['file.js']).pipeStdout(stream);
+ await execa('node', ['file.js'], {stdout: ['pipe', stream]});
- await execa('node', ['file.js']).pipeStderr(stream);
+ await execa('node', ['file.js'], {stderr: ['pipe', stream]});
- await execa('node', ['file.js']).pipeAll(stream);
+ await execa('node', ['file.js'], {
+ stdout: ['pipe', stream],
+ stderr: ['pipe', stream],
+});
- The
subprocess.pipeStdout()
,subprocess.pipeStderr()
andsubprocess.pipeAll()
methods have been renamed tosubprocess.pipe()
. The command and its arguments can be passed tosubprocess.pipe()
directly, without callingexeca()
a second time. Thefrom
piping option can specify'stdout'
(the default value),'stderr'
or'all'
. (#757)
- await execa('node', ['file.js']).pipeStdout(execa('node', ['other.js']));
+ await execa('node', ['file.js']).pipe('node', ['other.js']);
- await execa('node', ['file.js']).pipeStderr(execa('node', ['other.js']));
+ await execa('node', ['file.js']).pipe('node', ['other.js'], {from: 'stderr'});
- await execa('node', ['file.js']).pipeAll(execa('node', ['other.js']));
+ await execa('node', ['file.js']).pipe('node', ['other.js'], {from: 'all'});
- Renamed the
signal
option tocancelSignal
. (#880)
- await execa('node', ['file.js'], {signal: abortController.signal});
+ await execa('node', ['file.js'], {cancelSignal: abortController.signal});
- Renamed
error.killed
toerror.isTerminated
. (#625)
try {
await execa('node', ['file.js']);
} catch (error) {
- if (error.killed) {
+ if (error.isTerminated) {
// ...
}
}
subprocess.cancel()
has been removed. Please use eithersubprocess.kill()
or thecancelSignal
option instead. (#711)
- subprocess.cancel();
+ subprocess.kill();
- Renamed the
forceKillAfterTimeout
option toforceKillAfterDelay
. Also, it is now passed toexeca()
instead ofsubprocess.kill()
. (#714, #723)
- const subprocess = execa('node', ['file.js']);
- subprocess.kill('SIGTERM', {forceKillAfterTimeout: 1000});
+ const subprocess = execa('node', ['file.js'], {forceKillAfterDelay: 1000});
+ subprocess.kill('SIGTERM');
- The
verbose
option is now a string enum instead of a boolean.false
has been renamed to'none'
andtrue
has been renamed to'short'
. (#884)
- await execa('node', ['file.js'], {verbose: false});
+ await execa('node', ['file.js'], {verbose: 'none'});
- await execa('node', ['file.js'], {verbose: true});
+ await execa('node', ['file.js'], {verbose: 'short'});
- The
execPath
option has been renamed tonodePath
. It is now a noop unless thenode
option istrue
. Also, it now works even if thepreferLocal
option isfalse
. (#812, #815)
- await execa('node', ['file.js'], {execPath: './path/to/node'});
+ await execa('node', ['file.js'], {nodePath: './path/to/node'});
- The default value for the
serialization
option is now'advanced'
instead of'json'
. In particular, when callingsubprocess.send(object)
with an object that contains functions or symbols, those were previously silently removed. Now this will throw an exception. (#905)
- subprocess.send({example: true, getExample() {}});
+ subprocess.send({example: true});
- If
subprocess.stdout
,subprocess.stderr
orsubprocess.all
is manually piped, the.pipe()
call must now happen as soon assubprocess
is created. Otherwise, the output at the beginning of the subprocess might be missing. (#658, #747)
const subprocess = execa('node', ['file.js']);
- setTimeout(() => {
subprocess.stdout.pipe(process.stdout);
- }, 0);
- Signals passed to
subprocess.kill()
and to thekillSignal
option cannot be lowercase anymore. (#1025)
- const subprocess = execa('node', ['file.js'], {killSignal: 'sigterm'});
+ const subprocess = execa('node', ['file.js'], {killSignal: 'SIGTERM'});
- subprocess.kill('sigterm');
+ subprocess.kill('SIGTERM');
Features
Execution
- Use the template string syntax with any method (including
execa()
), as opposed to only$
. Conversely,$
can now use the regular array syntax. (#933) - A command's template string can span multiple lines. (#843)
- Share options between multiple calls, or set global options, by using
execa(options)
. (#933, #965) - Pass a file URL (as opposed to a file path string) to
execa()
,execaNode()
, theinputFile
option, thenodePath
option or theshell
option. (#630, #631, #632, #635)
Text lines
- Split the output into text lines by using the
lines
option. (#741, #929, #931, #948, #951, #957) - Subprocess is now an async iterable, iterating over the output lines while the subprocess is running. (#923)
Piping multiple subprocesses
- Simpler syntax: pass the command directly to
subprocess.pipe()
without callingexeca()
. A template string can also be used. (#840, #859, #864) - Wait for both subprocesses to complete. Error handling has been improved too. (#757, #778, #834, #854)
- Retrieve the result of each subprocess (not only the last one) by using
result.pipedFrom
anderror.pipedFrom
. (#834) - Pipe 1 or many subprocesses to 1 or many subprocesses. (#834)
- Pipe subprocesses using other file descriptors than
stdin
/stdout
/stderr
by using thefrom
andto
piping options. (#757, #834, #903, #920) - Cancel piping subprocesses by using the
unpipeSignal
piping option. (#834, #852)
Input/output
- Pass an array with multiple values to the
stdin
,stdout
andstderr
options. For example,stdout: ['inherit', 'pipe']
prints the output to the terminal while still returning it asresult.stdout
. (#643, #765, #941, #954) - Redirect the input/output from/to a file by passing a
{file: './path'}
object or a file URL to thestdin
,stdout
orstderr
option. (#610, #614, #621, #671, #1004) - Transform or filter the input/output by passing a generator function to the
stdin
,stdout
orstderr
option. (#693, #697, #698, #699, #709, #736, #737, #739, #740, #746, #748, #755, #756, #780, #783, #867, #915, #916, #917, #919, #924, #926, #945, #969) - Provide some binary input by passing an
Uint8Array
to theinput
orstdin
option. (834e372
, #670, #1029) - Provide some progressive input by passing a sync/async iterable to the
stdin
option. (#604, #944) - Provide multiple inputs by combining the
stdin
,input
andinputFile
options. (#666) - Return other file descriptors than
result.stdout
andresult.stderr
by usingresult.stdio
. (#676) - Specify different values for
stdout
andstderr
with the following options:verbose
,lines
,stripFinalNewline
,maxBuffer
,buffer
. (#966, #970, #971, #972, #973, #974)
Streams
- Redirect the input/output from/to a web stream by passing a
ReadableStream
orWritableStream
to thestdin
,stdout
orstderr
option. (#615, #619, #645) - Transform or filter the input/output by passing a
Duplex
, Node.jsTransform
or webTransformStream
to thestdin
,stdout
orstderr
option. (#937, #938) - Convert the subprocess to a stream by using
subprocess.readable()
,subprocess.writable()
orsubprocess.duplex()
. (#912, #922, #958)
Verbose mode
- Print the subprocess' completion, duration and errors with the
verbose: 'short'
orverbose: 'full'
option. (#887, #890) - Print the subprocess' output with the
verbose: 'full'
option. (#884, #950, #962, #990) - Prettier formatting and colors with the
verbose
option. (#883, #893, #894)
Debugging
- Retrieve the subprocess' duration by using
result.durationMs
anderror.durationMs
. (#896) - Retrieve the subprocess' current directory by using
result.cwd
. Previously onlyerror.cwd
was available. Also,result.cwd
anderror.cwd
are now normalized to absolute file paths. (#803) - Printing
result.escapedCommand
in a terminal is now safe. (#875)
Errors
- The
ExecaError
andExecaSyncError
classes are now exported. (#911) - Find the subprocess failure's root cause by using
error.cause
. (#911) - Know whether the subprocess failed due to the
maxBuffer
option by usingerror.isMaxBuffer
. (#963) - Improved
error.message
:error.stdout
anderror.stderr
are now interleaved if theall
option istrue
. Additional file descriptors are now printed too. Also, the formatting has been improved. (#676, #705, #991, #992) - Control characters in
error.message
are now escaped, so they don't result in visual bugs when printed in a terminal. (#879) - Improved stack trace when an
error
event is emitted onsubprocess.stdout
orsubprocess.stderr
. (#814)
Termination
- Specify an error message or stack trace when terminating a subprocess by passing an error instance to
subprocess.kill()
. (#811, #836, #1023) - The
forceKillAfterDelay
andkillSignal
options now apply to terminations due not only tosubprocess.kill()
but also to thecancelSignal
,timeout
,maxBuffer
andcleanup
options. (#714, #728)
Node.js files
- Use the
nodePath
andnodeOptions
options with any method, as opposed to onlyexecaNode()
, by passing thenode: true
option. (#804, #812, #815) - When using
execaNode()
or thenode: true
option, the current Node.js version is now inherited deeply. If the subprocess spawns other subprocesses, they will all use the same Node.js version. (#812, #815, #1011)
Synchronous execution
- Use the
all
andbuffer: false
options withexecaSync()
, as opposed to onlyexeca()
. (#953, #956) - Added the
$.s
alias for$.sync
. (#594)
Inter-process communication
- Use the
ipc: true
option, as opposed to the more verbosestdio: ['pipe', 'pipe', 'pipe', 'ipc']
option. (#794)
Input validation
- Improved the validation of the
input
,timeout
,cwd
,detached
,cancelSignal
andencoding
options. (#668, #715, #803, #928, #940) - Improved the validation of the arguments passed to
execa()
and the other exported methods. (#838, #873, #899) - Improved the validation of signals passed to
subprocess.kill()
and to thekillSignal
option. (#1025)
Bug fixes
- Fixed passing
undefined
values as options. This now uses the option's default value. (#712) - Fixed the process crashing when the
inputFile
option points to a missing file. (#609) - Fixed the process crashing when the
buffer
option isfalse
andsubprocess.stdout
errors. (#729) - Fixed the process crashing when passing
'overlapped'
to thestdout
orstderr
option withexecaSync()
. (#949) - Fixed the process crashing when multiple
'error'
events are emitted on the subprocess. (#790) - Fixed the
reject: false
option not being used when the subprocess fails to spawn. (#734) - Fixed some inaccuracies with
error.isTerminated
. (#625, #719)- It is now
true
when the subprocess fails due to thetimeout
option. - It is now
true
when callingprocess.kill(subprocess.pid)
, except on Windows. - It is now
false
when using non-terminating signals such assubprocess.kill(0)
.
- It is now
- Fixed missing
error.signal
anderror.signalDescription
when the subprocess is terminated by thecancelSignal
option. (#724) - Fixed a situation where the error returned by an
execa()
call might be modified by anotherexeca()
call. (#796, #806, #911) - Fixed the
verbose
option printing the command in the wrong order. (#600) - Fixed using both the
maxBuffer
andencoding
options. For example, when usingencoding: 'hex'
,maxBuffer
will now be measured in hexadecimal characters. Also,error.stdout
,error.stderr
anderror.all
were previously not applying themaxBuffer
option. (#652, #696) - Fixed the
maxBuffer
option not truncatingresult.stdout
andresult.stderr
when usingexecaSync()
. (#960) - Fixed empty output when using the
buffer: true
option (its default value) and iterating oversubprocess.stdout
orsubprocess.stderr
. ([#908
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 | Adoption | Passing | Confidence |
---|---|---|---|---|---|
@preact/signals (source) | ^2.0.5 -> ^2.2.0 |
||||
@types/react (source) | ^18.3.22 -> ^18.3.23 |
||||
@vitejs/plugin-react (source) | ^4.5.0 -> ^4.5.1 |
||||
@vue/compiler-sfc (source) | ^3.5.15 -> ^3.5.16 |
||||
preact (source) | ^10.26.7 -> ^10.26.8 |
||||
svelte (source) | ^5.33.2 -> ^5.33.14 |
||||
vue (source) | ^3.5.15 -> ^3.5.16 |
Release Notes
preactjs/signals (@preact/signals)
v2.2.0
Minor Changes
- #634
62bed44
Thanks @JoviDeCroock! - Add an option to specify a watched/unwatched callback to a signal
Patch Changes
v2.1.1
Patch Changes
- #684
a34eab2
Thanks @JoviDeCroock! - Ensure we build the thing
v2.1.0
Minor Changes
- #683
4b585a5
Thanks @JoviDeCroock! - Provide@preact/signals/utils
package with some helpers to make working with signals easier in Preact
vitejs/vite-plugin-react (@vitejs/plugin-react)
v4.5.1
Add explicit semicolon in preambleCode #485
This fixes an edge case when using HTML minifiers that strips line breaks aggressively.
preactjs/preact (preact)
v10.26.8
Fixes
- Fix defaultProps applying on null values (#4775, thanks @JoviDeCroock)
sveltejs/svelte (svelte)
v5.33.14
Patch Changes
-
Revert "feat: enable TS autocomplete for Svelte HTML element definitions" (#16063)
-
fix: destructuring snippet arguments (#16068)
v5.33.13
Patch Changes
- fix: avoid recursion error in
EachBlock
visitor (#16058)
v5.33.12
Patch Changes
- fix: correctly transform reassignments to class fields in SSR mode (#16051)
v5.33.11
Patch Changes
- fix: treat transitive dependencies of each blocks as mutable in legacy mode if item is mutated (#16038)
v5.33.10
Patch Changes
- fix: use
fill: 'forwards'
on transition animations to prevent flicker (#16035)
v5.33.9
Patch Changes
- fix: put expressions in effects unless known to be static (#15792)
v5.33.8
Patch Changes
- fix: only
select_option
if'value'
is innext
(#16032)
v5.33.7
Patch Changes
- fix:
bind:value
to select with stores (#16028)
v5.33.6
Patch Changes
-
fix: falsy attachments on components (#16021)
-
fix: correctly mark elements as selected during SSR (#16017)
v5.33.5
Patch Changes
-
fix: handle derived destructured iterators (#16015)
-
fix: avoid rerunning attachments when unrelated spread attributes change (#15961)
v5.33.4
Patch Changes
-
fix: narrow
defaultChecked
to boolean (#16009) -
fix: warn when using rest or identifier in custom elements without props option (#16003)
v5.33.3
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
Apply the image best practices described in the docs to hero images of examples/blog
:
- update the blog schema to change heroImage type from string to image
- move the placeholder images from
/public
to/src/assets
- update the sample blog posts' frontmatter with the new heroImage paths
- update the templates to use the
<Image />
component for hero images - update the about page hero image
Testing
These changes were applied in GitHub Codespaces and tested by running pnpm --filter @example/blog run test
.
Docs
These changes make the hero images in the blog example comply with the practices recommended in the existing documentation. I don't think a documentation update is needed.
Last fetched: | Scheduled refresh: Every Saturday
See Customizing GitHub Activity Pages to configure your own
Inspired by prs.atinux.com