UNPKG

@api-helper/core

Version:

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

655 lines (654 loc) 26.8 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __values = (this && this.__values) || function(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.deepMergeSchema = exports.processKeyName = exports.formatDate = exports.getErrorMessage = exports.filterSchemaPrimitiveValue = exports.isSchemaPrimitiveValue = exports.isSchemaObject = exports.processResponseSchemaPipeline = exports.processRequestSchemaPipeline = exports.deepAddSchemaRules = exports.uniqueRequestDataRootSchema = exports.processRequestSchema = exports.parserSchema = exports.filterSchemaRequired = exports.filterDotKeyName = exports.filterKeyName = exports.filterSchemaRoot = exports.filterDesc = exports.mergeUrl = exports.randomId = exports.randomChar = exports.uuid = exports.arrayUniquePush = exports.Try = exports.filterEmpty = exports.isHttp = exports.checkType = exports.pushArray = void 0; var qs_1 = __importDefault(require("qs")); var cloneDeep_1 = __importDefault(require("lodash/cloneDeep")); var isPlainObject_1 = __importDefault(require("lodash/isPlainObject")); var constant_1 = require("../constant"); var validator_1 = require("./validator"); var helpers_1 = require("../helpers"); function pushArray(target, value) { [].push.apply(target, value); return target; } exports.pushArray = pushArray; function checkType(value, type) { return Object.prototype.toString.call(value) === "[object ".concat(type, "]"); } exports.checkType = checkType; function isHttp(value) { return /^(http(s?):\/\/.*?)($|\/)/.test(String(value)); } exports.isHttp = isHttp; function filterEmpty(value) { return (value !== '' && value != null) ? value : ''; } exports.filterEmpty = filterEmpty; function Try(fn, err) { try { return fn(); } catch (e) { return err(e); } } exports.Try = Try; function arrayUniquePush(array, item) { if (!array.includes(item)) { array.push(item); } return array.length; } exports.arrayUniquePush = arrayUniquePush; function uuid() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0; var v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } exports.uuid = uuid; function randomChar(size) { if (size === void 0) { size = 16; } var str = uuid().replace(/-/gim, '').toLocaleLowerCase(); size = Number.parseInt((size > str.length ? str.length : size < 1 ? 1 : size), 10); return str.slice(str.length - size); } exports.randomChar = randomChar; function randomId(size) { return randomChar(size); } exports.randomId = randomId; function mergeUrl() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var queryParams = {}; var url = args.reduce(function (value, itm) { if (value.includes('?')) { var sp = value.split('?'); value = sp[0]; queryParams = Object.assign({}, queryParams, qs_1.default.parse(sp[1])); } if (itm.includes('?')) { var sp = itm.split('?'); itm = sp[0]; queryParams = Object.assign({}, queryParams, qs_1.default.parse(sp[1])); } if (value.endsWith('/') && itm.startsWith('/')) { itm = itm.slice(1); } return value + itm; }, ''); // URL参数 var queryParamsStr = qs_1.default.stringify(queryParams); if (queryParamsStr) { queryParamsStr = "?".concat(queryParamsStr); } return "".concat(url).concat(queryParamsStr); } exports.mergeUrl = mergeUrl; function filterDesc(value) { if (value === void 0) { value = ''; } value = value == null ? '' : value; // 换行符移除-windows value = value.replace(/\n/gim, constant_1.LINE_FEED_CODE); // 换行符移除-mac value = value.replace(/\r/gim, constant_1.LINE_FEED_CODE_MAC); // 注释开始符号移除 value = value.replace(/\/\*/gim, constant_1.COMMENT_START_CODE); // 注释结束符号移除 value = value.replace(/\*\//gim, constant_1.COMMENT_END_CODE); return value; } exports.filterDesc = filterDesc; function filterSchemaRoot(schemaList) { var e_1, _a; if (!schemaList) { return []; } var result = []; try { for (var schemaList_1 = __values(schemaList), schemaList_1_1 = schemaList_1.next(); !schemaList_1_1.done; schemaList_1_1 = schemaList_1.next()) { var schema = schemaList_1_1.value; result.push((0, cloneDeep_1.default)(__assign(__assign({}, schema), { params: [] }))); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (schemaList_1_1 && !schemaList_1_1.done && (_a = schemaList_1.return)) _a.call(schemaList_1); } finally { if (e_1) throw e_1.error; } } return result; } exports.filterSchemaRoot = filterSchemaRoot; // 预留,用于统一处理keyName,目前不需要进行任何处理。 function filterKeyName(v) { // if ( // ((typeof v === 'string' && (v as unknown as string).trim() !== '') || (typeof v !== 'string' && v != null)) // && !v.includes('.') // && !v.includes('[') // && !/^([^\x00-\xff]|[a-zA-Z_$])([^\x00-\xff]|[a-zA-Z0-9_$])*$/.test(v)) { // @ts-ignore // v = `\"${v}\"`; // } return v; } exports.filterKeyName = filterKeyName; // 过滤所有dot参数 function filterDotKeyName(v) { return v.replace(/\[.*/, '').replace(/\..*/, ''); } exports.filterDotKeyName = filterDotKeyName; function filterSchemaRequired(schemaList) { if (!schemaList) { return []; } function dfs(ls) { var e_2, _a; var result = []; try { for (var ls_1 = __values(ls), ls_1_1 = ls_1.next(); !ls_1_1.done; ls_1_1 = ls_1.next()) { var itm = ls_1_1.value; if (itm.rules.required) { itm.params = dfs(itm.params); result.push(itm); } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (ls_1_1 && !ls_1_1.done && (_a = ls_1.return)) _a.call(ls_1); } finally { if (e_2) throw e_2.error; } } return result; } return dfs((0, cloneDeep_1.default)(schemaList)); } exports.filterSchemaRequired = filterSchemaRequired; function parserSchema(schema, parentSchema, keyName, memo, options) { var e_3, _a; var _b, _c, _d, _e, _f, _g, _h, _j; if (parentSchema === void 0) { parentSchema = {}; } if (keyName === void 0) { keyName = ''; } if (memo === void 0) { memo = new Map(); } if (options === void 0) { options = { autoGenerateId: true }; } if (!schema) { return null; } if (memo.has(schema)) { return memo.get(schema); } memo.set(schema, null); keyName = filterKeyName(keyName); var requiredFieldList = (Array.isArray(parentSchema.required) ? parentSchema.required : checkType(parentSchema.required, 'String') ? [parentSchema.required] : []); // 定义数据,收集类型,对象类型在下面在进行单独处理 var resultSchema = (0, helpers_1.createSchema)((0, helpers_1.transformType)(schema.type, schema.format, 'string'), { id: options.autoGenerateId ? randomId() : '', title: filterDesc(schema.title), description: filterDesc(schema.description), keyName: keyName, type: (0, helpers_1.transformType)(schema.type, schema.format, 'string'), examples: (_b = schema.examples) !== null && _b !== void 0 ? _b : [], rules: { required: requiredFieldList.includes(keyName), }, rawType: schema.type, format: (_c = schema === null || schema === void 0 ? void 0 : schema.format) !== null && _c !== void 0 ? _c : '', }); resultSchema.label = resultSchema.title ? resultSchema.title : resultSchema.description ? resultSchema.description : ''; try { // 枚举类型单独处理,过滤非对象类型 if (schema.enum) { resultSchema.enum = schema.enum.filter(function (t) { return !(0, isPlainObject_1.default)(t); }); } var type = Array.isArray(schema.type) ? ((_e = (_d = schema.type) === null || _d === void 0 ? void 0 : _d[0]) !== null && _e !== void 0 ? _e : 'string') : schema.type; // 其他类型处理 // eslint-disable-next-line default-case switch (type) { case 'string': var stringRules = (0, helpers_1.createSchema)('string').rules; stringRules.required = requiredFieldList.includes(keyName); if (schema.minLength != null) stringRules.minLength = schema.minLength; if (schema.maxLength != null) stringRules.maxLength = schema.maxLength; if (schema.pattern != null) stringRules.pattern = schema.pattern; resultSchema.rules = stringRules; break; case 'number': var numberRules = (0, helpers_1.createSchema)('number').rules; numberRules.required = requiredFieldList.includes(keyName); if (schema.multipleOf != null) numberRules.multipleOf = schema.multipleOf; if (schema.minimum != null) numberRules.minimum = schema.minimum; if (schema.maximum != null) numberRules.maximum = schema.maximum; if (schema.exclusiveMinimum != null) numberRules.exclusiveMinimum = schema.exclusiveMinimum; if (schema.exclusiveMaximum != null) numberRules.exclusiveMaximum = schema.exclusiveMaximum; resultSchema.rules = numberRules; break; case 'null': var nullRules = (0, helpers_1.createSchema)('null').rules; nullRules.required = requiredFieldList.includes(keyName); resultSchema.rules = nullRules; break; case 'boolean': var booleanRules = (0, helpers_1.createSchema)('boolean').rules; booleanRules.required = requiredFieldList.includes(keyName); resultSchema.rules = booleanRules; break; // 对象类型 case 'object': if (schema.properties) { var schemaProperties = Object.entries(schema.properties); for (var i = 0; i < schemaProperties.length; i++) { var _k = __read(schemaProperties[i], 2), childKeyName = _k[0], childSchema = _k[1]; // fix: 当为Object类型,属性为空,导致成为一个异常的对象 if (((_f = childKeyName === null || childKeyName === void 0 ? void 0 : childKeyName.trim) === null || _f === void 0 ? void 0 : _f.call(childKeyName)) === '') { continue; } if ((0, validator_1.validateSchema)(childSchema)) { var tmp = parserSchema(childSchema, schema, childKeyName, memo, options); tmp && resultSchema.params.push(tmp); } } } break; // 数组类型 case 'array': // 数组内存在多种类型 if (Array.isArray(schema.items)) { try { for (var _l = __values(schema.items), _m = _l.next(); !_m.done; _m = _l.next()) { var item = _m.value; if ((0, validator_1.validateSchema)(item)) { var tmp = parserSchema(item, schema, '', memo, options); if (tmp) { resultSchema.params.push(tmp); } } } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_m && !_m.done && (_a = _l.return)) _a.call(_l); } finally { if (e_3) throw e_3.error; } } // 数组单一类型 schema.properties } else if (checkType(schema.items, 'Object')) { if (checkType((_g = schema === null || schema === void 0 ? void 0 : schema.items) === null || _g === void 0 ? void 0 : _g.oneOf, 'Array')) { (_j = (_h = schema === null || schema === void 0 ? void 0 : schema.items) === null || _h === void 0 ? void 0 : _h.oneOf) === null || _j === void 0 ? void 0 : _j.forEach(function (itm) { if (itm && (0, validator_1.validateSchema)(itm)) { var tmp = parserSchema(itm, schema, '', memo, options); if (tmp) { resultSchema.params.push(tmp); } } }); } else { if (schema.items && (0, validator_1.validateSchema)(schema.items)) { var tmp = parserSchema(schema.items, schema, '', memo, options); if (tmp) { resultSchema.params.push(tmp); } } } } var arrayRules = (0, helpers_1.createSchema)('array').rules; arrayRules.required = requiredFieldList.includes(keyName); if (schema.minItems != null) arrayRules.minLength = schema.minItems; if (schema.maxItems != null) arrayRules.maxLength = schema.maxItems; if (schema.uniqueItems != null) arrayRules.uniqueItems = schema.uniqueItems; resultSchema.rules = arrayRules; break; } } catch (e) { } return resultSchema; } exports.parserSchema = parserSchema; // 处理参数兼容,如果不兼容,返回schema,作为参数body function processRequestSchema(requestDataSchema, requestSchemaRecord, requestJSONSchemaSource, keyNameMemo, options) { var _a, _b, _c; if (keyNameMemo === void 0) { keyNameMemo = []; } if (options === void 0) { options = { autoGenerateId: true, }; } if (!requestJSONSchemaSource || !(0, validator_1.validateSchema)(requestJSONSchemaSource)) { return null; } var parsedSchema = parserSchema(requestJSONSchemaSource, undefined, undefined, undefined, options); // 类型相同可以整合,非重复 var types = Array.isArray(parsedSchema === null || parsedSchema === void 0 ? void 0 : parsedSchema.type) ? parsedSchema === null || parsedSchema === void 0 ? void 0 : parsedSchema.type : [parsedSchema === null || parsedSchema === void 0 ? void 0 : parsedSchema.type]; if ((parsedSchema === null || parsedSchema === void 0 ? void 0 : parsedSchema.type) === 'object' && requestJSONSchemaSource && !requestSchemaRecord.includes(requestJSONSchemaSource)) { var requestSchemaList = (_a = parsedSchema === null || parsedSchema === void 0 ? void 0 : parsedSchema.params) !== null && _a !== void 0 ? _a : []; requestSchemaList.forEach(function (item) { if (!keyNameMemo.includes(item.keyName)) { keyNameMemo.push(item.keyName); requestDataSchema.params.push(item); } }); requestSchemaRecord.push(requestJSONSchemaSource); (_b = options === null || options === void 0 ? void 0 : options.callback) === null || _b === void 0 ? void 0 : _b.call(options, parsedSchema); return parsedSchema; } // 类型不同 if (parsedSchema && parsedSchema.type !== 'object') { (_c = options === null || options === void 0 ? void 0 : options.callback) === null || _c === void 0 ? void 0 : _c.call(options, parsedSchema); return parsedSchema; } return null; } exports.processRequestSchema = processRequestSchema; function uniqueRequestDataRootSchema(api) { var _a; if ((_a = api.requestDataSchema) === null || _a === void 0 ? void 0 : _a.params) { var requestDataSchemaMemo_1 = []; api.requestDataSchema.params = api.requestDataSchema.params.filter(function (s) { if (!s.keyName) { return true; } var hasKeyName = requestDataSchemaMemo_1.includes(s.keyName); requestDataSchemaMemo_1.push(s.keyName); return !hasKeyName; }); } return api; } exports.uniqueRequestDataRootSchema = uniqueRequestDataRootSchema; function deepAddSchemaRules(schema, rules) { if (rules === void 0) { rules = {}; } schema = schema == null ? [] : Array.isArray(schema) ? schema : [schema]; if (Object.keys(rules).length === 0) { return undefined; } var memo = []; var deepLoop = function (s) { var e_4, _a; try { for (var s_1 = __values(s), s_1_1 = s_1.next(); !s_1_1.done; s_1_1 = s_1.next()) { var itm = s_1_1.value; if (!itm || memo.includes(itm)) { continue; } memo.push(itm); itm.rules = Object.assign({}, itm.rules, rules); deepLoop(itm.params); } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (s_1_1 && !s_1_1.done && (_a = s_1.return)) _a.call(s_1); } finally { if (e_4) throw e_4.error; } } }; deepLoop(schema); } exports.deepAddSchemaRules = deepAddSchemaRules; // 请求数据通用处理 function processRequestSchemaPipeline(api, requestDataSchema, requestExtraDataSchema, options) { if (requestDataSchema.params.length === 0) { api.requestDataSchema = requestExtraDataSchema; } else if (requestDataSchema.params.length > 0) { api.requestDataSchema = requestDataSchema; } else { api.requestExtraDataSchema = requestExtraDataSchema; } // 请求数据根对象属性去重 uniqueRequestDataRootSchema(api); // 请求数据规则处理 if (options.requiredRequestField) { deepAddSchemaRules(api.requestDataSchema, { required: true }); deepAddSchemaRules(api.requestExtraDataSchema, { required: true }); } return api; } exports.processRequestSchemaPipeline = processRequestSchemaPipeline; // 响应数据通用处理 function processResponseSchemaPipeline(api, options) { if (options.requiredResponseField) { deepAddSchemaRules(api.responseDataSchema, { required: true }); } } exports.processResponseSchemaPipeline = processResponseSchemaPipeline; // 判断是否为对象类型的Schema, Array | Object function isSchemaObject(schema) { if (!schema) { return false; } return !schema.keyName && (schema.type === 'array' || schema.type === 'object'); } exports.isSchemaObject = isSchemaObject; // 判断是否是原始值的Schema。 function isSchemaPrimitiveValue(schema) { if (!schema) { return false; } return !schema.keyName && schema.type !== 'array' && schema.type !== 'object'; } exports.isSchemaPrimitiveValue = isSchemaPrimitiveValue; /** * @description 过滤原始值的Schema。保留纯粹的类型对象。原始值Schema用于TS类型申明有用,在生成JS对象,Class实体类时候,这些原始值类型则无用,需要过滤掉。 * @example 例子说明: 源数据:[ { keyName: '', type: 'string' }, { keyName: 'username', type: 'string' } ] 过滤后:[ { keyName: 'username', type: 'string' } ] * @param schema { schema: APIHelper.Schema | APIHelper.SchemaList | null } schema对象 * @return APIHelper.Schema | APIHelper.SchemaList | null */ function filterSchemaPrimitiveValue(schema) { if (!schema) { return schema; } var schemaList = (0, cloneDeep_1.default)(Array.isArray(schema) ? schema : [schema]); var filter = function (scmList, memo) { var e_5, _a; var _b; if (memo === void 0) { memo = new Map(); } if (memo.has(scmList)) { return memo.get(scmList); } var result = []; memo.set(scmList, result); try { for (var scmList_1 = __values(scmList), scmList_1_1 = scmList_1.next(); !scmList_1_1.done; scmList_1_1 = scmList_1.next()) { var scm = scmList_1_1.value; if (isSchemaPrimitiveValue(scm)) { continue; } if (((_b = scm.params) === null || _b === void 0 ? void 0 : _b.length) > 0) { scm.params = filter(scm.params, memo); } result.push(scm); } } catch (e_5_1) { e_5 = { error: e_5_1 }; } finally { try { if (scmList_1_1 && !scmList_1_1.done && (_a = scmList_1.return)) _a.call(scmList_1); } finally { if (e_5) throw e_5.error; } } return result; }; var res = filter(schemaList); if (Array.isArray(schema)) { return res; } return schemaList[0]; } exports.filterSchemaPrimitiveValue = filterSchemaPrimitiveValue; function getErrorMessage(error, prefix, postfix) { if (prefix === void 0) { prefix = ''; } if (postfix === void 0) { postfix = ''; } function mergeMessage(msg) { return msg ? "".concat(prefix).concat(msg).concat(postfix) : ''; } if (!error) { return ''; } if (typeof error === 'string') { return mergeMessage(error); } if (error === null || error === void 0 ? void 0 : error.message) { return mergeMessage(error.message); } if (error === null || error === void 0 ? void 0 : error.msg) { return mergeMessage(error.msg); } return ''; } exports.getErrorMessage = getErrorMessage; function formatDate(date, format) { if (format === void 0) { format = 'YYYY-MM-dd HH:mm:ss'; } date = !(date instanceof Date) ? new Date(date) : date; var o = { 'M+': date.getMonth() + 1, 'd+': date.getDate(), 'H+': date.getHours(), 'm+': date.getMinutes(), 's+': date.getSeconds(), 'q+': Math.floor((date.getMonth() + 3) / 3), 'S': date.getMilliseconds() // 毫秒 }; if (/(Y+)/.test(format)) { format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)); } for (var k in o) { if (new RegExp('(' + k + ')').test(format)) { // @ts-ignore format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))); } } return format; } exports.formatDate = formatDate; // 处理keyName,如果不是合法的变量,添加"" function processKeyName(keyName) { if (!(0, validator_1.validateKeyName)(keyName)) { return "\"".concat(keyName, "\""); } return keyName; } exports.processKeyName = processKeyName; // 深度合并两个节点, // 合并到source节点中 function deepMergeSchema(source, other) { var _a; function dfs(s, o) { var _a; if (s === void 0) { s = null; } if (o === void 0) { o = null; } if (s == null) { return o; } if (o == null) { return s; } if (!(s.keyName === o.keyName && s.type === o.type)) { return s; } var memoOtherMap = {}; o.params.forEach(function (item) { memoOtherMap["".concat(item.keyName).concat(item.type)] = item; }); s.params.forEach(function (item, index) { var key = "".concat(item.keyName).concat(item.type); var memoOther = memoOtherMap[key]; // 存在相同节点,需要进行合并 if (memoOther) { var otherIndex = o.params.indexOf(memoOther); s.params.splice(index, 1, dfs(item, memoOther)); o.params.splice(otherIndex, 1); } }); // 还存在其他节点,直接复制 if (o.params.length) { (_a = s.params).push.apply(_a, __spreadArray([], __read(o.params), false)); } return s; } return (_a = dfs(source, other)) !== null && _a !== void 0 ? _a : null; } exports.deepMergeSchema = deepMergeSchema;