swagger-decorator
Version:
Decorator for Koa2 and koa-router, Auto-Generate Swagger Docs
301 lines (239 loc) • 8.38 kB
JavaScript
"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;
}
}