cis-api-tool
Version:
根据 swagger/yapi/apifox 的接口定义生成 TypeScript/JavaScript 的接口类型及其请求函数代码。
139 lines (137 loc) • 4.99 kB
JavaScript
import { QueryStringArrayFormat } from "./types-K2vxvtaP.mjs";
//#region src/helpers.ts
/**
* 定义配置。
*
* @param config 配置
*/
function defineConfig(config, hooks) {
if (hooks) Object.defineProperty(config, "hooks", {
value: hooks,
configurable: false,
enumerable: false,
writable: false
});
return config;
}
var FileData = class {
/**
* 原始文件数据。
*/
originalFileData;
/**
* 选项。
*/
options;
/**
* 文件数据辅助类,统一网页、小程序等平台的文件上传。
*
* @param originalFileData 原始文件数据
* @param options 若使用内部的 getFormData,则选项会被其使用
*/
constructor(originalFileData, options) {
this.originalFileData = originalFileData;
this.options = options;
}
/**
* 获取原始文件数据。
*
* @returns 原始文件数据
*/
getOriginalFileData() {
return this.originalFileData;
}
/**
* 获取选项。
*/
getOptions() {
return this.options;
}
};
/**
* 解析请求数据,从请求数据中分离出普通数据和文件数据。
*
* @param requestData 要解析的请求数据
* @returns 包含普通数据(data)和文件数据(fileData)的对象,data、fileData 为空对象时,表示没有此类数据
*/
function parseRequestData(requestData) {
const result = {
data: {},
fileData: {}
};
/* istanbul ignore else */
if (requestData != null) if (typeof requestData === "object" && !Array.isArray(requestData)) Object.keys(requestData).forEach((key) => {
if (requestData[key] && requestData[key] instanceof FileData) result.fileData[key] = requestData[key].getOriginalFileData();
else result.data[key] = requestData[key];
});
else result.data = requestData;
return result;
}
const queryStringify = (key, value, arrayFormat) => {
let str = "";
if (value != null) if (!Array.isArray(value)) str = `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
else if (arrayFormat === QueryStringArrayFormat.indices) str = value.map((v, i) => `${encodeURIComponent(`${key}[${i}]`)}=${encodeURIComponent(v)}`).join("&");
else if (arrayFormat === QueryStringArrayFormat.repeat) str = value.map((v) => `${encodeURIComponent(key)}=${encodeURIComponent(v)}`).join("&");
else if (arrayFormat === QueryStringArrayFormat.comma) str = `${encodeURIComponent(key)}=${encodeURIComponent(value.join(","))}`;
else if (arrayFormat === QueryStringArrayFormat.json) str = `${encodeURIComponent(key)}=${encodeURIComponent(JSON.stringify(value))}`;
else str = value.map((v) => `${encodeURIComponent(`${key}[]`)}=${encodeURIComponent(v)}`).join("&");
return str;
};
/**
* 准备要传给请求函数的参数。
*/
function prepare(requestConfig, requestData) {
let requestPath = requestConfig.path;
const { data, fileData } = parseRequestData(requestData);
const dataIsObject = data != null && typeof data === "object" && !Array.isArray(data);
if (dataIsObject) {
if (Array.isArray(requestConfig.paramNames) && requestConfig.paramNames.length > 0) Object.keys(data).forEach((key) => {
if (requestConfig.paramNames.indexOf(key) >= 0) {
requestPath = requestPath.replace(new RegExp(`\\{${key}\\}`, "g"), data[key]).replace(new RegExp(`/:${key}(?=/|$)`, "g"), `/${data[key]}`);
delete data[key];
}
});
let queryString = "";
if (Array.isArray(requestConfig.queryNames) && requestConfig.queryNames.length > 0) Object.keys(data).forEach((key) => {
if (requestConfig.queryNames.indexOf(key) >= 0) {
if (data[key] != null) queryString += `${queryString ? "&" : ""}${queryStringify(key, data[key], requestConfig.queryStringArrayFormat)}`;
delete data[key];
}
});
if (queryString) requestPath += `${requestPath.indexOf("?") > -1 ? "&" : "?"}${queryString}`;
}
const allData = {
...dataIsObject ? data : {},
...fileData
};
const getFormData = () => {
const useNativeFormData = typeof FormData !== "undefined";
const useNodeFormData = !useNativeFormData && typeof global === "object" && typeof global["process"] === "object" && typeof global["process"]["versions"] === "object" && global["process"]["versions"]["node"] != null;
const UniFormData = useNativeFormData ? FormData : useNodeFormData ? eval(`require('form-data')`) : void 0;
if (!UniFormData) throw new Error("当前环境不支持 FormData");
const formData = new UniFormData();
Object.keys(data).forEach((key) => {
formData.append(key, data[key]);
});
Object.keys(fileData).forEach((key) => {
const options = requestData[key].getOptions();
const files = Array.isArray(fileData[key]) ? fileData[key] : [fileData[key]];
files.forEach((file) => {
formData.append(key, file, useNativeFormData ? options?.filename : options);
});
});
return formData;
};
return {
...requestConfig,
path: requestPath,
rawData: requestData,
data,
hasFileData: fileData && Object.keys(fileData).length > 0,
fileData,
allData,
getFormData
};
}
//#endregion
export { FileData, defineConfig, parseRequestData, prepare };