kindergarten_java/lesingle-edu-reading-platform-frontend/orval.config.ts

68 lines
2.1 KiB
TypeScript
Raw Normal View History

import { defineConfig } from 'orval';
/** 内联 schema避免 ResultObject[] 的 $ref 导致 oneOf 验证错误 */
const RESULT_OBJECT_ARRAY_SCHEMA = {
type: 'object',
properties: {
code: { type: 'integer', format: 'int32' },
message: { type: 'string' },
data: { type: 'array', items: { type: 'object', additionalProperties: true } },
},
};
export default defineConfig({
readingPlatform: {
output: {
mode: 'split',
target: 'src/api/generated/index.ts',
schemas: 'src/api/generated/model',
client: 'axios',
override: {
mutator: {
path: 'src/api/generated/mutator.ts',
name: 'customMutator',
},
// 自定义类型名称
name: (type) => {
// 移除命名空间前缀,简化类型名称
return type.replace(/^(Result|ResultPageResult)/, '');
},
},
// 导入优化
imports: {
axios: true,
},
},
input: {
// 使用 api:fetch 生成的 openapi.jsonapi:update 会自动先执行 api:fetch
target: './openapi.json',
// 路径重写:确保 OpenAPI 文档中的路径正确
override: {
// 使用转换器修复路径 - 将 `/api/v1/xxx` 转换为 `/v1/xxx`(因为 baseURL 已经是 `/api`
transformer: (spec) => {
const paths = spec.paths || {};
for (const path of Object.keys(paths)) {
let newKey = path.replace(/^\/api\/v1\//, '/v1/');
if (newKey !== path) {
paths[newKey] = paths[path];
delete paths[path];
}
}
for (const pathObj of Object.values(paths)) {
for (const op of Object.values(pathObj)) {
const content = op?.responses?.['200']?.content;
if (!content) continue;
for (const media of Object.values(content)) {
if (media?.schema?.['$ref']?.endsWith('ResultObject[]')) {
media.schema = { ...RESULT_OBJECT_ARRAY_SCHEMA };
}
}
}
}
return spec;
},
},
},
},
});