[d24f17c] | 1 | import opId from '../../../helpers/op-id.js';
|
---|
| 2 | export default function normalize(parsedSpec) {
|
---|
| 3 | const {
|
---|
| 4 | spec
|
---|
| 5 | } = parsedSpec;
|
---|
| 6 | const {
|
---|
| 7 | paths
|
---|
| 8 | } = spec;
|
---|
| 9 | const map = {};
|
---|
| 10 | if (!paths || spec.$$normalized) {
|
---|
| 11 | return parsedSpec;
|
---|
| 12 | }
|
---|
| 13 |
|
---|
| 14 | // eslint-disable-next-line no-restricted-syntax, guard-for-in
|
---|
| 15 | for (const pathName in paths) {
|
---|
| 16 | const path = paths[pathName];
|
---|
| 17 | if (path == null || !['object', 'function'].includes(typeof path)) {
|
---|
| 18 | continue; // eslint-disable-line no-continue
|
---|
| 19 | }
|
---|
| 20 | const pathParameters = path.parameters;
|
---|
| 21 |
|
---|
| 22 | // eslint-disable-next-line no-restricted-syntax, guard-for-in
|
---|
| 23 | for (const method in path) {
|
---|
| 24 | const operation = path[method];
|
---|
| 25 | if (operation == null || !['object', 'function'].includes(typeof operation)) {
|
---|
| 26 | continue; // eslint-disable-line no-continue
|
---|
| 27 | }
|
---|
| 28 | const oid = opId(operation, pathName, method);
|
---|
| 29 | if (oid) {
|
---|
| 30 | if (map[oid]) {
|
---|
| 31 | map[oid].push(operation);
|
---|
| 32 | } else {
|
---|
| 33 | map[oid] = [operation];
|
---|
| 34 | }
|
---|
| 35 | const opList = map[oid];
|
---|
| 36 | if (opList.length > 1) {
|
---|
| 37 | opList.forEach((o, i) => {
|
---|
| 38 | // eslint-disable-next-line no-underscore-dangle
|
---|
| 39 | o.__originalOperationId = o.__originalOperationId || o.operationId;
|
---|
| 40 | o.operationId = `${oid}${i + 1}`;
|
---|
| 41 | });
|
---|
| 42 | } else if (typeof operation.operationId !== 'undefined') {
|
---|
| 43 | // Ensure we always add the normalized operation ID if one already exists
|
---|
| 44 | // ( potentially different, given that we normalize our IDs)
|
---|
| 45 | // ... _back_ to the spec. Otherwise, they might not line up
|
---|
| 46 | const obj = opList[0];
|
---|
| 47 | // eslint-disable-next-line no-underscore-dangle
|
---|
| 48 | obj.__originalOperationId = obj.__originalOperationId || operation.operationId;
|
---|
| 49 | obj.operationId = oid;
|
---|
| 50 | }
|
---|
| 51 | }
|
---|
| 52 | if (method !== 'parameters') {
|
---|
| 53 | // Add inherited consumes, produces, parameters, securities
|
---|
| 54 | const inheritsList = [];
|
---|
| 55 | const toBeInherit = {};
|
---|
| 56 |
|
---|
| 57 | // Global-levels
|
---|
| 58 | // eslint-disable-next-line no-restricted-syntax
|
---|
| 59 | for (const key in spec) {
|
---|
| 60 | if (key === 'produces' || key === 'consumes' || key === 'security') {
|
---|
| 61 | toBeInherit[key] = spec[key];
|
---|
| 62 | inheritsList.push(toBeInherit);
|
---|
| 63 | }
|
---|
| 64 | }
|
---|
| 65 |
|
---|
| 66 | // Path-levels
|
---|
| 67 | if (pathParameters) {
|
---|
| 68 | toBeInherit.parameters = pathParameters;
|
---|
| 69 | inheritsList.push(toBeInherit);
|
---|
| 70 | }
|
---|
| 71 | if (inheritsList.length) {
|
---|
| 72 | // eslint-disable-next-line no-restricted-syntax
|
---|
| 73 | for (const inherits of inheritsList) {
|
---|
| 74 | // eslint-disable-next-line no-restricted-syntax
|
---|
| 75 | for (const inheritName in inherits) {
|
---|
| 76 | if (!operation[inheritName]) {
|
---|
| 77 | operation[inheritName] = inherits[inheritName];
|
---|
| 78 | } else if (inheritName === 'parameters') {
|
---|
| 79 | // eslint-disable-next-line no-restricted-syntax
|
---|
| 80 | for (const param of inherits[inheritName]) {
|
---|
| 81 | const exists = operation[inheritName].some(opParam => opParam.name && opParam.name === param.name || opParam.$ref && opParam.$ref === param.$ref || opParam.$$ref && opParam.$$ref === param.$$ref || opParam === param);
|
---|
| 82 | if (!exists) {
|
---|
| 83 | operation[inheritName].push(param);
|
---|
| 84 | }
|
---|
| 85 | }
|
---|
| 86 | }
|
---|
| 87 | }
|
---|
| 88 | }
|
---|
| 89 | }
|
---|
| 90 | }
|
---|
| 91 | }
|
---|
| 92 | }
|
---|
| 93 | spec.$$normalized = true;
|
---|
| 94 | return parsedSpec;
|
---|
| 95 | } |
---|