import * as next from 'next';
import { NextApiRequest, NextApiResponse } from 'next';

type Middleware<Request = NextApiRequest, Response = NextApiResponse> = (req: Request, res: Response, next: () => Promise<void>) => Promise<void>;
type LabeledMiddleware<Request = NextApiRequest, Response = NextApiResponse> = {
    [name: string]: Middleware<Request, Response> | Array<Middleware<Request, Response>>;
};

declare function label<T extends LabeledMiddleware>(middleware: T, defaults?: (keyof T)[]): (...chosenMiddleware: (keyof T | Middleware | Middleware[])[]) => (apiRouteFn: next.NextApiHandler<any>) => next.NextApiHandler<any>;

declare function use(...middleware: (Middleware | Middleware[])[]): (apiRouteFn: next.NextApiHandler<any>) => next.NextApiHandler<any>;

export { LabeledMiddleware, Middleware, label, use };
