UNPKG

winterspec

Version:

Write Winter-CG compatible routes with filesystem routing and tons of features

47 lines (46 loc) 2.24 kB
import type { MapArray } from "../types/util.js"; import type { WinterSpecRequest, SerializableToResponse } from "../types/web-handler.js"; export type Middleware<RequiredContext = {}, NewContext = {}, RequestOptions = {}> = (request: WinterSpecRequest<{ routeParams: Readonly<Record<string, unknown>>; } & RequestOptions>, ctx: RequiredContext & Partial<NewContext>, next: (request: WinterSpecRequest, ctx: RequiredContext & Partial<NewContext>) => Promise<Response>) => Response | SerializableToResponse | Promise<Response | SerializableToResponse>; export type MiddlewareChain<RequiredOptions = any> = readonly Middleware<RequiredOptions>[]; /** * Collect all result options from a middleware chain * * For example: * * ```ts * Middleware<{}, { auth: string }> * Middleware<{}, { user: string }> * * -> * * { auth: string, user: string } * ``` */ export type AccumulateMiddlewareChainResultOptions<MiddlewareChain, AccumulationType extends "union" | "intersection"> = MiddlewareChain extends readonly [ Middleware<any, infer ResultOptions>, ...infer Remaining ] ? AccumulationType extends "intersection" ? ResultOptions & AccumulateMiddlewareChainResultOptions<Remaining, AccumulationType> : ResultOptions | AccumulateMiddlewareChainResultOptions<Remaining, AccumulationType> : MiddlewareChain extends readonly any[] ? AccumulationType extends "intersection" ? {} : never : never; /** * Picks out a subset of middlewares from a map, maintaining the order given in the array * * For example: * * ```ts * MiddlewareMap = { * "session_token": Middleware<{}, { session_token: string }>, * "pat": Middleware<{}, { pat: string }>, * "api_token": Middleware<{}, { api_token: string }> * } * Middlewares = ["session_token", "pat"] * * -> * * [ Middleware<{}, { session_token: string }>, Middleware<{}, { pat: string }> ] * ``` * */ export type MapMiddlewares<MiddlewareMap extends { [mw: string]: Middleware; }, Middlewares extends readonly (keyof MiddlewareMap)[] | keyof MiddlewareMap | "none"> = Middlewares extends readonly (keyof MiddlewareMap)[] ? MapArray<MiddlewareMap, Middlewares> : Middlewares extends infer K extends keyof MiddlewareMap ? readonly [MiddlewareMap[K]] : readonly [];