diff --git a/benchmark/packages/adapter/src/server.ts b/benchmark/packages/adapter/src/server.ts index c9cbf65129f2..a53766479081 100644 --- a/benchmark/packages/adapter/src/server.ts +++ b/benchmark/packages/adapter/src/server.ts @@ -22,7 +22,6 @@ class MyApp extends BaseApp { createPipeline(streaming: boolean) { return AppPipeline.create({ - logger: this.logger, manifest: this.manifest, streaming, }); diff --git a/packages/astro/src/cli/preferences/index.ts b/packages/astro/src/cli/preferences/index.ts index dcd8ac301046..7a1318d7bf98 100644 --- a/packages/astro/src/cli/preferences/index.ts +++ b/packages/astro/src/cli/preferences/index.ts @@ -70,7 +70,11 @@ export async function preferences( const inlineConfig = flagsToAstroInlineConfig(flags); const logger = createLoggerFromFlags(flags); const { astroConfig } = await resolveConfig(inlineConfig ?? {}, 'dev'); - const settings = await createSettings(astroConfig, fileURLToPath(astroConfig.root)); + const settings = await createSettings( + astroConfig, + inlineConfig.logLevel, + fileURLToPath(astroConfig.root), + ); const opts: SubcommandOptions = { location: flags.global ? 'global' : undefined, json: !!flags.json, diff --git a/packages/astro/src/config/index.ts b/packages/astro/src/config/index.ts index 0ab184ea32d1..382ab8c51b32 100644 --- a/packages/astro/src/config/index.ts +++ b/packages/astro/src/config/index.ts @@ -46,7 +46,7 @@ export function getViteConfig( ]); const logger = createNodeLogger(inlineAstroConfig); const { astroConfig: config } = await resolveConfig(inlineAstroConfig, cmd); - let settings = await createSettings(config, userViteConfig.root); + let settings = await createSettings(config, inlineAstroConfig.logLevel, userViteConfig.root); settings = await runHookConfigSetup({ settings, command: cmd, logger }); const routesList = await createRoutesList( { diff --git a/packages/astro/src/container/index.ts b/packages/astro/src/container/index.ts index f577c919d3dd..c21f2ee10de1 100644 --- a/packages/astro/src/container/index.ts +++ b/packages/astro/src/container/index.ts @@ -171,6 +171,7 @@ function createManifest( latestAstroVersion: undefined, debugInfoOutput: '', }, + logLevel: 'silent', }; } diff --git a/packages/astro/src/core/app/app.ts b/packages/astro/src/core/app/app.ts index 8c22f993c1d7..2806b1f4162c 100644 --- a/packages/astro/src/core/app/app.ts +++ b/packages/astro/src/core/app/app.ts @@ -4,7 +4,6 @@ import { AppPipeline } from './pipeline.js'; export class App extends BaseApp { createPipeline(streaming: boolean): AppPipeline { return AppPipeline.create({ - logger: this.logger, manifest: this.manifest, streaming, }); diff --git a/packages/astro/src/core/app/base.ts b/packages/astro/src/core/app/base.ts index f8053d1767ec..9bce45bb9698 100644 --- a/packages/astro/src/core/app/base.ts +++ b/packages/astro/src/core/app/base.ts @@ -108,15 +108,16 @@ export abstract class BaseApp

{ pipeline: P; adapterLogger: AstroIntegrationLogger; baseWithoutTrailingSlash: string; - logger = new Logger({ - dest: consoleLogDestination, - level: 'info', - }); + logger: Logger; constructor(manifest: SSRManifest, streaming = true, ...args: any[]) { this.manifest = manifest; this.manifestData = { routes: manifest.routes.map((route) => route.routeData) }; this.baseWithoutTrailingSlash = removeTrailingForwardSlash(manifest.base); this.pipeline = this.createPipeline(streaming, manifest, ...args); + this.logger = new Logger({ + dest: consoleLogDestination, + level: manifest.logLevel, + }); this.adapterLogger = new AstroIntegrationLogger(this.logger.options, manifest.adapterName); // This is necessary to allow running middlewares for 404 in SSR. There's special handling // to return the host 404 if the user doesn't provide a custom 404 diff --git a/packages/astro/src/core/app/entrypoint.ts b/packages/astro/src/core/app/entrypoint.ts index 941e95715d2f..ac454e5e66a6 100644 --- a/packages/astro/src/core/app/entrypoint.ts +++ b/packages/astro/src/core/app/entrypoint.ts @@ -6,7 +6,7 @@ import { createConsoleLogger } from './logging.js'; export function createApp(dev = import.meta.env.DEV): BaseApp { if (dev) { - const logger = createConsoleLogger('debug'); + const logger = createConsoleLogger(manifest.logLevel); return new DevApp(manifest, true, logger); } else { return new App(manifest); diff --git a/packages/astro/src/core/app/pipeline.ts b/packages/astro/src/core/app/pipeline.ts index d574db2653d8..5a1d3ff4411d 100644 --- a/packages/astro/src/core/app/pipeline.ts +++ b/packages/astro/src/core/app/pipeline.ts @@ -11,17 +11,14 @@ import { } from '../render/ssr-element.js'; import { getFallbackRoute, routeIsFallback, routeIsRedirect } from '../routing/index.js'; import { findRouteToRewrite } from '../routing/rewrite.js'; +import { createConsoleLogger } from './logging.js'; export class AppPipeline extends Pipeline { getName(): string { return 'AppPipeline'; } - static create({ - logger, - manifest, - streaming, - }: Pick) { + static create({ manifest, streaming }: Pick) { const resolve = async function resolve(specifier: string) { if (!(specifier in manifest.entryModules)) { throw new Error(`Unable to resolve [${specifier}]`); @@ -33,6 +30,7 @@ export class AppPipeline extends Pipeline { return createAssetLink(bundlePath, manifest.base, manifest.assetsPrefix); } }; + const logger = createConsoleLogger(manifest.logLevel); const pipeline = new AppPipeline( logger, manifest, diff --git a/packages/astro/src/core/app/types.ts b/packages/astro/src/core/app/types.ts index 69e01c90d3ca..c9b3f1b93339 100644 --- a/packages/astro/src/core/app/types.ts +++ b/packages/astro/src/core/app/types.ts @@ -17,6 +17,7 @@ import type { } from '../../types/public/internal.js'; import type { SinglePageBuiltModule } from '../build/types.js'; import type { CspDirective } from '../csp/config.js'; +import type { LoggerLevel } from '../logger/core.js'; import type { SessionDriver } from '../session.js'; import type { RoutingStrategies } from './common.js'; @@ -123,6 +124,7 @@ export type SSRManifest = { debugInfoOutput: string | undefined; }; internalFetchHeaders?: Record; + logLevel: LoggerLevel; }; export type SSRActions = { diff --git a/packages/astro/src/core/build/generate.ts b/packages/astro/src/core/build/generate.ts index 9cadcbe76610..04063ce189bb 100644 --- a/packages/astro/src/core/build/generate.ts +++ b/packages/astro/src/core/build/generate.ts @@ -58,7 +58,10 @@ export async function generatePages( // Grab the manifest and create the pipeline const manifest: SSRManifest = prerenderEntry.manifest; const pipeline = BuildPipeline.create({ internals, manifest, options }); - const { config, logger } = pipeline; + const app = prerenderEntry.app as BaseApp; + + const { config } = pipeline; + const logger = app.logger; // HACK! `astro:assets` relies on a global to know if its running in dev, prod, ssr, ssg, full moon // If we don't delete it here, it's technically not impossible (albeit improbable) for it to leak @@ -72,7 +75,6 @@ export async function generatePages( const pagesToGenerate = pipeline.retrieveRoutesToGenerate(); const routeToHeaders: RouteToHeaders = new Map(); - const app = prerenderEntry.app as BaseApp; if (ssr) { for (const [routeData, _] of pagesToGenerate) { if (routeData.prerender) { @@ -203,7 +205,8 @@ async function generatePage( routeToHeaders: RouteToHeaders, ) { // prepare information we need - const { config, logger } = pipeline; + const logger = app.logger; + const { config } = pipeline; async function generatePathWithLogs( path: string, @@ -214,7 +217,7 @@ async function generatePage( isConcurrent: boolean, ) { const timeStart = performance.now(); - pipeline.logger.debug('build', `Generating: ${path}`); + logger.debug('build', `Generating: ${path}`); const filePath = getOutputFilename(config, path, routeData); const lineIcon = @@ -298,7 +301,8 @@ async function getPathsForRoute( pipeline: BuildPipeline, builtPaths: Set, ): Promise> { - const { logger, options, manifest } = pipeline; + const { options, manifest } = pipeline; + const logger = app.logger; // TODO: investigate if BuildPipeline can be removed. We already have app.pipeline // which contains routeCache and other pipeline data. Eventually all pipeline info // should come from app.pipeline and BuildPipeline can be eliminated. @@ -506,7 +510,8 @@ async function generatePath( integrationRoute: IntegrationResolvedRoute, routeToHeaders: RouteToHeaders, ): Promise { - const { config, logger, options } = pipeline; + const { config, options } = pipeline; + const logger = app.logger; logger.debug('build', `Generating: ${pathname}`); // This adds the page name to the array so it can be shown as part of stats. @@ -548,10 +553,10 @@ async function generatePath( const url = getUrlForPath( pathname, - config.base, + app.manifest.base, options.origin, - config.build.format, - config.trailingSlash, + app.manifest.buildFormat, + app.manifest.trailingSlash, route.type, ); diff --git a/packages/astro/src/core/build/index.ts b/packages/astro/src/core/build/index.ts index 041dadf91dff..7dbf14ccd62a 100644 --- a/packages/astro/src/core/build/index.ts +++ b/packages/astro/src/core/build/index.ts @@ -64,7 +64,11 @@ export default async function build( const { userConfig, astroConfig } = await resolveConfig(inlineConfig, 'build'); telemetry.record(eventCliSession('build', userConfig)); - const settings = await createSettings(astroConfig, fileURLToPath(astroConfig.root)); + const settings = await createSettings( + astroConfig, + inlineConfig.logLevel, + fileURLToPath(astroConfig.root), + ); if (inlineConfig.force) { // isDev is always false, because it's interested in the build command, not the output type diff --git a/packages/astro/src/core/build/plugins/plugin-manifest.ts b/packages/astro/src/core/build/plugins/plugin-manifest.ts index 195e09827cc9..92e17959a5ac 100644 --- a/packages/astro/src/core/build/plugins/plugin-manifest.ts +++ b/packages/astro/src/core/build/plugins/plugin-manifest.ts @@ -368,5 +368,6 @@ async function buildManifest( debugInfoOutput: '', }, internalFetchHeaders, + logLevel: settings.logLevel, }; } diff --git a/packages/astro/src/core/config/settings.ts b/packages/astro/src/core/config/settings.ts index 02a8955fb1d6..b1b150b42a47 100644 --- a/packages/astro/src/core/config/settings.ts +++ b/packages/astro/src/core/config/settings.ts @@ -5,7 +5,7 @@ import toml from 'smol-toml'; import { getContentPaths } from '../../content/index.js'; import createPreferences from '../../preferences/index.js'; import type { AstroSettings } from '../../types/astro.js'; -import type { AstroConfig } from '../../types/public/config.js'; +import type { AstroConfig, AstroInlineConfig } from '../../types/public/config.js'; import { markdownContentEntryType } from '../../vite-plugin-markdown/content-entry-type.js'; import { getDefaultClientDirectives } from '../client-directive/index.js'; import { SUPPORTED_MARKDOWN_FILE_EXTENSIONS } from './../constants.js'; @@ -19,7 +19,10 @@ import { import { AstroTimer } from './timer.js'; import { loadTSConfig } from './tsconfig.js'; -export function createBaseSettings(config: AstroConfig): AstroSettings { +export function createBaseSettings( + config: AstroConfig, + logLevel: AstroInlineConfig['logLevel'], +): AstroSettings { const { contentDir } = getContentPaths(config); const dotAstroDir = new URL('.astro/', config.root); const preferences = createPreferences(config, dotAstroDir); @@ -152,12 +155,17 @@ export function createBaseSettings(config: AstroConfig): AstroSettings { fontResources: new Set(), styleHashes: [], }, + logLevel: logLevel ?? 'info', }; } -export async function createSettings(config: AstroConfig, cwd?: string): Promise { +export async function createSettings( + config: AstroConfig, + logLevel: AstroInlineConfig['logLevel'], + cwd?: string, +): Promise { const tsconfig = await loadTSConfig(cwd); - const settings = createBaseSettings(config); + const settings = createBaseSettings(config, logLevel); let watchFiles = []; if (cwd) { diff --git a/packages/astro/src/core/dev/restart.ts b/packages/astro/src/core/dev/restart.ts index e8361514c0b7..48b20790efae 100644 --- a/packages/astro/src/core/dev/restart.ts +++ b/packages/astro/src/core/dev/restart.ts @@ -84,7 +84,11 @@ async function restartContainer(container: Container): Promise fallbackRoute.pattern.exec(pathname)) - .find((x) => x); + route.pattern.exec(path) || + route.fallbackRoutes.map((fallbackRoute) => fallbackRoute.pattern.exec(path)).find((x) => x); if (!paramsMatch) return {}; const params: Params = {}; route.params.forEach((key, i) => { diff --git a/packages/astro/src/core/sync/index.ts b/packages/astro/src/core/sync/index.ts index 126bf94d1791..3653289a8bc5 100644 --- a/packages/astro/src/core/sync/index.ts +++ b/packages/astro/src/core/sync/index.ts @@ -63,7 +63,7 @@ export default async function sync( if (_telemetry) { telemetry.record(eventCliSession('sync', userConfig)); } - let settings = await createSettings(astroConfig, inlineConfig.root); + let settings = await createSettings(astroConfig, inlineConfig.logLevel, inlineConfig.root); settings = await runHookConfigSetup({ command: 'sync', settings, diff --git a/packages/astro/src/entrypoints/prerender.ts b/packages/astro/src/entrypoints/prerender.ts index 6b712f60ebb0..dbc8528247a1 100644 --- a/packages/astro/src/entrypoints/prerender.ts +++ b/packages/astro/src/entrypoints/prerender.ts @@ -3,13 +3,9 @@ import { manifest as _manifest } from 'virtual:astro:manifest'; import { createApp } from 'astro/app/entrypoint'; const app = createApp(); -const { pageMap, renderers } = _manifest; +const { renderers } = _manifest; // Export middleware lazy-loaded const middleware = () => import('virtual:astro:middleware'); -Object.assign(_manifest, { - pageMap, -}); - export { app, _manifest as manifest, renderers, middleware, actions }; diff --git a/packages/astro/src/manifest/serialized.ts b/packages/astro/src/manifest/serialized.ts index 14e5a4605737..54ce467d68bd 100644 --- a/packages/astro/src/manifest/serialized.ts +++ b/packages/astro/src/manifest/serialized.ts @@ -151,5 +151,6 @@ async function createSerializedManifest(settings: AstroSettings): Promise; styleHashes: Required['hashes']; }; + logLevel: LoggerLevel; } /** Generic interface for a component (Astro, Svelte, React, etc.) */ diff --git a/packages/astro/src/vite-plugin-app/createAstroServerApp.ts b/packages/astro/src/vite-plugin-app/createAstroServerApp.ts index a876545449c8..2d8dc7c9e010 100644 --- a/packages/astro/src/vite-plugin-app/createAstroServerApp.ts +++ b/packages/astro/src/vite-plugin-app/createAstroServerApp.ts @@ -16,7 +16,7 @@ export default async function createAstroServerApp( ) { const logger = new Logger({ dest: nodeLogDestination, - level: 'info', + level: settings.logLevel, }); const routesList: RoutesList = { routes: routes.map((r: RouteInfo) => r.routeData) }; diff --git a/packages/astro/src/vite-plugin-astro-server/plugin.ts b/packages/astro/src/vite-plugin-astro-server/plugin.ts index 869f71648b42..3b880e58b7b9 100644 --- a/packages/astro/src/vite-plugin-astro-server/plugin.ts +++ b/packages/astro/src/vite-plugin-astro-server/plugin.ts @@ -250,5 +250,6 @@ export async function createDevelopmentManifest(settings: AstroSettings): Promis latestAstroVersion: settings.latestAstroVersion, debugInfoOutput: '', }, + logLevel: settings.logLevel, }; }