
đż Minor Changes
-
#10974
2668ef9
Thanks @florian-lefebvre! - Adds experimental support for theastro:env
API.The
astro:env
API 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/client
or/server
module:---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
. TheenvField
helper 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
(client
orserver
) andaccess
(private
orpublic
) 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/client
module: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/server
module: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/server
module: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
58b10a0
Thanks @liruifengv! - Improves DX by throwing the originalAstroUserError
when an error is thrown inside a.mdx
file. -
#11136
35ef53c
Thanks @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
803dd80
Thanks @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
803dd80
Thanks @ematipico! - BREAKING CHANGE to the experimental Container API onlyChanges the type of the
renderers
option of theAstroContainer::create
function 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
35ef53c
Thanks @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
6e29a17
Thanks @matthewp! - Fixes a case whereAstro.url
would be incorrect when havingbuild.format
set to'preserve'
in the Astro config -
#11182
40b0b4d
Thanks @ematipico! - Fixes an issue whereAstro.rewrite
wasnât carrying over the body of aRequest
in on-demand pages. -
#11194
97fbe93
Thanks @ematipico! - Fixes an issue where the functiongetViteConfig
wasnât returning the correct merged Astro configuration