@alicloud/ros-cdk-assert 1.0.26 → 1.0.27

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.
@@ -6,7 +6,9 @@ export declare enum MatchStyle {
6
6
  /** Allows any change that does not cause a resource replacement */
7
7
  NO_REPLACES = "no replaces",
8
8
  /** Allows additions, but no updates */
9
- SUPERSET = "superset"
9
+ SUPERSET = "superset",
10
+ /** Allows regular expressions to match strings */
11
+ REGEXP = "regexp"
10
12
  }
11
13
  export declare function exactlyMatchTemplate(template: {
12
14
  [key: string]: any;
@@ -12,6 +12,8 @@ var MatchStyle;
12
12
  MatchStyle["NO_REPLACES"] = "no replaces";
13
13
  /** Allows additions, but no updates */
14
14
  MatchStyle["SUPERSET"] = "superset";
15
+ /** Allows regular expressions to match strings */
16
+ MatchStyle["REGEXP"] = "regexp";
15
17
  })(MatchStyle = exports.MatchStyle || (exports.MatchStyle = {}));
16
18
  function exactlyMatchTemplate(template) {
17
19
  return matchTemplate(template, MatchStyle.EXACT);
@@ -38,23 +40,23 @@ class StackMatchesTemplateAssertion extends assertion_1.Assertion {
38
40
  }
39
41
  }
40
42
  assertUsing(inspector) {
41
- const diff = rosDiff.diffTemplate(this.template, inspector.value);
42
- const acceptable = this.isDiffAcceptable(diff);
43
+ this.diff = rosDiff.diffTemplate(this.template, inspector.value);
44
+ const acceptable = this.isDiffAcceptable();
43
45
  if (!acceptable) {
44
46
  // Print the diff
45
- rosDiff.formatDifferences(process.stderr, diff);
47
+ rosDiff.formatDifferences(process.stderr, this.diff);
46
48
  // Print the actual template
47
49
  process.stderr.write(colors.rainbow('--------------------------------------------------------------------------------------\n'));
48
50
  process.stderr.write(colors.white((JSON.stringify(inspector.value, undefined, 2) + '\n')));
49
51
  }
50
52
  return acceptable;
51
53
  }
