@api-helper/cli
Version:
根据 Swagger 的接口定义生成 TypeScript/JavaScript 的接口类型及其请求函数代码。
149 lines (148 loc) • 8.38 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
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 __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = __importDefault(require("path"));
const await_to_js_1 = __importDefault(require("await-to-js"));
const process = __importStar(require("process"));
const fs_extra_1 = require("fs-extra");
const core_1 = require("@api-helper/core");
const util_1 = require("@api-helper/core/lib/utils/util");
const validator_1 = require("@api-helper/core/lib/utils/validator");
const util_2 = require("../../../lib/tools/util");
const locales_1 = __importDefault(require("../../../lib/locales"));
const logger_1 = __importDefault(require("../../../lib/tools/logger"));
const request_1 = __importDefault(require("../../../lib/tools/request"));
class ParserSwaggerPlugin {
constructor() {
this.name = 'swagger';
}
run(documentServers, options = {}) {
return __awaiter(this, void 0, void 0, function* () {
const locales = yield new locales_1.default().init();
const result = [];
if (documentServers.length === 0) {
return result;
}
const tasks = [];
for (let i = 0; i < documentServers.length; i++) {
const documentServer = documentServers[i];
const serverUrlText = `${documentServer.url}`;
tasks.push((() => __awaiter(this, void 0, void 0, function* () {
try {
const openAPIDocumentList = yield getDocument(documentServer);
if (openAPIDocumentList.length === 0) {
logger_1.default.error(`${locales.$t('没有获取到swagger配置文档:documentServers[%0].url -> ')}${serverUrlText}`.replace('%0', String(i)));
return;
}
const parsedDocumentList = yield new core_1.ParserSwagger(options).parser(openAPIDocumentList);
if (parsedDocumentList.length === 0) {
logger_1.default.error(`${locales.$t('解析swagger配置失败:documentServers[%0].url -> ')}${serverUrlText}`.replace('%0', String(i)));
return;
}
result.push({
documentServer,
parsedDocumentList
});
}
catch (e) {
logger_1.default.error('\n' + (e.message + `\tdocumentServers[${i}].url -> ${serverUrlText}`).trim());
}
}))());
}
yield (0, await_to_js_1.default)(Promise.all(tasks));
return result;
});
}
}
exports.default = ParserSwaggerPlugin;
function getDocument(documentServer) {
var _a, _b, _c;
return __awaiter(this, void 0, void 0, function* () {
const locales = yield new locales_1.default().init();
const requestConfig = (0, util_2.processRequestConfig)(documentServer);
const openAPIDocumentList = [];
const isHttp = /^(http(s?):\/\/.*?)($|\/)/.test(String(documentServer.url));
const serverUrlText = isHttp ? `【${documentServer.url}】` : '';
// 本地文件,尝试读取本地文件
if (!isHttp) {
const filepath = path_1.default.isAbsolute(documentServer.url) ? documentServer.url : path_1.default.join(process.cwd(), documentServer.url);
let [e, json] = yield (0, await_to_js_1.default)((0, fs_extra_1.readJson)(filepath));
if (e) {
const errorText = `${locales.$t('swagger文件读取失败:')}${(0, util_1.getErrorMessage)(e, ': ')}${serverUrlText}`;
logger_1.default.error(errorText);
return Promise.reject(errorText);
}
json = (Array.isArray(json) ? json : [json]);
json.forEach((itm) => {
itm.documentServerUrl = documentServer.url;
});
[].push.apply(openAPIDocumentList, json);
return openAPIDocumentList;
}
// 直接根据资源地址获取配置
const [baseError, openAPIDocument] = yield (0, await_to_js_1.default)((0, request_1.default)(Object.assign(Object.assign({}, requestConfig), { method: 'get', url: documentServer.url })));
if ((0, validator_1.validateOpenAPIDocument)(openAPIDocument)) {
openAPIDocument.documentServerUrl = documentServer.url;
openAPIDocumentList.push(openAPIDocument);
return openAPIDocumentList;
}
const { origin } = requestConfig;
// 获取所有分组-OpenAPI 2.0
let [, swaggerResources] = yield (0, await_to_js_1.default)((0, request_1.default)(Object.assign(Object.assign({}, requestConfig), { method: 'get', url: (0, util_1.mergeUrl)(origin, '/swagger-resources', requestConfig.qs) })));
// 获取所有分组-OpenAPI 3.0
if (!((_a = swaggerResources) === null || _a === void 0 ? void 0 : _a.length)) {
[, swaggerResources] = yield (0, await_to_js_1.default)((0, request_1.default)(Object.assign(Object.assign({}, requestConfig), { method: 'get', url: (0, util_1.mergeUrl)(origin, '/data/openapi.json', requestConfig.qs) })));
}
// 获取所有分组-OpenAPI 3.0
if (!((_b = swaggerResources) === null || _b === void 0 ? void 0 : _b.length)) {
[, swaggerResources] = yield (0, await_to_js_1.default)((0, request_1.default)(Object.assign(Object.assign({}, requestConfig), { method: 'get', url: (0, util_1.mergeUrl)(origin, '/openapi.json', requestConfig.qs) })));
}
if (Array.isArray(swaggerResources)) {
const tasks2 = [];
for (const sr of swaggerResources) {
const documentServerUrl = (0, util_1.mergeUrl)(origin, sr.url, requestConfig.qs);
tasks2.push((0, await_to_js_1.default)((0, request_1.default)(Object.assign(Object.assign({}, requestConfig), { method: 'get', url: documentServerUrl })).then((openapiDocument) => {
if ((0, validator_1.validateOpenAPIDocument)(openapiDocument)) {
openapiDocument.documentServerUrl = documentServerUrl;
openAPIDocumentList.push(openapiDocument);
}
})));
}
yield (0, await_to_js_1.default)(Promise.all(tasks2));
}
if (baseError && !openAPIDocumentList.length) {
logger_1.default.error(`\n` + ((_c = baseError) === null || _c === void 0 ? void 0 : _c.message) + `\t${documentServer.url}`);
}
return openAPIDocumentList;
});
}
;