生成产物与重新生成
生成的是 TypeScript 源码,不是独立 HTTP 实现。装饰器类需启用 experimentalDecorators: true 编译;安装实际输出 import 的包。
产物类型
| 产物 | 生成规则 |
|---|---|
types.ts | 按 schema 名称空间分组的组件模型类型/枚举及导入的 Wow 类型 |
*ApiClient.ts | 带 operationId 的普通 tagged 操作;操作全部 tag 都必须是可用 API tag;排除 wow/Actuator/已解析聚合 tag |
commandClient.ts | 已解析聚合的命令路径、请求体别名、普通及流式命令客户端 |
queryClient.ts | 聚合 QueryClientFactory、状态/字段类型、领域事件联合(空集为 never)及事件标题枚举 |
boundedContext.ts | 已解析上下文的别名常量 |
index.ts | .ts 文件及非空子目录的递归导出 |
.fetcher-generator.json | 版本 1 所有权清单,记录生成 .ts 文件的 SHA-256 |
普通方法暴露位置路径参数、ParameterRequest(multipart 为 FormData;JSON 引用可用时使用对应模型)及可选 attributes。query/header/cookie 数据放在 request 中,不会逐项展开为位置参数。路径级参数会继承,操作级参数按 in/name 覆盖。缺少 operationId 或没有可用 tag 的操作不生成。
返回推导只读取 200。优先 JSON schema,然后 wildcard schema,再 SSE。wildcard 字符串响应使用文本提取;识别 SSE 后返回 JsonServerSentEventStream,无法推导事件模型时回退到 any。无法推导正文时回退为 Promise<Response>,提取原生 Response。其他 2xx 状态不会自动等价。生成方法依赖装饰器在运行时替换 throw autoGeneratedError(...) 占位实现。
运行时配置
pnpm add @ahoo-wang/fetcher @ahoo-wang/fetcher-decorator @ahoo-wang/fetcher-eventstream @ahoo-wang/fetcher-wow
pnpm exec fetcher-generator generate -i ./openapi.json -o ./src/generated -t ./tsconfig.json
pnpm exec tsc --noEmit -p ./tsconfig.json通过 ApiMetadata 构造器创建生成的客户端,通常传 { fetcher }。应检查实际生成的方法名和签名,不要猜测 tag 或 operationId 的转换结果。为目标服务配置 Fetcher.baseURL;生成过程不调用生成 API。参见声明式端点。
所有权与失败
再次生成到相同路径的文件会被替换:手写定制应放在生成文件之外。陈旧文件仅在旧清单记录且内容 hash 未改变时删除。已修改的陈旧文件及无关文件会保留;保留不代表它属于当前生成 API。重建 index 仍可能包含项目中已有的源文件。
清单无效或生成路径逃出输出根目录会抛错。保存完成后才删除陈旧文件并写新清单,但整个目录不是原子事务:失败可能留下部分写入。不要通过删清单强制清理;使用专用输出目录并审查再生成差异。格式化/fixMissingImports 不代表输出类型检查通过,必须执行消费者编译器。
实现源码
packages/generator/src/utils/sourceFiles.ts:33
packages/generator/src/client/apiClientGenerator.ts:73
