DevApp Class — astro Architecture
Architecture documentation for the DevApp class in app.ts from the astro codebase.
Entity Profile
Dependency Diagram
graph TD ec09edcb_7ea1_1684_bf75_6f5bf722dd9c["DevApp"] 1c83a48e_263e_e961_abcc_b128e34eab91["app.ts"] ec09edcb_7ea1_1684_bf75_6f5bf722dd9c -->|defined in| 1c83a48e_263e_e961_abcc_b128e34eab91 b11b7214_f766_ed5f_8e67_7b74a2f0fafc["constructor()"] ec09edcb_7ea1_1684_bf75_6f5bf722dd9c -->|method| b11b7214_f766_ed5f_8e67_7b74a2f0fafc af94ed1d_3a06_3a75_51e7_2e0cac6a870a["createPipeline()"] ec09edcb_7ea1_1684_bf75_6f5bf722dd9c -->|method| af94ed1d_3a06_3a75_51e7_2e0cac6a870a 86d2cee0_36ba_0abe_1b6e_fbadb62f3858["isDev()"] ec09edcb_7ea1_1684_bf75_6f5bf722dd9c -->|method| 86d2cee0_36ba_0abe_1b6e_fbadb62f3858 e9b88d00_bbc7_b367_fbc7_b565361bd1df["updateRoutes()"] ec09edcb_7ea1_1684_bf75_6f5bf722dd9c -->|method| e9b88d00_bbc7_b367_fbc7_b565361bd1df ab5140dd_71f0_0d75_d541_dac7964b3e2d["match()"] ec09edcb_7ea1_1684_bf75_6f5bf722dd9c -->|method| ab5140dd_71f0_0d75_d541_dac7964b3e2d 89732b33_f6c0_7345_6fd2_4cfb1c40d1a5["devMatch()"] ec09edcb_7ea1_1684_bf75_6f5bf722dd9c -->|method| 89732b33_f6c0_7345_6fd2_4cfb1c40d1a5 8c958a17_30f5_1678_b38a_5d51a320ab3f["createRenderContext()"] ec09edcb_7ea1_1684_bf75_6f5bf722dd9c -->|method| 8c958a17_30f5_1678_b38a_5d51a320ab3f 84b4e3d3_9059_983c_2845_94bc19dd377b["renderError()"] ec09edcb_7ea1_1684_bf75_6f5bf722dd9c -->|method| 84b4e3d3_9059_983c_2845_94bc19dd377b
Relationship Graph
Source Code
packages/astro/src/core/app/dev/app.ts lines 15–137
export class DevApp extends BaseApp<NonRunnablePipeline> {
logger: Logger;
resolvedPathname: string | undefined = undefined;
constructor(manifest: SSRManifest, streaming = true, logger: Logger) {
super(manifest, streaming, logger);
this.logger = logger;
}
createPipeline(streaming: boolean, manifest: SSRManifest, logger: Logger): NonRunnablePipeline {
return NonRunnablePipeline.create({
logger,
manifest,
streaming,
});
}
isDev(): boolean {
return true;
}
/**
* Updates the routes list when files change during development.
* Called via HMR when new pages are added/removed.
*/
updateRoutes(newRoutesList: RoutesList): void {
this.manifestData = newRoutesList;
ensure404Route(this.manifestData);
}
match(request: Request): RouteData | undefined {
return super.match(request, true);
}
async devMatch(pathname: string): Promise<DevMatch | undefined> {
const matchedRoute = await matchRoute(
pathname,
this.manifestData,
this.pipeline as unknown as RunnablePipeline,
this.manifest,
);
if (!matchedRoute) return undefined;
this.resolvedPathname = matchedRoute.resolvedPathname;
return {
routeData: matchedRoute.route,
resolvedPathname: matchedRoute.resolvedPathname,
};
}
async createRenderContext(payload: CreateRenderContext): Promise<RenderContext> {
return super.createRenderContext({
...payload,
pathname: this.resolvedPathname ?? payload.pathname,
});
}
async renderError(
request: Request,
{ locals, skipMiddleware = false, error, clientAddress, status }: RenderErrorOptions,
): Promise<Response> {
// we always throw when we have Astro errors around the middleware
if (
isAstroError(error) &&
[MiddlewareNoDataOrNextCalled.name, MiddlewareNotAResponse.name].includes(error.name)
) {
throw error;
}
const renderRoute = async (routeData: RouteData) => {
try {
const preloadedComponent = await this.pipeline.getComponentByRoute(routeData);
const renderContext = await this.createRenderContext({
locals,
pipeline: this.pipeline,
pathname: await this.getPathnameFromRequest(request),
skipMiddleware,
request,
routeData,
clientAddress,
status,
shouldInjectCspMetaTags: false,
Domain
Defined In
Source
Frequently Asked Questions
What is the DevApp class?
DevApp is a class in the astro codebase, defined in packages/astro/src/core/app/dev/app.ts.
Where is DevApp defined?
DevApp is defined in packages/astro/src/core/app/dev/app.ts at line 15.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free