UNPKG

astro

Version:

Astro is a modern site builder with web best practices, performance, and DX front-of-mind.

105 lines (104 loc) 3.1 kB
import { Pipeline } from "../base-pipeline.js"; import { RedirectSinglePageBuiltModule } from "../redirects/component.js"; import { createModuleScriptElement, createStylesheetElementSet } from "../render/ssr-element.js"; import { findRouteToRewrite } from "../routing/rewrite.js"; class AppPipeline extends Pipeline { static create({ logger, manifest, runtimeMode, renderers, resolve, serverLike, streaming, defaultRoutes }) { const pipeline = new AppPipeline( logger, manifest, runtimeMode, renderers, resolve, serverLike, streaming, void 0, void 0, void 0, void 0, void 0, void 0, void 0, void 0, defaultRoutes ); return pipeline; } headElements(routeData) { const routeInfo = this.manifest.routes.find((route) => route.routeData === routeData); const links = /* @__PURE__ */ new Set(); const scripts = /* @__PURE__ */ new Set(); const styles = createStylesheetElementSet(routeInfo?.styles ?? []); for (const script of routeInfo?.scripts ?? []) { if ("stage" in script) { if (script.stage === "head-inline") { scripts.add({ props: {}, children: script.children }); } } else { scripts.add(createModuleScriptElement(script)); } } return { links, styles, scripts }; } componentMetadata() { } async getComponentByRoute(routeData) { const module = await this.getModuleForRoute(routeData); return module.page(); } async tryRewrite(payload, request) { const { newUrl, pathname, routeData } = findRouteToRewrite({ payload, request, routes: this.manifest?.routes.map((r) => r.routeData), trailingSlash: this.manifest.trailingSlash, buildFormat: this.manifest.buildFormat, base: this.manifest.base }); const componentInstance = await this.getComponentByRoute(routeData); return { newUrl, pathname, componentInstance, routeData }; } async getModuleForRoute(route) { for (const defaultRoute of this.defaultRoutes) { if (route.component === defaultRoute.component) { return { page: () => Promise.resolve(defaultRoute.instance), renderers: [] }; } } if (route.type === "redirect") { return RedirectSinglePageBuiltModule; } else { if (this.manifest.pageMap) { const importComponentInstance = this.manifest.pageMap.get(route.component); if (!importComponentInstance) { throw new Error( `Unexpectedly unable to find a component instance for route ${route.route}` ); } return await importComponentInstance(); } else if (this.manifest.pageModule) { return this.manifest.pageModule; } throw new Error( "Astro couldn't find the correct page to render, probably because it wasn't correctly mapped for SSR usage. This is an internal error, please file an issue." ); } } } export { AppPipeline };