openapi-diff
Version:
A CLI tool to identify differences between Swagger/OpenAPI specs.
77 lines (76 loc) • 4.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.findDifferencesInResponseHeaders = void 0;
const get_added_keys_from_objects_1 = require("./common/get-added-keys-from-objects");
const get_common_keys_from_objects_1 = require("./common/get-common-keys-from-objects");
const get_removed_keys_from_objects_1 = require("./common/get-removed-keys-from-objects");
const create_difference_1 = require("./create-difference");
const getHeaderDifferencePropertyName = (header) => {
return header.required.value
? 'response.required.header'
: 'response.optional.header';
};
const createAddHeaderDifference = (header) => {
return (0, create_difference_1.createDifference)({
action: 'add',
destinationSpecOrigins: [header.originalValue],
propertyName: getHeaderDifferencePropertyName(header),
source: 'openapi-diff',
sourceSpecOrigins: []
});
};
const createRemoveHeaderDifference = (header) => {
return (0, create_difference_1.createDifference)({
action: 'remove',
destinationSpecOrigins: [],
propertyName: getHeaderDifferencePropertyName(header),
source: 'openapi-diff',
sourceSpecOrigins: [header.originalValue]
});
};
const findAddedDifferencesInHeaders = (sourceResponseHeaders, destinationResponseHeaders) => {
const addedHeaders = (0, get_added_keys_from_objects_1.getAddedKeysFromObjects)(sourceResponseHeaders, destinationResponseHeaders);
return addedHeaders.map((headerName) => {
const addedHeader = destinationResponseHeaders[headerName];
return createAddHeaderDifference(addedHeader);
});
};
const findRequiredChangeDifferences = (sourceResponseHeader, destinationResponseHeader) => {
const requiredChangeDifferences = [];
if (sourceResponseHeader.required.value !== destinationResponseHeader.required.value) {
requiredChangeDifferences.push(createRemoveHeaderDifference(sourceResponseHeader), createAddHeaderDifference(destinationResponseHeader));
}
return requiredChangeDifferences;
};
const findDifferencesinMatchingHeaders = (sourceResponseHeaders, destinationResponseHeaders) => {
const matchingHeaders = (0, get_common_keys_from_objects_1.getCommonKeysFromObjects)(sourceResponseHeaders, destinationResponseHeaders);
return matchingHeaders.reduce((accumulator, headerName) => {
const sourceMatchingHeader = sourceResponseHeaders[headerName];
const destinationMatchingHeader = destinationResponseHeaders[headerName];
const requiredDifferences = findRequiredChangeDifferences(sourceMatchingHeader, destinationMatchingHeader);
return accumulator.concat(requiredDifferences);
}, []);
};
const findRemovedDifferencesInHeaders = (sourceResponseHeaders, destinationResponseHeaders) => {
const removedHeaders = (0, get_removed_keys_from_objects_1.getRemovedKeysFromObjects)(sourceResponseHeaders, destinationResponseHeaders);
return removedHeaders.map((headerName) => {
const removedHeader = sourceResponseHeaders[headerName];
return createRemoveHeaderDifference(removedHeader);
});
};
const normalizeHeaders = (responseHeaders) => {
return Object.keys(responseHeaders).reduce((accumulator, header) => {
const lowerCaseHeaderKey = header.toLowerCase();
accumulator[lowerCaseHeaderKey] = responseHeaders[header];
return accumulator;
}, {});
};
const findDifferencesInResponseHeaders = (sourceResponseHeaders, destinationResponseHeaders) => {
const normalizedSourceResponseHeaders = normalizeHeaders(sourceResponseHeaders);
const normalizedDestinationResponseHeaders = normalizeHeaders(destinationResponseHeaders);
const addedDifferences = findAddedDifferencesInHeaders(normalizedSourceResponseHeaders, normalizedDestinationResponseHeaders);
const matchingDifferences = findDifferencesinMatchingHeaders(normalizedSourceResponseHeaders, normalizedDestinationResponseHeaders);
const removedDifferences = findRemovedDifferencesInHeaders(normalizedSourceResponseHeaders, normalizedDestinationResponseHeaders);
return [...addedDifferences, ...matchingDifferences, ...removedDifferences];
};
exports.findDifferencesInResponseHeaders = findDifferencesInResponseHeaders;