openapi-diff
Version:
A CLI tool to identify differences between Swagger/OpenAPI specs.
84 lines (83 loc) • 3.54 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.findDiffsInXProperties = void 0;
const _ = require("lodash");
const create_difference_1 = require("./create-difference");
const findDiffsInXProperty = (sourceObject, destinationObject, propertyName) => {
const additionDiffs = findAdditionDiffsInXProperty(sourceObject, destinationObject, propertyName);
const deletionDiffs = findDeletionDiffsInXProperty(sourceObject, destinationObject, propertyName);
const editionDiffs = findEditionDiffsInXProperty(sourceObject, destinationObject, propertyName);
return _.concat([], additionDiffs, deletionDiffs, editionDiffs);
};
const findAdditionDiffsInXProperty = (sourceObject, destinationObject, propertyName) => {
const isAddition = isUndefinedDeep(sourceObject) && isDefinedDeep(destinationObject);
if (isAddition) {
return [(0, create_difference_1.createDifference)({
action: 'add',
destinationSpecOrigins: [destinationObject],
propertyName,
source: 'openapi-diff',
sourceSpecOrigins: []
})];
}
return [];
};
const findDeletionDiffsInXProperty = (sourceObject, destinationObject, propertyName) => {
const isDeletion = isDefinedDeep(sourceObject) && isUndefinedDeep(destinationObject);
if (isDeletion) {
return [(0, create_difference_1.createDifference)({
action: 'remove',
destinationSpecOrigins: [],
propertyName,
source: 'openapi-diff',
sourceSpecOrigins: [sourceObject]
})];
}
return [];
};
const findEditionDiffsInXProperty = (sourceObject, destinationObject, propertyName) => {
const isEdition = isDefinedDeep(sourceObject)
&& isDefinedDeep(destinationObject) && !_.isEqual(sourceObject.value, destinationObject.value);
if (isEdition) {
return [
(0, create_difference_1.createDifference)({
action: 'add',
destinationSpecOrigins: [destinationObject],
propertyName,
source: 'openapi-diff',
sourceSpecOrigins: [sourceObject]
}),
(0, create_difference_1.createDifference)({
action: 'remove',
destinationSpecOrigins: [destinationObject],
propertyName,
source: 'openapi-diff',
sourceSpecOrigins: [sourceObject]
})
];
}
return [];
};
const isUndefinedDeep = (objectWithValue) => {
return _.isUndefined(objectWithValue) || _.isUndefined(objectWithValue.value);
};
const isDefinedDeep = (objectWithValue) => {
return isDefined(objectWithValue) && isDefined(objectWithValue.value);
};
const isDefined = (target) => {
return !_.isUndefined(target);
};
const findDiffsInXProperties = (sourceParsedXProperties, destinationParsedXProperties, xPropertyContainerName) => {
const xPropertyUniqueNames = _(_.keys(sourceParsedXProperties))
.concat(_.keys(destinationParsedXProperties))
.uniq()
.value();
const xPropertyDiffs = _(xPropertyUniqueNames)
.map((xPropertyName) => {
return findDiffsInXProperty(sourceParsedXProperties[xPropertyName], destinationParsedXProperties[xPropertyName], `${xPropertyContainerName}.${xPropertyName}`);
})
.flatten()
.value();
return xPropertyDiffs;
};
exports.findDiffsInXProperties = findDiffsInXProperties;