import { WebContextHelper } from '../core/WebContext'; import { ConsoleContextHelper } from '../core/ConsoleContext'; export declare type Next = () => Promise; export declare type WebPlugin = Plugin | Plugin; export declare type ConsolePlugin = Plugin | Plugin; export declare type AllPlugin = WebPlugin | ConsolePlugin; export declare type CompatiblePlugin = WebMiddleware | ConsoleMiddleware | WebPlugin | ConsolePlugin; export declare type MixMiddleware = (context: WebContextHelper | ConsoleContextHelper, next: Next) => any; export declare type WebMiddleware = (context: WebContextHelper, next: Next) => any; export declare type ConsoleMiddleware = (context: ConsoleContextHelper, next: Next) => any; declare type PluginContext = Type extends Plugin.Mix ? MixMiddleware : Type extends Plugin.Console ? ConsoleMiddleware : WebMiddleware; export declare namespace Plugin { type Web = 'web'; type Console = 'console'; type Mix = 'mix'; } interface ParsedQs { [key: string]: undefined | string | string[] | ParsedQs | ParsedQs[]; } export declare abstract class Plugin { private middleware; protected collect(): PluginContext[]; protected use(fn: PluginContext): { use: Plugin['use']; }; protected use(plugin: Type extends Plugin.Web ? WebPlugin : Type extends Plugin.Console ? ConsolePlugin : AllPlugin): { use: Plugin['use']; }; protected use(fn: (ctx: any, next: Next) => any): { use: Plugin['use']; }; /** * You expect user have mounted plugin to router before this plugin, * so that you can safely use external props and states, with related type declaration on context. * * But remember that program won't actually check expected plugin, * you should tell user when to mount it and append to `package.json` like this: * * { * "peerDependencies": { * "expected-pkg": "^x.y.z" * }, * "dependencies": {}, * "devDependencies": { * "expected-pkg": "^x.y.z" * } * } */ protected expect(CustomPlugin: Type extends Plugin.Web ? new (...args: any[]) => WebPlugin : Type extends Plugin.Console ? new (...args: any[]) => ConsolePlugin : new (...args: any[]) => AllPlugin): { use: Plugin['use']; expect: Plugin['expect']; }; protected getQuery(ctx: WebContextHelper): ParsedQs; protected getBody(ctx: WebContextHelper): Promise>; protected getParams(ctx: WebContextHelper): Record; protected getOptions(ctx: ConsoleContextHelper, aliases?: Record): Record; } export {};