///
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;