import type { GeneratorConfig } from "@alova/wormhole"; export default { generator: [ { input: "http://localhost:8060/v3/api-docs", // 文档平台类型 platform: "swagger", // 生成代码的输出目录 output: "src/api", // 响应数据的媒体类型 responseMediaType: "application/json", // 请求体数据的媒体类型 bodyMediaType: "application/json", // 生成的 API 版本 version: 1, // 生成代码类型 type: "typescript", // 全局 API 名称 global: "Apis", splitImplementation: true, implementation: "inline", // API 处理函数 handleApi: apiDescriptor => { // 过滤掉已废弃的 API if (apiDescriptor.deprecated) { return undefined; } // 优先使用后端显式声明的 operationId(稳定、可读、无重名后缀), // 仅在 operationId 缺失时回退到 summary。切勿用 summary 覆盖 operationId, // 否则中文/长文本 summary 会变成方法名导致运行时查不到。 const newOpId = apiDescriptor.operationId ?? apiDescriptor.summary?.trim(); const url = apiDescriptor.url.replace(/^\/{platform}\//, "/api/"); // springdoc 默认把 Controller 类名转为 kebab tag(如 base-controller), // 而业务代码统一用 Pascal 无 Controller 的命名空间(如 Base)调用。 // 这里剥掉 -controller 后缀并转为 PascalCase,使 wormhole 生成的 // API 路径(Base.getUserInfo 等)与 Apis.Base.xxx 调用风格一致。 // 由于转换结果是合法 JS 标识符,wormhole 会原样保留、不做 camelCase 改写。 // springdoc v3 的 tag 有两种形态,都要能正确转为 PascalCase 且无 Controller 后缀: // - Pascal+Controller:SysGroupController -> SysGroup // - kebab+controller:sys-group-controller -> SysGroup // 关键:剥掉尾部 Controller 后,要在 camelCase 边界补空格再逐段首字母大写, // 否则 SysGroup -> Sysgroup(后面全被 toLowerCase 压成小写)会让运行时查不到。 const toNamespace = (tag: string): string => { const stripped = tag.replace(/controller$/i, ""); const withSpaces = stripped.replace(/([a-z0-9])([A-Z])/g, "$1 $2"); const parts = withSpaces.split(/[^a-zA-Z0-9]+/).filter(Boolean); return parts .map((p: string) => p.charAt(0).toUpperCase() + p.slice(1).toLowerCase()) .join(""); }; if (Array.isArray(apiDescriptor.tags)) { apiDescriptor.tags = apiDescriptor.tags.map(toNamespace); } return { ...apiDescriptor, operationId: newOpId, // 关键:改掉它 url, }; }, }, ], } as GeneratorConfig;