UNPKG

routing-controllers-openapi-extended

Version:

Runtime Swagger v2 / OpenAPI v2 specification generation for routing-controllers

158 lines 13.1 kB
"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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