0
Fork 0
mirror of https://github.com/withastro/astro.git synced 2025-02-03 22:29:08 -05:00

fix: dynamically imported middlewares

This commit is contained in:
Princesseuh 2024-09-24 09:51:47 +01:00
parent 7fa6f782cd
commit d1e5977533
No known key found for this signature in database
GPG key ID: 105BBD6D57F2B0C0
2 changed files with 101 additions and 73 deletions

View file

@ -9,9 +9,12 @@ import type {
SSRManifest,
SSRResult,
} from '../types/public/internal.js';
import { createOriginCheckMiddleware } from './app/middlewares.js';
import { AstroError } from './errors/errors.js';
import { AstroErrorData } from './errors/index.js';
import type { Logger } from './logger/core.js';
import { NOOP_MIDDLEWARE_FN } from './middleware/noop-middleware.js';
import { sequence } from './middleware/sequence.js';
import { RouteCache } from './render/route-cache.js';
import { createDefaultRoutes } from './routing/default.js';
@ -23,6 +26,7 @@ import { createDefaultRoutes } from './routing/default.js';
*/
export abstract class Pipeline {
readonly internalMiddleware: MiddlewareHandler[];
resolvedMiddleware: MiddlewareHandler | undefined = undefined;
constructor(
readonly logger: Logger,
@ -77,7 +81,9 @@ export abstract class Pipeline {
abstract headElements(routeData: RouteData): Promise<HeadElements> | HeadElements;
abstract componentMetadata(routeData: RouteData): Promise<SSRResult['componentMetadata']> | void;
abstract componentMetadata(
routeData: RouteData,
): Promise<SSRResult['componentMetadata']> | void;
/**
* It attempts to retrieve the `RouteData` that matches the input `url`, and the component that belongs to the `RouteData`.
@ -89,13 +95,35 @@ export abstract class Pipeline {
* @param {RewritePayload} rewritePayload The payload provided by the user
* @param {Request} request The original request
*/
abstract tryRewrite(rewritePayload: RewritePayload, request: Request): Promise<TryRewriteResult>;
abstract tryRewrite(
rewritePayload: RewritePayload,
request: Request,
): Promise<TryRewriteResult>;
/**
* Tells the pipeline how to retrieve a component give a `RouteData`
* @param routeData
*/
abstract getComponentByRoute(routeData: RouteData): Promise<ComponentInstance>;
/**
* Resolves the middleware from the manifest, and returns the `onRequest` function. If `onRequest` isn't there,
* it returns a no-op function
*/
async getMiddleware(): Promise<MiddlewareHandler> {
if (this.resolvedMiddleware) {
return this.resolvedMiddleware;
} else {
const middlewareInstance = await this.middleware();
const onRequest = middlewareInstance.onRequest ?? NOOP_MIDDLEWARE_FN;
if (this.manifest.checkOrigin) {
this.resolvedMiddleware = sequence(createOriginCheckMiddleware(), onRequest);
} else {
this.resolvedMiddleware = onRequest;
}
return this.resolvedMiddleware;
}
}
}
// eslint-disable-next-line @typescript-eslint/no-empty-object-type

View file

@ -1,3 +1,3 @@
import type { MiddlewareHandler } from '../../@types/astro.js';
import type { MiddlewareHandler } from "../../types/public/common.js";
export const NOOP_MIDDLEWARE_FN: MiddlewareHandler = (_, next) => next();