@aws-cdk/cloudformation-diff 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +2 -0
- package/README.md +12 -0
- package/lib/diff/index.d.ts +9 -0
- package/lib/diff/index.js +92 -0
- package/lib/diff/maybe-parsed.d.ts +14 -0
- package/lib/diff/maybe-parsed.js +14 -0
- package/lib/diff/template-and-changeset-diff-merger.d.ts +33 -0
- package/lib/diff/template-and-changeset-diff-merger.js +128 -0
- package/lib/diff/types.d.ts +368 -0
- package/lib/diff/types.js +498 -0
- package/lib/diff/util.d.ts +57 -0
- package/lib/diff/util.js +199 -0
- package/lib/diff-template.d.ts +25 -0
- package/lib/diff-template.js +212 -0
- package/lib/diffable.d.ts +22 -0
- package/lib/diffable.js +47 -0
- package/lib/format-table.d.ts +6 -0
- package/lib/format-table.js +108 -0
- package/lib/format.d.ts +106 -0
- package/lib/format.js +436 -0
- package/lib/iam/iam-changes.d.ts +66 -0
- package/lib/iam/iam-changes.js +421 -0
- package/lib/iam/iam-identity-center.d.ts +78 -0
- package/lib/iam/iam-identity-center.js +46 -0
- package/lib/iam/managed-policy.d.ts +11 -0
- package/lib/iam/managed-policy.js +33 -0
- package/lib/iam/statement.d.ts +113 -0
- package/lib/iam/statement.js +270 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +24 -0
- package/lib/network/security-group-changes.d.ts +32 -0
- package/lib/network/security-group-changes.js +99 -0
- package/lib/network/security-group-rule.d.ts +50 -0
- package/lib/network/security-group-rule.js +97 -0
- package/lib/render-intrinsics.d.ts +21 -0
- package/lib/render-intrinsics.js +78 -0
- package/lib/util.d.ts +7 -0
- package/lib/util.js +62 -0
- package/package.json +80 -0
package/lib/diff/util.js
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deepEqual = deepEqual;
|
|
4
|
+
exports.diffKeyedEntities = diffKeyedEntities;
|
|
5
|
+
exports.unionOf = unionOf;
|
|
6
|
+
exports.mangleLikeCloudFormation = mangleLikeCloudFormation;
|
|
7
|
+
exports.loadResourceModel = loadResourceModel;
|
|
8
|
+
const aws_service_spec_1 = require("@aws-cdk/aws-service-spec");
|
|
9
|
+
/**
|
|
10
|
+
* Compares two objects for equality, deeply. The function handles arguments that are
|
|
11
|
+
* +null+, +undefined+, arrays and objects. For objects, the function will not take the
|
|
12
|
+
* object prototype into account for the purpose of the comparison, only the values of
|
|
13
|
+
* properties reported by +Object.keys+.
|
|
14
|
+
*
|
|
15
|
+
* If both operands can be parsed to equivalent numbers, will return true.
|
|
16
|
+
* This makes diff consistent with CloudFormation, where a numeric 10 and a literal "10"
|
|
17
|
+
* are considered equivalent.
|
|
18
|
+
*
|
|
19
|
+
* @param lvalue the left operand of the equality comparison.
|
|
20
|
+
* @param rvalue the right operand of the equality comparison.
|
|
21
|
+
*
|
|
22
|
+
* @returns +true+ if both +lvalue+ and +rvalue+ are equivalent to each other.
|
|
23
|
+
*/
|
|
24
|
+
function deepEqual(lvalue, rvalue) {
|
|
25
|
+
if (lvalue === rvalue) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
// CloudFormation allows passing strings into boolean-typed fields
|
|
29
|
+
if (((typeof lvalue === 'string' && typeof rvalue === 'boolean') ||
|
|
30
|
+
(typeof lvalue === 'boolean' && typeof rvalue === 'string')) &&
|
|
31
|
+
lvalue.toString() === rvalue.toString()) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
// allows a numeric 10 and a literal "10" to be equivalent;
|
|
35
|
+
// this is consistent with CloudFormation.
|
|
36
|
+
if ((typeof lvalue === 'string' || typeof rvalue === 'string') &&
|
|
37
|
+
safeParseFloat(lvalue) === safeParseFloat(rvalue)) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
if (typeof lvalue !== typeof rvalue) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
if (Array.isArray(lvalue) !== Array.isArray(rvalue)) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
if (Array.isArray(lvalue) /* && Array.isArray(rvalue) */) {
|
|
47
|
+
if (lvalue.length !== rvalue.length) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
for (let i = 0; i < lvalue.length; i++) {
|
|
51
|
+
if (!deepEqual(lvalue[i], rvalue[i])) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
if (typeof lvalue === 'object' /* && typeof rvalue === 'object' */) {
|
|
58
|
+
if (lvalue === null || rvalue === null) {
|
|
59
|
+
// If both were null, they'd have been ===
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
const keys = Object.keys(lvalue);
|
|
63
|
+
if (keys.length !== Object.keys(rvalue).length) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
for (const key of keys) {
|
|
67
|
+
if (!rvalue.hasOwnProperty(key)) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
if (key === 'DependsOn') {
|
|
71
|
+
if (!dependsOnEqual(lvalue[key], rvalue[key])) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
// check differences other than `DependsOn`
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (!deepEqual(lvalue[key], rvalue[key])) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
// Neither object, nor array: I deduce this is primitive type
|
|
84
|
+
// Primitive type and not ===, so I deduce not deepEqual
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Compares two arguments to DependsOn for equality.
|
|
89
|
+
*
|
|
90
|
+
* @param lvalue the left operand of the equality comparison.
|
|
91
|
+
* @param rvalue the right operand of the equality comparison.
|
|
92
|
+
*
|
|
93
|
+
* @returns +true+ if both +lvalue+ and +rvalue+ are equivalent to each other.
|
|
94
|
+
*/
|
|
95
|
+
function dependsOnEqual(lvalue, rvalue) {
|
|
96
|
+
// allows ['Value'] and 'Value' to be equal
|
|
97
|
+
if (Array.isArray(lvalue) !== Array.isArray(rvalue)) {
|
|
98
|
+
const array = Array.isArray(lvalue) ? lvalue : rvalue;
|
|
99
|
+
const nonArray = Array.isArray(lvalue) ? rvalue : lvalue;
|
|
100
|
+
if (array.length === 1 && deepEqual(array[0], nonArray)) {
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
// allows arrays passed to DependsOn to be equivalent irrespective of element order
|
|
106
|
+
if (Array.isArray(lvalue) && Array.isArray(rvalue)) {
|
|
107
|
+
if (lvalue.length !== rvalue.length) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
for (let i = 0; i < lvalue.length; i++) {
|
|
111
|
+
for (let j = 0; j < lvalue.length; j++) {
|
|
112
|
+
if ((!deepEqual(lvalue[i], rvalue[j])) && (j === lvalue.length - 1)) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Produce the differences between two maps, as a map, using a specified diff function.
|
|
124
|
+
*
|
|
125
|
+
* @param oldValue the old map.
|
|
126
|
+
* @param newValue the new map.
|
|
127
|
+
* @param elementDiff the diff function.
|
|
128
|
+
*
|
|
129
|
+
* @returns a map representing the differences between +oldValue+ and +newValue+.
|
|
130
|
+
*/
|
|
131
|
+
function diffKeyedEntities(oldValue, newValue, elementDiff) {
|
|
132
|
+
const result = {};
|
|
133
|
+
for (const logicalId of unionOf(Object.keys(oldValue || {}), Object.keys(newValue || {}))) {
|
|
134
|
+
const oldElement = oldValue && oldValue[logicalId];
|
|
135
|
+
const newElement = newValue && newValue[logicalId];
|
|
136
|
+
if (oldElement === undefined && newElement === undefined) {
|
|
137
|
+
// Shouldn't happen in reality, but may happen in tests. Skip.
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
result[logicalId] = elementDiff(oldElement, newElement, logicalId);
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Computes the union of two sets of strings.
|
|
146
|
+
*
|
|
147
|
+
* @param lv the left set of strings.
|
|
148
|
+
* @param rv the right set of strings.
|
|
149
|
+
*
|
|
150
|
+
* @returns a new array containing all elemebts from +lv+ and +rv+, with no duplicates.
|
|
151
|
+
*/
|
|
152
|
+
function unionOf(lv, rv) {
|
|
153
|
+
const result = new Set(lv);
|
|
154
|
+
for (const v of rv) {
|
|
155
|
+
result.add(v);
|
|
156
|
+
}
|
|
157
|
+
return new Array(...result);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* GetStackTemplate flattens any codepoint greater than "\u7f" to "?". This is
|
|
161
|
+
* true even for codepoints in the supplemental planes which are represented
|
|
162
|
+
* in JS as surrogate pairs, all the way up to "\u{10ffff}".
|
|
163
|
+
*
|
|
164
|
+
* This function implements the same mangling in order to provide diagnostic
|
|
165
|
+
* information in `cdk diff`.
|
|
166
|
+
*/
|
|
167
|
+
function mangleLikeCloudFormation(payload) {
|
|
168
|
+
return payload.replace(/[\u{80}-\u{10ffff}]/gu, '?');
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* A parseFloat implementation that does the right thing for
|
|
172
|
+
* strings like '0.0.0'
|
|
173
|
+
* (for which JavaScript's parseFloat() returns 0).
|
|
174
|
+
* We return NaN for all of these strings that do not represent numbers,
|
|
175
|
+
* and so comparing them fails,
|
|
176
|
+
* and doesn't short-circuit the diff logic.
|
|
177
|
+
*/
|
|
178
|
+
function safeParseFloat(str) {
|
|
179
|
+
return Number(str);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Lazily load the service spec database and cache the loaded db
|
|
183
|
+
*/
|
|
184
|
+
let DATABASE;
|
|
185
|
+
function database() {
|
|
186
|
+
if (!DATABASE) {
|
|
187
|
+
DATABASE = (0, aws_service_spec_1.loadAwsServiceSpecSync)();
|
|
188
|
+
}
|
|
189
|
+
return DATABASE;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Load a Resource model from the Service Spec Database
|
|
193
|
+
*
|
|
194
|
+
* The database is loaded lazily and cached across multiple calls to `loadResourceModel`.
|
|
195
|
+
*/
|
|
196
|
+
function loadResourceModel(type) {
|
|
197
|
+
return database().lookup('resource', 'cloudFormationType', 'equals', type)[0];
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFrQkEsOEJBNENDO0FBZ0RELDhDQWlCQztBQVVELDBCQU1DO0FBVUQsNERBRUM7QUE4QkQsOENBRUM7QUEzTEQsZ0VBQW1FO0FBR25FOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLE1BQVcsRUFBRSxNQUFXO0lBQ2hELElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQUMsT0FBTyxJQUFJLENBQUM7SUFBQyxDQUFDO0lBQ3ZDLGtFQUFrRTtJQUNsRSxJQUFJLENBQUMsQ0FBQyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksT0FBTyxNQUFNLEtBQUssU0FBUyxDQUFDO1FBQzVELENBQUMsT0FBTyxNQUFNLEtBQUssU0FBUyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCwyREFBMkQ7SUFDM0QsMENBQTBDO0lBQzFDLElBQUksQ0FBQyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDO1FBQzFELGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxJQUFJLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxFQUFFLENBQUM7UUFBQyxPQUFPLEtBQUssQ0FBQztJQUFDLENBQUM7SUFDdEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sS0FBSyxDQUFDO0lB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QUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9hZEF3c1NlcnZpY2VTcGVjU3luYyB9IGZyb20gJ0Bhd3MtY2RrL2F3cy1zZXJ2aWNlLXNwZWMnO1xuaW1wb3J0IHsgUmVzb3VyY2UsIFNwZWNEYXRhYmFzZSB9IGZyb20gJ0Bhd3MtY2RrL3NlcnZpY2Utc3BlYy10eXBlcyc7XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCBkZWVwbHkuIFRoZSBmdW5jdGlvbiBoYW5kbGVzIGFyZ3VtZW50cyB0aGF0IGFyZVxuICogK251bGwrLCArdW5kZWZpbmVkKywgYXJyYXlzIGFuZCBvYmplY3RzLiBGb3Igb2JqZWN0cywgdGhlIGZ1bmN0aW9uIHdpbGwgbm90IHRha2UgdGhlXG4gKiBvYmplY3QgcHJvdG90eXBlIGludG8gYWNjb3VudCBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhlIGNvbXBhcmlzb24sIG9ubHkgdGhlIHZhbHVlcyBvZlxuICogcHJvcGVydGllcyByZXBvcnRlZCBieSArT2JqZWN0LmtleXMrLlxuICpcbiAqIElmIGJvdGggb3BlcmFuZHMgY2FuIGJlIHBhcnNlZCB0byBlcXVpdmFsZW50IG51bWJlcnMsIHdpbGwgcmV0dXJuIHRydWUuXG4gKiBUaGlzIG1ha2VzIGRpZmYgY29uc2lzdGVudCB3aXRoIENsb3VkRm9ybWF0aW9uLCB3aGVyZSBhIG51bWVyaWMgMTAgYW5kIGEgbGl0ZXJhbCBcIjEwXCJcbiAqIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQuXG4gKlxuICogQHBhcmFtIGx2YWx1ZSB0aGUgbGVmdCBvcGVyYW5kIG9mIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uLlxuICogQHBhcmFtIHJ2YWx1ZSB0aGUgcmlnaHQgb3BlcmFuZCBvZiB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbi5cbiAqXG4gKiBAcmV0dXJucyArdHJ1ZSsgaWYgYm90aCArbHZhbHVlKyBhbmQgK3J2YWx1ZSsgYXJlIGVxdWl2YWxlbnQgdG8gZWFjaCBvdGhlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChsdmFsdWU6IGFueSwgcnZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKGx2YWx1ZSA9PT0gcnZhbHVlKSB7IHJldHVybiB0cnVlOyB9XG4gIC8vIENsb3VkRm9ybWF0aW9uIGFsbG93cyBwYXNzaW5nIHN0cmluZ3MgaW50byBib29sZWFuLXR5cGVkIGZpZWxkc1xuICBpZiAoKCh0eXBlb2YgbHZhbHVlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgcnZhbHVlID09PSAnYm9vbGVhbicpIHx8XG4gICAgICAodHlwZW9mIGx2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiBydmFsdWUgPT09ICdzdHJpbmcnKSkgJiZcbiAgICAgIGx2YWx1ZS50b1N0cmluZygpID09PSBydmFsdWUudG9TdHJpbmcoKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIGFsbG93cyBhIG51bWVyaWMgMTAgYW5kIGEgbGl0ZXJhbCBcIjEwXCIgdG8gYmUgZXF1aXZhbGVudDtcbiAgLy8gdGhpcyBpcyBjb25zaXN0ZW50IHdpdGggQ2xvdWRGb3JtYXRpb24uXG4gIGlmICgodHlwZW9mIGx2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHJ2YWx1ZSA9PT0gJ3N0cmluZycpICYmXG4gICAgICBzYWZlUGFyc2VGbG9hdChsdmFsdWUpID09PSBzYWZlUGFyc2VGbG9hdChydmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiBsdmFsdWUgIT09IHR5cGVvZiBydmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChBcnJheS5pc0FycmF5KGx2YWx1ZSkgIT09IEFycmF5LmlzQXJyYXkocnZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKEFycmF5LmlzQXJyYXkobHZhbHVlKSAvKiAmJiBBcnJheS5pc0FycmF5KHJ2YWx1ZSkgKi8pIHtcbiAgICBpZiAobHZhbHVlLmxlbmd0aCAhPT0gcnZhbHVlLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBmb3IgKGxldCBpID0gMCA7IGkgPCBsdmFsdWUubGVuZ3RoIDsgaSsrKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChsdmFsdWVbaV0sIHJ2YWx1ZVtpXSkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgbHZhbHVlID09PSAnb2JqZWN0JyAvKiAmJiB0eXBlb2YgcnZhbHVlID09PSAnb2JqZWN0JyAqLykge1xuICAgIGlmIChsdmFsdWUgPT09IG51bGwgfHwgcnZhbHVlID09PSBudWxsKSB7XG4gICAgICAvLyBJZiBib3RoIHdlcmUgbnVsbCwgdGhleSdkIGhhdmUgYmVlbiA9PT1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGx2YWx1ZSk7XG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhydmFsdWUpLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAoIXJ2YWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgaWYgKGtleSA9PT0gJ0RlcGVuZHNPbicpIHtcbiAgICAgICAgaWYgKCFkZXBlbmRzT25FcXVhbChsdmFsdWVba2V5XSwgcnZhbHVlW2tleV0pKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAvLyBjaGVjayBkaWZmZXJlbmNlcyBvdGhlciB0aGFuIGBEZXBlbmRzT25gXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFkZWVwRXF1YWwobHZhbHVlW2tleV0sIHJ2YWx1ZVtrZXldKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gTmVpdGhlciBvYmplY3QsIG5vciBhcnJheTogSSBkZWR1Y2UgdGhpcyBpcyBwcmltaXRpdmUgdHlwZVxuICAvLyBQcmltaXRpdmUgdHlwZSBhbmQgbm90ID09PSwgc28gSSBkZWR1Y2Ugbm90IGRlZXBFcXVhbFxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIGFyZ3VtZW50cyB0byBEZXBlbmRzT24gZm9yIGVxdWFsaXR5LlxuICpcbiAqIEBwYXJhbSBsdmFsdWUgdGhlIGxlZnQgb3BlcmFuZCBvZiB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbi5cbiAqIEBwYXJhbSBydmFsdWUgdGhlIHJpZ2h0IG9wZXJhbmQgb2YgdGhlIGVxdWFsaXR5IGNvbXBhcmlzb24uXG4gKlxuICogQHJldHVybnMgK3RydWUrIGlmIGJvdGggK2x2YWx1ZSsgYW5kICtydmFsdWUrIGFyZSBlcXVpdmFsZW50IHRvIGVhY2ggb3RoZXIuXG4gKi9cbmZ1bmN0aW9uIGRlcGVuZHNPbkVxdWFsKGx2YWx1ZTogYW55LCBydmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAvLyBhbGxvd3MgWydWYWx1ZSddIGFuZCAnVmFsdWUnIHRvIGJlIGVxdWFsXG4gIGlmIChBcnJheS5pc0FycmF5KGx2YWx1ZSkgIT09IEFycmF5LmlzQXJyYXkocnZhbHVlKSkge1xuICAgIGNvbnN0IGFycmF5ID0gQXJyYXkuaXNBcnJheShsdmFsdWUpID8gbHZhbHVlIDogcnZhbHVlO1xuICAgIGNvbnN0IG5vbkFycmF5ID0gQXJyYXkuaXNBcnJheShsdmFsdWUpID8gcnZhbHVlIDogbHZhbHVlO1xuXG4gICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMSAmJiBkZWVwRXF1YWwoYXJyYXlbMF0sIG5vbkFycmF5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGFsbG93cyBhcnJheXMgcGFzc2VkIHRvIERlcGVuZHNPbiB0byBiZSBlcXVpdmFsZW50IGlycmVzcGVjdGl2ZSBvZiBlbGVtZW50IG9yZGVyXG4gIGlmIChBcnJheS5pc0FycmF5KGx2YWx1ZSkgJiYgQXJyYXkuaXNBcnJheShydmFsdWUpKSB7XG4gICAgaWYgKGx2YWx1ZS5sZW5ndGggIT09IHJ2YWx1ZS5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgZm9yIChsZXQgaSA9IDAgOyBpIDwgbHZhbHVlLmxlbmd0aCA7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDAgOyBqIDwgbHZhbHVlLmxlbmd0aCA7IGorKykge1xuICAgICAgICBpZiAoKCFkZWVwRXF1YWwobHZhbHVlW2ldLCBydmFsdWVbal0pKSAmJiAoaiA9PT0gbHZhbHVlLmxlbmd0aCAtIDEpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBQcm9kdWNlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byBtYXBzLCBhcyBhIG1hcCwgdXNpbmcgYSBzcGVjaWZpZWQgZGlmZiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gb2xkVmFsdWUgIHRoZSBvbGQgbWFwLlxuICogQHBhcmFtIG5ld1ZhbHVlICB0aGUgbmV3IG1hcC5cbiAqIEBwYXJhbSBlbGVtZW50RGlmZiB0aGUgZGlmZiBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJucyBhIG1hcCByZXByZXNlbnRpbmcgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gK29sZFZhbHVlKyBhbmQgK25ld1ZhbHVlKy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZLZXllZEVudGl0aWVzPFQ+KFxuICBvbGRWYWx1ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCxcbiAgbmV3VmFsdWU6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQsXG4gIGVsZW1lbnREaWZmOiAob2xkRWxlbWVudDogYW55LCBuZXdFbGVtZW50OiBhbnksIGtleTogc3RyaW5nKSA9PiBUKTogeyBbbmFtZTogc3RyaW5nXTogVCB9IHtcbiAgY29uc3QgcmVzdWx0OiB7IFtuYW1lOiBzdHJpbmddOiBUIH0gPSB7fTtcbiAgZm9yIChjb25zdCBsb2dpY2FsSWQgb2YgdW5pb25PZihPYmplY3Qua2V5cyhvbGRWYWx1ZSB8fCB7fSksIE9iamVjdC5rZXlzKG5ld1ZhbHVlIHx8IHt9KSkpIHtcbiAgICBjb25zdCBvbGRFbGVtZW50ID0gb2xkVmFsdWUgJiYgb2xkVmFsdWVbbG9naWNhbElkXTtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0gbmV3VmFsdWUgJiYgbmV3VmFsdWVbbG9naWNhbElkXTtcblxuICAgIGlmIChvbGRFbGVtZW50ID09PSB1bmRlZmluZWQgJiYgbmV3RWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBTaG91bGRuJ3QgaGFwcGVuIGluIHJlYWxpdHksIGJ1dCBtYXkgaGFwcGVuIGluIHRlc3RzLiBTa2lwLlxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzdWx0W2xvZ2ljYWxJZF0gPSBlbGVtZW50RGlmZihvbGRFbGVtZW50LCBuZXdFbGVtZW50LCBsb2dpY2FsSWQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIHVuaW9uIG9mIHR3byBzZXRzIG9mIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIGx2IHRoZSBsZWZ0IHNldCBvZiBzdHJpbmdzLlxuICogQHBhcmFtIHJ2IHRoZSByaWdodCBzZXQgb2Ygc3RyaW5ncy5cbiAqXG4gKiBAcmV0dXJucyBhIG5ldyBhcnJheSBjb250YWluaW5nIGFsbCBlbGVtZWJ0cyBmcm9tICtsdisgYW5kICtydissIHdpdGggbm8gZHVwbGljYXRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uT2YobHY6IHN0cmluZ1tdIHwgU2V0PHN0cmluZz4sIHJ2OiBzdHJpbmdbXSB8IFNldDxzdHJpbmc+KTogc3RyaW5nW10ge1xuICBjb25zdCByZXN1bHQgPSBuZXcgU2V0KGx2KTtcbiAgZm9yIChjb25zdCB2IG9mIHJ2KSB7XG4gICAgcmVzdWx0LmFkZCh2KTtcbiAgfVxuICByZXR1cm4gbmV3IEFycmF5KC4uLnJlc3VsdCk7XG59XG5cbi8qKlxuICogR2V0U3RhY2tUZW1wbGF0ZSBmbGF0dGVucyBhbnkgY29kZXBvaW50IGdyZWF0ZXIgdGhhbiBcIlxcdTdmXCIgdG8gXCI/XCIuIFRoaXMgaXNcbiAqIHRydWUgZXZlbiBmb3IgY29kZXBvaW50cyBpbiB0aGUgc3VwcGxlbWVudGFsIHBsYW5lcyB3aGljaCBhcmUgcmVwcmVzZW50ZWRcbiAqIGluIEpTIGFzIHN1cnJvZ2F0ZSBwYWlycywgYWxsIHRoZSB3YXkgdXAgdG8gXCJcXHV7MTBmZmZmfVwiLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgc2FtZSBtYW5nbGluZyBpbiBvcmRlciB0byBwcm92aWRlIGRpYWdub3N0aWNcbiAqIGluZm9ybWF0aW9uIGluIGBjZGsgZGlmZmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW5nbGVMaWtlQ2xvdWRGb3JtYXRpb24ocGF5bG9hZDogc3RyaW5nKSB7XG4gIHJldHVybiBwYXlsb2FkLnJlcGxhY2UoL1tcXHV7ODB9LVxcdXsxMGZmZmZ9XS9ndSwgJz8nKTtcbn1cblxuLyoqXG4gKiBBIHBhcnNlRmxvYXQgaW1wbGVtZW50YXRpb24gdGhhdCBkb2VzIHRoZSByaWdodCB0aGluZyBmb3JcbiAqIHN0cmluZ3MgbGlrZSAnMC4wLjAnXG4gKiAoZm9yIHdoaWNoIEphdmFTY3JpcHQncyBwYXJzZUZsb2F0KCkgcmV0dXJucyAwKS5cbiAqIFdlIHJldHVybiBOYU4gZm9yIGFsbCBvZiB0aGVzZSBzdHJpbmdzIHRoYXQgZG8gbm90IHJlcHJlc2VudCBudW1iZXJzLFxuICogYW5kIHNvIGNvbXBhcmluZyB0aGVtIGZhaWxzLFxuICogYW5kIGRvZXNuJ3Qgc2hvcnQtY2lyY3VpdCB0aGUgZGlmZiBsb2dpYy5cbiAqL1xuZnVuY3Rpb24gc2FmZVBhcnNlRmxvYXQoc3RyOiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gTnVtYmVyKHN0cik7XG59XG5cbi8qKlxuICogTGF6aWx5IGxvYWQgdGhlIHNlcnZpY2Ugc3BlYyBkYXRhYmFzZSBhbmQgY2FjaGUgdGhlIGxvYWRlZCBkYlxuICovXG5sZXQgREFUQUJBU0U6IFNwZWNEYXRhYmFzZSB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGRhdGFiYXNlKCk6IFNwZWNEYXRhYmFzZSB7XG4gIGlmICghREFUQUJBU0UpIHtcbiAgICBEQVRBQkFTRSA9IGxvYWRBd3NTZXJ2aWNlU3BlY1N5bmMoKTtcbiAgfVxuICByZXR1cm4gREFUQUJBU0U7XG59XG5cbi8qKlxuICogTG9hZCBhIFJlc291cmNlIG1vZGVsIGZyb20gdGhlIFNlcnZpY2UgU3BlYyBEYXRhYmFzZVxuICpcbiAqIFRoZSBkYXRhYmFzZSBpcyBsb2FkZWQgbGF6aWx5IGFuZCBjYWNoZWQgYWNyb3NzIG11bHRpcGxlIGNhbGxzIHRvIGBsb2FkUmVzb3VyY2VNb2RlbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUmVzb3VyY2VNb2RlbCh0eXBlOiBzdHJpbmcpOiBSZXNvdXJjZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBkYXRhYmFzZSgpLmxvb2t1cCgncmVzb3VyY2UnLCAnY2xvdWRGb3JtYXRpb25UeXBlJywgJ2VxdWFscycsIHR5cGUpWzBdO1xufVxuIl19
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { DescribeChangeSetOutput as DescribeChangeSet } from '@aws-sdk/client-cloudformation';
|
|
2
|
+
import * as types from './diff/types';
|
|
3
|
+
export * from './diff/types';
|
|
4
|
+
export type DescribeChangeSetOutput = DescribeChangeSet;
|
|
5
|
+
/**
|
|
6
|
+
* Compare two CloudFormation templates and return semantic differences between them.
|
|
7
|
+
*
|
|
8
|
+
* @param currentTemplate the current state of the stack.
|
|
9
|
+
* @param newTemplate the target state of the stack.
|
|
10
|
+
* @param changeSet the change set for this stack.
|
|
11
|
+
*
|
|
12
|
+
* @returns a +types.TemplateDiff+ object that represents the changes that will happen if
|
|
13
|
+
* a stack which current state is described by +currentTemplate+ is updated with
|
|
14
|
+
* the template +newTemplate+.
|
|
15
|
+
*/
|
|
16
|
+
export declare function fullDiff(currentTemplate: {
|
|
17
|
+
[key: string]: any;
|
|
18
|
+
}, newTemplate: {
|
|
19
|
+
[key: string]: any;
|
|
20
|
+
}, changeSet?: DescribeChangeSetOutput, isImport?: boolean): types.TemplateDiff;
|
|
21
|
+
export declare function diffTemplate(currentTemplate: {
|
|
22
|
+
[key: string]: any;
|
|
23
|
+
}, newTemplate: {
|
|
24
|
+
[key: string]: any;
|
|
25
|
+
}): types.TemplateDiff;
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.fullDiff = fullDiff;
|
|
18
|
+
exports.diffTemplate = diffTemplate;
|
|
19
|
+
const impl = require("./diff");
|
|
20
|
+
const template_and_changeset_diff_merger_1 = require("./diff/template-and-changeset-diff-merger");
|
|
21
|
+
const types = require("./diff/types");
|
|
22
|
+
const util_1 = require("./diff/util");
|
|
23
|
+
__exportStar(require("./diff/types"), exports);
|
|
24
|
+
const DIFF_HANDLERS = {
|
|
25
|
+
AWSTemplateFormatVersion: (diff, oldValue, newValue) => diff.awsTemplateFormatVersion = impl.diffAttribute(oldValue, newValue),
|
|
26
|
+
Description: (diff, oldValue, newValue) => diff.description = impl.diffAttribute(oldValue, newValue),
|
|
27
|
+
Metadata: (diff, oldValue, newValue) => diff.metadata = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffMetadata)),
|
|
28
|
+
Parameters: (diff, oldValue, newValue) => diff.parameters = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffParameter)),
|
|
29
|
+
Mappings: (diff, oldValue, newValue) => diff.mappings = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffMapping)),
|
|
30
|
+
Conditions: (diff, oldValue, newValue) => diff.conditions = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffCondition)),
|
|
31
|
+
Transform: (diff, oldValue, newValue) => diff.transform = impl.diffAttribute(oldValue, newValue),
|
|
32
|
+
Resources: (diff, oldValue, newValue) => diff.resources = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffResource)),
|
|
33
|
+
Outputs: (diff, oldValue, newValue) => diff.outputs = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffOutput)),
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Compare two CloudFormation templates and return semantic differences between them.
|
|
37
|
+
*
|
|
38
|
+
* @param currentTemplate the current state of the stack.
|
|
39
|
+
* @param newTemplate the target state of the stack.
|
|
40
|
+
* @param changeSet the change set for this stack.
|
|
41
|
+
*
|
|
42
|
+
* @returns a +types.TemplateDiff+ object that represents the changes that will happen if
|
|
43
|
+
* a stack which current state is described by +currentTemplate+ is updated with
|
|
44
|
+
* the template +newTemplate+.
|
|
45
|
+
*/
|
|
46
|
+
function fullDiff(currentTemplate, newTemplate, changeSet, isImport) {
|
|
47
|
+
normalize(currentTemplate);
|
|
48
|
+
normalize(newTemplate);
|
|
49
|
+
const theDiff = diffTemplate(currentTemplate, newTemplate);
|
|
50
|
+
if (changeSet) {
|
|
51
|
+
// These methods mutate the state of theDiff, using the changeSet.
|
|
52
|
+
const changeSetDiff = new template_and_changeset_diff_merger_1.TemplateAndChangeSetDiffMerger({ changeSet });
|
|
53
|
+
theDiff.resources.forEachDifference((logicalId, change) => changeSetDiff.overrideDiffResourceChangeImpactWithChangeSetChangeImpact(logicalId, change));
|
|
54
|
+
changeSetDiff.addImportInformationFromChangeset(theDiff.resources);
|
|
55
|
+
}
|
|
56
|
+
else if (isImport) {
|
|
57
|
+
makeAllResourceChangesImports(theDiff);
|
|
58
|
+
}
|
|
59
|
+
return theDiff;
|
|
60
|
+
}
|
|
61
|
+
function diffTemplate(currentTemplate, newTemplate) {
|
|
62
|
+
// Base diff
|
|
63
|
+
const theDiff = calculateTemplateDiff(currentTemplate, newTemplate);
|
|
64
|
+
// We're going to modify this in-place
|
|
65
|
+
const newTemplateCopy = deepCopy(newTemplate);
|
|
66
|
+
let didPropagateReferenceChanges;
|
|
67
|
+
let diffWithReplacements;
|
|
68
|
+
do {
|
|
69
|
+
diffWithReplacements = calculateTemplateDiff(currentTemplate, newTemplateCopy);
|
|
70
|
+
// Propagate replacements for replaced resources
|
|
71
|
+
didPropagateReferenceChanges = false;
|
|
72
|
+
if (diffWithReplacements.resources) {
|
|
73
|
+
diffWithReplacements.resources.forEachDifference((logicalId, change) => {
|
|
74
|
+
if (change.changeImpact === types.ResourceImpact.WILL_REPLACE) {
|
|
75
|
+
if (propagateReplacedReferences(newTemplateCopy, logicalId)) {
|
|
76
|
+
didPropagateReferenceChanges = true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
} while (didPropagateReferenceChanges);
|
|
82
|
+
// Copy "replaced" states from `diffWithReplacements` to `theDiff`.
|
|
83
|
+
diffWithReplacements.resources
|
|
84
|
+
.filter(r => isReplacement(r.changeImpact))
|
|
85
|
+
.forEachDifference((logicalId, downstreamReplacement) => {
|
|
86
|
+
const resource = theDiff.resources.get(logicalId);
|
|
87
|
+
if (resource.changeImpact !== downstreamReplacement.changeImpact) {
|
|
88
|
+
propagatePropertyReplacement(downstreamReplacement, resource);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
return theDiff;
|
|
92
|
+
}
|
|
93
|
+
function isReplacement(impact) {
|
|
94
|
+
return impact === types.ResourceImpact.MAY_REPLACE || impact === types.ResourceImpact.WILL_REPLACE;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* For all properties in 'source' that have a "replacement" impact, propagate that impact to "dest"
|
|
98
|
+
*/
|
|
99
|
+
function propagatePropertyReplacement(source, dest) {
|
|
100
|
+
for (const [propertyName, diff] of Object.entries(source.propertyUpdates)) {
|
|
101
|
+
if (diff.changeImpact && isReplacement(diff.changeImpact)) {
|
|
102
|
+
// Use the propertydiff of source in target. The result of this happens to be clear enough.
|
|
103
|
+
dest.setPropertyChange(propertyName, diff);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function calculateTemplateDiff(currentTemplate, newTemplate) {
|
|
108
|
+
const differences = {};
|
|
109
|
+
const unknown = {};
|
|
110
|
+
for (const key of (0, util_1.unionOf)(Object.keys(currentTemplate), Object.keys(newTemplate)).sort()) {
|
|
111
|
+
const oldValue = currentTemplate[key];
|
|
112
|
+
const newValue = newTemplate[key];
|
|
113
|
+
if ((0, util_1.deepEqual)(oldValue, newValue)) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const handler = DIFF_HANDLERS[key]
|
|
117
|
+
|| ((_diff, oldV, newV) => unknown[key] = impl.diffUnknown(oldV, newV));
|
|
118
|
+
handler(differences, oldValue, newValue);
|
|
119
|
+
}
|
|
120
|
+
if (Object.keys(unknown).length > 0) {
|
|
121
|
+
differences.unknown = new types.DifferenceCollection(unknown);
|
|
122
|
+
}
|
|
123
|
+
return new types.TemplateDiff(differences);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Replace all references to the given logicalID on the given template, in-place
|
|
127
|
+
*
|
|
128
|
+
* Returns true if any references were replaced.
|
|
129
|
+
*/
|
|
130
|
+
function propagateReplacedReferences(template, logicalId) {
|
|
131
|
+
let ret = false;
|
|
132
|
+
function recurse(obj) {
|
|
133
|
+
if (Array.isArray(obj)) {
|
|
134
|
+
obj.forEach(recurse);
|
|
135
|
+
}
|
|
136
|
+
if (typeof obj === 'object' && obj !== null) {
|
|
137
|
+
if (!replaceReference(obj)) {
|
|
138
|
+
Object.values(obj).forEach(recurse);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function replaceReference(obj) {
|
|
143
|
+
const keys = Object.keys(obj);
|
|
144
|
+
if (keys.length !== 1) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
const key = keys[0];
|
|
148
|
+
if (key === 'Ref') {
|
|
149
|
+
if (obj.Ref === logicalId) {
|
|
150
|
+
obj.Ref = logicalId + ' (replaced)';
|
|
151
|
+
ret = true;
|
|
152
|
+
}
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
if (key.startsWith('Fn::')) {
|
|
156
|
+
if (Array.isArray(obj[key]) && obj[key].length > 0 && obj[key][0] === logicalId) {
|
|
157
|
+
obj[key][0] = logicalId + '(replaced)';
|
|
158
|
+
ret = true;
|
|
159
|
+
}
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
recurse(template);
|
|
165
|
+
return ret;
|
|
166
|
+
}
|
|
167
|
+
function deepCopy(x) {
|
|
168
|
+
if (Array.isArray(x)) {
|
|
169
|
+
return x.map(deepCopy);
|
|
170
|
+
}
|
|
171
|
+
if (typeof x === 'object' && x !== null) {
|
|
172
|
+
const ret = {};
|
|
173
|
+
for (const key of Object.keys(x)) {
|
|
174
|
+
ret[key] = deepCopy(x[key]);
|
|
175
|
+
}
|
|
176
|
+
return ret;
|
|
177
|
+
}
|
|
178
|
+
return x;
|
|
179
|
+
}
|
|
180
|
+
function makeAllResourceChangesImports(diff) {
|
|
181
|
+
diff.resources.forEachDifference((_logicalId, change) => {
|
|
182
|
+
change.isImport = true;
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
function normalize(template) {
|
|
186
|
+
if (typeof template === 'object') {
|
|
187
|
+
for (const key of (Object.keys(template !== null && template !== void 0 ? template : {}))) {
|
|
188
|
+
if (key === 'Fn::GetAtt' && typeof template[key] === 'string') {
|
|
189
|
+
template[key] = template[key].split('.');
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
else if (key === 'DependsOn') {
|
|
193
|
+
if (typeof template[key] === 'string') {
|
|
194
|
+
template[key] = [template[key]];
|
|
195
|
+
}
|
|
196
|
+
else if (Array.isArray(template[key])) {
|
|
197
|
+
template[key] = template[key].sort();
|
|
198
|
+
}
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
if (Array.isArray(template[key])) {
|
|
202
|
+
for (const element of (template[key])) {
|
|
203
|
+
normalize(element);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
normalize(template[key]);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi10ZW1wbGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRpZmYtdGVtcGxhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQStDQSw0QkFxQkM7QUFFRCxvQ0F3Q0M7QUEzR0QsK0JBQStCO0FBQy9CLGtHQUEyRjtBQUMzRixzQ0FBc0M7QUFDdEMsc0NBQW9FO0FBRXBFLCtDQUE2QjtBQU83QixNQUFNLGFBQWEsR0FBb0I7SUFDckMsd0JBQXdCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQ3JELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUM7SUFDeEUsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUN4QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUMzRCxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBQSx3QkFBaUIsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxRyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBQSx3QkFBaUIsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM3RyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQ3JDLElBQUksQ0FBQyxR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QyxLQUFLLE1BQU0sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDdEMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNyQixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhlIFNESyBpcyBvbmx5IHVzZWQgdG8gcmVmZXJlbmNlIGBEZXNjcmliZUNoYW5nZVNldE91dHB1dGAsIHNvIHRoZSBTREsgaXMgYWRkZWQgYXMgYSBkZXZEZXBlbmRlbmN5LlxuLy8gVGhlIFNESyBzaG91bGQgbm90IG1ha2UgbmV0d29yayBjYWxscyBoZXJlXG5pbXBvcnQgdHlwZSB7IERlc2NyaWJlQ2hhbmdlU2V0T3V0cHV0IGFzIERlc2NyaWJlQ2hhbmdlU2V0IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCAqIGFzIGltcGwgZnJvbSAnLi9kaWZmJztcbmltcG9ydCB7IFRlbXBsYXRlQW5kQ2hhbmdlU2V0RGlmZk1lcmdlciB9IGZyb20gJy4vZGlmZi90ZW1wbGF0ZS1hbmQtY2hhbmdlc2V0LWRpZmYtbWVyZ2VyJztcbmltcG9ydCAqIGFzIHR5cGVzIGZyb20gJy4vZGlmZi90eXBlcyc7XG5pbXBvcnQgeyBkZWVwRXF1YWwsIGRpZmZLZXllZEVudGl0aWVzLCB1bmlvbk9mIH0gZnJvbSAnLi9kaWZmL3V0aWwnO1xuXG5leHBvcnQgKiBmcm9tICcuL2RpZmYvdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBEZXNjcmliZUNoYW5nZVNldE91dHB1dCA9IERlc2NyaWJlQ2hhbmdlU2V0O1xuXG50eXBlIERpZmZIYW5kbGVyID0gKGRpZmY6IHR5cGVzLklUZW1wbGF0ZURpZmYsIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpID0+IHZvaWQ7XG50eXBlIEhhbmRsZXJSZWdpc3RyeSA9IHsgW3NlY3Rpb246IHN0cmluZ106IERpZmZIYW5kbGVyIH07XG5cbmNvbnN0IERJRkZfSEFORExFUlM6IEhhbmRsZXJSZWdpc3RyeSA9IHtcbiAgQVdTVGVtcGxhdGVGb3JtYXRWZXJzaW9uOiAoZGlmZiwgb2xkVmFsdWUsIG5ld1ZhbHVlKSA9PlxuICAgIGRpZmYuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uID0gaW1wbC5kaWZmQXR0cmlidXRlKG9sZFZhbHVlLCBuZXdWYWx1ZSksXG4gIERlc2NyaXB0aW9uOiAoZGlmZiwgb2xkVmFsdWUsIG5ld1ZhbHVlKSA9PlxuICAgIGRpZmYuZGVzY3JpcHRpb24gPSBpbXBsLmRpZmZBdHRyaWJ1dGUob2xkVmFsdWUsIG5ld1ZhbHVlKSxcbiAgTWV0YWRhdGE6IChkaWZmLCBvbGRWYWx1ZSwgbmV3VmFsdWUpID0+XG4gICAgZGlmZi5tZXRhZGF0YSA9IG5ldyB0eXBlcy5EaWZmZXJlbmNlQ29sbGVjdGlvbihkaWZmS2V5ZWRFbnRpdGllcyhvbGRWYWx1ZSwgbmV3VmFsdWUsIGltcGwuZGlmZk1ldGFkYXRhKSksXG4gIFBhcmFtZXRlcnM6IChkaWZmLCBvbGRWYWx1ZSwgbmV3VmFsdWUpID0+XG4gICAgZGlmZi5wYXJhbWV0ZXJzID0gbmV3IHR5cGVzLkRpZmZlcmVuY2VDb2xsZWN0aW9uKGRpZmZLZXllZEVudGl0aWVzKG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW1wbC5kaWZmUGFyYW1ldGVyKSksXG4gIE1hcHBpbmdzOiAoZGlmZiwgb2xkVmFsdWUsIG5ld1ZhbHVlKSA9PlxuICAgIGRpZmYubWFwcGluZ3MgPSBuZXcgdHlwZXMuRGlmZmVyZW5jZUNvbGxlY3Rpb24oZGlmZktleWVkRW50aXRpZXMob2xkVmFsdWUsIG5ld1ZhbHVlLCBpbXBsLmRpZmZNYXBwaW5nKSksXG4gIENvbmRpdGlvbnM6IChkaWZmLCBvbGRWYWx1ZSwgbmV3VmFsdWUpID0+XG4gICAgZGlmZi5jb25kaXRpb25zID0gbmV3IHR5cGVzLkRpZmZlcmVuY2VDb2xsZWN0aW9uKGRpZmZLZXllZEVudGl0aWVzKG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW1wbC5kaWZmQ29uZGl0aW9uKSksXG4gIFRyYW5zZm9ybTogKGRpZmYsIG9sZFZhbHVlLCBuZXdWYWx1ZSkgPT5cbiAgICBkaWZmLnRyYW5zZm9ybSA9IGltcGwuZGlmZkF0dHJpYnV0ZShvbGRWYWx1ZSwgbmV3VmFsdWUpLFxuICBSZXNvdXJjZXM6IChkaWZmLCBvbGRWYWx1ZSwgbmV3VmFsdWUpID0+XG4gICAgZGlmZi5yZXNvdXJjZXMgPSBuZXcgdHlwZXMuRGlmZmVyZW5jZUNvbGxlY3Rpb24oZGlmZktleWVkRW50aXRpZXMob2xkVmFsdWUsIG5ld1ZhbHVlLCBpbXBsLmRpZmZSZXNvdXJjZSkpLFxuICBPdXRwdXRzOiAoZGlmZiwgb2xkVmFsdWUsIG5ld1ZhbHVlKSA9PlxuICAgIGRpZmYub3V0cHV0cyA9IG5ldyB0eXBlcy5EaWZmZXJlbmNlQ29sbGVjdGlvbihkaWZmS2V5ZWRFbnRpdGllcyhvbGRWYWx1ZSwgbmV3VmFsdWUsIGltcGwuZGlmZk91dHB1dCkpLFxufTtcblxuLyoqXG4gKiBDb21wYXJlIHR3byBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZXMgYW5kIHJldHVybiBzZW1hbnRpYyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZW0uXG4gKlxuICogQHBhcmFtIGN1cnJlbnRUZW1wbGF0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc3RhY2suXG4gKiBAcGFyYW0gbmV3VGVtcGxhdGUgICAgIHRoZSB0YXJnZXQgc3RhdGUgb2YgdGhlIHN0YWNrLlxuICogQHBhcmFtIGNoYW5nZVNldCAgICAgICB0aGUgY2hhbmdlIHNldCBmb3IgdGhpcyBzdGFjay5cbiAqXG4gKiBAcmV0dXJucyBhICt0eXBlcy5UZW1wbGF0ZURpZmYrIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5nZXMgdGhhdCB3aWxsIGhhcHBlbiBpZlxuICogICAgICBhIHN0YWNrIHdoaWNoIGN1cnJlbnQgc3RhdGUgaXMgZGVzY3JpYmVkIGJ5ICtjdXJyZW50VGVtcGxhdGUrIGlzIHVwZGF0ZWQgd2l0aFxuICogICAgICB0aGUgdGVtcGxhdGUgK25ld1RlbXBsYXRlKy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZ1bGxEaWZmKFxuICBjdXJyZW50VGVtcGxhdGU6IHsgW2tleTogc3RyaW5nXTogYW55IH0sXG4gIG5ld1RlbXBsYXRlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxuICBjaGFuZ2VTZXQ/OiBEZXNjcmliZUNoYW5nZVNldE91dHB1dCxcbiAgaXNJbXBvcnQ/OiBib29sZWFuLFxuKTogdHlwZXMuVGVtcGxhdGVEaWZmIHtcbiAgbm9ybWFsaXplKGN1cnJlbnRUZW1wbGF0ZSk7XG4gIG5vcm1hbGl6ZShuZXdUZW1wbGF0ZSk7XG4gIGNvbnN0IHRoZURpZmYgPSBkaWZmVGVtcGxhdGUoY3VycmVudFRlbXBsYXRlLCBuZXdUZW1wbGF0ZSk7XG4gIGlmIChjaGFuZ2VTZXQpIHtcbiAgICAvLyBUaGVzZSBtZXRob2RzIG11dGF0ZSB0aGUgc3RhdGUgb2YgdGhlRGlmZiwgdXNpbmcgdGhlIGNoYW5nZVNldC5cbiAgICBjb25zdCBjaGFuZ2VTZXREaWZmID0gbmV3IFRlbXBsYXRlQW5kQ2hhbmdlU2V0RGlmZk1lcmdlcih7IGNoYW5nZVNldCB9KTtcbiAgICB0aGVEaWZmLnJlc291cmNlcy5mb3JFYWNoRGlmZmVyZW5jZSgobG9naWNhbElkOiBzdHJpbmcsIGNoYW5nZTogdHlwZXMuUmVzb3VyY2VEaWZmZXJlbmNlKSA9PlxuICAgICAgY2hhbmdlU2V0RGlmZi5vdmVycmlkZURpZmZSZXNvdXJjZUNoYW5nZUltcGFjdFdpdGhDaGFuZ2VTZXRDaGFuZ2VJbXBhY3QobG9naWNhbElkLCBjaGFuZ2UpLFxuICAgICk7XG4gICAgY2hhbmdlU2V0RGlmZi5hZGRJbXBvcnRJbmZvcm1hdGlvbkZyb21DaGFuZ2VzZXQodGhlRGlmZi5yZXNvdXJjZXMpO1xuICB9IGVsc2UgaWYgKGlzSW1wb3J0KSB7XG4gICAgbWFrZUFsbFJlc291cmNlQ2hhbmdlc0ltcG9ydHModGhlRGlmZik7XG4gIH1cblxuICByZXR1cm4gdGhlRGlmZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZUZW1wbGF0ZShcbiAgY3VycmVudFRlbXBsYXRlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxuICBuZXdUZW1wbGF0ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSxcbik6IHR5cGVzLlRlbXBsYXRlRGlmZiB7XG4gIC8vIEJhc2UgZGlmZlxuICBjb25zdCB0aGVEaWZmID0gY2FsY3VsYXRlVGVtcGxhdGVEaWZmKGN1cnJlbnRUZW1wbGF0ZSwgbmV3VGVtcGxhdGUpO1xuXG4gIC8vIFdlJ3JlIGdvaW5nIHRvIG1vZGlmeSB0aGlzIGluLXBsYWNlXG4gIGNvbnN0IG5ld1RlbXBsYXRlQ29weSA9IGRlZXBDb3B5KG5ld1RlbXBsYXRlKTtcblxuICBsZXQgZGlkUHJvcGFnYXRlUmVmZXJlbmNlQ2hhbmdlcztcbiAgbGV0IGRpZmZXaXRoUmVwbGFjZW1lbnRzO1xuICBkbyB7XG4gICAgZGlmZldpdGhSZXBsYWNlbWVudHMgPSBjYWxjdWxhdGVUZW1wbGF0ZURpZmYoY3VycmVudFRlbXBsYXRlLCBuZXdUZW1wbGF0ZUNvcHkpO1xuXG4gICAgLy8gUHJvcGFnYXRlIHJlcGxhY2VtZW50cyBmb3IgcmVwbGFjZWQgcmVzb3VyY2VzXG4gICAgZGlkUHJvcGFnYXRlUmVmZXJlbmNlQ2hhbmdlcyA9IGZhbHNlO1xuICAgIGlmIChkaWZmV2l0aFJlcGxhY2VtZW50cy5yZXNvdXJjZXMpIHtcbiAgICAgIGRpZmZXaXRoUmVwbGFjZW1lbnRzLnJlc291cmNlcy5mb3JFYWNoRGlmZmVyZW5jZSgobG9naWNhbElkLCBjaGFuZ2UpID0+IHtcbiAgICAgICAgaWYgKGNoYW5nZS5jaGFuZ2VJbXBhY3QgPT09IHR5cGVzLlJlc291cmNlSW1wYWN0LldJTExfUkVQTEFDRSkge1xuICAgICAgICAgIGlmIChwcm9wYWdhdGVSZXBsYWNlZFJlZmVyZW5jZXMobmV3VGVtcGxhdGVDb3B5LCBsb2dpY2FsSWQpKSB7XG4gICAgICAgICAgICBkaWRQcm9wYWdhdGVSZWZlcmVuY2VDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSB3aGlsZSAoZGlkUHJvcGFnYXRlUmVmZXJlbmNlQ2hhbmdlcyk7XG5cbiAgLy8gQ29weSBcInJlcGxhY2VkXCIgc3RhdGVzIGZyb20gYGRpZmZXaXRoUmVwbGFjZW1lbnRzYCB0byBgdGhlRGlmZmAuXG4gIGRpZmZXaXRoUmVwbGFjZW1lbnRzLnJlc291cmNlc1xuICAgIC5maWx0ZXIociA9PiBpc1JlcGxhY2VtZW50KHIhLmNoYW5nZUltcGFjdCkpXG4gICAgLmZvckVhY2hEaWZmZXJlbmNlKChsb2dpY2FsSWQsIGRvd25zdHJlYW1SZXBsYWNlbWVudCkgPT4ge1xuICAgICAgY29uc3QgcmVzb3VyY2UgPSB0aGVEaWZmLnJlc291cmNlcy5nZXQobG9naWNhbElkKTtcblxuICAgICAgaWYgKHJlc291cmNlLmNoYW5nZUltcGFjdCAhPT0gZG93bnN0cmVhbVJlcGxhY2VtZW50LmNoYW5nZUltcGFjdCkge1xuICAgICAgICBwcm9wYWdhdGVQcm9wZXJ0eVJlcGxhY2VtZW50KGRvd25zdHJlYW1SZXBsYWNlbWVudCwgcmVzb3VyY2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIHJldHVybiB0aGVEaWZmO1xufVxuXG5mdW5jdGlvbiBpc1JlcGxhY2VtZW50KGltcGFjdDogdHlwZXMuUmVzb3VyY2VJbXBhY3QpIHtcbiAgcmV0dXJuIGltcGFjdCA9PT0gdHlwZXMuUmVzb3VyY2VJbXBhY3QuTUFZX1JFUExBQ0UgfHwgaW1wYWN0ID09PSB0eXBlcy5SZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0U7XG59XG5cbi8qKlxuICogRm9yIGFsbCBwcm9wZXJ0aWVzIGluICdzb3VyY2UnIHRoYXQgaGF2ZSBhIFwicmVwbGFjZW1lbnRcIiBpbXBhY3QsIHByb3BhZ2F0ZSB0aGF0IGltcGFjdCB0byBcImRlc3RcIlxuICovXG5mdW5jdGlvbiBwcm9wYWdhdGVQcm9wZXJ0eVJlcGxhY2VtZW50KHNvdXJjZTogdHlwZXMuUmVzb3VyY2VEaWZmZXJlbmNlLCBkZXN0OiB0eXBlcy5SZXNvdXJjZURpZmZlcmVuY2UpIHtcbiAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCBkaWZmXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UucHJvcGVydHlVcGRhdGVzKSkge1xuICAgIGlmIChkaWZmLmNoYW5nZUltcGFjdCAmJiBpc1JlcGxhY2VtZW50KGRpZmYuY2hhbmdlSW1wYWN0KSkge1xuICAgICAgLy8gVXNlIHRoZSBwcm9wZXJ0eWRpZmYgb2Ygc291cmNlIGluIHRhcmdldC4gVGhlIHJlc3VsdCBvZiB0aGlzIGhhcHBlbnMgdG8gYmUgY2xlYXIgZW5vdWdoLlxuICAgICAgZGVzdC5zZXRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWUsIGRpZmYpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVUZW1wbGF0ZURpZmYoY3VycmVudFRlbXBsYXRlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBuZXdUZW1wbGF0ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IHR5cGVzLlRlbXBsYXRlRGlmZiB7XG4gIGNvbnN0IGRpZmZlcmVuY2VzOiB0eXBlcy5JVGVtcGxhdGVEaWZmID0ge307XG4gIGNvbnN0IHVua25vd246IHsgW2tleTogc3RyaW5nXTogdHlwZXMuRGlmZmVyZW5jZTxhbnk+IH0gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgdW5pb25PZihPYmplY3Qua2V5cyhjdXJyZW50VGVtcGxhdGUpLCBPYmplY3Qua2V5cyhuZXdUZW1wbGF0ZSkpLnNvcnQoKSkge1xuICAgIGNvbnN0IG9sZFZhbHVlID0gY3VycmVudFRlbXBsYXRlW2tleV07XG4gICAgY29uc3QgbmV3VmFsdWUgPSBuZXdUZW1wbGF0ZVtrZXldO1xuICAgIGlmIChkZWVwRXF1YWwob2xkVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXI6IERpZmZIYW5kbGVyID0gRElGRl9IQU5ETEVSU1trZXldXG4gICAgICAgICAgICAgICAgICB8fCAoKF9kaWZmLCBvbGRWLCBuZXdWKSA9PiB1bmtub3duW2tleV0gPSBpbXBsLmRpZmZVbmtub3duKG9sZFYsIG5ld1YpKTtcbiAgICBoYW5kbGVyKGRpZmZlcmVuY2VzLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyh1bmtub3duKS5sZW5ndGggPiAwKSB7XG4gICAgZGlmZmVyZW5jZXMudW5rbm93biA9IG5ldyB0eXBlcy5EaWZmZXJlbmNlQ29sbGVjdGlvbih1bmtub3duKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgdHlwZXMuVGVtcGxhdGVEaWZmKGRpZmZlcmVuY2VzKTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBnaXZlbiBsb2dpY2FsSUQgb24gdGhlIGdpdmVuIHRlbXBsYXRlLCBpbi1wbGFjZVxuICpcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbnkgcmVmZXJlbmNlcyB3ZXJlIHJlcGxhY2VkLlxuICovXG5mdW5jdGlvbiBwcm9wYWdhdGVSZXBsYWNlZFJlZmVyZW5jZXModGVtcGxhdGU6IG9iamVjdCwgbG9naWNhbElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IHJldCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHJlY3Vyc2Uob2JqOiBhbnkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICBvYmouZm9yRWFjaChyZWN1cnNlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsKSB7XG4gICAgICBpZiAoIXJlcGxhY2VSZWZlcmVuY2Uob2JqKSkge1xuICAgICAgICBPYmplY3QudmFsdWVzKG9iaikuZm9yRWFjaChyZWN1cnNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZXBsYWNlUmVmZXJlbmNlKG9iajogYW55KSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSAxKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGNvbnN0IGtleSA9IGtleXNbMF07XG5cbiAgICBpZiAoa2V5ID09PSAnUmVmJykge1xuICAgICAgaWYgKG9iai5SZWYgPT09IGxvZ2ljYWxJZCkge1xuICAgICAgICBvYmouUmVmID0gbG9naWNhbElkICsgJyAocmVwbGFjZWQpJztcbiAgICAgICAgcmV0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnRm46OicpKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmpba2V5XSkgJiYgb2JqW2tleV0ubGVuZ3RoID4gMCAmJiBvYmpba2V5XVswXSA9PT0gbG9naWNhbElkKSB7XG4gICAgICAgIG9ialtrZXldWzBdID0gbG9naWNhbElkICsgJyhyZXBsYWNlZCknO1xuICAgICAgICByZXQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmVjdXJzZSh0ZW1wbGF0ZSk7XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRlZXBDb3B5KHg6IGFueSk6IGFueSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIHgubWFwKGRlZXBDb3B5KTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeCAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHJldDogYW55ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoeCkpIHtcbiAgICAgIHJldFtrZXldID0gZGVlcENvcHkoeFtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHJldHVybiB4O1xufVxuXG5mdW5jdGlvbiBtYWtlQWxsUmVzb3VyY2VDaGFuZ2VzSW1wb3J0cyhkaWZmOiB0eXBlcy5UZW1wbGF0ZURpZmYpIHtcbiAgZGlmZi5yZXNvdXJjZXMuZm9yRWFjaERpZmZlcmVuY2UoKF9sb2dpY2FsSWQ6IHN0cmluZywgY2hhbmdlOiB0eXBlcy5SZXNvdXJjZURpZmZlcmVuY2UpID0+IHtcbiAgICBjaGFuZ2UuaXNJbXBvcnQgPSB0cnVlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplKHRlbXBsYXRlOiBhbnkpIHtcbiAgaWYgKHR5cGVvZiB0ZW1wbGF0ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiAoT2JqZWN0LmtleXModGVtcGxhdGUgPz8ge30pKSkge1xuICAgICAgaWYgKGtleSA9PT0gJ0ZuOjpHZXRBdHQnICYmIHR5cGVvZiB0ZW1wbGF0ZVtrZXldID09PSAnc3RyaW5nJykge1xuICAgICAgICB0ZW1wbGF0ZVtrZXldID0gdGVtcGxhdGVba2V5XS5zcGxpdCgnLicpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnRGVwZW5kc09uJykge1xuICAgICAgICBpZiAodHlwZW9mIHRlbXBsYXRlW2tleV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGVtcGxhdGVba2V5XSA9IFt0ZW1wbGF0ZVtrZXldXTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRlbXBsYXRlW2tleV0pKSB7XG4gICAgICAgICAgdGVtcGxhdGVba2V5XSA9IHRlbXBsYXRlW2tleV0uc29ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0ZW1wbGF0ZVtrZXldKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgKHRlbXBsYXRlW2tleV0pKSB7XG4gICAgICAgICAgbm9ybWFsaXplKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub3JtYWxpemUodGVtcGxhdGVba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculate differences of immutable elements
|
|
3
|
+
*/
|
|
4
|
+
export declare class DiffableCollection<T extends Eq<T>> {
|
|
5
|
+
readonly additions: T[];
|
|
6
|
+
readonly removals: T[];
|
|
7
|
+
private readonly oldElements;
|
|
8
|
+
private readonly newElements;
|
|
9
|
+
addOld(...elements: T[]): void;
|
|
10
|
+
addNew(...elements: T[]): void;
|
|
11
|
+
calculateDiff(): void;
|
|
12
|
+
get hasChanges(): boolean;
|
|
13
|
+
get hasAdditions(): boolean;
|
|
14
|
+
get hasRemovals(): boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Things that can be compared to themselves (by value)
|
|
18
|
+
*/
|
|
19
|
+
interface Eq<T> {
|
|
20
|
+
equal(other: T): boolean;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
package/lib/diffable.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DiffableCollection = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Calculate differences of immutable elements
|
|
6
|
+
*/
|
|
7
|
+
class DiffableCollection {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.additions = [];
|
|
10
|
+
this.removals = [];
|
|
11
|
+
this.oldElements = [];
|
|
12
|
+
this.newElements = [];
|
|
13
|
+
}
|
|
14
|
+
addOld(...elements) {
|
|
15
|
+
this.oldElements.push(...elements);
|
|
16
|
+
}
|
|
17
|
+
addNew(...elements) {
|
|
18
|
+
this.newElements.push(...elements);
|
|
19
|
+
}
|
|
20
|
+
calculateDiff() {
|
|
21
|
+
this.additions.push(...difference(this.newElements, this.oldElements));
|
|
22
|
+
this.removals.push(...difference(this.oldElements, this.newElements));
|
|
23
|
+
}
|
|
24
|
+
get hasChanges() {
|
|
25
|
+
return this.additions.length + this.removals.length > 0;
|
|
26
|
+
}
|
|
27
|
+
get hasAdditions() {
|
|
28
|
+
return this.additions.length > 0;
|
|
29
|
+
}
|
|
30
|
+
get hasRemovals() {
|
|
31
|
+
return this.removals.length > 0;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.DiffableCollection = DiffableCollection;
|
|
35
|
+
/**
|
|
36
|
+
* Whether a collection contains some element (by value)
|
|
37
|
+
*/
|
|
38
|
+
function contains(element, xs) {
|
|
39
|
+
return xs.some(x => x.equal(element));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Return collection except for elements
|
|
43
|
+
*/
|
|
44
|
+
function difference(collection, elements) {
|
|
45
|
+
return collection.filter(x => !contains(x, elements));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZmFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWZmYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7R0FFRztBQUNILE1BQWEsa0JBQWtCO0lBQS9CO1FBQ2tCLGNBQVMsR0FBUSxFQUFFLENBQUM7UUFDcEIsYUFBUSxHQUFRLEVBQUUsQ0FBQztRQUVsQixnQkFBVyxHQUFRLEVBQUUsQ0FBQztRQUN0QixnQkFBVyxHQUFRLEVBQUUsQ0FBQztJQTBCekMsQ0FBQztJQXhCUSxNQUFNLENBQUMsR0FBRyxRQUFhO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxHQUFHLFFBQWE7UUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU0sYUFBYTtRQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBL0JELGdEQStCQztBQVNEOztHQUVHO0FBQ0gsU0FBUyxRQUFRLENBQWtCLE9BQVUsRUFBRSxFQUFPO0lBQ3BELE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLFVBQVUsQ0FBa0IsVUFBZSxFQUFFLFFBQWE7SUFDakUsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDeEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2FsY3VsYXRlIGRpZmZlcmVuY2VzIG9mIGltbXV0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgY2xhc3MgRGlmZmFibGVDb2xsZWN0aW9uPFQgZXh0ZW5kcyBFcTxUPj4ge1xuICBwdWJsaWMgcmVhZG9ubHkgYWRkaXRpb25zOiBUW10gPSBbXTtcbiAgcHVibGljIHJlYWRvbmx5IHJlbW92YWxzOiBUW10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9sZEVsZW1lbnRzOiBUW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdFbGVtZW50czogVFtdID0gW107XG5cbiAgcHVibGljIGFkZE9sZCguLi5lbGVtZW50czogVFtdKSB7XG4gICAgdGhpcy5vbGRFbGVtZW50cy5wdXNoKC4uLmVsZW1lbnRzKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGROZXcoLi4uZWxlbWVudHM6IFRbXSkge1xuICAgIHRoaXMubmV3RWxlbWVudHMucHVzaCguLi5lbGVtZW50cyk7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlRGlmZigpIHtcbiAgICB0aGlzLmFkZGl0aW9ucy5wdXNoKC4uLmRpZmZlcmVuY2UodGhpcy5uZXdFbGVtZW50cywgdGhpcy5vbGRFbGVtZW50cykpO1xuICAgIHRoaXMucmVtb3ZhbHMucHVzaCguLi5kaWZmZXJlbmNlKHRoaXMub2xkRWxlbWVudHMsIHRoaXMubmV3RWxlbWVudHMpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzQ2hhbmdlcygpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRpdGlvbnMubGVuZ3RoICsgdGhpcy5yZW1vdmFscy5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNBZGRpdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkaXRpb25zLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc1JlbW92YWxzKCkge1xuICAgIHJldHVybiB0aGlzLnJlbW92YWxzLmxlbmd0aCA+IDA7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGluZ3MgdGhhdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhlbXNlbHZlcyAoYnkgdmFsdWUpXG4gKi9cbmludGVyZmFjZSBFcTxUPiB7XG4gIGVxdWFsKG90aGVyOiBUKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgY29sbGVjdGlvbiBjb250YWlucyBzb21lIGVsZW1lbnQgKGJ5IHZhbHVlKVxuICovXG5mdW5jdGlvbiBjb250YWluczxUIGV4dGVuZHMgRXE8VD4+KGVsZW1lbnQ6IFQsIHhzOiBUW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIHhzLnNvbWUoeCA9PiB4LmVxdWFsKGVsZW1lbnQpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gY29sbGVjdGlvbiBleGNlcHQgZm9yIGVsZW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGRpZmZlcmVuY2U8VCBleHRlbmRzIEVxPFQ+Pihjb2xsZWN0aW9uOiBUW10sIGVsZW1lbnRzOiBUW10pOiBUW10ge1xuICByZXR1cm4gY29sbGVjdGlvbi5maWx0ZXIoeCA9PiAhY29udGFpbnMoeCwgZWxlbWVudHMpKTtcbn1cbiJdfQ==
|