import { HTTPMethod } from 'find-my-way';
import { Context, Middleware } from 'koa';
import { z, ZodObject, ZodType } from 'zod';
export type ControllerContext = Context & {
query: z.infer;
params: z.infer;
request: Context['request'] & {
body: z.infer;
};
};
export type ControllerFunction = (ctx: ControllerContext) => unknown | Promise;
export interface ControllerRegisterProps {
id: number;
method: HTTPMethod;
middlewares: Middleware[];
data: Record;
}
/**
* 插件构造函数
* @example
* const _fn = async (res: any) => 'dhshdfa';
* const _newResponse: ResponsePluginFunction = async (ctx, res, next) => {
* if (res && typeof res.$$typeof === 'symbol' && ctx.url.endsWith('.rsc')) {
* const html = await _fn(res);
* return await next(html)
* }
* return await next(res);
* }
*/
export type ResponsePluginFunction = (ctx: Context, result: any, next: (r: any) => Promise) => Promise;
/**
* 加入最终结果处理插件
* @param fn
* @returns
* @example `defineResponsePlugin(_newResponse);`
*/
export declare const defineResponsePlugin: (fn: ResponsePluginFunction) => number;
/** 旧版 `defineController(method, …)` 无 Zod 时的占位 schema(`safeParse` 恒成功) */
declare const legacyEmptyObject: z.ZodObject<{}, z.core.$strip>;
/**
* 定义路由控制器
* @overload 仅 method + handler(无 Zod)
* @overload method + 前置中间件 + handler
* @overload 由 `createControllerMetadata` 提供 method / middlewares / schema
*/
export declare function defineController(method: HTTPMethod, fn: ControllerFunction): ControllerRegisterProps;
export declare function defineController(method: HTTPMethod, middlewares: Middleware[], fn: ControllerFunction): ControllerRegisterProps;
export declare function defineController(metadata: ReturnType>, fn: ControllerFunction): ControllerRegisterProps;
export declare function createControllerMetadata(options: {
method: HTTPMethod;
middlewares?: Middleware[];
schema?: {
query?: A;
params?: B;
body?: C;
};
}): {
method: HTTPMethod;
middlewares?: Middleware[];
schema?: {
query?: A;
params?: B;
body?: C;
};
};
export type ControllerRequestMetadata = ReturnType>;
export {};