import { Request, Response } from '@alinea/iso';
export interface HttpRouter {
    (input: Request): Promise<Response>;
}
export interface Handle<In, Out> {
    (input: In): Out | undefined | Promise<Out | undefined>;
}
type Next<In, Out> = Handle<In, Out> | Route<In, Out>;
export declare class Route<In, Out> {
    handle: Handle<In, Out>;
    constructor(handle: Handle<In, Out>);
    map<T>(next: Handle<Out, T>): Route<In, T>;
    map<T>(next: Route<Out, T>): Route<In, T>;
    notFound(handler: (input: In) => Out | Promise<Out>): Route<In, Out>;
    recover(handler: (error: Error) => Out | Promise<Out>): Route<In, Out>;
}
export declare function router(...routes: Array<Next<Request, Response | undefined> | undefined>): Route<Request, Response | undefined>;
export declare namespace router {
    function use<In, Out>(handle: Handle<In, Out>): Route<In, Out>;
    function matcher(getPathname?: (url: URL) => string): {
        get(path: string): Route<globalThis.Request, {
            request: globalThis.Request;
            url: URL;
            params: Record<string, unknown>;
        }>;
        post(path: string): Route<globalThis.Request, {
            request: globalThis.Request;
            url: URL;
            params: Record<string, unknown>;
        }>;
        put(path: string): Route<globalThis.Request, {
            request: globalThis.Request;
            url: URL;
            params: Record<string, unknown>;
        }>;
        delete(path: string): Route<globalThis.Request, {
            request: globalThis.Request;
            url: URL;
            params: Record<string, unknown>;
        }>;
        all(path: string): Route<globalThis.Request, {
            request: globalThis.Request;
            url: URL;
            params: Record<string, unknown>;
        }>;
    };
    function base(url: string): {
        get(path: string): Route<globalThis.Request, {
            request: globalThis.Request;
            url: URL;
            params: Record<string, unknown>;
        }>;
        post(path: string): Route<globalThis.Request, {
            request: globalThis.Request;
            url: URL;
            params: Record<string, unknown>;
        }>;
        put(path: string): Route<globalThis.Request, {
            request: globalThis.Request;
            url: URL;
            params: Record<string, unknown>;
        }>;
        delete(path: string): Route<globalThis.Request, {
            request: globalThis.Request;
            url: URL;
            params: Record<string, unknown>;
        }>;
        all(path: string): Route<globalThis.Request, {
            request: globalThis.Request;
            url: URL;
            params: Record<string, unknown>;
        }>;
    };
    function startAt(base: string): {
        get(path: string): Route<globalThis.Request, {
            request: globalThis.Request;
            url: URL;
            params: Record<string, unknown>;
        }>;
        post(path: string): Route<globalThis.Request, {
            request: globalThis.Request;
            url: URL;
            params: Record<string, unknown>;
        }>;
        put(path: string): Route<globalThis.Request, {
            request: globalThis.Request;
            url: URL;
            params: Record<string, unknown>;
        }>;
        delete(path: string): Route<globalThis.Request, {
            request: globalThis.Request;
            url: URL;
            params: Record<string, unknown>;
        }>;
        all(path: string): Route<globalThis.Request, {
            request: globalThis.Request;
            url: URL;
            params: Record<string, unknown>;
        }>;
    };
    function parseFormData<In extends {
        request: Request;
    }>(input: In): Promise<In & {
        body: FormData;
    }>;
    function parseBuffer<In extends {
        request: Request;
    }>(input: In): Promise<In & {
        body: ArrayBuffer;
    }>;
    function parseJson<In extends {
        request: Request;
    }>(input: In): Promise<In & {
        body: unknown;
    }>;
    function jsonResponse<Out>(output: Out, init?: ResponseInit): globalThis.Response;
    function reportError(error: any): globalThis.Response;
    function redirect(url: string, init?: ResponseInit): globalThis.Response;
    type Cookie = {
        name: string;
        value: string;
        expires?: Date;
        maxAge?: number;
        domain?: string;
        path?: string;
        secure?: boolean;
        httpOnly?: boolean;
        sameSite?: 'strict' | 'lax' | 'none';
    };
    function cookie(...cookies: Array<Cookie>): string;
    function compress(...routes: Array<Next<Request, Response | undefined>>): Route<Request, Response | undefined>;
}
export {};
