Skip to content

Commit

Permalink
DevPipeline -> DevEnvironment
Browse files Browse the repository at this point in the history
  • Loading branch information
lilnasy committed Jan 31, 2024
1 parent 4631bbb commit 7763d76
Show file tree
Hide file tree
Showing 10 changed files with 130 additions and 207 deletions.
17 changes: 8 additions & 9 deletions packages/astro/src/prerender/routing.ts
Original file line number Diff line number Diff line change
@@ -1,30 +1,29 @@
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,
})
).sort((a, b) => prioritizePrerenderedMatchesComparator(a.route, b.route));
}

type PreloadAndSetPrerenderStatusParams = {
pipeline: DevPipeline;
environment: DevEnvironment;
matches: RouteData[];
settings: AstroSettings;
};
Expand All @@ -36,7 +35,7 @@ type PreloadAndSetPrerenderStatusResult = {
};

async function preloadAndSetPrerenderStatus({
pipeline,
environment,
matches,
settings,
}: PreloadAndSetPrerenderStatusParams): Promise<PreloadAndSetPrerenderStatusResult[]> {
Expand All @@ -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) {
Expand Down
86 changes: 0 additions & 86 deletions packages/astro/src/vite-plugin-astro-server/devPipeline.ts

This file was deleted.

52 changes: 52 additions & 0 deletions packages/astro/src/vite-plugin-astro-server/environment.ts
Original file line number Diff line number Diff line change
@@ -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();
}
}
8 changes: 4 additions & 4 deletions packages/astro/src/vite-plugin-astro-server/error.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -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);
Expand All @@ -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 {
Expand Down
31 changes: 0 additions & 31 deletions packages/astro/src/vite-plugin-astro-server/index.ts
Original file line number Diff line number Diff line change
@@ -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<ComponentInstance> {
// 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';
10 changes: 5 additions & 5 deletions packages/astro/src/vite-plugin-astro-server/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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);
}
Expand All @@ -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
Expand All @@ -85,7 +85,7 @@ export default function createVitePluginAstroServer({
}
localStorage.run(request, () => {
handleRequest({
pipeline,
environment,
manifestData,
controller,
incomingRequest: request,
Expand Down
19 changes: 9 additions & 10 deletions packages/astro/src/vite-plugin-astro-server/request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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));
Expand Down Expand Up @@ -70,24 +69,24 @@ 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,
url,
pathname: resolvedPathname,
body,
origin,
pipeline,
environment,
manifestData,
incomingRequest: incomingRequest,
incomingResponse: incomingResponse,
manifest,
});
},
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;
},
});
Expand Down

0 comments on commit 7763d76

Please sign in to comment.