/** * @file API Scheme * @author Yourtion Guo */ import { ZodRawShape, ZodType, z } from "zod"; import API, { type APIDefine, type DEFAULT_HANDLER } from "./api"; import IAPIDoc, { type IDocGeneratePlugin, type IDocWritter } from "./extend/docs"; import IAPITest from "./extend/test"; import { ErrorManager } from "./manager"; import { type ISchemaType } from "./params"; import * as utils from "./utils"; import { type ISupportMethds } from "./utils"; export * from "./api"; export * from "./params"; export { z, ZodRawShape, ZodType }; /** Schema方法 */ export type genSchema = Readonly API>>; /** 组方法 */ export interface IGruop extends Record, genSchema { define: (opt: APIDefine) => API; before: (...fn: T[]) => IGruop; middleware: (...fn: T[]) => IGruop; } /** API接口定义 */ export interface IApiInfo extends Record, genSchema { readonly $apis: Map>; define: (opt: APIDefine) => API; beforeHooks: Set; afterHooks: Set; docs?: IAPIDoc; formatOutputReverse?: (out: unknown) => [Error | null, unknown]; docOutputForamt?: (out: unknown) => unknown; } /** API基础信息 */ export interface IApiOptionInfo { /** 项目标题 */ title?: string; /** 项目描述(可以为 markdown 字符串) */ description?: string; /** 项目版本 */ version?: Date; /** 服务器host地址 */ host?: string; /** API默认位置 */ basePath?: string; } /** API定义 */ export interface IApiOption { info?: IApiOptionInfo; path?: string; missingParameterError?: (msg: string) => Error; invalidParameterError?: (msg: string) => Error; internalError?: (msg: string) => Error; groups?: Record; forceGroup?: boolean; docs?: IDocOptions; } /** 文档生成信息 */ export interface IDocOptions extends Record { /** 生成Markdown */ markdown?: string | boolean; /** 生成wiki */ wiki?: string | boolean; /** 生成 Index.md */ index?: string | boolean; /** 生成 Home.md */ home?: string | boolean; /** 生成 swagger.json */ swagger?: string | boolean; /** 生成 postman.json */ postman?: string | boolean; /** 生成 docs.json */ json?: string | boolean; /** 生成 jssdk.js 基于(axios) */ axios?: string | boolean; /** 生成 all-in-one.md */ all?: string | boolean; } export interface IGroupInfoOpt { name: string; prefix?: string; } interface IGroupInfo extends IGroupInfoOpt { middleware: T[]; before: T[]; } /** * Easy rest api helper */ export default class ERest { shareTestData?: unknown; utils: typeof utils; private apiInfo; private testAgent; private app; private info; private config; private error; private schemaRegistry; private typeRegistry; private errorManage; private docsOptions; private groups; private groupInfo; private forceGroup; private registAPI; private defineAPI; private mockHandler?; /** * 获取私有变量信息 */ get privateInfo(): { app: unknown; info: IApiOptionInfo; groups: Record; groupInfo: Record>; docsOptions: IDocOptions; error: { missingParameter: (msg: string) => Error; invalidParameter: (msg: string) => Error; internalError: (msg: string) => Error; }; mockHandler: ((data: unknown) => T) | undefined; }; /** * API实例 */ get api(): IApiInfo; /** * 测试实例 */ get test(): IAPITest; /** * 错误列表 */ get errors(): ErrorManager; /** * 类型管理器 */ get type(): { register: (name: string, schema: ZodType) => ERest; get: (name: string) => ZodType | undefined; has: (name: string) => boolean; value: (type: string, input: unknown, params?: unknown, format?: boolean) => { ok: boolean; message: string; value: unknown; }; }; /** * Schema 管理器 */ get schema(): { register: (name: string, schema: ZodType) => void; get: (name: string) => ZodType | undefined; has: (name: string) => boolean; check: (name: string, value: unknown) => boolean; createZodSchema: (schemaType: ISchemaType) => ZodType; }; /** * 创建 Schema 对象 */ createSchema(schemaObj: Record): z.ZodObject<{ [x: string]: ZodType>; }, z.core.$strip>; constructor(options: IApiOption); /** * 获取参数检查实例 */ paramsChecker(): (name: string, value: unknown, schema: ISchemaType) => unknown; /** * 获取Schema检查实例 */ schemaChecker(): (data: unknown, schema: Record, requiredOneOf?: string[]) => Record; responseChecker(): (data: unknown, schema: ISchemaType) => Record | { ok: boolean; message: string; value: unknown; }; /** * 获取API参数检查实例 */ apiParamsCheck(): (data: unknown, schema: Record) => Record; /** * 初始化测试系统 * @param app APP或者serve实例,用于init supertest * @param testPath 测试文件路径 * @param docPath 输出文件路径 */ initTest(app: unknown, testPath?: string, docPath?: string): void; /** * 设置测试格式化函数 */ setFormatOutput(fn: (out: unknown) => [Error | null, unknown]): void; /** * 设置文档格式化函数 */ setDocOutputForamt(fn: (out: unknown) => unknown): void; /** * 设置文档格式化函数 */ setDocWritter(fn: IDocWritter): void; setMockHandler(fn: (data: unknown) => T): void; /** * 注册文档生成组件 */ addDocPlugin(name: string, plugin: IDocGeneratePlugin): void; /** * 获取Swagger信息 */ buildSwagger(): unknown; /** * 设置全局 Before Hook */ beforeHooks(fn: T): void; /** * 设置全局 After Hook */ afterHooks(fn: T): void; /** * 获取分组API实例 */ group(name: string, info?: IGroupInfoOpt): IGruop; group(name: string, desc?: string): IGruop; /** * 生成文档 * @param savePath 文档保存路径 * @param onExit 是否等待程序退出再保存 */ genDocs(savePath?: string, onExit?: boolean): void; checkerLeiWeb(ereat: ERest, schema: API): (ctx: K) => void; checkerExpress(ereat: ERest, schema: API): (req: U, res: V, next: W) => void; checkerKoa(erest: ERest, schema: API): (req: U, res: V, next: W) => void; /** * 绑定路由 * (加载顺序:beforeHooks -> apiCheckParams -> middlewares -> handler -> afterHooks ) * * @param {Object} router 路由 */ bindRouter(router: unknown, checker: (ctx: ERest, schema: API) => T): void; bindKoaRouterToApp(app: unknown, KoaRouter: unknown, checker: (erest: ERest, schema: API) => T): void; /** * 绑定路由到Express * * @param {Object} app Express App 实例 * @param {Object} Router Router 对象 */ bindRouterToApp(app: unknown, Router: unknown, checker: (ctx: ERest, schema: API) => T): void; }