UNPKG

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
"use strict"; 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;