UNPKG

astro

Version:

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

95 lines (94 loc) 3.14 kB
import { getEnvironment } from "../environment/index.js"; import { FetchState } from "../fetch/fetch-state.js"; import { getLogger } from "../logger/manifest-logger.js"; import { handleMiddleware } from "../middleware/astro-middleware.js"; import { handlePages } from "../pages/handler.js"; import { getCustom404Route, getCustom500Route } from "../routing/helpers.js"; import { getRouteTable } from "../routing/route-table.js"; import { isAstroError } from "./index.js"; import { MiddlewareNoDataOrNextCalled, MiddlewareNotAResponse } from "./errors-data.js"; import { rewroteToEmptyErrorResponse } from "./handler.js"; async function renderDevError(manifest, request, { skipMiddleware = false, error, status, response: _response, pathname, ...resolvedRenderOptions }, { shouldInjectCspMetaTags }) { if (isAstroError(error) && [MiddlewareNoDataOrNextCalled.name, MiddlewareNotAResponse.name].includes(error.name)) { throw error; } const resolvedPathname = pathname ?? new FetchState(manifest, request).pathname; const renderRoute = async (routeData) => { try { const preloadedComponent = await getEnvironment(manifest).getComponentByRoute( manifest, routeData ); const errorState = new FetchState(manifest, request); errorState.skipMiddleware = skipMiddleware; errorState.clientAddress = resolvedRenderOptions.clientAddress; errorState.shouldInjectCspMetaTags = shouldInjectCspMetaTags ? !!manifest.csp : false; errorState.routeData = routeData; errorState.pathname = resolvedPathname; errorState.status = status; errorState.componentInstance = preloadedComponent; errorState.locals = resolvedRenderOptions.locals ?? {}; errorState.initialProps = { error }; const response = await handleMiddleware(errorState, handlePages); if (rewroteToEmptyErrorResponse(skipMiddleware, routeData, errorState.routeData, response)) { return renderDevError( manifest, request, { ...resolvedRenderOptions, status, error, skipMiddleware: true, pathname: resolvedPathname }, { shouldInjectCspMetaTags } ); } if (error) { getLogger(manifest).error( "router", error.stack || error.message ); } return response; } catch (_err) { if (skipMiddleware === false) { return renderDevError( manifest, request, { ...resolvedRenderOptions, status: 500, skipMiddleware: true, error: _err, pathname: resolvedPathname }, { shouldInjectCspMetaTags } ); } throw _err; } }; if (status === 404) { const custom404 = getCustom404Route(getRouteTable(manifest)); if (custom404) { return renderRoute(custom404); } } const custom500 = getCustom500Route(getRouteTable(manifest)); if (!custom500) { throw error; } else { return renderRoute(custom500); } } export { renderDevError };