diff options
Diffstat (limited to 'packages/astro/src')
-rw-r--r-- | packages/astro/src/@types/astro.ts | 67 | ||||
-rw-r--r-- | packages/astro/src/adapter-ssg/index.ts | 23 | ||||
-rw-r--r-- | packages/astro/src/cli/index.ts | 4 | ||||
-rw-r--r-- | packages/astro/src/core/add/index.ts | 14 | ||||
-rw-r--r-- | packages/astro/src/core/build/generate.ts | 6 | ||||
-rw-r--r-- | packages/astro/src/core/build/index.ts | 24 | ||||
-rw-r--r-- | packages/astro/src/core/build/page-data.ts | 6 | ||||
-rw-r--r-- | packages/astro/src/core/build/static-build.ts | 32 | ||||
-rw-r--r-- | packages/astro/src/core/build/vite-plugin-pages.ts | 3 | ||||
-rw-r--r-- | packages/astro/src/core/config.ts | 42 | ||||
-rw-r--r-- | packages/astro/src/core/endpoint/dev/index.ts | 3 | ||||
-rw-r--r-- | packages/astro/src/core/logger/node.ts | 1 | ||||
-rw-r--r-- | packages/astro/src/core/render/dev/index.ts | 4 | ||||
-rw-r--r-- | packages/astro/src/core/render/result.ts | 1 | ||||
-rw-r--r-- | packages/astro/src/core/request.ts | 2 | ||||
-rw-r--r-- | packages/astro/src/core/util.ts | 11 | ||||
-rw-r--r-- | packages/astro/src/events/session.ts | 2 | ||||
-rw-r--r-- | packages/astro/src/integrations/index.ts | 24 | ||||
-rw-r--r-- | packages/astro/src/vite-plugin-astro-server/index.ts | 6 |
19 files changed, 142 insertions, 133 deletions
diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index de3ad9954..dc437fe36 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -84,7 +84,6 @@ export interface BuildConfig { client: URL; server: URL; serverEntry: string; - staticMode: boolean | undefined; } /** @@ -426,6 +425,50 @@ export interface AstroUserConfig { /** * @docs + * @name adapter + * @typeraw {AstroIntegration} + * @see output + * @description + * + * Deploy to your favorite server, serverless, or edge host with build adapters. Import one of our first-party adapters for [Netlify](https://docs.astro.build/en/guides/deploy/netlify/#adapter-for-ssredge), [Vercel](https://docs.astro.build/en/guides/deploy/vercel/#adapter-for-ssr), and more to engage Astro SSR. + * + * [See our Server-side Rendering guide](https://docs.astro.build/en/guides/server-side-rendering/) for more on SSR, and [our deployment guides](https://docs.astro.build/en/guides/deploy/) for a complete list of hosts. + * + * ```js + * import netlify from '@astrojs/netlify/functions'; + * { + * // Example: Build for Netlify serverless deployment + * adapter: netlify(), + * } + * ``` + */ + adapter?: AstroIntegration; + + /** + * @docs + * @name output + * @type {('static' | 'server')} + * @default `'static'` + * @see adapter + * @description + * + * Specifies the output target for builds. + * + * - 'static' - Building a static site to be deploy to any static host. + * - 'server' - Building an app to be deployed to a host supporting SSR (server-side rendering). + * + * ```js + * import { defineConfig } from 'astro/config'; + * + * export default defineConfig({ + * output: 'static' + * }) + * ``` + */ + output?: 'static' | 'server'; + + /** + * @docs * @kind heading * @name Build Options */ @@ -609,26 +652,6 @@ export interface AstroUserConfig { /** * @docs * @kind heading - * @name Adapter - * @description - * - * Deploy to your favorite server, serverless, or edge host with build adapters. Import one of our first-party adapters for [Netlify](https://docs.astro.build/en/guides/deploy/netlify/#adapter-for-ssredge), [Vercel](https://docs.astro.build/en/guides/deploy/vercel/#adapter-for-ssr), and more to engage Astro SSR. - * - * [See our Server-side Rendering guide](https://docs.astro.build/en/guides/server-side-rendering/) for more on SSR, and [our deployment guides](https://docs.astro.build/en/guides/deploy/) for a complete list of hosts. - * - * ```js - * import netlify from '@astrojs/netlify/functions'; - * { - * // Example: Build for Netlify serverless deployment - * adapter: netlify(), - * } - * ``` - */ - adapter?: AstroIntegration; - - /** - * @docs - * @kind heading * @name Integrations * @description * @@ -747,7 +770,7 @@ export interface AstroConfig extends z.output<typeof AstroConfigSchema> { // This is a more detailed type than zod validation gives us. // TypeScript still confirms zod validation matches this type. integrations: AstroIntegration[]; - adapter?: AstroIntegration; + // Private: // We have a need to pass context based on configured state, // that is different from the user-exposed configuration. diff --git a/packages/astro/src/adapter-ssg/index.ts b/packages/astro/src/adapter-ssg/index.ts deleted file mode 100644 index 703289d8f..000000000 --- a/packages/astro/src/adapter-ssg/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { AstroAdapter, AstroIntegration } from '../@types/astro'; - -export function getAdapter(): AstroAdapter { - return { - name: '@astrojs/ssg', - // This one has no server entrypoint and is mostly just an integration - //serverEntrypoint: '@astrojs/ssg/server.js', - }; -} - -export default function createIntegration(): AstroIntegration { - return { - name: '@astrojs/ssg', - hooks: { - 'astro:config:done': ({ setAdapter }) => { - setAdapter(getAdapter()); - }, - 'astro:build:start': ({ buildConfig }) => { - buildConfig.staticMode = true; - }, - }, - }; -} diff --git a/packages/astro/src/cli/index.ts b/packages/astro/src/cli/index.ts index 27aa7db30..a9e3ebe8e 100644 --- a/packages/astro/src/cli/index.ts +++ b/packages/astro/src/cli/index.ts @@ -132,7 +132,7 @@ async function runCommand(cmd: string, flags: yargs.Arguments) { } } - let { astroConfig, userConfig, userConfigPath } = await openConfig({ cwd: root, flags, cmd }); + let { astroConfig, userConfig, userConfigPath } = await openConfig({ cwd: root, flags, cmd, logging }); telemetry.record(event.eventCliSession(cmd, userConfig, flags)); // Common CLI Commands: @@ -154,7 +154,7 @@ async function runCommand(cmd: string, flags: yargs.Arguments) { watcher.on('add', async function restartServerOnNewConfigFile(addedFile: string) { // if there was not a config before, attempt to resolve if (!userConfigPath && addedFile.includes('astro.config')) { - const addedConfig = await openConfig({ cwd: root, flags, cmd }); + const addedConfig = await openConfig({ cwd: root, flags, cmd, logging }); if (addedConfig.userConfigPath) { info(logging, 'astro', 'Astro config detected. Restarting server...'); astroConfig = addedConfig.astroConfig; diff --git a/packages/astro/src/core/add/index.ts b/packages/astro/src/core/add/index.ts index fe75c42c7..7790a71f0 100644 --- a/packages/astro/src/core/add/index.ts +++ b/packages/astro/src/core/add/index.ts @@ -66,7 +66,7 @@ export default async function add(names: string[], { cwd, flags, logging, teleme ['--yes', 'Accept all prompts.'], ['--help', 'Show this help message.'], ], - 'Example: Add a UI Framework': [ + 'Recommended: UI Frameworks': [ ['react', 'astro add react'], ['preact', 'astro add preact'], ['vue', 'astro add vue'], @@ -74,7 +74,13 @@ export default async function add(names: string[], { cwd, flags, logging, teleme ['solid-js', 'astro add solid-js'], ['lit', 'astro add lit'], ], - 'Example: Add an Integration': [ + 'Recommended: Hosting': [ + ['netlify', 'astro add netlify'], + ['vercel', 'astro add vercel'], + ['cloudflare', 'astro add cloudflare'], + ['deno', 'astro add deno'], + ], + 'Recommended: Integrations': [ ['tailwind', 'astro add tailwind'], ['partytown', 'astro add partytown'], ['sitemap', 'astro add sitemap'], @@ -85,9 +91,7 @@ export default async function add(names: string[], { cwd, flags, logging, teleme ['deno', 'astro add deno'], ], }, - description: `Check out the full integration catalog: ${cyan( - 'https://astro.build/integrations' - )}`, + description: `For more integrations, check out: ${cyan('https://astro.build/integrations')}`, }); return; } diff --git a/packages/astro/src/core/build/generate.ts b/packages/astro/src/core/build/generate.ts index 55cd4e8c1..876736e76 100644 --- a/packages/astro/src/core/build/generate.ts +++ b/packages/astro/src/core/build/generate.ts @@ -18,7 +18,7 @@ import { debug, info } from '../logger/core.js'; import { render } from '../render/core.js'; import { createLinkStylesheetElementSet, createModuleScriptsSet } from '../render/ssr-element.js'; import { createRequest } from '../request.js'; -import { getOutputFilename, isBuildingToSSR } from '../util.js'; +import { getOutputFilename } from '../util.js'; import { getOutFile, getOutFolder } from './common.js'; import { eachPageData, getPageDataByComponent } from './internal.js'; import type { PageBuildData, SingleFileBuiltModule, StaticBuildOptions } from './types'; @@ -97,7 +97,7 @@ export async function generatePages( const timer = performance.now(); info(opts.logging, null, `\n${bgGreen(black(' generating static routes '))}`); - const ssr = isBuildingToSSR(opts.astroConfig); + const ssr = opts.astroConfig.output === 'server'; const serverEntry = opts.buildConfig.serverEntry; const outFolder = ssr ? opts.buildConfig.server : opts.astroConfig.outDir; const ssrEntryURL = new URL('./' + serverEntry + `?time=${Date.now()}`, outFolder); @@ -207,7 +207,7 @@ async function generatePath( } } - const ssr = isBuildingToSSR(opts.astroConfig); + const ssr = opts.astroConfig.output === 'server'; const url = new URL(opts.astroConfig.base + removeLeadingForwardSlash(pathname), origin); const options: RenderOptions = { adapterName: undefined, diff --git a/packages/astro/src/core/build/index.ts b/packages/astro/src/core/build/index.ts index f35e2d12f..41b18556a 100644 --- a/packages/astro/src/core/build/index.ts +++ b/packages/astro/src/core/build/index.ts @@ -1,5 +1,11 @@ import type { AstroTelemetry } from '@astrojs/telemetry'; -import type { AstroConfig, BuildConfig, ManifestData, RuntimeMode } from '../../@types/astro'; +import type { + AstroAdapter, + AstroConfig, + BuildConfig, + ManifestData, + RuntimeMode, +} from '../../@types/astro'; import type { LogOptions } from '../logger/core'; import fs from 'fs'; @@ -18,7 +24,7 @@ import { debug, info, levels, timerMessage } from '../logger/core.js'; import { apply as applyPolyfill } from '../polyfill.js'; import { RouteCache } from '../render/route-cache.js'; import { createRouteManifest } from '../routing/index.js'; -import { createSafeError, isBuildingToSSR } from '../util.js'; +import { createSafeError } from '../util.js'; import { collectPagesData } from './page-data.js'; import { staticBuild } from './static-build.js'; import { getTimeStat } from './util.js'; @@ -98,11 +104,14 @@ class AstroBuilder { client: new URL('./client/', this.config.outDir), server: new URL('./server/', this.config.outDir), serverEntry: 'entry.mjs', - staticMode: undefined, }; await runHookBuildStart({ config: this.config, buildConfig }); - info(this.logging, 'build', 'Collecting build information...'); + info(this.logging, 'build', `output target: ${colors.green(this.config.output)}`); + if (this.config._ctx.adapter) { + info(this.logging, 'build', `deploy adapter: ${colors.green(this.config._ctx.adapter.name)}`); + } + info(this.logging, 'build', 'Collecting build info...'); this.timer.loadStart = performance.now(); const { assets, allPages } = await collectPagesData({ astroConfig: this.config, @@ -111,7 +120,7 @@ class AstroBuilder { origin, routeCache: this.routeCache, viteServer, - ssr: isBuildingToSSR(this.config), + ssr: this.config.output === 'server', }); debug('build', timerMessage('All pages loaded', this.timer.loadStart)); @@ -168,12 +177,11 @@ class AstroBuilder { }); if (this.logging.level && levels[this.logging.level] <= levels['info']) { - const buildMode = isBuildingToSSR(this.config) ? 'ssr' : 'static'; await this.printStats({ logging: this.logging, timeStart: this.timer.init, pageCount: pageNames.length, - buildMode, + buildMode: this.config.output, }); } } @@ -198,7 +206,7 @@ class AstroBuilder { logging: LogOptions; timeStart: number; pageCount: number; - buildMode: 'static' | 'ssr'; + buildMode: 'static' | 'server'; }) { const total = getTimeStat(timeStart, performance.now()); diff --git a/packages/astro/src/core/build/page-data.ts b/packages/astro/src/core/build/page-data.ts index 23fb0283d..74c1e45aa 100644 --- a/packages/astro/src/core/build/page-data.ts +++ b/packages/astro/src/core/build/page-data.ts @@ -10,7 +10,6 @@ import { debug } from '../logger/core.js'; import { removeTrailingForwardSlash } from '../path.js'; import { callGetStaticPaths, RouteCache, RouteCacheEntry } from '../render/route-cache.js'; import { matchRoute } from '../routing/match.js'; -import { isBuildingToSSR } from '../util.js'; export interface CollectPagesDataOptions { astroConfig: AstroConfig; @@ -36,9 +35,6 @@ export async function collectPagesData( const assets: Record<string, string> = {}; const allPages: AllPagesData = {}; const builtPaths = new Set<string>(); - - const buildMode = isBuildingToSSR(astroConfig) ? 'ssr' : 'static'; - const dataCollectionLogTimeout = setInterval(() => { info(opts.logging, 'build', 'The data collection step may take longer for larger projects...'); clearInterval(dataCollectionLogTimeout); @@ -72,7 +68,7 @@ export async function collectPagesData( }; clearInterval(routeCollectionLogTimeout); - if (buildMode === 'static') { + if (astroConfig.output === 'static') { const html = `${route.pathname}`.replace(/\/?$/, '/index.html'); debug( 'build', diff --git a/packages/astro/src/core/build/static-build.ts b/packages/astro/src/core/build/static-build.ts index 33acb7161..931285eee 100644 --- a/packages/astro/src/core/build/static-build.ts +++ b/packages/astro/src/core/build/static-build.ts @@ -6,12 +6,11 @@ import { fileURLToPath } from 'url'; import * as vite from 'vite'; import { BuildInternals, createBuildInternals } from '../../core/build/internal.js'; import { prependForwardSlash } from '../../core/path.js'; -import { emptyDir, removeDir } from '../../core/util.js'; +import { emptyDir, removeDir, isModeServerWithNoAdapter } from '../../core/util.js'; import { runHookBuildSetup } from '../../integrations/index.js'; import { rollupPluginAstroBuildCSS } from '../../vite-plugin-build-css/index.js'; import type { ViteConfigWithSSR } from '../create-vite'; import { info } from '../logger/core.js'; -import { isBuildingToSSR } from '../util.js'; import { generatePages } from './generate.js'; import { trackPageData } from './internal.js'; import type { PageBuildData, StaticBuildOptions } from './types'; @@ -25,6 +24,21 @@ import { injectManifest, vitePluginSSR } from './vite-plugin-ssr.js'; export async function staticBuild(opts: StaticBuildOptions) { const { allPages, astroConfig } = opts; + // Verify this app is buildable. + if(isModeServerWithNoAdapter(opts.astroConfig)) { + throw new Error(`Cannot use \`output: 'server'\` without an adapter. +Install and configure the appropriate server adapter for your final deployment. +Example: + + // astro.config.js + import netlify from '@astrojs/netlify'; + export default { + output: 'server', + adapter: netlify(), + } +`) + } + // The pages to be built for rendering purposes. const pageInput = new Set<string>(); @@ -60,9 +74,7 @@ export async function staticBuild(opts: StaticBuildOptions) { info( opts.logging, 'build', - isBuildingToSSR(astroConfig) - ? 'Building SSR entrypoints...' - : 'Building entrypoints for prerendering...' + `Building ${astroConfig.output} entrypoints...` ); const ssrResult = (await ssrBuild(opts, internals, pageInput)) as RollupOutput; info(opts.logging, 'build', dim(`Completed in ${getTimeStat(timer.ssr, performance.now())}.`)); @@ -83,7 +95,7 @@ export async function staticBuild(opts: StaticBuildOptions) { await clientBuild(opts, internals, clientInput); timer.generate = performance.now(); - if (opts.buildConfig.staticMode) { + if (astroConfig.output === 'static') { try { await generatePages(ssrResult, opts, internals, facadeIdToPageDataMap); } finally { @@ -100,7 +112,7 @@ export async function staticBuild(opts: StaticBuildOptions) { async function ssrBuild(opts: StaticBuildOptions, internals: BuildInternals, input: Set<string>) { const { astroConfig, viteConfig } = opts; - const ssr = isBuildingToSSR(astroConfig); + const ssr = astroConfig.output === 'server'; const out = ssr ? opts.buildConfig.server : astroConfig.outDir; const viteBuildConfig: ViteConfigWithSSR = { @@ -144,7 +156,7 @@ async function ssrBuild(opts: StaticBuildOptions, internals: BuildInternals, inp }), ...(viteConfig.plugins || []), // SSR needs to be last - isBuildingToSSR(opts.astroConfig) && vitePluginSSR(internals, opts.astroConfig._ctx.adapter!), + opts.astroConfig.output === 'server' && vitePluginSSR(internals, opts.astroConfig._ctx.adapter!), vitePluginAnalyzer(opts.astroConfig, internals), ], publicDir: ssr ? false : viteConfig.publicDir, @@ -174,7 +186,7 @@ async function clientBuild( ) { const { astroConfig, viteConfig } = opts; const timer = performance.now(); - const ssr = isBuildingToSSR(astroConfig); + const ssr = astroConfig.output === 'server'; const out = ssr ? opts.buildConfig.client : astroConfig.outDir; // Nothing to do if there is no client-side JS. @@ -275,7 +287,7 @@ async function copyFiles(fromFolder: URL, toFolder: URL) { async function ssrMoveAssets(opts: StaticBuildOptions) { info(opts.logging, 'build', 'Rearranging server assets...'); - const serverRoot = opts.buildConfig.staticMode + const serverRoot = opts.astroConfig.output === 'static' ? opts.buildConfig.client : opts.buildConfig.server; const clientRoot = opts.buildConfig.client; diff --git a/packages/astro/src/core/build/vite-plugin-pages.ts b/packages/astro/src/core/build/vite-plugin-pages.ts index 1158d69be..ceaf87eeb 100644 --- a/packages/astro/src/core/build/vite-plugin-pages.ts +++ b/packages/astro/src/core/build/vite-plugin-pages.ts @@ -1,6 +1,5 @@ import type { Plugin as VitePlugin } from 'vite'; import { pagesVirtualModuleId, resolvedPagesVirtualModuleId } from '../app/index.js'; -import { isBuildingToSSR } from '../util.js'; import { addRollupInput } from './add-rollup-input.js'; import type { BuildInternals } from './internal.js'; import { eachPageData } from './internal.js'; @@ -11,7 +10,7 @@ export function vitePluginPages(opts: StaticBuildOptions, internals: BuildIntern name: '@astro/plugin-build-pages', options(options) { - if (!isBuildingToSSR(opts.astroConfig)) { + if (opts.astroConfig.output === 'static') { return addRollupInput(options, [pagesVirtualModuleId]); } }, diff --git a/packages/astro/src/core/config.ts b/packages/astro/src/core/config.ts index ff6b1557c..86cf10a54 100644 --- a/packages/astro/src/core/config.ts +++ b/packages/astro/src/core/config.ts @@ -15,6 +15,7 @@ import { mergeConfig as mergeViteConfig } from 'vite'; import { z } from 'zod'; import { appendForwardSlash, prependForwardSlash, trimSlashes } from './path.js'; import { arraify, isObject } from './util.js'; +import { LogOptions, warn } from './logger/core.js'; load.use([loadTypeScript]); @@ -92,7 +93,6 @@ export const LEGACY_ASTRO_CONFIG_KEYS = new Set([ ]); export const AstroConfigSchema = z.object({ - adapter: z.object({ name: z.string(), hooks: z.object({}).passthrough().default({}) }).optional(), root: z .string() .optional() @@ -127,6 +127,19 @@ export const AstroConfigSchema = z.object({ .union([z.literal('always'), z.literal('never'), z.literal('ignore')]) .optional() .default(ASTRO_CONFIG_DEFAULTS.trailingSlash), + output: z + .union([z.literal('static'), z.literal('server')]) + .optional() + .default('static'), + adapter: z.object({ name: z.string(), hooks: z.object({}).passthrough().default({}) }).optional(), + integrations: z.preprocess( + // preprocess + (val) => (Array.isArray(val) ? val.flat(Infinity).filter(Boolean) : val), + // validate + z + .array(z.object({ name: z.string(), hooks: z.object({}).passthrough().default({}) })) + .default(ASTRO_CONFIG_DEFAULTS.integrations) + ), build: z .object({ format: z @@ -153,14 +166,6 @@ export const AstroConfigSchema = z.object({ .optional() .default({}) ), - integrations: z.preprocess( - // preprocess - (val) => (Array.isArray(val) ? val.flat(Infinity).filter(Boolean) : val), - // validate - z - .array(z.object({ name: z.string(), hooks: z.object({}).passthrough().default({}) })) - .default(ASTRO_CONFIG_DEFAULTS.integrations) - ), style: z .object({ postcss: z @@ -227,7 +232,8 @@ export const AstroConfigSchema = z.object({ export async function validateConfig( userConfig: any, root: string, - cmd: string + cmd: string, + logging: LogOptions ): Promise<AstroConfig> { const fileProtocolRoot = pathToFileURL(root + path.sep); // Manual deprecation checks @@ -388,6 +394,7 @@ interface LoadConfigOptions { flags?: Flags; cmd: string; validate?: boolean; + logging: LogOptions; } /** @@ -459,7 +466,13 @@ export async function openConfig(configOptions: LoadConfigOptions): Promise<Open userConfig = config.value; userConfigPath = config.filePath; } - const astroConfig = await resolveConfig(userConfig, root, flags, configOptions.cmd); + const astroConfig = await resolveConfig( + userConfig, + root, + flags, + configOptions.cmd, + configOptions.logging + ); return { astroConfig, @@ -505,7 +518,7 @@ export async function loadConfig(configOptions: LoadConfigOptions): Promise<Astr if (config) { userConfig = config.value; } - return resolveConfig(userConfig, root, flags, configOptions.cmd); + return resolveConfig(userConfig, root, flags, configOptions.cmd, configOptions.logging); } /** Attempt to resolve an Astro configuration object. Normalize, validate, and return. */ @@ -513,10 +526,11 @@ export async function resolveConfig( userConfig: AstroUserConfig, root: string, flags: CLIFlags = {}, - cmd: string + cmd: string, + logging: LogOptions ): Promise<AstroConfig> { const mergedConfig = mergeCLIFlags(userConfig, flags, cmd); - const validatedConfig = await validateConfig(mergedConfig, root, cmd); + const validatedConfig = await validateConfig(mergedConfig, root, cmd, logging); return validatedConfig; } diff --git a/packages/astro/src/core/endpoint/dev/index.ts b/packages/astro/src/core/endpoint/dev/index.ts index 1e7abe8df..342c9a4f4 100644 --- a/packages/astro/src/core/endpoint/dev/index.ts +++ b/packages/astro/src/core/endpoint/dev/index.ts @@ -1,13 +1,12 @@ import type { EndpointHandler } from '../../../@types/astro'; import type { SSROptions } from '../../render/dev'; import { preload } from '../../render/dev/index.js'; -import { isBuildingToSSR } from '../../util.js'; import { call as callEndpoint } from '../index.js'; export async function call(ssrOpts: SSROptions) { const [, mod] = await preload(ssrOpts); return await callEndpoint(mod as unknown as EndpointHandler, { ...ssrOpts, - ssr: isBuildingToSSR(ssrOpts.astroConfig), + ssr: ssrOpts.astroConfig.output === 'server', }); } diff --git a/packages/astro/src/core/logger/node.ts b/packages/astro/src/core/logger/node.ts index b655b2631..23bb2e8bc 100644 --- a/packages/astro/src/core/logger/node.ts +++ b/packages/astro/src/core/logger/node.ts @@ -125,7 +125,6 @@ export const logger = { }; export function enableVerboseLogging() { - //debugPackage.enable('*,-babel'); debug('cli', '--verbose flag enabled! Enabling: DEBUG="*,-babel"'); debug( 'cli', diff --git a/packages/astro/src/core/render/dev/index.ts b/packages/astro/src/core/render/dev/index.ts index df0d13177..a6643fc35 100644 --- a/packages/astro/src/core/render/dev/index.ts +++ b/packages/astro/src/core/render/dev/index.ts @@ -11,7 +11,7 @@ import type { } from '../../../@types/astro'; import { prependForwardSlash } from '../../../core/path.js'; import { LogOptions } from '../../logger/core.js'; -import { isBuildingToSSR, isPage } from '../../util.js'; +import { isPage } from '../../util.js'; import { render as coreRender } from '../core.js'; import { RouteCache } from '../route-cache.js'; import { collectMdMetadata } from '../util.js'; @@ -194,7 +194,7 @@ export async function render( route, routeCache, site: astroConfig.site ? new URL(astroConfig.base, astroConfig.site).toString() : undefined, - ssr: isBuildingToSSR(astroConfig), + ssr: astroConfig.output === 'server', streaming: true, }); diff --git a/packages/astro/src/core/render/result.ts b/packages/astro/src/core/render/result.ts index 6e5da1d69..e6aab55b3 100644 --- a/packages/astro/src/core/render/result.ts +++ b/packages/astro/src/core/render/result.ts @@ -116,6 +116,7 @@ export function createResult(args: CreateResultArgs): SSRResult { const headers = new Headers(); if (args.streaming) { headers.set('Transfer-Encoding', 'chunked'); + headers.set('Content-Type', 'text/html'); } else { headers.set('Content-Type', 'text/html'); } diff --git a/packages/astro/src/core/request.ts b/packages/astro/src/core/request.ts index 59d8acae9..24356983f 100644 --- a/packages/astro/src/core/request.ts +++ b/packages/astro/src/core/request.ts @@ -56,7 +56,7 @@ export function createRequest({ warn( logging, 'ssg', - `Headers are not exposed in static-site generation (SSG) mode. To enable reading headers you need to set an SSR adapter in your config.` + `Headers are not exposed in static (SSG) output mode. To enable headers: set \`output: "server"\` in your config file.` ); return _headers; }, diff --git a/packages/astro/src/core/util.ts b/packages/astro/src/core/util.ts index 76c2c310a..4ba0a7286 100644 --- a/packages/astro/src/core/util.ts +++ b/packages/astro/src/core/util.ts @@ -182,15 +182,8 @@ export function isPage(file: URL, config: AstroConfig): boolean { return endsWithPageExt(file, config); } -export function isBuildingToSSR(config: AstroConfig): boolean { - const adapter = config._ctx.adapter; - if (!adapter) return false; - - if (typeof adapter.serverEntrypoint === 'string') { - return true; - } else { - return false; - } +export function isModeServerWithNoAdapter(config: AstroConfig): boolean { + return config.output === 'server' && !config._ctx.adapter; } export function emoji(char: string, fallback: string) { diff --git a/packages/astro/src/events/session.ts b/packages/astro/src/events/session.ts index 3fc3be723..f2c26d980 100644 --- a/packages/astro/src/events/session.ts +++ b/packages/astro/src/events/session.ts @@ -1,6 +1,4 @@ -import { createRequire } from 'node:module'; import type { AstroUserConfig } from '../@types/astro'; -const require = createRequire(import.meta.url); const EVENT_SESSION = 'ASTRO_CLI_SESSION_STARTED'; diff --git a/packages/astro/src/integrations/index.ts b/packages/astro/src/integrations/index.ts index d13d05d52..a005b62b6 100644 --- a/packages/astro/src/integrations/index.ts +++ b/packages/astro/src/integrations/index.ts @@ -7,12 +7,10 @@ import { HookParameters, RouteData, } from '../@types/astro.js'; -import ssgAdapter from '../adapter-ssg/index.js'; import type { SerializedSSRManifest } from '../core/app/types'; import type { PageBuildData } from '../core/build/types'; import { mergeConfig } from '../core/config.js'; import type { ViteConfigWithSSR } from '../core/create-vite.js'; -import { isBuildingToSSR } from '../core/util.js'; export async function runHookConfigSetup({ config: _config, @@ -21,8 +19,9 @@ export async function runHookConfigSetup({ config: AstroConfig; command: 'dev' | 'build'; }): Promise<AstroConfig> { + // An adapter is an integration, so if one is provided push it. if (_config.adapter) { - _config.integrations.push(_config.adapter); + _config.integrations.push(_config.adapter); } let updatedConfig: AstroConfig = { ..._config }; @@ -80,7 +79,7 @@ export async function runHookConfigDone({ config }: { config: AstroConfig }) { setAdapter(adapter) { if (config._ctx.adapter && config._ctx.adapter.name !== adapter.name) { throw new Error( - `Adapter already set to ${config._ctx.adapter.name}. You can only have one adapter.` + `Integration "${integration.name}" conflicts with "${config._ctx.adapter.name}". You can only configure one deployment integration.` ); } config._ctx.adapter = adapter; @@ -88,22 +87,9 @@ export async function runHookConfigDone({ config }: { config: AstroConfig }) { }); } } - // Call the default adapter - if (!config._ctx.adapter) { - const integration = ssgAdapter(); - config.integrations.push(integration); - if (integration?.hooks?.['astro:config:done']) { - await integration.hooks['astro:config:done']({ - config, - setAdapter(adapter) { - config._ctx.adapter = adapter; - }, - }); - } - } } -export async function runHookServerSetup({ +export async function runHookServerSetup({ config, server, }: { @@ -203,7 +189,7 @@ export async function runHookBuildDone({ pages: string[]; routes: RouteData[]; }) { - const dir = isBuildingToSSR(config) ? buildConfig.client : config.outDir; + const dir = config.output === 'server' ? buildConfig.client : config.outDir; for (const integration of config.integrations) { if (integration?.hooks?.['astro:build:done']) { diff --git a/packages/astro/src/vite-plugin-astro-server/index.ts b/packages/astro/src/vite-plugin-astro-server/index.ts index 86012991e..3449b7d3a 100644 --- a/packages/astro/src/vite-plugin-astro-server/index.ts +++ b/packages/astro/src/vite-plugin-astro-server/index.ts @@ -20,7 +20,7 @@ import { preload, ssr } from '../core/render/dev/index.js'; import { RouteCache } from '../core/render/route-cache.js'; import { createRequest } from '../core/request.js'; import { createRouteManifest, matchRoute } from '../core/routing/index.js'; -import { createSafeError, isBuildingToSSR, resolvePages } from '../core/util.js'; +import { createSafeError, resolvePages } from '../core/util.js'; import notFoundTemplate, { subpathNotUsedTemplate } from '../template/4xx.js'; interface AstroPluginOptions { @@ -205,7 +205,7 @@ async function handleRequest( ) { const reqStart = performance.now(); const origin = `${viteServer.config.server.https ? 'https' : 'http'}://${req.headers.host}`; - const buildingToSSR = isBuildingToSSR(config); + const buildingToSSR = config.output === 'server'; // Ignore `.html` extensions and `index.html` in request URLS to ensure that // routing behavior matches production builds. This supports both file and directory // build formats, and is necessary based on how the manifest tracks build targets. @@ -276,7 +276,7 @@ async function handleRequest( routeCache, pathname: pathname, logging, - ssr: isBuildingToSSR(config), + ssr: config.output === 'server', }); if (paramsAndPropsRes === GetParamsAndPropsError.NoMatchingStaticPath) { warn( |