routing-controllers-openapi
Version:
Runtime OpenAPI v3 spec generation for routing-controllers
97 lines • 8.93 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.ResponseSchema = exports.setOpenAPIMetadata = exports.getOpenAPIMetadata = exports.applyOpenAPIDecorator = exports.OpenAPI = void 0;
const tslib_1 = require("tslib");
const lodash_merge_1 = tslib_1.__importDefault(require("lodash.merge"));
require("reflect-metadata");
const index_1 = require("./index");
const OPEN_API_KEY = Symbol('routing-controllers-openapi:OpenAPI');
function OpenAPI(spec) {
return (...args) => {
if (args.length === 1) {
const [target] = args;
const currentMeta = getOpenAPIMetadata(target);
setOpenAPIMetadata([spec, ...currentMeta], target);
}
else {
const [target, key] = args;
const currentMeta = getOpenAPIMetadata(target, key);
setOpenAPIMetadata([spec, ...currentMeta], target, key);
}
};
}
exports.OpenAPI = OpenAPI;
function applyOpenAPIDecorator(originalOperation, route) {
const { action } = route;
const openAPIParams = [
...getOpenAPIMetadata(action.target),
...getOpenAPIMetadata(action.target.prototype, action.method),
];
return openAPIParams.reduce((acc, oaParam) => {
return typeof oaParam === 'function'
? oaParam(acc, route)
: (0, lodash_merge_1.default)({}, acc, oaParam);
}, originalOperation);
}
exports.applyOpenAPIDecorator = applyOpenAPIDecorator;
function getOpenAPIMetadata(target, key) {
return ((key
? Reflect.getMetadata(OPEN_API_KEY, target.constructor, key)
: Reflect.getMetadata(OPEN_API_KEY, target)) || []);
}
exports.getOpenAPIMetadata = getOpenAPIMetadata;
function setOpenAPIMetadata(value, target, key) {
return key
? Reflect.defineMetadata(OPEN_API_KEY, value, target.constructor, key)
: Reflect.defineMetadata(OPEN_API_KEY, value, target);
}
exports.setOpenAPIMetadata = setOpenAPIMetadata;
function ResponseSchema(responseClass, options = {}) {
const setResponseSchema = (source, route) => {
var _a;
const contentType = options.contentType || (0, index_1.getContentType)(route);
const description = options.description || '';
const isArray = options.isArray || false;
const statusCode = (options.statusCode || (0, index_1.getStatusCode)(route)) + '';
let responseSchemaName = '';
if (typeof responseClass === 'function' && responseClass.name) {
responseSchemaName = responseClass.name;
}
else if (typeof responseClass === 'string') {
responseSchemaName = responseClass;
}
if (responseSchemaName) {
const reference = {
$ref: `#/components/schemas/${responseSchemaName}`,
};
const schema = isArray ? { items: reference, type: 'array' } : reference;
const responses = {
[statusCode]: {
content: {
[contentType]: {
schema,
},
},
description,
},
};
const oldSchema = (_a = source.responses[statusCode]) === null || _a === void 0 ? void 0 : _a.content[contentType].schema;
if ((oldSchema === null || oldSchema === void 0 ? void 0 : oldSchema.$ref) || (oldSchema === null || oldSchema === void 0 ? void 0 : oldSchema.items) || (oldSchema === null || oldSchema === void 0 ? void 0 : oldSchema.oneOf)) {
const newStatusCodeResponse = (0, lodash_merge_1.default)({}, source.responses[statusCode], responses[statusCode]);
const newSchema = oldSchema.oneOf
? {
oneOf: [...oldSchema.oneOf, schema],
}
: { oneOf: [oldSchema, schema] };
newStatusCodeResponse.content[contentType].schema = newSchema;
source.responses[statusCode] = newStatusCodeResponse;
return source;
}
return (0, lodash_merge_1.default)({}, source, { responses });
}
return source;
};
return OpenAPI(setResponseSchema);
}
exports.ResponseSchema = ResponseSchema;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSx3RUFBaUM7QUFFakMsNEJBQXlCO0FBRXpCLG1DQUErRDtBQUUvRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMscUNBQXFDLENBQUMsQ0FBQTtBQWVsRSxTQUFnQixPQUFPLENBQUMsSUFBa0I7SUFFeEMsT0FBTyxDQUFDLEdBQUcsSUFBdUQsRUFBRSxFQUFFO1FBQ3BFLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDckIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQTtZQUNyQixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUM5QyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1NBQ25EO2FBQU07WUFDTCxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQTtZQUMxQixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFDbkQsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUE7U0FDeEQ7SUFDSCxDQUFDLENBQUE7QUFDSCxDQUFDO0FBYkQsMEJBYUM7QUFLRCxTQUFnQixxQkFBcUIsQ0FDbkMsaUJBQWtDLEVBQ2xDLEtBQWE7SUFFYixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFBO0lBQ3hCLE1BQU0sYUFBYSxHQUFHO1FBQ3BCLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNwQyxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFF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
;