Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .changeset/full-crews-juggle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
'@astrojs/netlify': minor
'@astrojs/vercel': minor
'@astrojs/node': minor
'astro': minor
---

Stabilizes the adapter feature `experimentalStatiHeaders`. If you were using this feature in any of the supported adapters, you'll need to change the name of the flag:

```diff
export default defineConfig({
adapter: netlify({
- experimentalStaticHeaders: true
+ staticHeaders: true
})
})
```
1 change: 0 additions & 1 deletion examples/minimal/src/pages/index.astro
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
---

---

<html lang="en">
Expand Down
4 changes: 0 additions & 4 deletions packages/astro/src/core/app/dev/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,8 @@ import { getCustom404Route, getCustom500Route } from '../../routing/helpers.js';
import { matchRoute } from '../../routing/dev.js';
import type { RunnablePipeline } from '../../../vite-plugin-app/pipeline.js';

/**
*
*/
export class DevApp extends BaseApp<NonRunnablePipeline> {
logger: Logger;
currentRenderContext: RenderContext | undefined = undefined;
resolvedPathname: string | undefined = undefined;
constructor(manifest: SSRManifest, streaming = true, logger: Logger) {
super(manifest, streaming, logger);
Expand Down
7 changes: 7 additions & 0 deletions packages/astro/src/core/build/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type { SSRManifest } from '../app/types.js';
import type { BuildInternals } from './internal.js';
import { BuildPipeline } from './pipeline.js';
import type { StaticBuildOptions } from './types.js';
import type { CreateRenderContext, RenderContext } from '../render-context.js';

export class BuildApp extends BaseApp<BuildPipeline> {
createPipeline(_streaming: boolean, manifest: SSRManifest, ..._args: any[]): BuildPipeline {
Expand All @@ -11,6 +12,12 @@ export class BuildApp extends BaseApp<BuildPipeline> {
});
}

async createRenderContext(payload: CreateRenderContext): Promise<RenderContext> {
return await super.createRenderContext({
...payload,
});
}

isDev(): boolean {
return true;
}
Expand Down
7 changes: 2 additions & 5 deletions packages/astro/src/core/build/generate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ export async function generatePages(
await runHookBuildGenerated({
settings: options.settings,
logger,
experimentalRouteToHeaders: routeToHeaders,
routeToHeaders,
});
}

Expand Down Expand Up @@ -610,10 +610,7 @@ async function generatePath(
route.distURL = [outFile];
}

if (
settings.adapter?.adapterFeatures?.experimentalStaticHeaders &&
settings.config.security?.csp
) {
if (settings.adapter?.adapterFeatures?.staticHeaders) {
routeToHeaders.set(pathname, { headers: responseHeaders, route: integrationRoute });
}

Expand Down
4 changes: 1 addition & 3 deletions packages/astro/src/core/build/plugins/plugin-manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -280,9 +280,7 @@ async function buildManifest(
];

csp = {
cspDestination: settings.adapter?.adapterFeatures?.experimentalStaticHeaders
? 'adapter'
: undefined,
cspDestination: settings.adapter?.adapterFeatures?.staticHeaders ? 'adapter' : undefined,
scriptHashes,
scriptResources: getScriptResources(settings.config.security.csp),
styleHashes,
Expand Down
6 changes: 3 additions & 3 deletions packages/astro/src/integrations/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -575,11 +575,11 @@ export async function runHookBuildSsr({
export async function runHookBuildGenerated({
settings,
logger,
experimentalRouteToHeaders,
routeToHeaders,
}: {
settings: AstroSettings;
logger: Logger;
experimentalRouteToHeaders: RouteToHeaders;
routeToHeaders: RouteToHeaders;
}) {
const dir =
settings.buildOutput === 'server' ? settings.config.build.client : settings.config.outDir;
Expand All @@ -589,7 +589,7 @@ export async function runHookBuildGenerated({
integration,
hookName: 'astro:build:generated',
logger,
params: () => ({ dir, experimentalRouteToHeaders }),
params: () => ({ dir, routeToHeaders }),
});
}
}
Expand Down
4 changes: 1 addition & 3 deletions packages/astro/src/manifest/serialized.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,7 @@ async function createSerializedManifest(settings: AstroSettings): Promise<Serial

if (shouldTrackCspHashes(settings.config.security.csp)) {
csp = {
cspDestination: settings.adapter?.adapterFeatures?.experimentalStaticHeaders
? 'adapter'
: undefined,
cspDestination: settings.adapter?.adapterFeatures?.staticHeaders ? 'adapter' : undefined,
scriptHashes: getScriptHashes(settings.config.security.csp),
scriptResources: getScriptResources(settings.config.security.csp),
styleHashes: getStyleHashes(settings.config.security.csp),
Expand Down
2 changes: 2 additions & 0 deletions packages/astro/src/runtime/server/render/page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ export async function renderPage(
) {
headers.set('content-security-policy', renderCspContent(result));
}

return new Response(bytes, {
headers,
status: result.response.status,
Expand Down Expand Up @@ -88,6 +89,7 @@ export async function renderPage(
) {
headers.set('content-security-policy', renderCspContent(result));
}

// For non-streaming, convert string to byte array to calculate Content-Length
if (!streaming && typeof body === 'string') {
body = encoder.encode(body);
Expand Down
7 changes: 3 additions & 4 deletions packages/astro/src/types/public/integrations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,9 @@ export interface AstroAdapterFeatures {
* `astro:build:generated` hook, so adapters can consume them and add them inside
* their hosting headers configuration file.
*
* NOTE: the semantics and list of headers might change until the feature
* is out of experimental
* Future features may decide to use this feature to create/add headers for static pages.
*/
experimentalStaticHeaders?: boolean;
staticHeaders?: boolean;
}

/**
Expand Down Expand Up @@ -257,7 +256,7 @@ export interface BaseIntegrationHooks {
'astro:build:generated': (options: {
dir: URL;
logger: AstroIntegrationLogger;
experimentalRouteToHeaders: RouteToHeaders;
routeToHeaders: RouteToHeaders;
}) => void | Promise<void>;
'astro:build:done': (options: {
pages: { pathname: string }[];
Expand Down
7 changes: 5 additions & 2 deletions packages/astro/src/vite-plugin-app/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,16 +87,19 @@
manifestData: RoutesList,
getDebugInfo: () => Promise<string>,
): RunnablePipeline {
return RunnablePipeline.create(manifestData, {
const pipeline = RunnablePipeline.create(manifestData, {
loader,
logger,
manifest,
settings,
getDebugInfo,
});

return pipeline;
}

async createRenderContext(payload: CreateRenderContext): Promise<RenderContext> {
console.log(this.manifest.csp);

Check warning on line 102 in packages/astro/src/vite-plugin-app/app.ts

View workflow job for this annotation

GitHub Actions / Lint

lint/suspicious/noConsole

Don't use console.
this.currentRenderContext = await super.createRenderContext({
...payload,
pathname: this.resolvedPathname ?? payload.pathname,
Expand Down Expand Up @@ -234,7 +237,7 @@
routeData,
clientAddress,
status,
shouldInjectCspMetaTags: false,
shouldInjectCspMetaTags: !!this.manifest.csp,
});
renderContext.props.error = error;
const response = await renderContext.render(preloadedComponent);
Expand Down
42 changes: 28 additions & 14 deletions packages/astro/src/vite-plugin-app/pipeline.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,12 @@ import { createDefaultRoutes } from '../core/routing/default.js';
import { routeIsRedirect } from '../core/routing/index.js';
import { findRouteToRewrite } from '../core/routing/rewrite.js';
import { isPage } from '../core/util.js';
import { resolveIdToUrl } from '../core/viteUtils.js';
import type { AstroSettings, ComponentInstance, RoutesList } from '../types/astro.js';
import type {
AstroSettings,
ComponentInstance,
ImportedDevStyle,
RoutesList,
} from '../types/astro.js';
import type {
DevToolbarMetadata,
RewritePayload,
Expand All @@ -24,7 +28,6 @@ import type {
import { getComponentMetadata } from '../vite-plugin-astro-server/metadata.js';
import { createResolve } from '../vite-plugin-astro-server/resolve.js';
import { PAGE_SCRIPT_ID } from '../vite-plugin-scripts/index.js';
import { getDevCSSModuleName } from '../vite-plugin-css/util.js';

/**
* This Pipeline is used when the Vite SSR environment is runnable.
Expand Down Expand Up @@ -69,7 +72,7 @@ export class RunnablePipeline extends Pipeline {
}

async headElements(routeData: RouteData): Promise<HeadElements> {
const { manifest, loader, runtimeMode, settings } = this;
const { manifest, runtimeMode, settings } = this;
const filePath = new URL(`${routeData.component}`, manifest.rootDir);
const scripts = new Set<SSRElement>();

Expand All @@ -81,15 +84,14 @@ export class RunnablePipeline extends Pipeline {
children: '',
});

if (
settings.config.devToolbar.enabled &&
(await settings.preferences.get('devToolbar.enabled'))
) {
const src = await resolveIdToUrl(
loader,
'astro/runtime/client/dev-toolbar/entrypoint.js',
);
scripts.add({ props: { type: 'module', src }, children: '' });
if (this.manifest.devToolbar.enabled) {
scripts.add({
props: {
type: 'module',
src: '/@id/astro/runtime/client/dev-toolbar/entrypoint.js',
},
children: '',
});

const additionalMetadata: DevToolbarMetadata['__astro_dev_toolbar__'] = {
root: fileURLToPath(settings.config.root),
Expand Down Expand Up @@ -124,7 +126,19 @@ export class RunnablePipeline extends Pipeline {
}
}

const { css } = await loader.import(getDevCSSModuleName(routeData.component));
const { devCSSMap } = await import('virtual:astro:dev-css-all');

const importer = devCSSMap.get(routeData.component);
let css = new Set<ImportedDevStyle>();
if (importer) {
const cssModule = await importer();
css = cssModule.css;
} else {
this.logger.warn(
'assets',
`Unable to find CSS for ${routeData.component}. This is likely a bug in Astro.`,
);
}

// Pass framework CSS in as style tags to be appended to the page.
const links = new Set<SSRElement>();
Expand Down
4 changes: 1 addition & 3 deletions packages/astro/src/vite-plugin-astro-server/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,7 @@ export async function createDevelopmentManifest(settings: AstroSettings): Promis
];

csp = {
cspDestination: settings.adapter?.adapterFeatures?.experimentalStaticHeaders
? 'adapter'
: undefined,
cspDestination: settings.adapter?.adapterFeatures?.staticHeaders ? 'adapter' : undefined,
scriptHashes: getScriptHashes(settings.config.security.csp),
scriptResources: getScriptResources(settings.config.security.csp),
styleHashes,
Expand Down
8 changes: 4 additions & 4 deletions packages/astro/test/test-adapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ export default function ({
},
adapterFeatures: {
buildOutput: 'server',
experimentalStaticHeaders: staticHeaders,
staticHeaders: staticHeaders,
},
...extendAdapter,
});
Expand All @@ -143,9 +143,9 @@ export default function ({
setManifest(manifest);
}
},
'astro:build:generated': ({ experimentalRouteToHeaders }) => {
'astro:build:generated': ({ routeToHeaders }) => {
if (setRouteToHeaders) {
setRouteToHeaders(experimentalRouteToHeaders);
setRouteToHeaders(routeToHeaders);
}
},
},
Expand Down Expand Up @@ -270,7 +270,7 @@ export function selfTestAdapter({
},
adapterFeatures: {
buildOutput: 'server',
experimentalStaticHeaders: staticHeaders,
staticHeaders: staticHeaders,
},
...extendAdapter,
});
Expand Down
10 changes: 5 additions & 5 deletions packages/integrations/netlify/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ export interface NetlifyIntegrationConfig {
* Here the list of the headers that are added:
* - The CSP header of the static pages is added when CSP support is enabled.
*/
experimentalStaticHeaders?: boolean;
staticHeaders?: boolean;

/**
* Netlify features to enable when running `astro dev`. These work best when your site is linked to a Netlify site using `netlify link`.
Expand Down Expand Up @@ -671,15 +671,15 @@ export default function netlifyIntegration(
finalBuildOutput = buildOutput;

const useEdgeMiddleware = integrationConfig?.edgeMiddleware ?? false;
const useStaticHeaders = integrationConfig?.experimentalStaticHeaders ?? false;
const useStaticHeaders = integrationConfig?.staticHeaders ?? false;

setAdapter({
name: '@astrojs/netlify',
serverEntrypoint: '@astrojs/netlify/ssr-function.js',
exports: ['default'],
adapterFeatures: {
edgeMiddleware: useEdgeMiddleware,
experimentalStaticHeaders: useStaticHeaders,
staticHeaders: useStaticHeaders,
},
args: { middlewareSecret } satisfies Args,
supportedAstroFeatures: {
Expand All @@ -703,8 +703,8 @@ export default function netlifyIntegration(
},
});
},
'astro:build:generated': ({ experimentalRouteToHeaders }) => {
staticHeadersMap = experimentalRouteToHeaders;
'astro:build:generated': ({ routeToHeaders }) => {
staticHeadersMap = routeToHeaders;
},
'astro:build:ssr': async ({ middlewareEntryPoint }) => {
astroMiddlewareEntryPoint = middlewareEntryPoint;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { defineConfig } from 'astro/config';
export default defineConfig({
output: 'static',
adapter: netlify({
experimentalStaticHeaders: true
staticHeaders: true
}),
site: "http://example.com",
security: {
Expand Down
8 changes: 4 additions & 4 deletions packages/integrations/node/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export function getAdapter(options: Options): AstroAdapter {
adapterFeatures: {
buildOutput: 'server',
edgeMiddleware: false,
experimentalStaticHeaders: options.experimentalStaticHeaders,
staticHeaders: options.staticHeaders,
},
supportedAstroFeatures: {
hybridOutput: 'stable',
Expand Down Expand Up @@ -92,8 +92,8 @@ export default function createIntegration(userOptions: UserOptions): AstroIntegr
},
});
},
'astro:build:generated': ({ experimentalRouteToHeaders }) => {
_routeToHeaders = experimentalRouteToHeaders;
'astro:build:generated': ({ routeToHeaders }) => {
_routeToHeaders = routeToHeaders;
},
'astro:config:done': ({ setAdapter, config }) => {
_options = {
Expand All @@ -103,7 +103,7 @@ export default function createIntegration(userOptions: UserOptions): AstroIntegr
host: config.server.host,
port: config.server.port,
assets: config.build.assets,
experimentalStaticHeaders: userOptions.experimentalStaticHeaders ?? false,
staticHeaders: userOptions.staticHeaders ?? false,
experimentalErrorPageHost,
};
setAdapter(getAdapter(_options));
Expand Down
Loading