diff --git a/packages/astro/src/prerender/routing.ts b/packages/astro/src/prerender/routing.ts index 1c1b8382546ab..7a00a460f035d 100644 --- a/packages/astro/src/prerender/routing.ts +++ b/packages/astro/src/prerender/routing.ts @@ -1,22 +1,21 @@ import type { AstroSettings, ComponentInstance, RouteData } from '../@types/astro.js'; import { RedirectComponentInstance, routeIsRedirect } from '../core/redirects/index.js'; -import type DevPipeline from '../vite-plugin-astro-server/devPipeline.js'; -import { preload } from '../vite-plugin-astro-server/index.js'; +import type { DevEnvironment } from '../vite-plugin-astro-server/environment.js'; import { getPrerenderStatus } from './metadata.js'; type GetSortedPreloadedMatchesParams = { - pipeline: DevPipeline; + environment: DevEnvironment; matches: RouteData[]; settings: AstroSettings; }; export async function getSortedPreloadedMatches({ - pipeline, + environment, matches, settings, }: GetSortedPreloadedMatchesParams) { return ( await preloadAndSetPrerenderStatus({ - pipeline, + environment, matches, settings, }) @@ -24,7 +23,7 @@ export async function getSortedPreloadedMatches({ } type PreloadAndSetPrerenderStatusParams = { - pipeline: DevPipeline; + environment: DevEnvironment; matches: RouteData[]; settings: AstroSettings; }; @@ -36,7 +35,7 @@ type PreloadAndSetPrerenderStatusResult = { }; async function preloadAndSetPrerenderStatus({ - pipeline, + environment, matches, settings, }: PreloadAndSetPrerenderStatusParams): Promise { @@ -52,12 +51,12 @@ async function preloadAndSetPrerenderStatus({ }; } - const preloadedComponent = await preload({ pipeline, filePath }); + const preloadedComponent = await environment.preload(filePath); // gets the prerender metadata set by the `astro:scanner` vite plugin const prerenderStatus = getPrerenderStatus({ filePath, - loader: pipeline.getModuleLoader(), + loader: environment.loader, }); if (prerenderStatus !== undefined) { diff --git a/packages/astro/src/vite-plugin-astro-server/devPipeline.ts b/packages/astro/src/vite-plugin-astro-server/devPipeline.ts deleted file mode 100644 index 4b877ccccd1f9..0000000000000 --- a/packages/astro/src/vite-plugin-astro-server/devPipeline.ts +++ /dev/null @@ -1,86 +0,0 @@ -import type { - AstroConfig, - AstroSettings, - RuntimeMode, - SSRLoadedRenderer, - SSRManifest, -} from '../@types/astro.js'; -import type { Logger } from '../core/logger/core.js'; -import type { ModuleLoader } from '../core/module-loader/index.js'; -import { Pipeline } from '../core/pipeline.js'; -import { Environment, loadRenderer } from '../core/render/index.js'; -import { RouteCache } from '../core/render/route-cache.js'; -import { isServerLikeOutput } from '../prerender/utils.js'; -import { createResolve } from './resolve.js'; - -export default class DevPipeline extends Pipeline { - #settings: AstroSettings; - #loader: ModuleLoader; - #devLogger: Logger; - - constructor({ - manifest, - logger, - settings, - loader, - }: { - manifest: SSRManifest; - logger: Logger; - settings: AstroSettings; - loader: ModuleLoader; - }) { - const env = DevPipeline.createDevelopmentEnvironment(manifest, settings, logger, loader); - super(env); - this.#devLogger = logger; - this.#settings = settings; - this.#loader = loader; - } - - clearRouteCache() { - this.env.routeCache.clearAll(); - } - - getSettings(): Readonly { - return this.#settings; - } - - getConfig(): Readonly { - return this.#settings.config; - } - - getModuleLoader(): Readonly { - return this.#loader; - } - - get logger(): Readonly { - return this.#devLogger; - } - - async loadRenderers() { - const renderers = await Promise.all( - this.#settings.renderers.map((r) => loadRenderer(r, this.#loader)) - ); - this.env.renderers = renderers.filter(Boolean) as SSRLoadedRenderer[]; - } - - static createDevelopmentEnvironment( - manifest: SSRManifest, - settings: AstroSettings, - logger: Logger, - loader: ModuleLoader - ): Environment { - const mode: RuntimeMode = 'development'; - return new Environment( - logger, - manifest, - mode, - [], - createResolve(loader, settings.config.root), - isServerLikeOutput(settings.config), - true, - new RouteCache(logger, mode), - ); - } - - async handleFallback() {} -} diff --git a/packages/astro/src/vite-plugin-astro-server/environment.ts b/packages/astro/src/vite-plugin-astro-server/environment.ts new file mode 100644 index 0000000000000..0825dfdcd28b9 --- /dev/null +++ b/packages/astro/src/vite-plugin-astro-server/environment.ts @@ -0,0 +1,52 @@ +import type { AstroConfig, AstroSettings, ComponentInstance, SSRLoadedRenderer, SSRManifest } from '../@types/astro.js'; +import type { Logger } from '../core/logger/core.js'; +import type { ModuleLoader } from '../core/module-loader/index.js'; +import { Environment, loadRenderer } from '../core/render/index.js'; +import { RouteCache } from '../core/render/route-cache.js'; +import { viteID } from '../core/util.js'; +import { isServerLikeOutput } from '../prerender/utils.js'; +import { createResolve } from './resolve.js'; +import { AggregateError, CSSError, MarkdownError } from '../core/errors/index.js'; +import { enhanceViteSSRError } from '../core/errors/dev/index.js'; + +export class DevEnvironment extends Environment { + constructor( + readonly loader: ModuleLoader, + readonly logger: Logger, + readonly manifest: SSRManifest, + readonly settings: AstroSettings, + readonly config = settings.config, + ) { + const mode = 'development' + const resolve = createResolve(loader, settings.config.root); + const serverLike = isServerLikeOutput(settings.config); + const streaming = true; + const routeCache = new RouteCache(logger, mode); + super(logger, manifest, mode, [], resolve, serverLike, streaming, routeCache); + } + + async preload(filePath: URL) { + const { loader } = this; + + // Important: This needs to happen first, in case a renderer provides polyfills. + const renderers__ = this.settings.renderers.map((r) => loadRenderer(r, loader)); + const renderers_ = await Promise.all(renderers__); + this.renderers = renderers_.filter((r): r is SSRLoadedRenderer => Boolean(r)); + + try { + // Load the module from the Vite SSR Runtime. + return await loader.import(viteID(filePath)) as ComponentInstance; + } catch (error) { + // If the error came from Markdown or CSS, we already handled it and there's no need to enhance it + if (MarkdownError.is(error) || CSSError.is(error) || AggregateError.is(error)) { + throw error; + } + + throw enhanceViteSSRError({ error, filePath, loader }); + } + } + + clearRouteCache() { + this.routeCache.clearAll(); + } +} \ No newline at end of file diff --git a/packages/astro/src/vite-plugin-astro-server/error.ts b/packages/astro/src/vite-plugin-astro-server/error.ts index 7c478fc6eb689..faf16dec9d16b 100644 --- a/packages/astro/src/vite-plugin-astro-server/error.ts +++ b/packages/astro/src/vite-plugin-astro-server/error.ts @@ -1,6 +1,6 @@ import type { ModuleLoader } from '../core/module-loader/index.js'; import type { AstroConfig } from '../@types/astro.js'; -import type DevPipeline from './devPipeline.js'; +import type { DevEnvironment } from './environment.js'; import { collectErrorMetadata } from '../core/errors/dev/index.js'; import { createSafeError, AstroErrorData } from '../core/errors/index.js'; @@ -10,7 +10,7 @@ import { eventError, telemetry } from '../events/index.js'; export function recordServerError( loader: ModuleLoader, config: AstroConfig, - pipeline: DevPipeline, + { logger }: DevEnvironment, _err: unknown ) { const err = createSafeError(_err); @@ -29,9 +29,9 @@ export function recordServerError( telemetry.record(eventError({ cmd: 'dev', err: errorWithMetadata, isFatal: false })); } - pipeline.logger.error( + logger.error( null, - formatErrorMessage(errorWithMetadata, pipeline.logger.level() === 'debug') + formatErrorMessage(errorWithMetadata, logger.level() === 'debug') ); return { diff --git a/packages/astro/src/vite-plugin-astro-server/index.ts b/packages/astro/src/vite-plugin-astro-server/index.ts index 97592d47a4f96..14172e8ae8274 100644 --- a/packages/astro/src/vite-plugin-astro-server/index.ts +++ b/packages/astro/src/vite-plugin-astro-server/index.ts @@ -1,34 +1,3 @@ -import type { ComponentInstance } from '../@types/astro.js'; -import { enhanceViteSSRError } from '../core/errors/dev/index.js'; -import { AggregateError, CSSError, MarkdownError } from '../core/errors/index.js'; -import { viteID } from '../core/util.js'; -import type DevPipeline from './devPipeline.js'; - -export async function preload({ - pipeline, - filePath, -}: { - pipeline: DevPipeline; - filePath: URL; -}): Promise { - // Important: This needs to happen first, in case a renderer provides polyfills. - await pipeline.loadRenderers(); - - try { - // Load the module from the Vite SSR Runtime. - const mod = (await pipeline.getModuleLoader().import(viteID(filePath))) as ComponentInstance; - - return mod; - } catch (error) { - // If the error came from Markdown or CSS, we already handled it and there's no need to enhance it - if (MarkdownError.is(error) || CSSError.is(error) || AggregateError.is(error)) { - throw error; - } - - throw enhanceViteSSRError({ error, filePath, loader: pipeline.getModuleLoader() }); - } -} - export { createController, runWithErrorHandling } from './controller.js'; export { default as vitePluginAstroServer } from './plugin.js'; export { handleRequest } from './request.js'; diff --git a/packages/astro/src/vite-plugin-astro-server/plugin.ts b/packages/astro/src/vite-plugin-astro-server/plugin.ts index ba33c3ebd44b7..45ebf234fd11b 100644 --- a/packages/astro/src/vite-plugin-astro-server/plugin.ts +++ b/packages/astro/src/vite-plugin-astro-server/plugin.ts @@ -8,7 +8,7 @@ import { createViteLoader } from '../core/module-loader/index.js'; import { createRouteManifest } from '../core/routing/index.js'; import { baseMiddleware } from './base.js'; import { createController } from './controller.js'; -import DevPipeline from './devPipeline.js'; +import { DevEnvironment } from './environment.js'; import { handleRequest } from './request.js'; import { AstroError, AstroErrorData } from '../core/errors/index.js'; import { getViteErrorPayload } from '../core/errors/dev/index.js'; @@ -33,14 +33,14 @@ export default function createVitePluginAstroServer({ configureServer(viteServer) { const loader = createViteLoader(viteServer); const manifest = createDevelopmentManifest(settings); - const pipeline = new DevPipeline({ logger, manifest, settings, loader }); + const environment = new DevEnvironment(loader, logger, manifest, settings); let manifestData: ManifestData = createRouteManifest({ settings, fsMod }, logger); const controller = createController({ loader }); const localStorage = new AsyncLocalStorage(); /** rebuild the route cache + manifest, as needed. */ function rebuildManifest(needsManifestRebuild: boolean) { - pipeline.clearRouteCache(); + environment.clearRouteCache(); if (needsManifestRebuild) { manifestData = createRouteManifest({ settings }, logger); } @@ -60,7 +60,7 @@ export default function createVitePluginAstroServer({ const request = store; setRouteError(controller.state, request.url!, error); } - const { errorWithMetadata } = recordServerError(loader, settings.config, pipeline, error); + const { errorWithMetadata } = recordServerError(loader, settings.config, environment, error); setTimeout( async () => loader.webSocketSend(await getViteErrorPayload(errorWithMetadata)), 200 @@ -85,7 +85,7 @@ export default function createVitePluginAstroServer({ } localStorage.run(request, () => { handleRequest({ - pipeline, + environment, manifestData, controller, incomingRequest: request, diff --git a/packages/astro/src/vite-plugin-astro-server/request.ts b/packages/astro/src/vite-plugin-astro-server/request.ts index 29ceafa0c5ab5..8077564de1f37 100644 --- a/packages/astro/src/vite-plugin-astro-server/request.ts +++ b/packages/astro/src/vite-plugin-astro-server/request.ts @@ -4,13 +4,13 @@ import { collapseDuplicateSlashes, removeTrailingForwardSlash } from '../core/pa import { isServerLikeOutput } from '../prerender/utils.js'; import type { DevServerController } from './controller.js'; import { runWithErrorHandling } from './controller.js'; -import type DevPipeline from './devPipeline.js'; +import type { DevEnvironment } from './environment.js'; import { handle500Response } from './response.js'; import { handleRoute, matchRoute } from './route.js'; import { recordServerError } from './error.js'; type HandleRequest = { - pipeline: DevPipeline; + environment: DevEnvironment; manifestData: ManifestData; controller: DevServerController; incomingRequest: http.IncomingMessage; @@ -20,16 +20,15 @@ type HandleRequest = { /** The main logic to route dev server requests to pages in Astro. */ export async function handleRequest({ - pipeline, + environment, manifestData, controller, incomingRequest, incomingResponse, manifest, }: HandleRequest) { - const config = pipeline.getConfig(); - const moduleLoader = pipeline.getModuleLoader(); - const origin = `${moduleLoader.isHttps() ? 'https' : 'http'}://${incomingRequest.headers.host}`; + const { config, loader } = environment; + const origin = `${loader.isHttps() ? 'https' : 'http'}://${incomingRequest.headers.host}`; const buildingToSSR = isServerLikeOutput(config); const url = new URL(collapseDuplicateSlashes(origin + incomingRequest.url)); @@ -70,7 +69,7 @@ export async function handleRequest({ controller, pathname, async run() { - const matchedRoute = await matchRoute(pathname, manifestData, pipeline); + const matchedRoute = await matchRoute(pathname, manifestData, environment); const resolvedPathname = matchedRoute?.resolvedPathname ?? pathname; return await handleRoute({ matchedRoute, @@ -78,7 +77,7 @@ export async function handleRequest({ pathname: resolvedPathname, body, origin, - pipeline, + environment, manifestData, incomingRequest: incomingRequest, incomingResponse: incomingResponse, @@ -86,8 +85,8 @@ export async function handleRequest({ }); }, onError(_err) { - const { error, errorWithMetadata } = recordServerError(moduleLoader, config, pipeline, _err); - handle500Response(moduleLoader, incomingResponse, errorWithMetadata); + const { error, errorWithMetadata } = recordServerError(loader, config, environment, _err); + handle500Response(loader, incomingResponse, errorWithMetadata); return error; }, }); diff --git a/packages/astro/src/vite-plugin-astro-server/route.ts b/packages/astro/src/vite-plugin-astro-server/route.ts index a6c7dea3152a1..a376448f535d7 100644 --- a/packages/astro/src/vite-plugin-astro-server/route.ts +++ b/packages/astro/src/vite-plugin-astro-server/route.ts @@ -30,8 +30,7 @@ import { getSortedPreloadedMatches } from '../prerender/routing.js'; import { isServerLikeOutput } from '../prerender/utils.js'; import { PAGE_SCRIPT_ID } from '../vite-plugin-scripts/index.js'; import { getStylesForURL } from './css.js'; -import type DevPipeline from './devPipeline.js'; -import { preload } from './index.js'; +import type { DevEnvironment } from './environment.js'; import { getComponentMetadata } from './metadata.js'; import { handle404Response, writeSSRResult, writeWebResponse } from './response.js'; import { getScriptsForURL } from './scripts.js'; @@ -65,16 +64,15 @@ function getCustom404Route(manifestData: ManifestData): RouteData | undefined { export async function matchRoute( pathname: string, manifestData: ManifestData, - pipeline: DevPipeline + environment: DevEnvironment ): Promise { - const env = pipeline.env; - const { routeCache, logger } = env; + const { routeCache, logger } = environment; let matches = matchAllRoutes(pathname, manifestData); const preloadedMatches = await getSortedPreloadedMatches({ - pipeline, + environment, matches, - settings: pipeline.getSettings(), + settings: environment.settings, }); for await (const { preloadedComponent, route: maybeRoute, filePath } of preloadedMatches) { @@ -87,7 +85,7 @@ export async function matchRoute( routeCache, pathname: pathname, logger, - ssr: isServerLikeOutput(pipeline.getConfig()), + ssr: environment.serverLike, }); return { route: maybeRoute, @@ -110,13 +108,13 @@ export async function matchRoute( // build formats, and is necessary based on how the manifest tracks build targets. const altPathname = pathname.replace(/(index)?\.html$/, ''); if (altPathname !== pathname) { - return await matchRoute(altPathname, manifestData, pipeline); + return await matchRoute(altPathname, manifestData, environment); } if (matches.length) { const possibleRoutes = matches.flatMap((route) => route.component); - pipeline.logger.warn( + environment.logger.warn( 'router', `${AstroErrorData.NoMatchingStaticPathFound.message( pathname @@ -127,8 +125,8 @@ export async function matchRoute( const custom404 = getCustom404Route(manifestData); if (custom404) { - const filePath = new URL(`./${custom404.component}`, pipeline.getConfig().root); - const preloadedComponent = await preload({ pipeline, filePath }); + const filePath = new URL(`./${custom404.component}`, environment.config.root); + const preloadedComponent = await environment.preload(filePath); return { route: custom404, @@ -153,7 +151,7 @@ type HandleRoute = { incomingResponse: http.ServerResponse; manifest: SSRManifest; status?: 404 | 500; - pipeline: DevPipeline; + environment: DevEnvironment; }; export async function handleRoute({ @@ -163,17 +161,14 @@ export async function handleRoute({ status = getStatus(matchedRoute), body, origin, - pipeline, + environment, manifestData, incomingRequest, incomingResponse, manifest, }: HandleRoute): Promise { const timeStart = performance.now(); - const { env } = pipeline; - const config = pipeline.getConfig(); - const moduleLoader = pipeline.getModuleLoader(); - const { logger } = env; + const { config, logger } = environment; if (!matchedRoute && !config.i18n) { if (isLoggedRequest(pathname)) { logger.info(null, req({ url: pathname, method: incomingRequest.method, statusCode: 404 })); @@ -188,8 +183,9 @@ export async function handleRoute({ let mod: ComponentInstance | undefined = undefined; let options: SSROptions | undefined = undefined; let route: RouteData; - const middleware = await loadMiddleware(moduleLoader); - + const middleware = await loadMiddleware(environment.loader); + const onRequest: MiddlewareHandler = middleware.onRequest + if (!matchedRoute) { if (config.i18n) { const locales = config.i18n.locales; @@ -240,7 +236,7 @@ export async function handleRoute({ renderContext = await createRenderContext({ request, pathname, - env, + env: environment, mod, route, locales: manifest.i18n?.locales, @@ -272,7 +268,7 @@ export async function handleRoute({ } options = { - env, + env: environment, filePath, preload: preloadedComponent, pathname, @@ -284,11 +280,11 @@ export async function handleRoute({ mod = options.preload; const { scripts, links, styles, metadata } = await getScriptsAndStyles({ - pipeline, + environment, filePath: options.filePath, }); - const i18n = pipeline.getConfig().i18n; + const i18n = environment.config.i18n; renderContext = await createRenderContext({ request: options.request, @@ -299,14 +295,12 @@ export async function handleRoute({ componentMetadata: metadata, route: options.route, mod, - env, + env: environment, locales: i18n?.locales, routing: i18n?.routing, defaultLocale: i18n?.defaultLocale, }); } - - const onRequest: MiddlewareHandler = middleware.onRequest; if (config.i18n) { const i18Middleware = createI18nMiddleware( manifest.i18n, @@ -316,16 +310,16 @@ export async function handleRoute({ ); if (i18Middleware) { - pipeline.setMiddlewareFunction(sequence(i18Middleware, onRequest)); - pipeline.onBeforeRenderRoute(i18nPipelineHook); + environment.setMiddlewareFunction(sequence(i18Middleware, onRequest)); + environment.onBeforeRenderRoute(i18nPipelineHook); } else { - pipeline.setMiddlewareFunction(onRequest); + environment.setMiddlewareFunction(onRequest); } } else { - pipeline.setMiddlewareFunction(onRequest); + environment.setMiddlewareFunction(onRequest); } - let response = await pipeline.renderRoute(renderContext, mod); + let response = await environment.renderRoute(renderContext, mod); if (isLoggedRequest(pathname)) { const timeEnd = performance.now(); logger.info( @@ -343,7 +337,7 @@ export async function handleRoute({ has404Route(manifestData) && response.headers.get(REROUTE_DIRECTIVE_HEADER) !== 'no' ) { - const fourOhFourRoute = await matchRoute('/404', manifestData, pipeline); + const fourOhFourRoute = await matchRoute('/404', manifestData, environment); if (options && fourOhFourRoute?.route !== options.route) return handleRoute({ ...options, @@ -352,7 +346,7 @@ export async function handleRoute({ status: 404, body, origin, - pipeline, + environment, manifestData, incomingRequest, incomingResponse, @@ -384,19 +378,17 @@ export async function handleRoute({ } interface GetScriptsAndStylesParams { - pipeline: DevPipeline; + environment: DevEnvironment; filePath: URL; } -async function getScriptsAndStyles({ pipeline, filePath }: GetScriptsAndStylesParams) { - const moduleLoader = pipeline.getModuleLoader(); - const settings = pipeline.getSettings(); - const mode = pipeline.env.mode; +async function getScriptsAndStyles({ environment, filePath }: GetScriptsAndStylesParams) { + const { settings, loader } = environment; // Add hoisted script tags - const scripts = await getScriptsForURL(filePath, settings.config.root, moduleLoader); + const scripts = await getScriptsForURL(filePath, settings.config.root, loader); // Inject HMR scripts - if (isPage(filePath, settings) && mode === 'development') { + if (isPage(filePath, settings) && environment.mode === 'development') { scripts.add({ props: { type: 'module', src: '/@vite/client' }, children: '', @@ -409,7 +401,7 @@ async function getScriptsAndStyles({ pipeline, filePath }: GetScriptsAndStylesPa scripts.add({ props: { type: 'module', - src: await resolveIdToUrl(moduleLoader, 'astro/runtime/client/dev-toolbar/entrypoint.js'), + src: await resolveIdToUrl(loader, 'astro/runtime/client/dev-toolbar/entrypoint.js'), }, children: '', }); @@ -444,7 +436,7 @@ async function getScriptsAndStyles({ pipeline, filePath }: GetScriptsAndStylesPa } // Pass framework CSS in as style tags to be appended to the page. - const { urls: styleUrls, styles: importedStyles } = await getStylesForURL(filePath, moduleLoader); + const { urls: styleUrls, styles: importedStyles } = await getStylesForURL(filePath, loader); let links = new Set(); [...styleUrls].forEach((href) => { links.add({ @@ -476,7 +468,7 @@ async function getScriptsAndStyles({ pipeline, filePath }: GetScriptsAndStylesPa }); }); - const metadata = await getComponentMetadata(filePath, moduleLoader); + const metadata = await getComponentMetadata(filePath, loader); return { scripts, styles, links, metadata }; } diff --git a/packages/astro/test/units/routing/route-matching.test.js b/packages/astro/test/units/routing/route-matching.test.js index 6f4724893c4a7..a8f10086fe155 100644 --- a/packages/astro/test/units/routing/route-matching.test.js +++ b/packages/astro/test/units/routing/route-matching.test.js @@ -13,7 +13,7 @@ import * as cheerio from 'cheerio'; import testAdapter from '../../test-adapter.js'; import { getSortedPreloadedMatches } from '../../../dist/prerender/routing.js'; import { createDevelopmentManifest } from '../../../dist/vite-plugin-astro-server/plugin.js'; -import DevPipeline from '../../../dist/vite-plugin-astro-server/devPipeline.js'; +import { DevEnvironment } from '../../../dist/vite-plugin-astro-server/environment.js'; const root = new URL('../../fixtures/alias/', import.meta.url); const fileSystem = { @@ -124,7 +124,7 @@ const fileSystem = { }; describe('Route matching', () => { - let pipeline; + let environment; let manifestData; let container; let settings; @@ -145,7 +145,7 @@ describe('Route matching', () => { const loader = createViteLoader(container.viteServer); const manifest = createDevelopmentManifest(container.settings); - pipeline = new DevPipeline({ manifest, logger: defaultLogger, settings, loader }); + environment = new DevEnvironment(loader, defaultLogger, manifest, settings); manifestData = createRouteManifest( { cwd: fileURLToPath(root), @@ -163,7 +163,7 @@ describe('Route matching', () => { describe('Matched routes', () => { it('should be sorted correctly', async () => { const matches = matchAllRoutes('/try-matching-a-route', manifestData); - const preloadedMatches = await getSortedPreloadedMatches({ pipeline, matches, settings }); + const preloadedMatches = await getSortedPreloadedMatches({ environment, matches, settings }); const sortedRouteNames = preloadedMatches.map((match) => match.route.route); expect(sortedRouteNames).to.deep.equal([ @@ -177,7 +177,7 @@ describe('Route matching', () => { }); it('nested should be sorted correctly', async () => { const matches = matchAllRoutes('/nested/try-matching-a-route', manifestData); - const preloadedMatches = await getSortedPreloadedMatches({ pipeline, matches, settings }); + const preloadedMatches = await getSortedPreloadedMatches({ environment, matches, settings }); const sortedRouteNames = preloadedMatches.map((match) => match.route.route); expect(sortedRouteNames).to.deep.equal([ diff --git a/packages/astro/test/units/vite-plugin-astro-server/request.test.js b/packages/astro/test/units/vite-plugin-astro-server/request.test.js index d1d0cf464e841..fb48c6a426f99 100644 --- a/packages/astro/test/units/vite-plugin-astro-server/request.test.js +++ b/packages/astro/test/units/vite-plugin-astro-server/request.test.js @@ -11,27 +11,25 @@ import { defaultLogger, } from '../test-utils.js'; import { createDevelopmentManifest } from '../../../dist/vite-plugin-astro-server/plugin.js'; -import DevPipeline from '../../../dist/vite-plugin-astro-server/devPipeline.js'; +import { DevEnvironment } from '../../../dist/vite-plugin-astro-server/environment.js'; -async function createDevPipeline(overrides = {}) { +async function createDevEnvironment(overrides = {}) { const settings = overrides.settings ?? (await createBasicSettings({ root: '/' })); const loader = overrides.loader ?? createLoader(); const manifest = createDevelopmentManifest(settings); - return new DevPipeline({ - manifest, - settings, - logger: defaultLogger, - loader, - }); + return new DevEnvironment(loader, defaultLogger, manifest, settings); } describe('vite-plugin-astro-server', () => { describe('request', () => { it('renders a request', async () => { - const pipeline = await createDevPipeline({ + const environment = await createDevEnvironment({ loader: createLoader({ - import() { + import(id) { + if (id === '\0astro-internal:middleware') { + return { onRequest: (_, next) => next() } + } const Page = createComponent(() => { return render`
testing
`; }); @@ -39,7 +37,7 @@ describe('vite-plugin-astro-server', () => { }, }), }); - const controller = createController({ loader: pipeline.getModuleLoader() }); + const controller = createController({ loader: environment.loader }); const { req, res, text } = createRequestAndResponse(); const fs = createFs( { @@ -51,14 +49,14 @@ describe('vite-plugin-astro-server', () => { const manifestData = createRouteManifest( { fsMod: fs, - settings: pipeline.getSettings(), + settings: environment.settings, }, defaultLogger ); try { await handleRequest({ - pipeline, + environment, manifestData, controller, incomingRequest: req,