Minor Changes
-
#10935
ddd8e49
Thanks @bluwy! - Exportsastro/jsx/rehype.js
with utilities to generate an Astro metadata object -
#10625
698c2d9
Thanks @goulvenclech! - Adds the ability for multiple pages to use the same component as anentrypoint
when building an Astro integration. This change is purely internal, and aligns the build process with the behaviour in the development server. -
#10906
7bbd664
Thanks @Princesseuh! - Adds a new radio checkbox component to the dev toolbar UI library (astro-dev-toolbar-radio-checkbox
) -
#10963
61f47a6
Thanks @delucis! - Adds support for passing an inline Astro configuration object togetViteConfig()
If you are using
getViteConfig()
to configure the Vitest test runner, you can now pass a second argument to control how Astro is configured. This makes it possible to configure unit tests with different Astro options when using Vitest’s workspaces feature.// vitest.config.ts import { getViteConfig } from 'astro/config'; export default getViteConfig( /* Vite configuration */ { test: {} }, /* Astro configuration */ { site: 'https://example.com', trailingSlash: 'never', } );
-
#10867
47877a7
Thanks @ematipico! - Adds experimental rewriting in Astro with a newrewrite()
function and the middlewarenext()
function.The feature is available via an experimental flag in
astro.config.mjs
:export default defineConfig({ experimental: { rewriting: true, }, });
When enabled, you can use
rewrite()
to render another page without changing the URL of the browser in Astro pages and endpoints.--- // src/pages/dashboard.astro if (!Astro.props.allowed) { return Astro.rewrite('/'); } ---
// src/pages/api.js export function GET(ctx) { if (!ctx.locals.allowed) { return ctx.rewrite('/'); } }
The middleware
next()
function now accepts a parameter with the same type as therewrite()
function. For example, withnext("/")
, you can call the next middleware function with a newRequest
.// src/middleware.js export function onRequest(ctx, next) { if (!ctx.cookies.get('allowed')) { return next('/'); // new signature } return next(); }
NOTE: please read the RFC to understand the current expectations of the new APIs.
-
#10858
c0c509b
Thanks @bholmesdev! - Adds experimental support for the Actions API. Actions let you define type-safe endpoints you can query from client components with progressive enhancement built in.Actions help you write type-safe backend functions you can call from anywhere. Enable server rendering using the
output
property and add theactions
flag to theexperimental
object:{ output: 'hybrid', // or 'server' experimental: { actions: true, }, }
Declare all your actions in
src/actions/index.ts
. This file is the global actions handler.Define an action using the
defineAction()
utility from theastro:actions
module. These accept thehandler
property to define your server-side request handler. If your action accepts arguments, apply theinput
property to validate parameters with Zod.This example defines two actions:
like
andcomment
. Thelike
action accepts a JSON object with apostId
string, while thecomment
action accepts FormData withpostId
,author
, andbody
strings. Eachhandler
updates your database and return a type-safe response.// src/actions/index.ts import { defineAction, z } from 'astro:actions'; export const server = { like: defineAction({ input: z.object({ postId: z.string() }), handler: async ({ postId }, context) => { // update likes in db return likes; }, }), comment: defineAction({ accept: 'form', input: z.object({ postId: z.string(), body: z.string(), }), handler: async ({ postId }, context) => { // insert comments in db return comment; }, }), };
Then, call an action from your client components using the
actions
object fromastro:actions
. You can pass a type-safe object when using JSON, or a FormData object when usingaccept: 'form'
in your action definition:// src/components/blog.tsx import { actions } from 'astro:actions'; import { useState } from 'preact/hooks'; export function Like({ postId }: { postId: string }) { const [likes, setLikes] = useState(0); return ( <button onClick={async () => { const newLikes = await actions.like({ postId }); setLikes(newLikes); }} > {likes} likes </button> ); } export function Comment({ postId }: { postId: string }) { return ( <form onSubmit={async (e) => { e.preventDefault(); const formData = new FormData(e.target); const result = await actions.blog.comment(formData); // handle result }} > <input type="hidden" name="postId" value={postId} /> <label for="author">Author</label> <input id="author" type="text" name="author" /> <textarea rows={10} name="body"></textarea> <button type="submit">Post</button> </form> ); }
For a complete overview, and to give feedback on this experimental API, see the Actions RFC.
-
#10906
7bbd664
Thanks @Princesseuh! - Adds a newbuttonBorderRadius
property to theastro-dev-toolbar-button
component for the dev toolbar component library. This property can be useful to make a fully rounded button with an icon in the center.
Patch Changes
-
#10977
59571e8
Thanks @BryceRussell! - Improve error message when accessingclientAddress
on prerendered routes -
#10935
ddd8e49
Thanks @bluwy! - Improves the error message when failed to render MDX components -
#10917
3412535
Thanks @jakobhellermann! - Fixes a case where the local server would crash when the host also contained the port, eg. withX-Forwarded-Host: hostname:8080
andX-Forwarded-Port: 8080
headers -
#10959
685fc22
Thanks @bluwy! - Refactors internal handling of styles and scripts for content collections to improve build performance -
#10889
4d905cc
Thanks @matthewp! - Preserve content modules properly in cache -
#10955
2978287
Thanks @florian-lefebvre! - HandlesAstroUserError
s thrown while syncing content collections and exportsBaseSchema
andCollectionConfig
types