Archived
forked from admin/userbase
66 lines
3.3 KiB
TypeScript
66 lines
3.3 KiB
TypeScript
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;
|