- 与 notice 同形态:hash 路由 + TablePageAlovaNew 分页 + alova 信封分支 - API 层手写(文档端点仅容器网内可达,api:gen 无通路),键名对齐后端 operationId - 审计修复:outDir 回 dist 根(CI zip 根须含 html)、main.ts 显式引入 @/api 挂载全局 Apis、 保存失败重拉回滚、路由页补只读 timeout/bodyLimit 列、详情弹窗 backendCode 恒空说明
88 lines
2.9 KiB
TypeScript
88 lines
2.9 KiB
TypeScript
/// <reference types='./globals.d.ts' />
|
||
/* tslint:disable */
|
||
/* eslint-disable */
|
||
/**
|
||
* 接口调用代理工厂(与 UserBase/Notice 同形,来源为 alova 生成器的运行时部分)。
|
||
* 依据 apiDefinitions 的 [method, url] 构造 alova Method;{path} 占位由 pathParams 替换。
|
||
*/
|
||
import { Method } from 'alova';
|
||
import apiDefinitions from './apiDefinitions';
|
||
|
||
const cache = Object.create(null);
|
||
const createFunctionalProxy = (
|
||
array: (string | symbol)[],
|
||
alovaInstance: Alova<any, any, any, any, any>,
|
||
configMap: any
|
||
) => {
|
||
const apiPathKey = array.join('.') as keyof typeof apiDefinitions;
|
||
if (cache[apiPathKey]) {
|
||
return cache[apiPathKey];
|
||
}
|
||
// create a new proxy instance
|
||
const proxy = new Proxy(function () {}, {
|
||
get(_, property) {
|
||
// record the target property, so that it can get the completed accessing paths
|
||
const newArray = [...array, property];
|
||
// always return a new proxy to continue recording accessing paths.
|
||
return createFunctionalProxy(newArray, alovaInstance, configMap);
|
||
},
|
||
apply(_, __, [config]) {
|
||
const apiItem = apiDefinitions[apiPathKey];
|
||
if (!apiItem) {
|
||
throw new Error(`the api path of \`${apiPathKey}\` is not found`);
|
||
}
|
||
const mergedConfig = {
|
||
...configMap[apiPathKey],
|
||
...config
|
||
};
|
||
const [method, url] = apiItem;
|
||
const pathParams = mergedConfig.pathParams;
|
||
const urlReplaced = url!.replace(/\{([^}]+)\}/g, (_, key) => {
|
||
const pathParam = pathParams[key];
|
||
return pathParam;
|
||
});
|
||
delete mergedConfig.pathParams;
|
||
let data = mergedConfig.data;
|
||
if (Object.prototype.toString.call(data) === '[object Object]' && typeof FormData !== 'undefined') {
|
||
let hasBlobData = false;
|
||
const formData = new FormData();
|
||
for (const key in data) {
|
||
if (Array.isArray(data[key])) {
|
||
for (const ele of data[key]) {
|
||
formData.append(key, ele);
|
||
if (ele instanceof Blob) {
|
||
hasBlobData = true;
|
||
}
|
||
}
|
||
} else {
|
||
formData.append(key, data[key]);
|
||
if (data[key] instanceof Blob) {
|
||
hasBlobData = true;
|
||
}
|
||
}
|
||
}
|
||
data = hasBlobData ? formData : data;
|
||
}
|
||
return new Method(method!.toUpperCase() as MethodType, alovaInstance, urlReplaced, mergedConfig, data);
|
||
}
|
||
});
|
||
cache[apiPathKey] = proxy;
|
||
return proxy;
|
||
};
|
||
|
||
export const createApis = (alovaInstance: Alova<any, any, any, any, any>, configMap: any) => {
|
||
const Apis = new Proxy({} as Apis, {
|
||
get(_, property) {
|
||
return createFunctionalProxy([property], alovaInstance, configMap);
|
||
}
|
||
});
|
||
return Apis;
|
||
};
|
||
|
||
export const mountApis = (Apis: Apis) => {
|
||
// define global variable `Apis`
|
||
(globalThis as any).Apis = Apis;
|
||
};
|
||
|
||
export const withConfigType = <Config extends MethodsConfigMap>(config: Config) => config;
|