routing-controllers-openapi-extended
Version:
Runtime Swagger v2 / OpenAPI v2 specification generation for routing-controllers
158 lines • 13.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
require("reflect-metadata");
const _ = require("lodash");
const pathToRegexp = require("path-to-regexp");
const pathParser_1 = require("./pathParser");
const common_1 = require("./common");
const storage_1 = require("../storage");
function getCustomParameters(route) {
const { target, method } = route.action;
return storage_1.getStorage().filterParametersByTarget(target, method);
}
exports.getCustomParameters = getCustomParameters;
function getCustomParametersByName(route, name) {
let customParameter;
if (name) {
customParameter = getCustomParameters(route).find(p => p.name === name);
}
return customParameter || { name };
}
function getParamSchema(param) {
const { explicitType, index, object, method } = param;
const type = Reflect.getMetadata('design:paramtypes', object, method)[index];
if (_.isFunction(type) && type.name === 'Array') {
const items = explicitType
? { $ref: '#/definitions/' + explicitType.name }
: { type: 'object' };
return { items, type: 'array' };
}
if (explicitType) {
return { $ref: '#/definitions/' + explicitType.name };
}
if (_.isFunction(type)) {
if (_.isString(type.prototype) || _.isSymbol(type.prototype)) {
return { type: 'string' };
}
else if (_.isNumber(type.prototype)) {
return { type: 'number' };
}
else if (_.isBoolean(type.prototype)) {
return { type: 'boolean' };
}
else if (type.name !== 'Object') {
return { $ref: '#/definitions/' + type.name };
}
}
return {};
}
exports.getParamSchema = getParamSchema;
function getHeaderParams(route) {
const headers = route.params.filter(p => p.type === 'header')
.map(headerMeta => {
const headerParam = {
in: 'header',
name: headerMeta.name || 'Unknown',
required: common_1.isRequired(headerMeta, route),
type: 'string',
};
const customParameter = getCustomParametersByName(route, headerMeta.name || '');
return _.merge(headerParam, customParameter);
});
const headersMeta = _.find(route.params, { type: 'headers' });
if (headersMeta) {
const schema = getParamSchema(headersMeta);
headers.push({
in: 'header',
name: _.last(_.split(schema.$ref, '/')) || '',
required: common_1.isRequired(headersMeta, route),
schema
});
}
return headers;
}
exports.getHeaderParams = getHeaderParams;
function getPathParams(route) {
const path = pathParser_1.getFullExpressPath(route);
const tokens = pathToRegexp.parse(path);
return tokens.filter(_.isObject)
.map((token) => {
const name = Number.isInteger(token.name) ? token.pattern : `${token.name}`;
const param = {
in: 'path',
name: name || 'Unknown',
required: !token.optional,
type: 'string',
};
const customParameter = getCustomParametersByName(route, name);
return _.merge(param, customParameter);
});
}
exports.getPathParams = getPathParams;
function getQueryParams(route) {
const queries = route.params.filter(p => p.type === 'query')
.map(queryMeta => {
const schema = getParamSchema(queryMeta);
const queryParam = {
in: 'query',
name: queryMeta.name || 'Unknown',
required: common_1.isRequired(queryMeta, route),
schema,
};
const customParameter = getCustomParametersByName(route, queryMeta.name || '');
if (!schema.$ref) {
queryParam.type = schema.type;
delete queryParam.schema;
}
return _.merge(queryParam, customParameter);
});
const queriesMeta = _.find(route.params, { type: 'queries' });
if (queriesMeta) {
const schema = getParamSchema(queriesMeta);
queries.push({
in: 'query',
name: _.last(_.split(schema.$ref, '/')) || '',
required: common_1.isRequired(queriesMeta, route),
schema
});
}
return queries;
}
exports.getQueryParams = getQueryParams;
function getBodyParams(route) {
return route.params.filter(p => p.type === 'body')
.map(queryMeta => {
const schema = getParamSchema(queryMeta);
const bodyParams = {
in: 'body',
name: queryMeta.name || queryMeta.type,
required: common_1.isRequired(queryMeta, route),
schema,
};
const customParameter = getCustomParametersByName(route, bodyParams.name);
if (!schema.$ref) {
bodyParams.type = schema.type;
delete bodyParams.schema;
}
return _.merge(bodyParams, customParameter);
});
}
exports.getBodyParams = getBodyParams;
function getParameters(route) {
const parameters = [
...getHeaderParams(route),
...getPathParams(route),
...getQueryParams(route),
...getBodyParams(route),
];
const parametersSet = new Set(parameters.map((p) => p.name));
const customParameters = getCustomParameters(route);
customParameters.forEach((customParam) => {
if (!parametersSet.has(customParam.name)) {
parameters.push(customParam);
}
});
return parameters;
}
exports.getParameters = getParameters;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyUGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnNlci9wYXJhbWV0ZXJQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw0QkFBMEI7QUFDMUIsNEJBQTJCO0FBSTNCLCtDQUFnRDtBQUNoRCw2Q0FBa0Q7QUFDbEQscUNBQXNDO0FBQ3RDLHdDQUF3QztBQUd4QyxTQUFnQixtQkFBbUIsQ0FBQyxLQUFZO0lBQzlDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUV4QyxPQUFPLG9CQUFVLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUpELGtEQUlDO0FBRUQsU0FBUyx5QkFBeUIsQ0FBQyxLQUFZLEVBQUUsSUFBWTtJQUMzRCxJQUFJLGVBQWUsQ0FBQztJQUVuQixJQUFJLElBQUksRUFBRTtRQUNULGVBQWUsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0tBQ3hFO0lBRUQsT0FBTyxlQUFlLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUN0QyxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLEtBQXdCO0lBQ25ELE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUE7SUFFckQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDNUUsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFO1FBQy9D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