import type { VextAdapter } from "./adapter.js"; import type { VextApp, RouteRecord, RouteOptions } from "./app.js"; import type { VextMiddleware, VextHandler } from "./middleware.js"; /** * RouteDefinition — 路由定义对象(内部数据结构) * * 由 defineRoutes() 返回,包含收集到的所有路由记录。 * router-loader 扫描 src/routes/ 后,对每个文件的 default export * 调用 routeDef.register(adapter, prefix, ...) 注册到底层适配器。 * * 执行流程: * 1. defineRoutes(factory) 被调用 * 2. 内部创建 collector(模拟 VextApp 的 HTTP 方法) * 3. 调用 factory(collector),用户代码注册路由 * 4. collector 将每条 app.get/post/... 调用推入 routes 数组 * 5. 返回 RouteDefinition { routes, register } * 6. router-loader 后续调用 register() 注册到 adapter */ export interface RouteDefinition { /** 收集到的路由记录列表 */ readonly routes: RouteRecord[]; /** * 来源文件路径(由 router-loader 注入,用于错误信息和日志) * * defineRoutes 返回时为空字符串, * router-loader 在加载模块后设置此字段。 */ sourceFile: string; /** * 将收集到的路由注册到底层适配器 * * router-loader 对每个路由文件调用此方法,完成: * 1. 拼接完整路径:fullPath = prefix + route.path * 2. 解析 middlewares → VextMiddleware[] * 3. 构建 validate 中间件(若有 options.validate) * 4. 组装执行链:[...routeMiddlewares, validateMiddleware?, handlerAsMiddleware] * 5. adapter.registerRoute(method, fullPath, chain) * * @param adapter 底层适配器实例 * @param prefix 文件路径推导出的路由前缀(如 /api/users) * @param middlewareDefs 已加载的中间件定义映射(name → VextMiddleware) * @param globalMiddlewares 全局中间件列表(插件通过 app.use() 注册的) */ register(adapter: VextAdapter, prefix: string, middlewareDefs: Map, globalMiddlewares: VextMiddleware[]): void; } /** * 路由收集器接口(内部使用) * * defineRoutes 内部创建的 collector 实现此接口, * 模拟 VextApp 的 HTTP 方法签名,将路由定义收集到数组中。 * 用户在 factory 回调中调用的 app.get/post/... 实际上是调用此 collector。 */ export interface RouteCollector { get(path: string, options: RouteOptions, handler: VextHandler): void; get(path: string, handler: VextHandler): void; post(path: string, options: RouteOptions, handler: VextHandler): void; post(path: string, handler: VextHandler): void; put(path: string, options: RouteOptions, handler: VextHandler): void; put(path: string, handler: VextHandler): void; patch(path: string, options: RouteOptions, handler: VextHandler): void; patch(path: string, handler: VextHandler): void; delete(path: string, options: RouteOptions, handler: VextHandler): void; delete(path: string, handler: VextHandler): void; head(path: string, options: RouteOptions, handler: VextHandler): void; head(path: string, handler: VextHandler): void; options(path: string, options: RouteOptions, handler: VextHandler): void; options(path: string, handler: VextHandler): void; } /** * defineRoutes 工厂回调函数类型 * * 接收完整的 VextApp 对象(实际上是 RouteCollector + app 引用), * 在其上注册路由。 */ export type RouteFactory = (app: VextApp) => void;