UNPKG

yapi-to-typescript

Version:

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

220 lines (182 loc) 6.63 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; exports.__esModule = true; exports.FileData = void 0; exports.defineConfig = defineConfig; exports.parseRequestData = parseRequestData; exports.prepare = prepare; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _types = require("./types"); /** * 定义配置。 * * @param config 配置 */ function defineConfig(config, hooks) { if (hooks) { Object.defineProperty(config, 'hooks', { value: hooks, configurable: false, enumerable: false, writable: false }); } return config; } var FileData = /*#__PURE__*/function () { /** * 原始文件数据。 */ /** * 选项。 */ /** * 文件数据辅助类,统一网页、小程序等平台的文件上传。 * * @param originalFileData 原始文件数据 * @param options 若使用内部的 getFormData,则选项会被其使用 */ function FileData(originalFileData, options) { this.originalFileData = void 0; this.options = void 0; this.originalFileData = originalFileData; this.options = options; } /** * 获取原始文件数据。 * * @returns 原始文件数据 */ var _proto = FileData.prototype; _proto.getOriginalFileData = function getOriginalFileData() { return this.originalFileData; } /** * 获取选项。 */ ; _proto.getOptions = function getOptions() { return this.options; }; return FileData; }(); /** * 解析请求数据,从请求数据中分离出普通数据和文件数据。 * * @param requestData 要解析的请求数据 * @returns 包含普通数据(data)和文件数据(fileData)的对象,data、fileData 为空对象时,表示没有此类数据 */ exports.FileData = FileData; function parseRequestData(requestData) { var result = { data: {}, fileData: {} }; /* istanbul ignore else */ if (requestData != null) { if (typeof requestData === 'object' && !Array.isArray(requestData)) { Object.keys(requestData).forEach(function (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; } var queryStringify = function queryStringify(key, value, arrayFormat) { var str = ''; if (value != null) { if (!Array.isArray(value)) { str = encodeURIComponent(key) + "=" + encodeURIComponent(value); } else if (arrayFormat === _types.QueryStringArrayFormat.indices) { str = value.map(function (v, i) { return encodeURIComponent(key + "[" + i + "]") + "=" + encodeURIComponent(v); }).join('&'); } else if (arrayFormat === _types.QueryStringArrayFormat.repeat) { str = value.map(function (v) { return encodeURIComponent(key) + "=" + encodeURIComponent(v); }).join('&'); } else if (arrayFormat === _types.QueryStringArrayFormat.comma) { str = encodeURIComponent(key) + "=" + encodeURIComponent(value.join(',')); } else if (arrayFormat === _types.QueryStringArrayFormat.json) { str = encodeURIComponent(key) + "=" + encodeURIComponent(JSON.stringify(value)); } else { str = value.map(function (v) { return encodeURIComponent(key + "[]") + "=" + encodeURIComponent(v); }).join('&'); } } return str; }; /** * 准备要传给请求函数的参数。 */ function prepare(requestConfig, requestData) { var requestPath = requestConfig.path; var _parseRequestData = parseRequestData(requestData), data = _parseRequestData.data, fileData = _parseRequestData.fileData; var dataIsObject = data != null && typeof data === 'object' && !Array.isArray(data); if (dataIsObject) { // 替换路径参数 if (Array.isArray(requestConfig.paramNames) && requestConfig.paramNames.length > 0) { Object.keys(data).forEach(function (key) { if (requestConfig.paramNames.indexOf(key) >= 0) { // ref: https://github.com/YMFE/yapi/blob/master/client/containers/Project/Interface/InterfaceList/InterfaceEditForm.js#L465 requestPath = requestPath.replace(new RegExp("\\{" + key + "\\}", 'g'), data[key]).replace(new RegExp("/:" + key + "(?=/|$)", 'g'), "/" + data[key]); delete data[key]; } }); } // 追加查询参数到路径上 var queryString = ''; if (Array.isArray(requestConfig.queryNames) && requestConfig.queryNames.length > 0) { Object.keys(data).forEach(function (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; } } // 全部数据 var allData = (0, _extends2.default)({}, dataIsObject ? data : {}, fileData); // 获取表单数据 var getFormData = function getFormData() { var useNativeFormData = typeof FormData !== 'undefined'; var useNodeFormData = !useNativeFormData && // https://github.com/fjc0k/vtils/blob/master/src/utils/inNodeJS.ts typeof global === 'object' && typeof global['process'] === 'object' && typeof global['process']['versions'] === 'object' && global['process']['versions']['node'] != null; var UniFormData = useNativeFormData ? FormData : useNodeFormData ? eval("require('form-data')") : undefined; if (!UniFormData) { throw new Error('当前环境不支持 FormData'); } var formData = new UniFormData(); Object.keys(data).forEach(function (key) { formData.append(key, data[key]); }); Object.keys(fileData).forEach(function (key) { var options = requestData[key].getOptions(); var files = Array.isArray(fileData[key]) ? fileData[key] : [fileData[key]]; files.forEach(function (file) { formData.append(key, file, useNativeFormData ? options == null ? void 0 : options.filename : options); }); }); return formData; }; return (0, _extends2.default)({}, requestConfig, { path: requestPath, rawData: requestData, data: data, hasFileData: fileData && Object.keys(fileData).length > 0, fileData: fileData, allData: allData, getFormData: getFormData }); }