52
- isDiffAcceptable(diff) {
54
+ isDiffAcceptable() {
53
55
  switch (this.matchStyle) {
54
56
  case MatchStyle.EXACT:
55
- return diff.differenceCount === 0;
57
+ return this.diff.differenceCount === 0;
56
58
  case MatchStyle.NO_REPLACES:
57
- for (const change of Object.values(diff.resources.changes)) {
59
+ for (const change of Object.values(this.diff.resources.changes)) {
58
60
  if (change.changeImpact === rosDiff.ResourceImpact.MAY_REPLACE) {
59
61
  return false;
60
62
  }
@@ -62,34 +64,91 @@ class StackMatchesTemplateAssertion extends assertion_1.Assertion {
62
64
  return false;
63
65
  }
64
66
  }
65
- for (const change of Object.values(diff.parameters.changes)) {
67
+ for (const change of Object.values(this.diff.parameters.changes)) {
66
68
  if (change.isUpdate) {
67
69
  return false;
68
70
  }
69
71
  }
70
- for (const change of Object.values(diff.outputs.changes)) {
72
+ for (const change of Object.values(this.diff.outputs.changes)) {
71
73
  if (change.isUpdate) {
72
74
  return false;
73
75
  }
74
76
  }
75
77
  return true;
76
78
  case MatchStyle.SUPERSET:
77
- for (const change of Object.values(diff.resources.changes)) {
79
+ for (const change of Object.values(this.diff.resources.changes)) {
78
80
  if (change.changeImpact !== rosDiff.ResourceImpact.WILL_CREATE) {
79
81
  return false;
80
82
  }
81
83
  }
82
- for (const change of Object.values(diff.parameters.changes)) {
84
+ for (const change of Object.values(this.diff.parameters.changes)) {
83
85
  if (change.isAddition) {
84
86
  return false;
85
87
  }
86
88
  }
87
- for (const change of Object.values(diff.outputs.changes)) {
89
+ for (const change of Object.values(this.diff.outputs.changes)) {
88
90
  if (change.isAddition || change.isUpdate) {
89
91
  return false;
90
92
  }
91
93
  }
92
94
  return true;
95
+ case MatchStyle.REGEXP:
96
+ let acceptable = true;
97
+ let diffMap = this.diff.toMap();
98
+ let keysToDelete = [];
99
+ for (const key in diffMap) {
100
+ const value = diffMap[key];
101
+ if (value === undefined || value === null || value === {}) {
102
+ keysToDelete.push(key);
103
+ continue;
104
+ }
105
+ if (rosDiff.isDifferenceInstance(value)) {
106
+ if (compareVariablesWithRegExp(value.oldValue, value.newValue)) {
107
+ keysToDelete.push(key);
108
+ }
109
+ else {
110
+ acceptable = false;
111
+ }
112
+ }
113
+ else if (typeof value === 'object' && !Array.isArray(value)) {
114
+ for (const subKey in value) {
115
+ if (compareVariablesWithRegExp(value[subKey].oldValue, value[subKey].newValue)) {
116
+ keysToDelete.push(key + '.' + subKey);
117
+ }
118
+ else {
119
+ for (const otherSubKey in value) {
120
+ const regex = new RegExp(subKey);
121
+ if (otherSubKey === subKey || !regex.test(otherSubKey)) {
122
+ continue;
123
+ }
124
+ if (compareVariablesWithRegExp(value[subKey].oldValue, value[otherSubKey].newValue)
125
+ || compareVariablesWithRegExp(value[otherSubKey].oldValue, value[subKey].newValue)) {
126
+ keysToDelete.push(key + '.' + subKey);
127
+ keysToDelete.push(key + '.' + otherSubKey);
128
+ break;
129
+ }
130
+ else {
131
+ acceptable = false;
132
+ }
133
+ }
134
+ }
135
+ }
136
+ }
137
+ }
138
+ for (const key of keysToDelete) {
139
+ const keys = key.split('.');
140
+ if (keys.length == 1) {
141
+ delete diffMap[key];
142
+ }
143
+ else {
144
+ delete diffMap[keys[0]][keys[1]];
145
+ if (Object.keys(diffMap[keys[0]]).length === 0) {
146
+ delete diffMap[keys[0]];
147
+ }
148
+ }
149
+ }
150
+ this.diff = rosDiff.TemplateDiff.fromMap(diffMap);
151
+ return acceptable;
93
152
  }
94
153
  throw new Error(`Unsupported match style: ${this.matchStyle}`);
95
154
  }
@@ -97,4 +156,48 @@ class StackMatchesTemplateAssertion extends assertion_1.Assertion {
97
156
  return `template (${this.matchStyle}): ${JSON.stringify(this.template, null, 2)}`;
98
157
  }
99
158
  }
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2gtdGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYXRjaC10ZW1wbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyREFBMkQ7QUFDM0QsNENBQXlDO0FBRXpDLHNDQUFzQztBQUV0QyxJQUFZLFVBT1g7QUFQRCxXQUFZLFVBQVU7SUFDcEIsOEJBQThCO0lBQzlCLCtCQUFpQixDQUFBO0lBQ2pCLG1FQUFtRTtJQUNuRSx5Q0FBMkIsQ0FBQTtJQUMzQix1Q0FBdUM7SUFDdkMsbUNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVBXLFVBQVUsR0FBVixrQkFBVSxLQUFWLGtCQUFVLFFBT3JCO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsUUFBZ0M7SUFDbkUsT0FBTyxhQUFhLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRkQsb0RBRUM7QUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxRQUFnQztJQUNwRSxPQUFPLGFBQWEsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFGRCxzREFFQztBQUVELFNBQWdCLGFBQWEsQ0FDM0IsUUFBZ0MsRUFDaEMsYUFBeUIsVUFBVSxDQUFDLEtBQUs7SUFFekMsT0FBTyxJQUFJLDZCQUE2QixDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBTEQsc0NBS0M7QUFFRCxNQUFNLDZCQUE4QixTQUFRLHFCQUF5QjtJQUNuRSxZQUE2QixRQUFnQyxFQUFtQixVQUFzQjtRQUNwRyxLQUFLLEVBQUUsQ0FBQztRQURtQixhQUFRLEdBQVIsUUFBUSxDQUF3QjtRQUFtQixlQUFVLEdBQVYsVUFBVSxDQUFZO0lBRXRHLENBQUM7SUFFTSxhQUFhLENBQUMsU0FBeUI7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDaEMsZ0ZBQWdGO1lB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Q0FBQyxRQUFRLEVBQUU7d0JBQ3hDLE9BQU8sS0FBSyxDQUFDO3FCQUNkO2lCQUNGO2dCQUVELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sYUFBYSxJQUFJLENBQUMsVUFBVSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNwRixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyByb3NEaWZmIGZyb20gJ0BhbGljbG91ZC9yb3MtY2RrLXRlbXBsYXRlLWRpZmYnO1xuaW1wb3J0IHsgQXNzZXJ0aW9uIH0gZnJvbSAnLi4vYXNzZXJ0aW9uJztcbmltcG9ydCB7IFN0YWNrSW5zcGVjdG9yIH0gZnJvbSAnLi4vaW5zcGVjdG9yJztcbmltcG9ydCAqIGFzIGNvbG9ycyBmcm9tICdjb2xvcnMvc2FmZSc7XG5cbmV4cG9ydCBlbnVtIE1hdGNoU3R5bGUge1xuICAvKiogUmVxdWlyZXMgYW4gZXhhY3QgbWF0Y2ggKi9cbiAgRVhBQ1QgPSAnZXhhY3RseScsXG4gIC8qKiBBbGxvd3MgYW55IGNoYW5nZSB0aGF0IGRvZXMgbm90IGNhdXNlIGEgcmVzb3VyY2UgcmVwbGFjZW1lbnQgKi9cbiAgTk9fUkVQTEFDRVMgPSAnbm8gcmVwbGFjZXMnLFxuICAvKiogQWxsb3dzIGFkZGl0aW9ucywgYnV0IG5vIHVwZGF0ZXMgKi9cbiAgU1VQRVJTRVQgPSAnc3VwZXJzZXQnLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RseU1hdGNoVGVtcGxhdGUodGVtcGxhdGU6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgcmV0dXJuIG1hdGNoVGVtcGxhdGUodGVtcGxhdGUsIE1hdGNoU3R5bGUuRVhBQ1QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmVBU3VwZXJzZXRPZlRlbXBsYXRlKHRlbXBsYXRlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gIHJldHVybiBtYXRjaFRlbXBsYXRlKHRlbXBsYXRlLCBNYXRjaFN0eWxlLlNVUEVSU0VUKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoVGVtcGxhdGUoXG4gIHRlbXBsYXRlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxuICBtYXRjaFN0eWxlOiBNYXRjaFN0eWxlID0gTWF0Y2hTdHlsZS5FWEFDVCxcbik6IEFzc2VydGlvbjxTdGFja0luc3BlY3Rvcj4ge1xuICByZXR1cm4gbmV3IFN0YWNrTWF0Y2hlc1RlbXBsYXRlQXNzZXJ0aW9uKHRlbXBsYXRlLCBtYXRjaFN0eWxlKTtcbn1cblxuY2xhc3MgU3RhY2tNYXRjaGVzVGVtcGxhdGVBc3NlcnRpb24gZXh0ZW5kcyBBc3NlcnRpb248U3RhY2tJbnNwZWN0b3I+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgcHJpdmF0ZSByZWFkb25seSBtYXRjaFN0eWxlOiBNYXRjaFN0eWxlKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlcnRPclRocm93KGluc3BlY3RvcjogU3RhY2tJbnNwZWN0b3IpIHtcbiAgICBpZiAoIXRoaXMuYXNzZXJ0VXNpbmcoaW5zcGVjdG9yKSkge1xuICAgICAgLy8gVGhlIGRldGFpbHMgaGF2ZSBhbHJlYWR5IGJlZW4gcHJpbnRlZCwgc28gZG9uJ3QgZ2VuZXJhdGUgYSBodWdlIGVycm9yIG1lc3NhZ2VcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGVtcGxhdGUgY29tcGFyaXNvbiBwcm9kdWNlZCB1bmFjY2VwdGFibGUgbWF0Y2gnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXNzZXJ0VXNpbmcoaW5zcGVjdG9yOiBTdGFja0luc3BlY3Rvcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRpZmYgPSByb3NEaWZmLmRpZmZUZW1wbGF0ZSh0aGlzLnRlbXBsYXRlLCBpbnNwZWN0b3IudmFsdWUpO1xuICAgIGNvbnN0IGFjY2VwdGFibGUgPSB0aGlzLmlzRGlmZkFjY2VwdGFibGUoZGlmZik7XG4gICAgaWYgKCFhY2NlcHRhYmxlKSB7XG4gICAgICAvLyBQcmludCB0aGUgZGlmZlxuICAgICAgcm9zRGlmZi5mb3JtYXREaWZmZXJlbmNlcyhwcm9jZXNzLnN0ZGVyciwgZGlmZik7XG5cbiAgICAgIC8vIFByaW50IHRoZSBhY3R1YWwgdGVtcGxhdGVcbiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGNvbG9ycy5yYWluYm93KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbicpKTtcbiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGNvbG9ycy53aGl0ZSgoSlNPTi5zdHJpbmdpZnkoaW5zcGVjdG9yLnZhbHVlLCB1bmRlZmluZWQsIDIpICsgJ1xcbicpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjY2VwdGFibGU7XG4gIH1cblxuICBwcml2YXRlIGlzRGlmZkFjY2VwdGFibGUoZGlmZjogcm9zRGlmZi5UZW1wbGF0ZURpZmYpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKHRoaXMubWF0Y2hTdHlsZSkge1xuICAgICAgY2FzZSBNYXRjaFN0eWxlLkVYQUNUOlxuICAgICAgICByZXR1cm4gZGlmZi5kaWZmZXJlbmNlQ291bnQgPT09IDA7XG4gICAgICBjYXNlIE1hdGNoU3R5bGUuTk9fUkVQTEFDRVM6XG4gICAgICAgIGZvciAoY29uc3QgY2hhbmdlIG9mIE9iamVjdC52YWx1ZXMoZGlmZi5yZXNvdXJjZXMuY2hhbmdlcykpIHtcbiAgICAgICAgICBpZiAoY2hhbmdlLmNoYW5nZUltcGFjdCA9PT0gcm9zRGlmZi5SZXNvdXJjZUltcGFjdC5NQVlfUkVQTEFDRSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2hhbmdlLmNoYW5nZUltcGFjdCA9PT0gcm9zRGlmZi5SZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBPYmplY3QudmFsdWVzKGRpZmYucGFyYW1ldGVycy5jaGFuZ2VzKSkge1xuICAgICAgICAgIGlmIChjaGFuZ2UuaXNVcGRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBPYmplY3QudmFsdWVzKGRpZmYub3V0cHV0cy5jaGFuZ2VzKSkge1xuICAgICAgICAgIGlmIChjaGFuZ2UuaXNVcGRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlIE1hdGNoU3R5bGUuU1VQRVJTRVQ6XG4gICAgICAgIGZvciAoY29uc3QgY2hhbmdlIG9mIE9iamVjdC52YWx1ZXMoZGlmZi5yZXNvdXJjZXMuY2hhbmdlcykpIHtcbiAgICAgICAgICBpZiAoY2hhbmdlLmNoYW5nZUltcGFjdCAhPT0gcm9zRGlmZi5SZXNvdXJjZUltcGFjdC5XSUxMX0NSRUFURSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgY2hhbmdlIG9mIE9iamVjdC52YWx1ZXMoZGlmZi5wYXJhbWV0ZXJzLmNoYW5nZXMpKSB7XG4gICAgICAgICAgaWYgKGNoYW5nZS5pc0FkZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgT2JqZWN0LnZhbHVlcyhkaWZmLm91dHB1dHMuY2hhbmdlcykpIHtcbiAgICAgICAgICBpZiAoY2hhbmdlLmlzQWRkaXRpb24gfHwgY2hhbmdlLmlzVXBkYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbWF0Y2ggc3R5bGU6ICR7dGhpcy5tYXRjaFN0eWxlfWApO1xuICB9XG5cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdGVtcGxhdGUgKCR7dGhpcy5tYXRjaFN0eWxlfSk6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy50ZW1wbGF0ZSwgbnVsbCwgMil9YDtcbiAgfVxufVxuIl19
159
+ function compareVariablesWithRegExp(var1, var2) {
160
+ if (typeof var1 !== typeof var2) {
161
+ return false;
162
+ }
163
+ if (typeof var1 === 'string' && typeof var2 === 'string') {
164
+ if (var1 !== var2) {
165
+ const regex = new RegExp(var1);
166
+ return regex.test(var2);
167
+ }
168
+ else {
169
+ return true;
170
+ }
171
+ }
172
+ if (typeof var1 !== 'object' && typeof var2 !== 'object') {
173
+ return var1 === var2;
174
+ }
175
+ if (typeof var1 === 'object' && typeof var2 === 'object') {
176
+ if (Array.isArray(var1) && Array.isArray(var2)) {
177
+ if (var1.length !== var2.length) {
178
+ return false;
179
+ }
180
+ for (let i = 0; i < var1.length; i++) {
181
+ if (!compareVariablesWithRegExp(var1[i], var2[i])) {
182
+ return false;
183
+ }
184
+ }
185
+ return true;
186
+ }
187
+ else {
188
+ const keys1 = Object.keys(var1);
189
+ const keys2 = Object.keys(var2);
190
+ if (keys1.length !== keys2.length) {
191
+ return false;
192
+ }
193
+ for (const key of keys1) {
194
+ if (!compareVariablesWithRegExp(var1[key], var2[key])) {
195
+ return false;
196
+ }
197
+ }
198
+ return true;
199
+ }
200
+ }
201
+ return false;
202
+ }
203
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2gtdGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYXRjaC10ZW1wbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyREFBMkQ7QUFDM0QsNENBQXVDO0FBRXZDLHNDQUFzQztBQUV0QyxJQUFZLFVBU1g7QUFURCxXQUFZLFVBQVU7SUFDcEIsOEJBQThCO0lBQzlCLCtCQUFpQixDQUFBO0lBQ2pCLG1FQUFtRTtJQUNuRSx5Q0FBMkIsQ0FBQTtJQUMzQix1Q0FBdUM7SUFDdkMsbUNBQXFCLENBQUE7SUFDckIsa0RBQWtEO0lBQ2xELCtCQUFpQixDQUFBO0FBQ25CLENBQUMsRUFUVyxVQUFVLEdBQVYsa0JBQVUsS0FBVixrQkFBVSxRQVNyQjtBQUVELFNBQWdCLG9CQUFvQixDQUFDLFFBQWdDO0lBQ25FLE9BQU8sYUFBYSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUZELG9EQUVDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsUUFBZ0M7SUFDcEUsT0FBTyxhQUFhLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRkQsc0RBRUM7QUFFRCxTQUFnQixhQUFhLENBQzNCLFFBQWdDLEVBQ2hDLGFBQXlCLFVBQVUsQ0FBQyxLQUFLO0lBRXpDLE9BQU8sSUFBSSw2QkFBNkIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUxELHNDQUtDO0FBRUQsTUFBTSw2QkFBOEIsU0FBUSxxQkFBeUI7SUFFbkUsWUFBNkIsUUFBZ0MsRUFBbUIsVUFBc0I7UUFDcEcsS0FBSyxFQUFFLENBQUM7UUFEbUIsYUFBUSxHQUFSLFFBQVEsQ0FBd0I7UUFBbUIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtJQUV0RyxDQUFDO0lBRU0sYUFBYSxDQUFDLFNBQXlCO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFD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LEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyByb3NEaWZmIGZyb20gJ0BhbGljbG91ZC9yb3MtY2RrLXRlbXBsYXRlLWRpZmYnO1xuaW1wb3J0IHtBc3NlcnRpb259IGZyb20gJy4uL2Fzc2VydGlvbic7XG5pbXBvcnQge1N0YWNrSW5zcGVjdG9yfSBmcm9tICcuLi9pbnNwZWN0b3InO1xuaW1wb3J0ICogYXMgY29sb3JzIGZyb20gJ2NvbG9ycy9zYWZlJztcblxuZXhwb3J0IGVudW0gTWF0Y2hTdHlsZSB7XG4gIC8qKiBSZXF1aXJlcyBhbiBleGFjdCBtYXRjaCAqL1xuICBFWEFDVCA9ICdleGFjdGx5JyxcbiAgLyoqIEFsbG93cyBhbnkgY2hhbmdlIHRoYXQgZG9lcyBub3QgY2F1c2UgYSByZXNvdXJjZSByZXBsYWNlbWVudCAqL1xuICBOT19SRVBMQUNFUyA9ICdubyByZXBsYWNlcycsXG4gIC8qKiBBbGxvd3MgYWRkaXRpb25zLCBidXQgbm8gdXBkYXRlcyAqL1xuICBTVVBFUlNFVCA9ICdzdXBlcnNldCcsXG4gIC8qKiBBbGxvd3MgcmVndWxhciBleHByZXNzaW9ucyB0byBtYXRjaCBzdHJpbmdzICovXG4gIFJFR0VYUCA9ICdyZWdleHAnLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RseU1hdGNoVGVtcGxhdGUodGVtcGxhdGU6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgcmV0dXJuIG1hdGNoVGVtcGxhdGUodGVtcGxhdGUsIE1hdGNoU3R5bGUuRVhBQ1QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmVBU3VwZXJzZXRPZlRlbXBsYXRlKHRlbXBsYXRlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gIHJldHVybiBtYXRjaFRlbXBsYXRlKHRlbXBsYXRlLCBNYXRjaFN0eWxlLlNVUEVSU0VUKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoVGVtcGxhdGUoXG4gIHRlbXBsYXRlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxuICBtYXRjaFN0eWxlOiBNYXRjaFN0eWxlID0gTWF0Y2hTdHlsZS5FWEFDVCxcbik6IEFzc2VydGlvbjxTdGFja0luc3BlY3Rvcj4ge1xuICByZXR1cm4gbmV3IFN0YWNrTWF0Y2hlc1RlbXBsYXRlQXNzZXJ0aW9uKHRlbXBsYXRlLCBtYXRjaFN0eWxlKTtcbn1cblxuY2xhc3MgU3RhY2tNYXRjaGVzVGVtcGxhdGVBc3NlcnRpb24gZXh0ZW5kcyBBc3NlcnRpb248U3RhY2tJbnNwZWN0b3I+IHtcbiAgcHVibGljIGRpZmY/OiByb3NEaWZmLlRlbXBsYXRlRGlmZjtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgcHJpdmF0ZSByZWFkb25seSBtYXRjaFN0eWxlOiBNYXRjaFN0eWxlKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlcnRPclRocm93KGluc3BlY3RvcjogU3RhY2tJbnNwZWN0b3IpIHtcbiAgICBpZiAoIXRoaXMuYXNzZXJ0VXNpbmcoaW5zcGVjdG9yKSkge1xuICAgICAgLy8gVGhlIGRldGFpbHMgaGF2ZSBhbHJlYWR5IGJlZW4gcHJpbnRlZCwgc28gZG9uJ3QgZ2VuZXJhdGUgYSBodWdlIGVycm9yIG1lc3NhZ2VcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGVtcGxhdGUgY29tcGFyaXNvbiBwcm9kdWNlZCB1bmFjY2VwdGFibGUgbWF0Y2gnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXNzZXJ0VXNpbmcoaW5zcGVjdG9yOiBTdGFja0luc3BlY3Rvcik6IGJvb2xlYW4ge1xuICAgIHRoaXMuZGlmZiA9IHJvc0RpZmYuZGlmZlRlbXBsYXRlKHRoaXMudGVtcGxhdGUsIGluc3BlY3Rvci52YWx1ZSk7XG4gICAgY29uc3QgYWNjZXB0YWJsZSA9IHRoaXMuaXNEaWZmQWNjZXB0YWJsZSgpO1xuICAgIGlmICghYWNjZXB0YWJsZSkge1xuICAgICAgLy8gUHJpbnQgdGhlIGRpZmZcbiAgICAgIHJvc0RpZmYuZm9ybWF0RGlmZmVyZW5jZXMocHJvY2Vzcy5zdGRlcnIsIHRoaXMuZGlmZik7XG5cbiAgICAgIC8vIFByaW50IHRoZSBhY3R1YWwgdGVtcGxhdGVcbiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGNvbG9ycy5yYWluYm93KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbicpKTtcbiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGNvbG9ycy53aGl0ZSgoSlNPTi5zdHJpbmdpZnkoaW5zcGVjdG9yLnZhbHVlLCB1bmRlZmluZWQsIDIpICsgJ1xcbicpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjY2VwdGFibGU7XG4gIH1cblxuICBwcml2YXRlIGlzRGlmZkFjY2VwdGFibGUoKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoICh0aGlzLm1hdGNoU3R5bGUpIHtcbiAgICAgIGNhc2UgTWF0Y2hTdHlsZS5FWEFDVDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlmZiEuZGlmZmVyZW5jZUNvdW50ID09PSAwO1xuICAgICAgY2FzZSBNYXRjaFN0eWxlLk5PX1JFUExBQ0VTOlxuICAgICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBPYmplY3QudmFsdWVzKHRoaXMuZGlmZiEucmVzb3VyY2VzLmNoYW5nZXMpKSB7XG4gICAgICAgICAgaWYgKGNoYW5nZS5jaGFuZ2VJbXBhY3QgPT09IHJvc0RpZmYuUmVzb3VyY2VJbXBhY3QuTUFZX1JFUExBQ0UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNoYW5nZS5jaGFuZ2VJbXBhY3QgPT09IHJvc0RpZmYuUmVzb3VyY2VJbXBhY3QuV0lMTF9SRVBMQUNFKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmRpZmYhLnBhcmFtZXRlcnMuY2hhbmdlcykpIHtcbiAgICAgICAgICBpZiAoY2hhbmdlLmlzVXBkYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmRpZmYhLm91dHB1dHMuY2hhbmdlcykpIHtcbiAgICAgICAgICBpZiAoY2hhbmdlLmlzVXBkYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSBNYXRjaFN0eWxlLlNVUEVSU0VUOlxuICAgICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBPYmplY3QudmFsdWVzKHRoaXMuZGlmZiEucmVzb3VyY2VzLmNoYW5nZXMpKSB7XG4gICAgICAgICAgaWYgKGNoYW5nZS5jaGFuZ2VJbXBhY3QgIT09IHJvc0RpZmYuUmVzb3VyY2VJbXBhY3QuV0lMTF9DUkVBVEUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBPYmplY3QudmFsdWVzKHRoaXMuZGlmZiEucGFyYW1ldGVycy5jaGFuZ2VzKSkge1xuICAgICAgICAgIGlmIChjaGFuZ2UuaXNBZGRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgY2hhbmdlIG9mIE9iamVjdC52YWx1ZXModGhpcy5kaWZmIS5vdXRwdXRzLmNoYW5nZXMpKSB7XG4gICAgICAgICAgaWYgKGNoYW5nZS5pc0FkZGl0aW9uIHx8IGNoYW5nZS5pc1VwZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSBNYXRjaFN0eWxlLlJFR0VYUDpcbiAgICAgICAgbGV0IGFjY2VwdGFibGUgPSB0cnVlO1xuICAgICAgICBsZXQgZGlmZk1hcCA9IHRoaXMuZGlmZiEudG9NYXAoKTtcbiAgICAgICAgbGV0IGtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGlmZk1hcCkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGlmZk1hcFtrZXldO1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB7fSkge1xuICAgICAgICAgICAga2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocm9zRGlmZi5pc0RpZmZlcmVuY2VJbnN0YW5jZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmIChjb21wYXJlVmFyaWFibGVzV2l0aFJlZ0V4cCh2YWx1ZS5vbGRWYWx1ZSwgdmFsdWUubmV3VmFsdWUpKSB7XG4gICAgICAgICAgICAgIGtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhY2NlcHRhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJLZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgaWYgKGNvbXBhcmVWYXJpYWJsZXNXaXRoUmVnRXhwKHZhbHVlW3N1YktleV0ub2xkVmFsdWUsIHZhbHVlW3N1YktleV0ubmV3VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAga2V5c1RvRGVsZXRlLnB1c2goa2V5ICsgJy4nICsgc3ViS2V5KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG90aGVyU3ViS2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoc3ViS2V5KTtcbiAgICAgICAgICAgICAgICAgIGlmIChvdGhlclN1YktleSA9PT0gc3ViS2V5IHx8ICFyZWdleC50ZXN0KG90aGVyU3ViS2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChjb21wYXJlVmFyaWFibGVzV2l0aFJlZ0V4cCh2YWx1ZVtzdWJLZXldLm9sZFZhbHVlLCB2YWx1ZVtvdGhlclN1YktleV0ubmV3VmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgfHwgY29tcGFyZVZhcmlhYmxlc1dpdGhSZWdFeHAodmFsdWVbb3RoZXJTdWJLZXldLm9sZFZhbHVlLCB2YWx1ZVtzdWJLZXldLm5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBrZXlzVG9EZWxldGUucHVzaChrZXkgKyAnLicgKyBzdWJLZXkpO1xuICAgICAgICAgICAgICAgICAgICBrZXlzVG9EZWxldGUucHVzaChrZXkgKyAnLicgKyBvdGhlclN1YktleSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjZXB0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzVG9EZWxldGUpIHtcbiAgICAgICAgICBjb25zdCBrZXlzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICAgICAgaWYgKGtleXMubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBkaWZmTWFwW2tleV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSBkaWZmTWFwW2tleXNbMF1dW2tleXNbMV1dO1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRpZmZNYXBba2V5c1swXV0pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBkZWxldGUgZGlmZk1hcFtrZXlzWzBdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaWZmID0gcm9zRGlmZi5UZW1wbGF0ZURpZmYuZnJvbU1hcChkaWZmTWFwKTtcbiAgICAgICAgcmV0dXJuIGFjY2VwdGFibGU7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbWF0Y2ggc3R5bGU6ICR7dGhpcy5tYXRjaFN0eWxlfWApO1xuICB9XG5cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdGVtcGxhdGUgKCR7dGhpcy5tYXRjaFN0eWxlfSk6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy50ZW1wbGF0ZSwgbnVsbCwgMil9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wYXJlVmFyaWFibGVzV2l0aFJlZ0V4cCh2YXIxOiBhbnksIHZhcjI6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHZhcjEgIT09IHR5cGVvZiB2YXIyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YXIxID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFyMiA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodmFyMSAhPT0gdmFyMikge1xuICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHZhcjEpO1xuICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodmFyMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFyMSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhcjIgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHZhcjEgPT09IHZhcjI7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhcjEgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YXIyID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhcjEpICYmIEFycmF5LmlzQXJyYXkodmFyMikpIHtcbiAgICAgIGlmICh2YXIxLmxlbmd0aCAhPT0gdmFyMi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YXIxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghY29tcGFyZVZhcmlhYmxlc1dpdGhSZWdFeHAodmFyMVtpXSwgdmFyMltpXSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBrZXlzMSA9IE9iamVjdC5rZXlzKHZhcjEpO1xuICAgICAgY29uc3Qga2V5czIgPSBPYmplY3Qua2V5cyh2YXIyKTtcbiAgICAgIGlmIChrZXlzMS5sZW5ndGggIT09IGtleXMyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzMSkge1xuICAgICAgICBpZiAoIWNvbXBhcmVWYXJpYWJsZXNXaXRoUmVnRXhwKHZhcjFba2V5XSwgdmFyMltrZXldKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19
@@ -1,6 +1,6 @@
1
1
  import * as rosDiff from '@alicloud/ros-cdk-template-diff';
2
- import { Assertion } from '../assertion';
3
- import { StackInspector } from '../inspector';
2
+ import {Assertion} from '../assertion';
3
+ import {StackInspector} from '../inspector';
4
4
  import * as colors from 'colors/safe';
5
5
 
6
6
  export enum MatchStyle {
@@ -10,6 +10,8 @@ export enum MatchStyle {
10
10
  NO_REPLACES = 'no replaces',
11
11
  /** Allows additions, but no updates */
12
12
  SUPERSET = 'superset',
13
+ /** Allows regular expressions to match strings */
14
+ REGEXP = 'regexp',
13
15
  }
14
16
 
15
17
  export function exactlyMatchTemplate(template: { [key: string]: any }) {
@@ -28,6 +30,7 @@ export function matchTemplate(
28
30
  }
29
31
 
30
32
  class StackMatchesTemplateAssertion extends Assertion<StackInspector> {
33
+ public diff?: rosDiff.TemplateDiff;
31
34
  constructor(private readonly template: { [key: string]: any }, private readonly matchStyle: MatchStyle) {
32
35
  super();
33
36
  }
@@ -40,11 +43,11 @@ class StackMatchesTemplateAssertion extends Assertion<StackInspector> {
40
43
  }
41
44
 
42
45
  public assertUsing(inspector: StackInspector): boolean {
43
- const diff = rosDiff.diffTemplate(this.template, inspector.value);
44
- const acceptable = this.isDiffAcceptable(diff);
46
+ this.diff = rosDiff.diffTemplate(this.template, inspector.value);
47
+ const acceptable = this.isDiffAcceptable();
45
48
  if (!acceptable) {
46
49
  // Print the diff
47
- rosDiff.formatDifferences(process.stderr, diff);
50
+ rosDiff.formatDifferences(process.stderr, this.diff);
48
51
 
49
52
  // Print the actual template
50
53
  process.stderr.write(colors.rainbow('--------------------------------------------------------------------------------------\n'));
@@ -54,12 +57,12 @@ class StackMatchesTemplateAssertion extends Assertion<StackInspector> {
54
57
  return acceptable;
55
58
  }
56
59
 
57
- private isDiffAcceptable(diff: rosDiff.TemplateDiff): boolean {
60
+ private isDiffAcceptable(): boolean {
58
61
  switch (this.matchStyle) {
59
62
  case MatchStyle.EXACT:
60
- return diff.differenceCount === 0;
63
+ return this.diff!.differenceCount === 0;
61
64
  case MatchStyle.NO_REPLACES:
62
- for (const change of Object.values(diff.resources.changes)) {
65
+ for (const change of Object.values(this.diff!.resources.changes)) {
63
66
  if (change.changeImpact === rosDiff.ResourceImpact.MAY_REPLACE) {
64
67
  return false;
65
68
  }
@@ -68,38 +71,90 @@ class StackMatchesTemplateAssertion extends Assertion<StackInspector> {
68
71
  }
69
72
  }
70
73
 
71
- for (const change of Object.values(diff.parameters.changes)) {
74
+ for (const change of Object.values(this.diff!.parameters.changes)) {
72
75
  if (change.isUpdate) {
73
76
  return false;
74
77
  }
75
78
  }
76
79
 
77
- for (const change of Object.values(diff.outputs.changes)) {
80
+ for (const change of Object.values(this.diff!.outputs.changes)) {
78
81
  if (change.isUpdate) {
79
82
  return false;
80
83
  }
81
84
  }
82
85
  return true;
83
86
  case MatchStyle.SUPERSET:
84
- for (const change of Object.values(diff.resources.changes)) {
87
+ for (const change of Object.values(this.diff!.resources.changes)) {
85
88
  if (change.changeImpact !== rosDiff.ResourceImpact.WILL_CREATE) {
86
89
  return false;
87
90
  }
88
91
  }
89
92
 
90
- for (const change of Object.values(diff.parameters.changes)) {
93
+ for (const change of Object.values(this.diff!.parameters.changes)) {
91
94
  if (change.isAddition) {
92
95
  return false;
93
96
  }
94
97
  }
95
98
 
96
- for (const change of Object.values(diff.outputs.changes)) {
99
+ for (const change of Object.values(this.diff!.outputs.changes)) {
97
100
  if (change.isAddition || change.isUpdate) {
98
101
  return false;
99
102
  }
100
103
  }
101
104
 
102
105
  return true;
106
+ case MatchStyle.REGEXP:
107
+ let acceptable = true;
108
+ let diffMap = this.diff!.toMap();
109
+ let keysToDelete: string[] = [];
110
+ for (const key in diffMap) {
111
+ const value = diffMap[key];
112
+ if (value === undefined || value === null || value === {}) {
113
+ keysToDelete.push(key);
114
+ continue;
115
+ }
116
+ if (rosDiff.isDifferenceInstance(value)) {
117
+ if (compareVariablesWithRegExp(value.oldValue, value.newValue)) {
118
+ keysToDelete.push(key);
119
+ } else {
120
+ acceptable = false;
121
+ }
122
+ } else if (typeof value === 'object' && !Array.isArray(value)) {
123
+ for (const subKey in value) {
124
+ if (compareVariablesWithRegExp(value[subKey].oldValue, value[subKey].newValue)) {
125
+ keysToDelete.push(key + '.' + subKey);
126
+ } else {
127
+ for (const otherSubKey in value) {
128
+ const regex = new RegExp(subKey);
129
+ if (otherSubKey === subKey || !regex.test(otherSubKey)) {
130
+ continue;
131
+ }
132
+ if (compareVariablesWithRegExp(value[subKey].oldValue, value[otherSubKey].newValue)
133
+ || compareVariablesWithRegExp(value[otherSubKey].oldValue, value[subKey].newValue)) {
134
+ keysToDelete.push(key + '.' + subKey);
135
+ keysToDelete.push(key + '.' + otherSubKey);
136
+ break;
137
+ } else {
138
+ acceptable = false;
139
+ }
140
+ }
141
+ }
142
+ }
143
+ }
144
+ }
145
+ for (const key of keysToDelete) {
146
+ const keys = key.split('.');
147
+ if (keys.length == 1) {
148
+ delete diffMap[key];
149
+ } else {
150
+ delete diffMap[keys[0]][keys[1]];
151
+ if (Object.keys(diffMap[keys[0]]).length === 0) {
152
+ delete diffMap[keys[0]];
153
+ }
154
+ }
155
+ }
156
+ this.diff = rosDiff.TemplateDiff.fromMap(diffMap);
157
+ return acceptable;
103
158
  }
104
159
  throw new Error(`Unsupported match style: ${this.matchStyle}`);
105
160
  }
@@ -108,3 +163,50 @@ class StackMatchesTemplateAssertion extends Assertion<StackInspector> {
108
163
  return `template (${this.matchStyle}): ${JSON.stringify(this.template, null, 2)}`;
109
164
  }
110
165
  }
166
+
167
+ function compareVariablesWithRegExp(var1: any, var2: any): boolean {
168
+ if (typeof var1 !== typeof var2) {
169
+ return false;
170
+ }
171
+
172
+ if (typeof var1 === 'string' && typeof var2 === 'string') {
173
+ if (var1 !== var2) {
174
+ const regex = new RegExp(var1);
175
+ return regex.test(var2);
176
+ } else {
177
+ return true;
178
+ }
179
+ }
180
+
181
+ if (typeof var1 !== 'object' && typeof var2 !== 'object') {
182
+ return var1 === var2;
183
+ }
184
+
185
+ if (typeof var1 === 'object' && typeof var2 === 'object') {
186
+ if (Array.isArray(var1) && Array.isArray(var2)) {
187
+ if (var1.length !== var2.length) {
188
+ return false;
189
+ }
190
+ for (let i = 0; i < var1.length; i++) {
191
+ if (!compareVariablesWithRegExp(var1[i], var2[i])) {
192
+ return false;
193
+ }
194
+ }
195
+ return true;
196
+ } else {
197
+ const keys1 = Object.keys(var1);
198
+ const keys2 = Object.keys(var2);
199
+ if (keys1.length !== keys2.length) {
200
+ return false;
201
+ }
202
+ for (const key of keys1) {
203
+ if (!compareVariablesWithRegExp(var1[key], var2[key])) {
204
+ return false;
205
+ }
206
+ }
207
+ return true;
208
+ }
209
+ }
210
+
211
+ return false;
212
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alicloud/ros-cdk-assert",
3
- "version": "1.0.26",
3
+ "version": "1.0.27",
4
4
  "description": "Aliyun SDK Copyright (C) Alibaba Cloud Computing All rights reserved. http://www.aliyun.com",
5
5
  "author": "ROS Development Team",
6
6
  "license": "Apache-2.0",
@@ -27,9 +27,9 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "colors": "^1.4.0",
30
- "@alicloud/ros-cdk-core": "^1.0.26",
31
- "@alicloud/ros-cdk-assembly-schema": "^1.0.26",
32
- "@alicloud/ros-cdk-cxapi": "^1.0.26",
33
- "@alicloud/ros-cdk-template-diff": "^1.0.26"
30
+ "@alicloud/ros-cdk-core": "^1.0.27",
31
+ "@alicloud/ros-cdk-assembly-schema": "^1.0.27",
32
+ "@alicloud/ros-cdk-cxapi": "^1.0.27",
33
+ "@alicloud/ros-cdk-template-diff": "^1.0.27"
34
34
  }
35
35
  }