UNPKG

astro

Version:

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

71 lines (70 loc) 2.64 kB
import { AstroCookies } from "../cookies/cookies.js"; import { ForbiddenRewrite } from "../errors/errors-data.js"; import { AstroError } from "../errors/index.js"; import { apiContextRoutesSymbol } from "../render-context.js"; import { getParams } from "../render/index.js"; import { setOriginPathname } from "../routing/rewrite.js"; import { defineMiddleware } from "./index.js"; function sequence(...handlers) { const filtered = handlers.filter((h) => !!h); const length = filtered.length; if (!length) { return defineMiddleware((_context, next) => { return next(); }); } return defineMiddleware((context, next) => { let carriedPayload = void 0; return applyHandle(0, context); function applyHandle(i, handleContext) { const handle = filtered[i]; const result = handle(handleContext, async (payload) => { if (i < length - 1) { if (payload) { let newRequest; if (payload instanceof Request) { newRequest = payload; } else if (payload instanceof URL) { newRequest = new Request(payload, handleContext.request); } else { newRequest = new Request( new URL(payload, handleContext.url.origin), handleContext.request ); } const oldPathname = handleContext.url.pathname; const pipeline = Reflect.get(handleContext, apiContextRoutesSymbol); const { routeData, pathname } = await pipeline.tryRewrite( payload, handleContext.request ); if (pipeline.serverLike === true && handleContext.isPrerendered === false && routeData.prerender === true) { throw new AstroError({ ...ForbiddenRewrite, message: ForbiddenRewrite.message( handleContext.url.pathname, pathname, routeData.component ), hint: ForbiddenRewrite.hint(routeData.component) }); } carriedPayload = payload; handleContext.request = newRequest; handleContext.url = new URL(newRequest.url); handleContext.cookies = new AstroCookies(newRequest); handleContext.params = getParams(routeData, pathname); setOriginPathname(handleContext.request, oldPathname); } return applyHandle(i + 1, handleContext); } else { return next(payload ?? carriedPayload); } }); return result; } }); } export { sequence };