Files
UserbaseFront/alova.config.ts
T
2026-08-19 11:28:31 +08:00

66 lines
3.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;