openapi-modifier
Version:
This package allows you to automate the process of modifying OpenAPI specifications by applying a set of predefined rules
111 lines (110 loc) • 7.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.configSchema = void 0;
const zod_1 = require("zod");
const refs_1 = require("../common/utils/refs");
const each_operation_1 = require("../common/utils/iterators/each-operation");
const factory_1 = require("../../logger/messages/factory");
const configSchema = zod_1.z
.object({
map: zod_1.z.record(zod_1.z.string(), zod_1.z.string()),
})
.strict();
exports.configSchema = configSchema;
const processor = {
configSchema,
defaultConfig: {
map: {},
},
processDocument: (openAPIFile, config, logger) => {
var _a, _b, _c, _d;
const { map } = config;
let usageCount = {};
const increaseUsageCount = (contentType) => {
usageCount[contentType] = (usageCount[contentType] || 0) + 1;
};
logger.trace(`Check components.requestBodies ...`);
// forEach - components.requestBodies[name].content.[contentType].schema
Object.keys(((_b = (_a = openAPIFile.document) === null || _a === void 0 ? void 0 : _a.components) === null || _b === void 0 ? void 0 : _b.requestBodies) || {}).forEach((name) => {
var _a, _b, _c;
const requestBodySchema = (_c = (_b = (_a = openAPIFile.document) === null || _a === void 0 ? void 0 : _a.components) === null || _b === void 0 ? void 0 : _b.requestBodies) === null || _c === void 0 ? void 0 : _c[name];
if ((0, refs_1.checkIsRefSchema)(requestBodySchema)) {
return;
}
Object.keys((requestBodySchema === null || requestBodySchema === void 0 ? void 0 : requestBodySchema.content) || {}).forEach((contentType) => {
var _a, _b, _c;
const newContentType = map[contentType];
if (((_a = requestBodySchema === null || requestBodySchema === void 0 ? void 0 : requestBodySchema.content) === null || _a === void 0 ? void 0 : _a[contentType]) && newContentType) {
logger.trace(`Change content-type - components.requestBodies[${name}].content.[${contentType}].schema`);
requestBodySchema.content[newContentType] = (_b = requestBodySchema === null || requestBodySchema === void 0 ? void 0 : requestBodySchema.content) === null || _b === void 0 ? void 0 : _b[contentType];
(_c = requestBodySchema === null || requestBodySchema === void 0 ? void 0 : requestBodySchema.content) === null || _c === void 0 ? true : delete _c[contentType];
increaseUsageCount(contentType);
}
});
});
logger.trace(`Check components.responses ...`);
// forEach - components.responses[code].content.[contentType].schema
Object.keys(((_d = (_c = openAPIFile.document) === null || _c === void 0 ? void 0 : _c.components) === null || _d === void 0 ? void 0 : _d.responses) || {}).forEach((code) => {
var _a, _b, _c;
const responsesCodeSchema = (_c = (_b = (_a = openAPIFile.document) === null || _a === void 0 ? void 0 : _a.components) === null || _b === void 0 ? void 0 : _b.responses) === null || _c === void 0 ? void 0 : _c[code];
if ((0, refs_1.checkIsRefSchema)(responsesCodeSchema)) {
return;
}
Object.keys((responsesCodeSchema === null || responsesCodeSchema === void 0 ? void 0 : responsesCodeSchema.content) || {}).forEach((contentType) => {
var _a, _b, _c;
const newContentType = map[contentType];
if (((_a = responsesCodeSchema === null || responsesCodeSchema === void 0 ? void 0 : responsesCodeSchema.content) === null || _a === void 0 ? void 0 : _a[contentType]) && newContentType) {
logger.trace(`Change content-type - components.responses[${code}].content.[${contentType}].schema`);
responsesCodeSchema.content[newContentType] = (_b = responsesCodeSchema === null || responsesCodeSchema === void 0 ? void 0 : responsesCodeSchema.content) === null || _b === void 0 ? void 0 : _b[contentType];
(_c = responsesCodeSchema === null || responsesCodeSchema === void 0 ? void 0 : responsesCodeSchema.content) === null || _c === void 0 ? true : delete _c[contentType];
increaseUsageCount(contentType);
}
});
});
logger.trace(`Check paths ...`);
(0, each_operation_1.forEachOperation)(openAPIFile, ({ operationSchema, path, method }) => {
logger.trace(`Check operation responses ...`);
// forEach - paths[path][method].responses[code].content[contentType].schema
const responses = (operationSchema === null || operationSchema === void 0 ? void 0 : operationSchema.responses) || {};
Object.keys(responses).forEach((code) => {
const responseSchema = responses[code];
if ((0, refs_1.checkIsRefSchema)(responseSchema)) {
return;
}
Object.keys((responseSchema === null || responseSchema === void 0 ? void 0 : responseSchema.content) || {}).forEach((contentType) => {
var _a, _b, _c;
const newContentType = map[contentType];
if (((_a = responseSchema === null || responseSchema === void 0 ? void 0 : responseSchema.content) === null || _a === void 0 ? void 0 : _a[contentType]) && newContentType) {
logger.trace(`Change content-type - paths[${path}][${method}].responses[${code}].content[${contentType}].schema`);
responseSchema.content[newContentType] = (_b = responseSchema === null || responseSchema === void 0 ? void 0 : responseSchema.content) === null || _b === void 0 ? void 0 : _b[contentType];
(_c = responseSchema === null || responseSchema === void 0 ? void 0 : responseSchema.content) === null || _c === void 0 ? true : delete _c[contentType];
increaseUsageCount(contentType);
}
});
});
logger.trace(`Check operation requestBody ...`);
// forEach - paths[path][method].requestBody.content[contentType].schema
const requestBody = operationSchema === null || operationSchema === void 0 ? void 0 : operationSchema.requestBody;
if (!(0, refs_1.checkIsRefSchema)(requestBody)) {
Object.keys((requestBody === null || requestBody === void 0 ? void 0 : requestBody.content) || {}).forEach((contentType) => {
var _a, _b, _c;
const newContentType = map[contentType];
if (((_a = requestBody === null || requestBody === void 0 ? void 0 : requestBody.content) === null || _a === void 0 ? void 0 : _a[contentType]) && newContentType) {
logger.trace(`Change content-type - paths[${path}][${method}].requestBody.content[${contentType}].schema`);
requestBody.content[newContentType] = (_b = requestBody === null || requestBody === void 0 ? void 0 : requestBody.content) === null || _b === void 0 ? void 0 : _b[contentType];
(_c = requestBody === null || requestBody === void 0 ? void 0 : requestBody.content) === null || _c === void 0 ? true : delete _c[contentType];
increaseUsageCount(contentType);
}
});
}
});
logger.trace(`Usage count: ${JSON.stringify(usageCount)}`);
Object.keys(map).forEach((contentType) => {
if (!usageCount[contentType]) {
logger.warning(factory_1.messagesFactory.configField.notUsaged(`map.${contentType}`));
}
});
return openAPIFile;
},
};
exports.default = processor;