
đż Minor Changes
-
#10974
2668ef9Thanks @florian-lefebvre! - Adds experimental support for theastro:envAPI.The
astro:envAPI lets you configure a type-safe schema for your environment variables, and indicate whether they should be available on the server or the client. Import and use your defined variables from the appropriate/clientor/servermodule:---import { PUBLIC_APP_ID } from 'astro:env/client';import { PUBLIC_API_URL, getSecret } from 'astro:env/server';const API_TOKEN = getSecret('API_TOKEN');const data = await fetch(`${PUBLIC_API_URL}/users`, {method: 'POST',headers: {'Content-Type': 'application/json',Authorization: `Bearer ${API_TOKEN}`,},body: JSON.stringify({ appId: PUBLIC_APP_ID }),});---To define the data type and properties of your environment variables, declare a schema in your Astro config in
experimental.env.schema. TheenvFieldhelper allows you define your variable as a string, number, or boolean and pass properties in an object:astro.config.mjs import { defineConfig, envField } from 'astro/config';export default defineConfig({experimental: {env: {schema: {PUBLIC_API_URL: envField.string({ context: 'client', access: 'public', optional: true }),PUBLIC_PORT: envField.number({ context: 'server', access: 'public', default: 4321 }),API_SECRET: envField.string({ context: 'server', access: 'secret' }),},},},});There are three kinds of environment variables, determined by the combination of
context(clientorserver) andaccess(privateorpublic) settings defined in yourenv.schema:-
Public client variables: These variables end up in both your final client and server bundles, and can be accessed from both client and server through the
astro:env/clientmodule:import { PUBLIC_API_URL } from 'astro:env/client'; -
Public server variables: These variables end up in your final server bundle and can be accessed on the server through the
astro:env/servermodule:import { PUBLIC_PORT } from 'astro:env/server'; -
Secret server variables: These variables are not part of your final bundle and can be accessed on the server through the
getSecret()helper function available from theastro:env/servermodule:import { getSecret } from 'astro:env/server';const API_SECRET = getSecret('API_SECRET'); // typedconst SECRET_NOT_IN_SCHEMA = getSecret('SECRET_NOT_IN_SCHEMA'); // string | undefined
Note: Secret client variables are not supported because there is no safe way to send this data to the client. Therefore, it is not possible to configure both
context: "client"andaccess: "secret"in your schema.To learn more, check out the documentation.
-
đ Patch Changes
-
#11192
58b10a0Thanks @liruifengv! - Improves DX by throwing the originalAstroUserErrorwhen an error is thrown inside a.mdxfile. -
#11136
35ef53cThanks @ematipico! - Errors that are emitted during a rewrite are now bubbled up and shown to the user. A 404 response is not returned anymore. -
#11144
803dd80Thanks @ematipico! - The integration now exposes a function calledgetContainerRenderer, that can be used inside the Container APIs to load the relative renderer.import { experimental_AstroContainer as AstroContainer } from 'astro/container';import ReactWrapper from '../src/components/ReactWrapper.astro';import { loadRenderers } from 'astro:container';import { getContainerRenderer } from '@astrojs/react';test('ReactWrapper with react renderer', async () => {const renderers = await loadRenderers([getContainerRenderer()]);const container = await AstroContainer.create({renderers,});const result = await container.renderToString(ReactWrapper);expect(result).toContain('Counter');expect(result).toContain('Count: <!-- -->5');}); -
#11144
803dd80Thanks @ematipico! - BREAKING CHANGE to the experimental Container API onlyChanges the type of the
renderersoption of theAstroContainer::createfunction and adds a dedicated functionloadRenderers()to load the rendering scripts from renderer integration packages (@astrojs/react,@astrojs/preact,@astrojs/solid-js,@astrojs/svelte,@astrojs/vue,@astrojs/lit, and@astrojs/mdx).You no longer need to know the individual, direct file paths to the client and server rendering scripts for each renderer integration package. Now, there is a dedicated function to load the renderer from each package, which is available from
getContainerRenderer():import { experimental_AstroContainer as AstroContainer } from 'astro/container';import ReactWrapper from '../src/components/ReactWrapper.astro';import { loadRenderers } from "astro:container";import { getContainerRenderer } from "@astrojs/react";test('ReactWrapper with react renderer', async () => {const renderers = await loadRenderers([getContainerRenderer()])const renderers = [{name: '@astrojs/react',clientEntrypoint: '@astrojs/react/client.js',serverEntrypoint: '@astrojs/react/server.js',},];const container = await AstroContainer.create({renderers,});const result = await container.renderToString(ReactWrapper);expect(result).toContain('Counter');expect(result).toContain('Count: <!-- -->5');});The new
loadRenderers()helper function is available fromastro:container, a virtual module that can be used when running the Astro container insidevite. -
#11136
35ef53cThanks @ematipico! - Itâs not possible anymore to useAstro.rewrite("/404")inside static pages. This isnât counterproductive because Astro will end-up emitting a page that contains the HTML of 404 error page.Itâs still possible to use
Astro.rewrite("/404")inside on-demand pages, or pages that opt-out from prerendering. -
#11191
6e29a17Thanks @matthewp! - Fixes a case whereAstro.urlwould be incorrect when havingbuild.formatset to'preserve'in the Astro config -
#11182
40b0b4dThanks @ematipico! - Fixes an issue whereAstro.rewritewasnât carrying over the body of aRequestin on-demand pages. -
#11194
97fbe93Thanks @ematipico! - Fixes an issue where the functiongetViteConfigwasnât returning the correct merged Astro configuration