swagger-client
Version:
SwaggerJS - a collection of interfaces for OAI specs
105 lines (100 loc) • 3.99 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
exports.__esModule = true;
exports.default = normalize;
var _ramdaAdjunct = require("ramda-adjunct");
var _opId = _interopRequireDefault(require("../../../helpers/op-id.js"));
function normalize(parsedSpec) {
const {
spec
} = parsedSpec;
const {
paths
} = spec;
const map = {};
if (!paths || spec.$$normalized) {
return parsedSpec;
}
// eslint-disable-next-line no-restricted-syntax, guard-for-in
for (const pathName in paths) {
const path = paths[pathName];
if (path == null || !['object', 'function'].includes(typeof path)) {
continue; // eslint-disable-line no-continue
}
const pathParameters = path.parameters;
// eslint-disable-next-line no-restricted-syntax, guard-for-in
for (const method in path) {
const operation = path[method];
if (operation == null || !['object', 'function'].includes(typeof operation)) {
continue; // eslint-disable-line no-continue
}
const oid = (0, _opId.default)(operation, pathName, method);
if (oid) {
if (map[oid]) {
map[oid].push(operation);
} else {
map[oid] = [operation];
}
const opList = map[oid];
if (opList.length > 1) {
opList.forEach((o, i) => {
// eslint-disable-next-line no-underscore-dangle
o.__originalOperationId = o.__originalOperationId || o.operationId;
o.operationId = `${oid}${i + 1}`;
});
} else if (typeof operation.operationId !== 'undefined') {
// Ensure we always add the normalized operation ID if one already exists
// ( potentially different, given that we normalize our IDs)
// ... _back_ to the spec. Otherwise, they might not line up
const obj = opList[0];
// eslint-disable-next-line no-underscore-dangle
obj.__originalOperationId = obj.__originalOperationId || operation.operationId;
obj.operationId = oid;
}
}
if (method !== 'parameters') {
// Add inherited consumes, produces, parameters, securities
const inheritsList = [];
const toBeInherit = {};
// Global-levels
// eslint-disable-next-line no-restricted-syntax
for (const key in spec) {
if (key === 'produces' || key === 'consumes' || key === 'security') {
toBeInherit[key] = spec[key];
inheritsList.push(toBeInherit);
}
}
// Path-levels
if (pathParameters) {
toBeInherit.parameters = pathParameters;
inheritsList.push(toBeInherit);
}
if (inheritsList.length) {
// eslint-disable-next-line no-restricted-syntax
for (const inherits of inheritsList) {
// eslint-disable-next-line no-restricted-syntax
for (const inheritName in inherits) {
if (!Array.isArray(operation[inheritName])) {
operation[inheritName] = inherits[inheritName];
} else if (inheritName === 'parameters') {
// eslint-disable-next-line no-restricted-syntax
for (const param of inherits[inheritName]) {
const exists = operation[inheritName].some(opParam => {
if (!(0, _ramdaAdjunct.isPlainObject)(opParam) && !(0, _ramdaAdjunct.isPlainObject)(param)) return false;
if (opParam === param) return true;
return ['name', '$ref', '$$ref'].some(key => typeof opParam[key] === 'string' && typeof param[key] === 'string' && opParam[key] === param[key]);
});
if (!exists) {
operation[inheritName].push(param);
}
}
}
}
}
}
}
}
}
spec.$$normalized = true;
return parsedSpec;
}