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 {};