UNPKG

cis-api-tool

Version:

根据 swagger/yapi/apifox 的接口定义生成 TypeScript/JavaScript 的接口类型及其请求函数代码。

139 lines (137 loc) 4.99 kB
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 };