UNPKG

swagger-decorator

Version:
301 lines (239 loc) 8.38 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require("babel-runtime/helpers/extends"); var _extends3 = _interopRequireDefault(_extends2); var _keys = require("babel-runtime/core-js/object/keys"); var _keys2 = _interopRequireDefault(_keys); var _getIterator2 = require("babel-runtime/core-js/get-iterator"); var _getIterator3 = _interopRequireDefault(_getIterator2); exports.buildSwaggerJSON = buildSwaggerJSON; exports._convertSchema = _convertSchema; exports._convertParameterInPath = _convertParameterInPath; var _singleton = require("../internal/singleton"); var _swagger = require("./template/swagger.json"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var pathToRegexp = require("path-to-regexp"); // 标志是否编译完毕 var hasBuilt = false; /** * Description 构建 Swagger JSON 文件 */ function buildSwaggerJSON() { if (hasBuilt) { return; } // 初始化请求路径 _swagger.swaggerJSON["paths"] = {}; // 遍历所有的内部对象 var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { var _loop = function _loop() { var key = _step.value; var value = _singleton.innerAPIObject[key]; var parentKey = value.instance.target.__proto__.name + "-" + value.instance.key; // 判断 requestMapping 是否存在,不存在则表示为父类 if (!value.requestMapping) { return "continue"; } // 将 :parameter 替换为 {parameter} var requestPath = _convertParameterInPath(value.requestMapping.path); _swagger.swaggerJSON["paths"][requestPath] = {}; _swagger.swaggerJSON["paths"][requestPath][value.requestMapping.method] = {}; var apiDoc = _swagger.swaggerJSON["paths"][requestPath][value.requestMapping.method]; // 构建基本描述 apiDoc.description = value.description.description; apiDoc.produces = value.description.produces; apiDoc.parameters = []; var merge = function merge(key) { return [].concat(_singleton.innerAPIObject[parentKey] ? _singleton.innerAPIObject[parentKey][key] || [] : []).concat(value[key] || []); }; // 构建路径参数 // 这里需要整合父类的声明 var pathParameter = merge("pathParameter"); var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = (0, _getIterator3.default)(pathParameter), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var param = _step2.value; apiDoc.parameters.push((0, _extends3.default)({}, param, { collectionFormat: "csv" })); } // 构建查询参数 } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } var queryParameter = merge("queryParameter"); var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = (0, _getIterator3.default)(queryParameter), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var _param = _step3.value; apiDoc.parameters.push((0, _extends3.default)({}, _param, { items: { type: _param.items && _param.items.length > 0 ? _param.items[0] : undefined }, collectionFormat: "csv" })); } // 构建请求体参数 } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } var bodyParameter = merge("bodyParameter"); var _iteratorNormalCompletion4 = true; var _didIteratorError4 = false; var _iteratorError4 = undefined; try { for (var _iterator4 = (0, _getIterator3.default)(bodyParameter), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { var _param2 = _step4.value; apiDoc.parameters.push((0, _extends3.default)({}, _param2, { schema: _convertSchema(_param2.schema) })); } } catch (err) { _didIteratorError4 = true; _iteratorError4 = err; } finally { try { if (!_iteratorNormalCompletion4 && _iterator4.return) { _iterator4.return(); } } finally { if (_didIteratorError4) { throw _iteratorError4; } } } apiDoc.responses = {}; // 判断是直接获取该类的响应值注解还是获取父类的响应值注解 var responses = merge("responses"); // 构建返回值 var _iteratorNormalCompletion5 = true; var _didIteratorError5 = false; var _iteratorError5 = undefined; try { for (var _iterator5 = (0, _getIterator3.default)(responses), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { var resp = _step5.value; apiDoc.responses[resp.statusCode] = { description: resp.description, schema: _convertSchema(resp.schema) }; } } catch (err) { _didIteratorError5 = true; _iteratorError5 = err; } finally { try { if (!_iteratorNormalCompletion5 && _iterator5.return) { _iterator5.return(); } } finally { if (_didIteratorError5) { throw _iteratorError5; } } } }; for (var _iterator = (0, _getIterator3.default)((0, _keys2.default)(_singleton.innerAPIObject)), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var _ret = _loop(); if (_ret === "continue") continue; } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } hasBuilt = true; } function _convertSchema(schema) { var convertedSchema = void 0; if (Array.isArray(schema) && schema.length > 0) { convertedSchema = { type: "array", items: { $ref: "#/definitions/" + schema[0].name } }; } if (typeof schema === "function") { convertedSchema = { $ref: "#/definitions/" + schema.name }; } return convertedSchema; } /** * Description * @param path * @private */ function _convertParameterInPath(path) { var segments = []; var re = pathToRegexp(path, segments); if (segments.length === 0) { return path; } else { var convertedPath = path; var _iteratorNormalCompletion6 = true; var _didIteratorError6 = false; var _iteratorError6 = undefined; try { for (var _iterator6 = (0, _getIterator3.default)(segments), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { var segment = _step6.value; convertedPath = convertedPath.replace(new RegExp(segment.prefix + ":" + segment.name, "g"), segment.prefix + "{" + segment.name + "}"); } } catch (err) { _didIteratorError6 = true; _iteratorError6 = err; } finally { try { if (!_iteratorNormalCompletion6 && _iterator6.return) { _iterator6.return(); } } finally { if (_didIteratorError6) { throw _iteratorError6; } } } return convertedPath; } }