/// import type { Module } from 'worktop/cfw'; import type { Promisable, Strict, Dict } from 'worktop/utils'; declare global { interface Headers { append(name: string, value: { toString(): string }): void; set(name: string, value: { toString(): string }): void; } } export type Params = Dict; /** * All valid HTTP methods * @see {require('http').METHODS} */ export type Method = 'ACL' | 'BIND' | 'CHECKOUT' | 'CONNECT' | 'COPY' | 'DELETE' | 'GET' | 'HEAD' | 'LINK' | 'LOCK' | 'M-SEARCH' | 'MERGE' | 'MKACTIVITY' | 'MKCALENDAR' | 'MKCOL' | 'MOVE' | 'NOTIFY' | 'OPTIONS' | 'PATCH' | 'POST' | 'PRI' | 'PROPFIND' | 'PROPPATCH' | 'PURGE' | 'PUT' | 'REBIND' | 'REPORT' | 'SEARCH' | 'SOURCE' | 'SUBSCRIBE' | 'TRACE' | 'UNBIND' | 'UNLINK' | 'UNLOCK' | 'UNSUBSCRIBE'; // TODO: move to utils? type Merge = Omit & { params: P }; export type Deferral = (res: Response) => Promisable; export interface Context extends Module.Context { url: URL; params: Params; defer(f: Deferral): void; } export type Handler< C extends Context = Context, P = Params, > = ( request: Request, context: Merge ) => Promisable; export type RouteParams = T extends `${infer Prev}/*/${infer Rest}` ? RouteParams & { wild: string } & RouteParams : T extends `${string}:${infer P}?/${infer Rest}` ? { [K in P]?: string } & RouteParams : T extends `${string}:${infer P}/${infer Rest}` ? { [K in P]: string } & RouteParams : T extends `${string}:${infer P}?` ? { [K in P]?: string } : T extends `${string}:${infer P}` ? { [K in P]: string } : T extends `${string}*` ? { wild: string } : {}; export type Initializer = ( request: Request, context?: Partial & Module.Context ) => Promise; export declare class Router { mount(prefix: `/${string}/`, router: Router): void; add(method: Method, route: T, handler: Handler): void; add(method: Method, route: T, handler: Handler>>): void; onerror(req: Request, context: C & { status?: number; error?: Error }): Promisable; prepare?(req: Request, context: Omit): Promisable; run: Initializer; } /** * Compose multiple `Handler` functions together, creating a final handler. */ export function compose< C extends Context = Context, P extends Params = Params, >(...handlers: Handler[]): Handler;