@api-helper/core
Version:
根据 Swagger 的接口定义生成 TypeScript/JavaScript 的接口类型及其请求函数代码。
406 lines (405 loc) • 21.3 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
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 __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var util_1 = require("../utils/util");
var constant_1 = require("../constant");
var validator_1 = require("../utils/validator");
var helpers_1 = require("../helpers");
var parser_key_name_2_schema_1 = __importDefault(require("./parser-key-name-2-schema"));
var ParserYapi = /** @class */ (function () {
function ParserYapi(params) {
var _a, _b;
this.autoGenerateId = true;
this.requiredRequestField = params.requiredRequestField;
this.requiredResponseField = (_a = params.requiredResponseField) !== null && _a !== void 0 ? _a : true;
this.projectInfo = params.projectInfo;
this.categoryList = params.categoryList;
this.apiList = params.apiList;
this.autoGenerateId = (_b = params.autoGenerateId) !== null && _b !== void 0 ? _b : true;
}
ParserYapi.prototype.parser = function () {
return __awaiter(this, void 0, void 0, function () {
var project;
return __generator(this, function (_a) {
project = this.parserProject();
project.categoryList = this.parserApiList(project, this.parserCategoryList());
return [2 /*return*/, [project]];
});
});
};
ParserYapi.prototype.parserProject = function () {
var _a;
var title = (0, util_1.filterDesc)(this.projectInfo.name);
return (0, helpers_1.createDocument)({
id: this.generateId(),
title: title ? title : '接口文档',
description: (0, util_1.filterDesc)(this.projectInfo.desc),
version: 'last',
documentVersion: '2.0',
documentServerUrl: (_a = this.projectInfo.documentServerUrl) !== null && _a !== void 0 ? _a : '',
basePath: this.projectInfo.basepath || '/',
});
};
ParserYapi.prototype.parserCategoryList = function () {
var _this = this;
var result = [];
this.categoryList.forEach(function (category) {
result.push((0, helpers_1.createCategory)({
id: _this.generateId(),
name: category.name,
description: (0, util_1.filterDesc)(category === null || category === void 0 ? void 0 : category.desc),
}));
});
result.push((0, helpers_1.createCategory)({
id: this.generateId(),
name: constant_1.UNKNOWN_GROUP_NAME,
description: constant_1.UNKNOWN_GROUP_DESC,
}));
return result;
};
ParserYapi.prototype.parserApiList = function (project, categoryList) {
var _this = this;
var categoryMap = new Map;
categoryList.forEach(function (category) {
categoryMap.set(category.name, category);
});
this.apiList.forEach(function (apiMap) {
var e_1, _a, e_2, _b, e_3, _c, e_4, _d;
var _e, _f, _g, _h;
var apiContent = apiMap.content;
// 没有详情内容,不做任何处理
if (!apiContent) {
return;
}
var tag = apiMap.tag;
var method = apiMap.method.toLowerCase();
var api = (0, helpers_1.createApi)({
method: method,
id: _this.generateId(),
title: (0, util_1.filterDesc)(apiMap.title),
description: (0, util_1.filterDesc)(apiMap.markdown),
path: (0, util_1.mergeUrl)((0, util_1.isHttp)(project.basePath) ? '' : project.basePath, apiMap.path),
docURL: (_e = apiMap.docURL) !== null && _e !== void 0 ? _e : '',
});
var headerSchema = (0, helpers_1.createSchema)('object');
(_f = apiContent === null || apiContent === void 0 ? void 0 : apiContent.req_headers) === null || _f === void 0 ? void 0 : _f.forEach(function (item) {
var _a;
if (!(item === null || item === void 0 ? void 0 : item.value)) {
return;
}
switch (item.value) {
// 请求数据类型
case 'Content-Type': {
api.requestContentType = [item.value];
break;
}
// 其他请求头信息
default: {
headerSchema.params.push((0, helpers_1.createSchema)('string', {
keyName: item.value,
title: (_a = (0, util_1.filterDesc)(item.desc)) !== null && _a !== void 0 ? _a : '',
rules: {
required: ['1', 1].includes(item.required),
}
}));
}
}
});
if (headerSchema.params.length) {
api.headers = headerSchema;
}
// 响应数据类型
if (apiContent === null || apiContent === void 0 ? void 0 : apiContent.res_body_type) {
api.responseContentType = [apiContent === null || apiContent === void 0 ? void 0 : apiContent.res_body_type];
}
try {
api.label = api.title || api.description || '';
// API content-type,暂无特殊处理
// switch (apiMap.req_body_type) {
// case 'form':
// case 'file':
// // ['multipart/form-data']; //form data required
// break;
// case 'json':
// // ['application/json'];
// break;
// case 'raw':
// // ['text/plain'];
// break;
// default:
// break;
// }
// header 和 cookie信息,暂无特殊处理
// const req_headers = apiContent.req_headers;
// Headers parameters
// for (const p of req_headers) {
// // swagger has consumes proprety, so skip proprety 'Content-Type'
// if (p.name === 'Content-Type') {
// continue;
// }
// paramArray.push({
// name: p.name,
// in: 'header',
// description: `${p.name} (Only:${p.value})`,
// required: Number(p.required) === 1,
// type: 'string', //always be type string
// default: p.value
// });
// }
/****************** 请求参数处理-开始 ******************/
var requestDataSchema = (0, helpers_1.createSchema)('object', {
id: _this.generateId(),
});
var requestExtraDataSchema = null;
// fix: 重复项问题
var requestSchemaRecord = [];
var parserKeyName2SchemaWrap = [];
var requestKeyNameMemo = [];
// 路径参数
var reqParams = apiContent.req_params;
try {
for (var reqParams_1 = __values(reqParams), reqParams_1_1 = reqParams_1.next(); !reqParams_1_1.done; reqParams_1_1 = reqParams_1.next()) {
var p = reqParams_1_1.value;
var keyName = (0, util_1.filterKeyName)(p.name);
// 参数字段没有,跳过该字段
if (!keyName || requestKeyNameMemo.includes(keyName)) {
continue;
}
// 字段
var scm = (0, helpers_1.createSchema)('string', {
id: _this.generateId(),
description: (0, util_1.filterDesc)(p.desc),
keyName: keyName,
rules: {
required: true
}
});
scm.label = scm.title ? scm.title : scm.description ? scm.description : '';
api.pathParamKeyNameList.push(keyName);
requestKeyNameMemo.push(keyName);
requestDataSchema.params.push(scm);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (reqParams_1_1 && !reqParams_1_1.done && (_a = reqParams_1.return)) _a.call(reqParams_1);
}
finally { if (e_1) throw e_1.error; }
}
// URL Query 参数
var reqQuery = apiContent.req_query;
try {
for (var reqQuery_1 = __values(reqQuery), reqQuery_1_1 = reqQuery_1.next(); !reqQuery_1_1.done; reqQuery_1_1 = reqQuery_1.next()) {
var p = reqQuery_1_1.value;
var keyName = (0, util_1.filterKeyName)(p.name);
// 参数字段没有,跳过该字段
if (!keyName || requestKeyNameMemo.includes(keyName)) {
continue;
}
requestKeyNameMemo.includes(keyName) && requestKeyNameMemo.push(keyName);
// 字段
var scm = null;
var parserKeyName2SchemaRes = new parser_key_name_2_schema_1.default(p.name, 'string').parse();
if (parserKeyName2SchemaRes) {
parserKeyName2SchemaWrap.push(parserKeyName2SchemaRes.wrapSchema);
scm = parserKeyName2SchemaRes.targetSchema;
keyName = (0, util_1.filterKeyName)(parserKeyName2SchemaRes.wrapSchema.keyName);
}
else {
scm = (0, helpers_1.createSchema)('string', {
id: _this.generateId(),
description: (0, util_1.filterDesc)(p.desc),
keyName: keyName,
rules: {
required: Number(p.required) === 1
}
});
}
scm.label = scm.title ? scm.title : scm.description ? scm.description : '';
!api.queryStringKeyNameList.includes(keyName) && api.queryStringKeyNameList.push(keyName);
if (!parserKeyName2SchemaRes) {
requestDataSchema.params.push(scm);
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (reqQuery_1_1 && !reqQuery_1_1.done && (_b = reqQuery_1.return)) _b.call(reqQuery_1);
}
finally { if (e_2) throw e_2.error; }
}
// 合并 name[0].a.rule 属性。
parser_key_name_2_schema_1.default.appendSchemeList(parserKeyName2SchemaWrap, requestDataSchema, requestKeyNameMemo);
// Body 参数
var reqBodyType = apiContent.req_body_type;
switch (reqBodyType) {
case 'form': {
try {
// Form Data数据
for (var _j = __values(apiContent.req_body_form), _k = _j.next(); !_k.done; _k = _j.next()) {
var p = _k.value;
var keyName = (0, util_1.filterKeyName)(p.name);
// 参数字段没有,跳过该字段
if (!keyName || requestKeyNameMemo.includes(keyName)) {
continue;
}
// 字段
var scm = (0, helpers_1.createSchema)('string', {
id: _this.generateId(),
description: (0, util_1.filterDesc)(p.desc),
keyName: keyName,
type: 'string',
rules: {
required: Number(p.required) === 1
},
rawType: p.type,
format: (_g = p === null || p === void 0 ? void 0 : p.format) !== null && _g !== void 0 ? _g : '',
});
scm.type = (0, helpers_1.transformType)(p.type, p === null || p === void 0 ? void 0 : p.format, 'string');
scm.label = scm.title ? scm.title : scm.description ? scm.description : '';
api.formDataKeyNameList.push(keyName);
requestKeyNameMemo.push(keyName);
requestDataSchema.params.push(scm);
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (_k && !_k.done && (_c = _j.return)) _c.call(_j);
}
finally { if (e_3) throw e_3.error; }
}
break;
}
case 'json': {
if (apiContent.req_body_other) {
try {
var jsonParam = JSON.parse(apiContent.req_body_other);
if (jsonParam) {
requestExtraDataSchema = (0, util_1.processRequestSchema)(requestDataSchema, requestSchemaRecord, jsonParam, requestKeyNameMemo, {
autoGenerateId: _this.autoGenerateId
});
}
}
finally { }
}
break;
}
// formData
case 'file': {
var keyName = (0, util_1.filterKeyName)('file');
// 参数字段没有,跳过该字段
if (requestKeyNameMemo.includes(keyName)) {
break;
}
// 字段
var scm = (0, helpers_1.createSchema)('File', {
id: _this.generateId(),
description: (0, util_1.filterDesc)(apiContent.req_body_other),
keyName: keyName,
});
scm.label = scm.title ? scm.title : scm.description ? scm.description : '';
api.formDataKeyNameList.push(keyName);
requestKeyNameMemo.push(keyName);
requestDataSchema.params.push(scm);
break;
}
}
(0, util_1.processRequestSchemaPipeline)(api, requestDataSchema, requestExtraDataSchema, _this);
/****************** 请求参数处理-结束 ******************/
/****************** 响应参数处理-结束 ******************/
try {
if (apiContent.res_body_type === 'json' && apiContent.res_body) {
var responsesSchemaSource = JSON.parse(apiContent.res_body);
if ((0, validator_1.validateSchema)(responsesSchemaSource)) {
api.responseDataSchema = (0, util_1.parserSchema)(responsesSchemaSource, undefined, undefined, undefined, {
autoGenerateId: _this.autoGenerateId
});
if (((_h = api.responseDataSchema) === null || _h === void 0 ? void 0 : _h.type) === 'object') {
api.responseDataSchema.keyName = '';
}
}
}
}
finally { }
(0, util_1.processResponseSchemaPipeline)(api, _this);
try {
/****************** 响应参数处理-结束 ******************/
// 将该API添加到所依赖的模块中
for (var tag_1 = __values(tag), tag_1_1 = tag_1.next(); !tag_1_1.done; tag_1_1 = tag_1.next()) {
var tagName = tag_1_1.value;
var recordCategory = categoryMap.has(tagName) ? categoryMap.get(tagName) : categoryMap.get(constant_1.UNKNOWN_GROUP_NAME);
recordCategory && recordCategory.apiList.push(api);
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (tag_1_1 && !tag_1_1.done && (_d = tag_1.return)) _d.call(tag_1);
}
finally { if (e_4) throw e_4.error; }
}
}
catch (e) {
console.log("".concat(method.toUpperCase(), " ").concat(api.path, " \u63A5\u53E3\u89E3\u6790\u5931\u8D25\uFF0C\u8BF7\u8054\u7CFB @api-helper \u4F5C\u8005\u4FEE\u590D\u8BE5\u95EE\u9898\uFF0C\u6216\u63D0\u4EA4issue\uFF0Chttps://github.com/ztz2/api-helper/issues\n\n").concat(e));
}
});
return categoryList;
};
ParserYapi.prototype.generateId = function () {
return this.autoGenerateId ? (0, util_1.randomId)() : '';
};
return ParserYapi;
}());
exports.default = ParserYapi;