@aws-cdk/cloudformation-diff
Version:
Utilities to diff CDK stacks against CloudFormation templates
91 lines • 12.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.diffAttribute = diffAttribute;
exports.diffCondition = diffCondition;
exports.diffMapping = diffMapping;
exports.diffMetadata = diffMetadata;
exports.diffOutput = diffOutput;
exports.diffParameter = diffParameter;
exports.diffResource = diffResource;
exports.diffUnknown = diffUnknown;
const types = require("./types");
const util_1 = require("./util");
function diffAttribute(oldValue, newValue) {
return new types.Difference(_asString(oldValue), _asString(newValue));
}
function diffCondition(oldValue, newValue) {
return new types.ConditionDifference(oldValue, newValue);
}
function diffMapping(oldValue, newValue) {
return new types.MappingDifference(oldValue, newValue);
}
function diffMetadata(oldValue, newValue) {
return new types.MetadataDifference(oldValue, newValue);
}
function diffOutput(oldValue, newValue) {
return new types.OutputDifference(oldValue, newValue);
}
function diffParameter(oldValue, newValue) {
return new types.ParameterDifference(oldValue, newValue);
}
function diffResource(oldValue, newValue) {
const resourceType = {
oldType: oldValue && oldValue.Type,
newType: newValue && newValue.Type,
};
let propertyDiffs = {};
let otherDiffs = {};
if (resourceType.oldType !== undefined && resourceType.oldType === resourceType.newType) {
// Only makes sense to inspect deeper if the types stayed the same
const impl = (0, util_1.loadResourceModel)(resourceType.oldType);
propertyDiffs = (0, util_1.diffKeyedEntities)(oldValue.Properties, newValue.Properties, (oldVal, newVal, key) => _diffProperty(oldVal, newVal, key, impl));
otherDiffs = (0, util_1.diffKeyedEntities)(oldValue, newValue, _diffOther);
delete otherDiffs.Properties;
}
return new types.ResourceDifference(oldValue, newValue, {
resourceType, propertyDiffs, otherDiffs,
});
function _diffProperty(oldV, newV, key, resourceSpec) {
let changeImpact = types.ResourceImpact.NO_CHANGE;
const spec = resourceSpec?.properties?.[key];
if (spec && !(0, util_1.deepEqual)(oldV, newV)) {
switch (spec.causesReplacement) {
case 'yes':
changeImpact = types.ResourceImpact.WILL_REPLACE;
break;
case 'maybe':
changeImpact = types.ResourceImpact.MAY_REPLACE;
break;
default:
// In those cases, whatever is the current value is what we should keep
changeImpact = types.ResourceImpact.WILL_UPDATE;
}
}
return new types.PropertyDifference(oldV, newV, { changeImpact });
}
function _diffOther(oldV, newV) {
return new types.Difference(oldV, newV);
}
}
function diffUnknown(oldValue, newValue) {
return new types.Difference(oldValue, newValue);
}
/**
* Coerces a given value to +string | undefined+.
*
* @param value - the value to be coerced.
*
* @returns +undefined+ if +value+ is +null+ or +undefined+,
* +value+ if it is a +string+,
* a compact JSON representation of +value+ otherwise.
*/
function _asString(value) {
if (value == null) {
return undefined;
}
if (typeof value === 'string') {
return value;
}
return JSON.stringify(value);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLHNDQUVDO0FBRUQsc0NBRUM7QUFFRCxrQ0FFQztBQUVELG9DQUVDO0FBRUQsZ0NBRUM7QUFFRCxzQ0FFQztBQUVELG9DQStDQztBQUVELGtDQUVDO0FBOUVELGlDQUFpQztBQUNqQyxpQ0FBeUU7QUFFekUsU0FBZ0IsYUFBYSxDQUFDLFFBQWEsRUFBRSxRQUFhO0lBQ3hELE9BQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFTLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBRUQsU0FBZ0IsYUFBYSxDQUFDLFFBQXlCLEVBQUUsUUFBeUI7SUFDaEYsT0FBTyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxRQUF1QixFQUFFLFFBQXVCO0lBQzFFLE9BQU8sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFFRCxTQUFnQixZQUFZLENBQUMsUUFBd0IsRUFBRSxRQUF3QjtJQUM3RSxPQUFPLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsU0FBZ0IsVUFBVSxDQUFDLFFBQXNCLEVBQUUsUUFBc0I7SUFDdkUsT0FBTyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxRQUF5QixFQUFFLFFBQXlCO0lBQ2hGLE9BQU8sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FB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QUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVzb3VyY2UgfSBmcm9tICdAYXdzLWNkay9zZXJ2aWNlLXNwZWMtdHlwZXMnO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBkZWVwRXF1YWwsIGRpZmZLZXllZEVudGl0aWVzLCBsb2FkUmVzb3VyY2VNb2RlbCB9IGZyb20gJy4vdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmQXR0cmlidXRlKG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpOiB0eXBlcy5EaWZmZXJlbmNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IHR5cGVzLkRpZmZlcmVuY2U8c3RyaW5nPihfYXNTdHJpbmcob2xkVmFsdWUpLCBfYXNTdHJpbmcobmV3VmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZDb25kaXRpb24ob2xkVmFsdWU6IHR5cGVzLkNvbmRpdGlvbiwgbmV3VmFsdWU6IHR5cGVzLkNvbmRpdGlvbik6IHR5cGVzLkNvbmRpdGlvbkRpZmZlcmVuY2Uge1xuICByZXR1cm4gbmV3IHR5cGVzLkNvbmRpdGlvbkRpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZNYXBwaW5nKG9sZFZhbHVlOiB0eXBlcy5NYXBwaW5nLCBuZXdWYWx1ZTogdHlwZXMuTWFwcGluZyk6IHR5cGVzLk1hcHBpbmdEaWZmZXJlbmNlIHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5NYXBwaW5nRGlmZmVyZW5jZShvbGRWYWx1ZSwgbmV3VmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlmZk1ldGFkYXRhKG9sZFZhbHVlOiB0eXBlcy5NZXRhZGF0YSwgbmV3VmFsdWU6IHR5cGVzLk1ldGFkYXRhKTogdHlwZXMuTWV0YWRhdGFEaWZmZXJlbmNlIHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5NZXRhZGF0YURpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZPdXRwdXQob2xkVmFsdWU6IHR5cGVzLk91dHB1dCwgbmV3VmFsdWU6IHR5cGVzLk91dHB1dCk6IHR5cGVzLk91dHB1dERpZmZlcmVuY2Uge1xuICByZXR1cm4gbmV3IHR5cGVzLk91dHB1dERpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZQYXJhbWV0ZXIob2xkVmFsdWU6IHR5cGVzLlBhcmFtZXRlciwgbmV3VmFsdWU6IHR5cGVzLlBhcmFtZXRlcik6IHR5cGVzLlBhcmFtZXRlckRpZmZlcmVuY2Uge1xuICByZXR1cm4gbmV3IHR5cGVzLlBhcmFtZXRlckRpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZSZXNvdXJjZShvbGRWYWx1ZT86IHR5cGVzLlJlc291cmNlLCBuZXdWYWx1ZT86IHR5cGVzLlJlc291cmNlKTogdHlwZXMuUmVzb3VyY2VEaWZmZXJlbmNlIHtcbiAgY29uc3QgcmVzb3VyY2VUeXBlID0ge1xuICAgIG9sZFR5cGU6IG9sZFZhbHVlICYmIG9sZFZhbHVlLlR5cGUsXG4gICAgbmV3VHlwZTogbmV3VmFsdWUgJiYgbmV3VmFsdWUuVHlwZSxcbiAgfTtcbiAgbGV0IHByb3BlcnR5RGlmZnM6IHsgW2tleTogc3RyaW5nXTogdHlwZXMuUHJvcGVydHlEaWZmZXJlbmNlPGFueT4gfSA9IHt9O1xuICBsZXQgb3RoZXJEaWZmczogeyBba2V5OiBzdHJpbmddOiB0eXBlcy5EaWZmZXJlbmNlPGFueT4gfSA9IHt9O1xuXG4gIGlmIChyZXNvdXJjZVR5cGUub2xkVHlwZSAhPT0gdW5kZWZpbmVkICYmIHJlc291cmNlVHlwZS5vbGRUeXBlID09PSByZXNvdXJjZVR5cGUubmV3VHlwZSkge1xuICAgIC8vIE9ubHkgbWFrZXMgc2Vuc2UgdG8gaW5zcGVjdCBkZWVwZXIgaWYgdGhlIHR5cGVzIHN0YXllZCB0aGUgc2FtZVxuICAgIGNvbnN0IGltcGwgPSBsb2FkUmVzb3VyY2VNb2RlbChyZXNvdXJjZVR5cGUub2xkVHlwZSk7XG4gICAgcHJvcGVydHlEaWZmcyA9IGRpZmZLZXllZEVudGl0aWVzKG9sZFZhbHVlIS5Qcm9wZXJ0aWVzLFxuICAgICAgbmV3VmFsdWUhLlByb3BlcnRpZXMsXG4gICAgICAob2xkVmFsLCBuZXdWYWwsIGtleSkgPT4gX2RpZmZQcm9wZXJ0eShvbGRWYWwsIG5ld1ZhbCwga2V5LCBpbXBsKSk7XG5cbiAgICBvdGhlckRpZmZzID0gZGlmZktleWVkRW50aXRpZXMob2xkVmFsdWUsIG5ld1ZhbHVlLCBfZGlmZk90aGVyKTtcbiAgICBkZWxldGUgb3RoZXJEaWZmcy5Qcm9wZXJ0aWVzO1xuICB9XG5cbiAgcmV0dXJuIG5ldyB0eXBlcy5SZXNvdXJjZURpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlLCB7XG4gICAgcmVzb3VyY2VUeXBlLCBwcm9wZXJ0eURpZmZzLCBvdGhlckRpZmZzLFxuICB9KTtcblxuICBmdW5jdGlvbiBfZGlmZlByb3BlcnR5KG9sZFY6IGFueSwgbmV3VjogYW55LCBrZXk6IHN0cmluZywgcmVzb3VyY2VTcGVjPzogUmVzb3VyY2UpIHtcbiAgICBsZXQgY2hhbmdlSW1wYWN0ID0gdHlwZXMuUmVzb3VyY2VJbXBhY3QuTk9fQ0hBTkdFO1xuXG4gICAgY29uc3Qgc3BlYyA9IHJlc291cmNlU3BlYz8ucHJvcGVydGllcz8uW2tleV07XG4gICAgaWYgKHNwZWMgJiYgIWRlZXBFcXVhbChvbGRWLCBuZXdWKSkge1xuICAgICAgc3dpdGNoIChzcGVjLmNhdXNlc1JlcGxhY2VtZW50KSB7XG4gICAgICAgIGNhc2UgJ3llcyc6XG4gICAgICAgICAgY2hhbmdlSW1wYWN0ID0gdHlwZXMuUmVzb3VyY2VJbXBhY3QuV0lMTF9SRVBMQUNFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtYXliZSc6XG4gICAgICAgICAgY2hhbmdlSW1wYWN0ID0gdHlwZXMuUmVzb3VyY2VJbXBhY3QuTUFZX1JFUExBQ0U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSW4gdGhvc2UgY2FzZXMsIHdoYXRldmVyIGlzIHRoZSBjdXJyZW50IHZhbHVlIGlzIHdoYXQgd2Ugc2hvdWxkIGtlZXBcbiAgICAgICAgICBjaGFuZ2VJbXBhY3QgPSB0eXBlcy5SZXNvdXJjZUltcGFjdC5XSUxMX1VQREFURTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IHR5cGVzLlByb3BlcnR5RGlmZmVyZW5jZShvbGRWLCBuZXdWLCB7IGNoYW5nZUltcGFjdCB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9kaWZmT3RoZXIob2xkVjogYW55LCBuZXdWOiBhbnkpIHtcbiAgICByZXR1cm4gbmV3IHR5cGVzLkRpZmZlcmVuY2Uob2xkViwgbmV3Vik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZVbmtub3duKG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpOiB0eXBlcy5EaWZmZXJlbmNlPGFueT4ge1xuICByZXR1cm4gbmV3IHR5cGVzLkRpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuLyoqXG4gKiBDb2VyY2VzIGEgZ2l2ZW4gdmFsdWUgdG8gK3N0cmluZyB8IHVuZGVmaW5lZCsuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gdGhlIHZhbHVlIHRvIGJlIGNvZXJjZWQuXG4gKlxuICogQHJldHVybnMgK3VuZGVmaW5lZCsgaWYgK3ZhbHVlKyBpcyArbnVsbCsgb3IgK3VuZGVmaW5lZCssXG4gKiAgICAgICt2YWx1ZSsgaWYgaXQgaXMgYSArc3RyaW5nKyxcbiAqICAgICAgYSBjb21wYWN0IEpTT04gcmVwcmVzZW50YXRpb24gb2YgK3ZhbHVlKyBvdGhlcndpc2UuXG4gKi9cbmZ1bmN0aW9uIF9hc1N0cmluZyh2YWx1ZTogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlIGFzIHN0cmluZztcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufVxuIl19