jsii-diff 1.35.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 +111 -0
- package/bin/jsii-diff +2 -0
- package/bin/jsii-diff.d.ts +1 -0
- package/bin/jsii-diff.js +230 -0
- package/lib/diagnostics.d.ts +17 -0
- package/lib/diagnostics.js +52 -0
- package/lib/index.d.ts +11 -0
- package/lib/index.js +20 -0
- package/lib/stability.d.ts +3 -0
- package/lib/stability.js +52 -0
- package/lib/type-analysis.d.ts +39 -0
- package/lib/type-analysis.js +172 -0
- package/lib/type-comparison.d.ts +195 -0
- package/lib/type-comparison.js +508 -0
- package/lib/types.d.ts +46 -0
- package/lib/types.js +136 -0
- package/lib/util.d.ts +19 -0
- package/lib/util.js +117 -0
- package/lib/validations.d.ts +157 -0
- package/lib/validations.js +487 -0
- package/lib/version.d.ts +2 -0
- package/lib/version.js +7 -0
- package/package.json +57 -0
- package/test/classes.test.d.ts +1 -0
- package/test/classes.test.js +542 -0
- package/test/diagnostics.test.d.ts +1 -0
- package/test/diagnostics.test.js +110 -0
- package/test/enums.test.d.ts +1 -0
- package/test/enums.test.js +41 -0
- package/test/structs.test.d.ts +1 -0
- package/test/structs.test.js +242 -0
- package/test/type-unions.test.d.ts +1 -0
- package/test/type-unions.test.js +101 -0
- package/test/util.d.ts +4 -0
- package/test/util.js +38 -0
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateExistingMembers = exports.memberPairs = exports.validateNotMadeImmutable = exports.subclassableType = exports.validateMethodCompatible = exports.validateNoNewRequiredParams = exports.validateExistingParams = exports.validateParameterTypeSame = exports.validateParameterTypeWeakened = exports.validatePropertyTypeSame = exports.validatePropertyTypeNotWeakened = exports.validateReturnTypeSame = exports.validateReturnTypeNotWeakened = exports.validateNoNewAbstractMembers = exports.validateNotMadeNonVariadic = exports.validateAsyncSame = exports.validateStaticSame = exports.validateSubclassableNotRemoved = exports.validateNotMadeAbstract = exports.validateBaseTypeAssignability = void 0;
|
|
4
|
+
const reflect = require("jsii-reflect");
|
|
5
|
+
const log4js = require("log4js");
|
|
6
|
+
const stability_1 = require("./stability");
|
|
7
|
+
const type_analysis_1 = require("./type-analysis");
|
|
8
|
+
const LOG = log4js.getLogger('jsii-diff');
|
|
9
|
+
/**
|
|
10
|
+
* The updated type is still nominally assignable to all original base types
|
|
11
|
+
*
|
|
12
|
+
* Make sure the following remains compilable:
|
|
13
|
+
*
|
|
14
|
+
* ```
|
|
15
|
+
* BASE instance = new CLASS();
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Where CLASS ≤: BASE.
|
|
19
|
+
*/
|
|
20
|
+
function validateBaseTypeAssignability(original, updated, mismatches) {
|
|
21
|
+
const ana = assignableToAllBaseTypes(original, updated);
|
|
22
|
+
if (!ana.success) {
|
|
23
|
+
mismatches.report({
|
|
24
|
+
ruleKey: 'base-types',
|
|
25
|
+
message: `not assignable to all base types anymore: ${ana.reasons.join(', ')}`,
|
|
26
|
+
violator: original,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.validateBaseTypeAssignability = validateBaseTypeAssignability;
|
|
31
|
+
/**
|
|
32
|
+
* The updated type has not been newly made abstract
|
|
33
|
+
*
|
|
34
|
+
* Make sure the following remains compilable:
|
|
35
|
+
*
|
|
36
|
+
* ```
|
|
37
|
+
* new CLASS();
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
function validateNotMadeAbstract(original, updated, mismatches) {
|
|
41
|
+
if (updated.abstract && !original.abstract) {
|
|
42
|
+
mismatches.report({
|
|
43
|
+
ruleKey: 'made-abstract',
|
|
44
|
+
message: 'has gone from non-abstract to abstract',
|
|
45
|
+
violator: original,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.validateNotMadeAbstract = validateNotMadeAbstract;
|
|
50
|
+
/**
|
|
51
|
+
* The updated type has not had its @subclassable attribute removed
|
|
52
|
+
*
|
|
53
|
+
* This would lift a restriction we can't afford.
|
|
54
|
+
*/
|
|
55
|
+
function validateSubclassableNotRemoved(original, updated, mismatches) {
|
|
56
|
+
if (original.docs.subclassable && !updated.docs.subclassable) {
|
|
57
|
+
mismatches.report({
|
|
58
|
+
ruleKey: 'remove-subclassable',
|
|
59
|
+
message: 'has gone from @subclassable to non-@subclassable',
|
|
60
|
+
violator: original,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.validateSubclassableNotRemoved = validateSubclassableNotRemoved;
|
|
65
|
+
/**
|
|
66
|
+
* Check that the `static`-ness of a member hasn't changed
|
|
67
|
+
*/
|
|
68
|
+
function validateStaticSame(original, updated, mismatches) {
|
|
69
|
+
if (original.static !== updated.static) {
|
|
70
|
+
mismatches.report({
|
|
71
|
+
ruleKey: 'changed-static',
|
|
72
|
+
violator: original,
|
|
73
|
+
message: `used to be ${original.static ? 'static' : 'not static'}, is now ${updated.static ? 'static' : 'not static'}`,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.validateStaticSame = validateStaticSame;
|
|
78
|
+
/**
|
|
79
|
+
* Check that the `async`-ness of a method hasn't changed
|
|
80
|
+
*/
|
|
81
|
+
function validateAsyncSame(original, updated, mismatches) {
|
|
82
|
+
if (original.async !== updated.async) {
|
|
83
|
+
const origQual = original.async ? 'asynchronous' : 'synchronous';
|
|
84
|
+
const updQual = updated.async ? 'asynchronous' : 'synchronous';
|
|
85
|
+
mismatches.report({
|
|
86
|
+
ruleKey: 'changed-async',
|
|
87
|
+
violator: original,
|
|
88
|
+
message: `was ${origQual}, is now ${updQual}`,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.validateAsyncSame = validateAsyncSame;
|
|
93
|
+
/**
|
|
94
|
+
* Once variadic, can never be made non-variadic anymore (because I could always have been passing N+1 arguments)
|
|
95
|
+
*/
|
|
96
|
+
function validateNotMadeNonVariadic(original, updated, mismatches) {
|
|
97
|
+
if (original.variadic && !updated.variadic) {
|
|
98
|
+
mismatches.report({
|
|
99
|
+
ruleKey: 'changed-variadic',
|
|
100
|
+
violator: original,
|
|
101
|
+
message: 'used to be variadic, not variadic anymore.',
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.validateNotMadeNonVariadic = validateNotMadeNonVariadic;
|
|
106
|
+
/**
|
|
107
|
+
* Check that no new abstract members were added to a subclassable type
|
|
108
|
+
*
|
|
109
|
+
* You cannot have added abstract members to the class/interface, as they are
|
|
110
|
+
* an added burden on potential implementors.
|
|
111
|
+
*/
|
|
112
|
+
function validateNoNewAbstractMembers(original, updated, mismatches) {
|
|
113
|
+
const absMemberNames = new Set(updated.allMembers.filter((m) => m.abstract).map((m) => m.name));
|
|
114
|
+
const originalMemberNames = new Set(original.allMembers.map((m) => m.name));
|
|
115
|
+
for (const name of absMemberNames) {
|
|
116
|
+
if (!originalMemberNames.has(name)) {
|
|
117
|
+
mismatches.report({
|
|
118
|
+
ruleKey: 'new-abstract-member',
|
|
119
|
+
message: `adds requirement for subclasses to implement '${name}'.`,
|
|
120
|
+
violator: updated.getMembers(true)[name],
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
exports.validateNoNewAbstractMembers = validateNoNewAbstractMembers;
|
|
126
|
+
/**
|
|
127
|
+
* Validate that a method return type is the same or strengthened
|
|
128
|
+
*
|
|
129
|
+
* Make sure the following remains compilable:
|
|
130
|
+
*
|
|
131
|
+
* ```
|
|
132
|
+
* T value = object.method();
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* Where RETURN_TYPE(method) ≤: T.
|
|
136
|
+
*/
|
|
137
|
+
function validateReturnTypeNotWeakened(original, updated, mismatches) {
|
|
138
|
+
const retAna = isCompatibleReturnType(original.returns, updated.returns);
|
|
139
|
+
if (!retAna.success) {
|
|
140
|
+
mismatches.report({
|
|
141
|
+
ruleKey: 'change-return-type',
|
|
142
|
+
violator: original,
|
|
143
|
+
message: `returns ${describeOptionalValueMatchingFailure(original.returns, updated.returns, retAna)}`,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.validateReturnTypeNotWeakened = validateReturnTypeNotWeakened;
|
|
148
|
+
/**
|
|
149
|
+
* Validate that a method return type is the exact same
|
|
150
|
+
*
|
|
151
|
+
* Necessary for subclassable types in C#.
|
|
152
|
+
*/
|
|
153
|
+
function validateReturnTypeSame(original, updated, mismatches) {
|
|
154
|
+
const origDescr = reflect.OptionalValue.describe(original.returns);
|
|
155
|
+
const updaDescr = reflect.OptionalValue.describe(updated.returns);
|
|
156
|
+
if (origDescr !== updaDescr) {
|
|
157
|
+
mismatches.report({
|
|
158
|
+
ruleKey: 'change-return-type',
|
|
159
|
+
violator: original,
|
|
160
|
+
message: `returns ${updaDescr} (formerly ${origDescr})`,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
exports.validateReturnTypeSame = validateReturnTypeSame;
|
|
165
|
+
/**
|
|
166
|
+
* Validate that a property type is the same or strengthened
|
|
167
|
+
*
|
|
168
|
+
* Make sure the following remains compilable:
|
|
169
|
+
*
|
|
170
|
+
* ```
|
|
171
|
+
* T value = object.prop;
|
|
172
|
+
* ```
|
|
173
|
+
*
|
|
174
|
+
* Where RETURN_TYPE(prop) ≤: T.
|
|
175
|
+
*/
|
|
176
|
+
function validatePropertyTypeNotWeakened(original, updated, mismatches) {
|
|
177
|
+
const ana = isCompatibleReturnType(original, updated);
|
|
178
|
+
if (!ana.success) {
|
|
179
|
+
mismatches.report({
|
|
180
|
+
ruleKey: 'changed-type',
|
|
181
|
+
violator: original,
|
|
182
|
+
message: `type ${describeOptionalValueMatchingFailure(original, updated, ana)}`,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
exports.validatePropertyTypeNotWeakened = validatePropertyTypeNotWeakened;
|
|
187
|
+
/**
|
|
188
|
+
* Validate that a property type is the exact same
|
|
189
|
+
*
|
|
190
|
+
* Necessary for subclassable types in C#.
|
|
191
|
+
*/
|
|
192
|
+
function validatePropertyTypeSame(original, updated, mismatches) {
|
|
193
|
+
const oldDesc = reflect.OptionalValue.describe(original);
|
|
194
|
+
const newDesc = reflect.OptionalValue.describe(updated);
|
|
195
|
+
if (oldDesc !== newDesc) {
|
|
196
|
+
mismatches.report({
|
|
197
|
+
ruleKey: 'changed-type',
|
|
198
|
+
violator: original,
|
|
199
|
+
message: `changed to ${newDesc} (formerly ${oldDesc})`,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
exports.validatePropertyTypeSame = validatePropertyTypeSame;
|
|
204
|
+
/**
|
|
205
|
+
* Validate that a method return type is the same or weakened
|
|
206
|
+
*
|
|
207
|
+
* Make sure the following remains compilable if U is changed:
|
|
208
|
+
*
|
|
209
|
+
* ```
|
|
210
|
+
* function method(arg: U) { ... }
|
|
211
|
+
*
|
|
212
|
+
* object.method(<T>value);
|
|
213
|
+
* ```
|
|
214
|
+
*
|
|
215
|
+
* Where T ≤: U.
|
|
216
|
+
*/
|
|
217
|
+
function validateParameterTypeWeakened(method, original, updated, mismatches) {
|
|
218
|
+
const argAna = isCompatibleArgumentType(original.type, updated.type);
|
|
219
|
+
if (!argAna.success) {
|
|
220
|
+
mismatches.report({
|
|
221
|
+
ruleKey: 'incompatible-argument',
|
|
222
|
+
violator: method,
|
|
223
|
+
message: `argument ${original.name}, takes ${describeOptionalValueMatchingFailure(original, updated, argAna)}`,
|
|
224
|
+
});
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
exports.validateParameterTypeWeakened = validateParameterTypeWeakened;
|
|
229
|
+
/**
|
|
230
|
+
* Validate that a method parameter type is the exact same
|
|
231
|
+
*
|
|
232
|
+
* Necessary for subclassable types in C#.
|
|
233
|
+
*/
|
|
234
|
+
function validateParameterTypeSame(method, original, updated, mismatches) {
|
|
235
|
+
if (original.type.toString() !== updated.type.toString()) {
|
|
236
|
+
mismatches.report({
|
|
237
|
+
ruleKey: 'incompatible-argument',
|
|
238
|
+
violator: method,
|
|
239
|
+
message: `argument ${original.name}, takes ${updated.type.toString()} (formerly ${original.type.toString()}): type is @subclassable`,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
exports.validateParameterTypeSame = validateParameterTypeSame;
|
|
244
|
+
function describeOptionalValueMatchingFailure(origType, updatedType, analysis) {
|
|
245
|
+
const origDescr = reflect.OptionalValue.describe(origType);
|
|
246
|
+
const updaDescr = reflect.OptionalValue.describe(updatedType);
|
|
247
|
+
if (origDescr !== updaDescr) {
|
|
248
|
+
return `${updaDescr} (formerly ${origDescr}): ${analysis.reasons.join(', ')}`;
|
|
249
|
+
}
|
|
250
|
+
return `${updaDescr}: ${analysis.reasons.join(', ')}`;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Validate that each param in the old callable is still available in the new callable, and apply custom validation to the pairs
|
|
254
|
+
*
|
|
255
|
+
* Make sure the following remains compilable:
|
|
256
|
+
*
|
|
257
|
+
* ```
|
|
258
|
+
* object.method(a1, a2, ..., aN);
|
|
259
|
+
* ```
|
|
260
|
+
*
|
|
261
|
+
* (All types still assignable)
|
|
262
|
+
*/
|
|
263
|
+
function validateExistingParams(original, updated, mismatches, validateParam) {
|
|
264
|
+
original.parameters.forEach((param, i) => {
|
|
265
|
+
const updatedParam = findParam(updated.parameters, i);
|
|
266
|
+
if (updatedParam === undefined) {
|
|
267
|
+
mismatches.report({
|
|
268
|
+
ruleKey: 'removed-argument',
|
|
269
|
+
violator: original,
|
|
270
|
+
message: `argument ${param.name}, not accepted anymore.`,
|
|
271
|
+
});
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
validateParam(param, updatedParam);
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
exports.validateExistingParams = validateExistingParams;
|
|
278
|
+
/**
|
|
279
|
+
* Validate that no new required params got added to the end of the method
|
|
280
|
+
*
|
|
281
|
+
* Make sure the following remains compilable:
|
|
282
|
+
*
|
|
283
|
+
* ```
|
|
284
|
+
* object.method(a1, a2, ..., aN);
|
|
285
|
+
* ```
|
|
286
|
+
*
|
|
287
|
+
* (Not too few arguments)
|
|
288
|
+
*/
|
|
289
|
+
function validateNoNewRequiredParams(original, updated, mismatches) {
|
|
290
|
+
updated.parameters.forEach((param, i) => {
|
|
291
|
+
if (param.optional) {
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
const origParam = findParam(original.parameters, i);
|
|
295
|
+
if (!origParam || origParam.optional) {
|
|
296
|
+
mismatches.report({
|
|
297
|
+
ruleKey: 'new-argument',
|
|
298
|
+
violator: original,
|
|
299
|
+
message: `argument ${param.name}, newly required argument.`,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
exports.validateNoNewRequiredParams = validateNoNewRequiredParams;
|
|
305
|
+
function validateMethodCompatible(original, updated, mismatches) {
|
|
306
|
+
stability_1.validateStabilities(original, updated, mismatches);
|
|
307
|
+
// Type guards on original are duplicated on updated to help tsc... They are required to be the same type by the declaration.
|
|
308
|
+
if (reflect.isMethod(original) && reflect.isMethod(updated)) {
|
|
309
|
+
validateStaticSame(original, updated, mismatches);
|
|
310
|
+
validateAsyncSame(original, updated, mismatches);
|
|
311
|
+
validateReturnTypeNotWeakened(original, updated, mismatches);
|
|
312
|
+
}
|
|
313
|
+
validateNotMadeNonVariadic(original, updated, mismatches);
|
|
314
|
+
// Check that every original parameter can still be mapped to a parameter in the updated method
|
|
315
|
+
validateExistingParams(original, updated, mismatches, (oldParam, newParam) => {
|
|
316
|
+
validateParameterTypeWeakened(original, oldParam, newParam, mismatches);
|
|
317
|
+
});
|
|
318
|
+
validateNoNewRequiredParams(original, updated, mismatches);
|
|
319
|
+
}
|
|
320
|
+
exports.validateMethodCompatible = validateMethodCompatible;
|
|
321
|
+
/**
|
|
322
|
+
* Check if a class/interface has been marked as @subclassable
|
|
323
|
+
*/
|
|
324
|
+
function subclassableType(x) {
|
|
325
|
+
return x.docs.subclassable;
|
|
326
|
+
}
|
|
327
|
+
exports.subclassableType = subclassableType;
|
|
328
|
+
/**
|
|
329
|
+
* Find the indicated parameter with the given index
|
|
330
|
+
*
|
|
331
|
+
* May return the last parameter if it's variadic
|
|
332
|
+
*/
|
|
333
|
+
function findParam(parameters, i) {
|
|
334
|
+
if (i < parameters.length) {
|
|
335
|
+
return parameters[i];
|
|
336
|
+
}
|
|
337
|
+
const lastParam = parameters.length > 0 ? parameters[parameters.length - 1] : undefined;
|
|
338
|
+
if (lastParam && lastParam.variadic) {
|
|
339
|
+
return lastParam;
|
|
340
|
+
}
|
|
341
|
+
return undefined;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Validate that a previously mutable property is not made immutable
|
|
345
|
+
*
|
|
346
|
+
* Make sure the following remains compilable:
|
|
347
|
+
*
|
|
348
|
+
* ```
|
|
349
|
+
* object.prop = value;
|
|
350
|
+
* ```
|
|
351
|
+
*/
|
|
352
|
+
function validateNotMadeImmutable(original, updated, mismatches) {
|
|
353
|
+
if (updated.immutable && !original.immutable) {
|
|
354
|
+
mismatches.report({
|
|
355
|
+
ruleKey: 'removed-mutability',
|
|
356
|
+
violator: original,
|
|
357
|
+
message: 'used to be mutable, is now immutable',
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
exports.validateNotMadeImmutable = validateNotMadeImmutable;
|
|
362
|
+
function* memberPairs(origClass, xs, updatedClass, mismatches) {
|
|
363
|
+
for (const origMember of xs) {
|
|
364
|
+
LOG.trace(`${origClass.fqn}#${origMember.name}`);
|
|
365
|
+
const updatedMember = updatedClass.allMembers.find((m) => m.name === origMember.name);
|
|
366
|
+
if (!updatedMember) {
|
|
367
|
+
mismatches.report({
|
|
368
|
+
ruleKey: 'removed',
|
|
369
|
+
violator: origMember,
|
|
370
|
+
message: 'has been removed',
|
|
371
|
+
});
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
if (origMember.kind !== updatedMember.kind) {
|
|
375
|
+
mismatches.report({
|
|
376
|
+
ruleKey: 'changed-kind',
|
|
377
|
+
violator: origMember,
|
|
378
|
+
message: `changed from ${origMember.kind} to ${updatedMember.kind}`,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
if (!origMember.protected && updatedMember.protected) {
|
|
382
|
+
mismatches.report({
|
|
383
|
+
ruleKey: 'hidden',
|
|
384
|
+
violator: origMember,
|
|
385
|
+
message: "changed from 'public' to 'protected'",
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
yield [origMember, updatedMember];
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
exports.memberPairs = memberPairs;
|
|
392
|
+
/**
|
|
393
|
+
* Whether we are strengthening the postcondition (output type of a method or property)
|
|
394
|
+
*
|
|
395
|
+
* Strengthening output values is allowed!
|
|
396
|
+
*/
|
|
397
|
+
function isCompatibleReturnType(original, updated) {
|
|
398
|
+
if (original.type.void) {
|
|
399
|
+
return { success: true };
|
|
400
|
+
} // If we didn't use to return anything, returning something now is fine
|
|
401
|
+
if (updated.type.void) {
|
|
402
|
+
return { success: false, reasons: ["now returning 'void'"] };
|
|
403
|
+
} // If we used to return something, we can't stop doing that
|
|
404
|
+
if (!original.optional && updated.optional) {
|
|
405
|
+
return { success: false, reasons: ['output type is now optional'] };
|
|
406
|
+
}
|
|
407
|
+
return type_analysis_1.isSuperType(original.type, updated.type, updated.system);
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Whether we are weakening the pre (input type of a method)
|
|
411
|
+
*
|
|
412
|
+
* Weakening preconditions is allowed!
|
|
413
|
+
*/
|
|
414
|
+
function isCompatibleArgumentType(original, updated) {
|
|
415
|
+
// Input can never be void, so no need to check
|
|
416
|
+
return type_analysis_1.isSuperType(updated, original, updated.system);
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Verify assignability to supertypes
|
|
420
|
+
*
|
|
421
|
+
* For every base type B of type T, someone could have written:
|
|
422
|
+
*
|
|
423
|
+
* ```
|
|
424
|
+
* const variable: B = new T();
|
|
425
|
+
* ```
|
|
426
|
+
*
|
|
427
|
+
* This code needs to be valid in the updated assembly, so for each
|
|
428
|
+
* B an updated type B' needs to exist in the new assembly which is
|
|
429
|
+
* still a supertype of T'.
|
|
430
|
+
*/
|
|
431
|
+
function assignableToAllBaseTypes(original, updated) {
|
|
432
|
+
for (const B of baseTypes(original)) {
|
|
433
|
+
const result = type_analysis_1.isNominalSuperType(B.reference, updated.reference, updated.system);
|
|
434
|
+
if (!result.success) {
|
|
435
|
+
return result;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return { success: true };
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Return all base types of the given reference type
|
|
442
|
+
*/
|
|
443
|
+
function baseTypes(type) {
|
|
444
|
+
const ret = new Array();
|
|
445
|
+
const todo = [type];
|
|
446
|
+
const seen = new Set();
|
|
447
|
+
while (todo.length > 0) {
|
|
448
|
+
const next = todo.pop();
|
|
449
|
+
if (seen.has(next.fqn)) {
|
|
450
|
+
continue;
|
|
451
|
+
}
|
|
452
|
+
ret.push(next);
|
|
453
|
+
seen.add(next.fqn);
|
|
454
|
+
todo.push(...next.interfaces);
|
|
455
|
+
if (next.isClassType() && next.base) {
|
|
456
|
+
todo.push(next.base);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
return ret;
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Validate that each enum member in the old enum enum, and apply custom validation to the enums
|
|
463
|
+
*
|
|
464
|
+
* Make sure the following remains compilable:
|
|
465
|
+
*
|
|
466
|
+
* ```
|
|
467
|
+
* T x = ENUM.member;
|
|
468
|
+
* ```
|
|
469
|
+
*
|
|
470
|
+
* (For every member of enum)
|
|
471
|
+
*/
|
|
472
|
+
function validateExistingMembers(original, updated, mismatches, validateMember) {
|
|
473
|
+
for (const origMember of original.members) {
|
|
474
|
+
const updatedMember = updated.members.find((m) => m.name === origMember.name);
|
|
475
|
+
if (!updatedMember) {
|
|
476
|
+
mismatches.report({
|
|
477
|
+
ruleKey: 'removed',
|
|
478
|
+
violator: origMember,
|
|
479
|
+
message: `member ${origMember.name} has been removed`,
|
|
480
|
+
});
|
|
481
|
+
continue;
|
|
482
|
+
}
|
|
483
|
+
validateMember(origMember, updatedMember);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
exports.validateExistingMembers = validateExistingMembers;
|
|
487
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2YWxpZGF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx3Q0FBd0M7QUFDeEMsaUNBQWlDO0FBRWpDLDJDQUFrRDtBQUNsRCxtREFLeUI7QUFHekIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUUxQzs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsNkJBQTZCLENBQzNDLFFBQVcsRUFDWCxPQUFVLEVBQ1YsVUFBbUI7SUFFbkIsTUFBTSxHQUFHLEdBQUcsd0JBQXdCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFO1FBQ2hCLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDaEIsT0FBTyxFQUFFLFlBQVk7WUFDckIsT0FBTyxFQUFFLDZDQUE2QyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDcEUsSUFBSSxDQUNMLEVBQUU7WUFDSCxRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFDLENBQUM7S0FDSjtBQUNILENBQUM7QUFmRCxzRUFlQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQ3JDLFFBQTJCLEVBQzNCLE9BQTBCLEVBQzFCLFVBQW1CO0lBRW5CLElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUU7UUFDMUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUNoQixPQUFPLEVBQUUsZUFBZTtZQUN4QixPQUFPLEVBQUUsd0NBQXdDO1lBQ2pELFFBQVEsRUFBRSxRQUFRO1NBQ25CLENBQUMsQ0FBQztLQUNKO0FBQ0gsQ0FBQztBQVpELDBEQVlDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLDhCQUE4QixDQUM1QyxRQUFXLEVBQ1gsT0FBVSxFQUNWLFVBQW1CO0lBRW5CLElBQUksUUFBUSxDQUFD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QyxDQUFDO0tBQzNDO0FBQ0gsQ0FBQztBQXhCRCwwREF3QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5pbXBvcnQgKiBhcyBsb2c0anMgZnJvbSAnbG9nNGpzJztcblxuaW1wb3J0IHsgdmFsaWRhdGVTdGFiaWxpdGllcyB9IGZyb20gJy4vc3RhYmlsaXR5JztcbmltcG9ydCB7XG4gIEFuYWx5c2lzLFxuICBGYWlsZWRBbmFseXNpcyxcbiAgaXNTdXBlclR5cGUsXG4gIGlzTm9taW5hbFN1cGVyVHlwZSxcbn0gZnJvbSAnLi90eXBlLWFuYWx5c2lzJztcbmltcG9ydCB7IElSZXBvcnQgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgTE9HID0gbG9nNGpzLmdldExvZ2dlcignanNpaS1kaWZmJyk7XG5cbi8qKlxuICogVGhlIHVwZGF0ZWQgdHlwZSBpcyBzdGlsbCBub21pbmFsbHkgYXNzaWduYWJsZSB0byBhbGwgb3JpZ2luYWwgYmFzZSB0eXBlc1xuICpcbiAqIE1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIHJlbWFpbnMgY29tcGlsYWJsZTpcbiAqXG4gKiBgYGBcbiAqIEJBU0UgaW5zdGFuY2UgPSBuZXcgQ0xBU1MoKTtcbiAqIGBgYFxuICpcbiAqIFdoZXJlIENMQVNTIOKJpDogQkFTRS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQmFzZVR5cGVBc3NpZ25hYmlsaXR5PFQgZXh0ZW5kcyByZWZsZWN0LlJlZmVyZW5jZVR5cGU+KFxuICBvcmlnaW5hbDogVCxcbiAgdXBkYXRlZDogVCxcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbikge1xuICBjb25zdCBhbmEgPSBhc3NpZ25hYmxlVG9BbGxCYXNlVHlwZXMob3JpZ2luYWwsIHVwZGF0ZWQpO1xuICBpZiAoIWFuYS5zdWNjZXNzKSB7XG4gICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgcnVsZUtleTogJ2Jhc2UtdHlwZXMnLFxuICAgICAgbWVzc2FnZTogYG5vdCBhc3NpZ25hYmxlIHRvIGFsbCBiYXNlIHR5cGVzIGFueW1vcmU6ICR7YW5hLnJlYXNvbnMuam9pbihcbiAgICAgICAgJywgJyxcbiAgICAgICl9YCxcbiAgICAgIHZpb2xhdG9yOiBvcmlnaW5hbCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB1cGRhdGVkIHR5cGUgaGFzIG5vdCBiZWVuIG5ld2x5IG1hZGUgYWJzdHJhY3RcbiAqXG4gKiBNYWtlIHN1cmUgdGhlIGZvbGxvd2luZyByZW1haW5zIGNvbXBpbGFibGU6XG4gKlxuICogYGBgXG4gKiBuZXcgQ0xBU1MoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVOb3RNYWRlQWJzdHJhY3QoXG4gIG9yaWdpbmFsOiByZWZsZWN0LkNsYXNzVHlwZSxcbiAgdXBkYXRlZDogcmVmbGVjdC5DbGFzc1R5cGUsXG4gIG1pc21hdGNoZXM6IElSZXBvcnQsXG4pIHtcbiAgaWYgKHVwZGF0ZWQuYWJzdHJhY3QgJiYgIW9yaWdpbmFsLmFic3RyYWN0KSB7XG4gICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgcnVsZUtleTogJ21hZGUtYWJzdHJhY3QnLFxuICAgICAgbWVzc2FnZTogJ2hhcyBnb25lIGZyb20gbm9uLWFic3RyYWN0IHRvIGFic3RyYWN0JyxcbiAgICAgIHZpb2xhdG9yOiBvcmlnaW5hbCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB1cGRhdGVkIHR5cGUgaGFzIG5vdCBoYWQgaXRzIEBzdWJjbGFzc2FibGUgYXR0cmlidXRlIHJlbW92ZWRcbiAqXG4gKiBUaGlzIHdvdWxkIGxpZnQgYSByZXN0cmljdGlvbiB3ZSBjYW4ndCBhZmZvcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVN1YmNsYXNzYWJsZU5vdFJlbW92ZWQ8VCBleHRlbmRzIHJlZmxlY3QuUmVmZXJlbmNlVHlwZT4oXG4gIG9yaWdpbmFsOiBULFxuICB1cGRhdGVkOiBULFxuICBtaXNtYXRjaGVzOiBJUmVwb3J0LFxuKSB7XG4gIGlmIChvcmlnaW5hbC5kb2NzLnN1YmNsYXNzYWJsZSAmJiAhdXBkYXRlZC5kb2NzLnN1YmNsYXNzYWJsZSkge1xuICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgIHJ1bGVLZXk6ICdyZW1vdmUtc3ViY2xhc3NhYmxlJyxcbiAgICAgIG1lc3NhZ2U6ICdoYXMgZ29uZSBmcm9tIEBzdWJjbGFzc2FibGUgdG8gbm9uLUBzdWJjbGFzc2FibGUnLFxuICAgICAgdmlvbGF0b3I6IG9yaWdpbmFsLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCB0aGUgYHN0YXRpY2AtbmVzcyBvZiBhIG1lbWJlciBoYXNuJ3QgY2hhbmdlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTdGF0aWNTYW1lPFQgZXh0ZW5kcyByZWZsZWN0Lk1ldGhvZCB8IHJlZmxlY3QuUHJvcGVydHk+KFxuICBvcmlnaW5hbDogVCxcbiAgdXBkYXRlZDogVCxcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbikge1xuICBpZiAob3JpZ2luYWwuc3RhdGljICE9PSB1cGRhdGVkLnN0YXRpYykge1xuICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgIHJ1bGVLZXk6ICdjaGFuZ2VkLXN0YXRpYycsXG4gICAgICB2aW9sYXRvcjogb3JpZ2luYWwsXG4gICAgICBtZXNzYWdlOiBgdXNlZCB0byBiZSAke1xuICAgICAgICBvcmlnaW5hbC5zdGF0aWMgPyAnc3RhdGljJyA6ICdub3Qgc3RhdGljJ1xuICAgICAgfSwgaXMgbm93ICR7dXBkYXRlZC5zdGF0aWMgPyAnc3RhdGljJyA6ICdub3Qgc3RhdGljJ31gLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCB0aGUgYGFzeW5jYC1uZXNzIG9mIGEgbWV0aG9kIGhhc24ndCBjaGFuZ2VkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUFzeW5jU2FtZShcbiAgb3JpZ2luYWw6IHJlZmxlY3QuTWV0aG9kLFxuICB1cGRhdGVkOiByZWZsZWN0Lk1ldGhvZCxcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbikge1xuICBpZiAob3JpZ2luYWwuYXN5bmMgIT09IHVwZGF0ZWQuYXN5bmMpIHtcbiAgICBjb25zdCBvcmlnUXVhbCA9IG9yaWdpbmFsLmFzeW5jID8gJ2FzeW5jaHJvbm91cycgOiAnc3luY2hyb25vdXMnO1xuICAgIGNvbnN0IHVwZFF1YWwgPSB1cGRhdGVkLmFzeW5jID8gJ2FzeW5jaHJvbm91cycgOiAnc3luY2hyb25vdXMnO1xuICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgIHJ1bGVLZXk6ICdjaGFuZ2VkLWFzeW5jJyxcbiAgICAgIHZpb2xhdG9yOiBvcmlnaW5hbCxcbiAgICAgIG1lc3NhZ2U6IGB3YXMgJHtvcmlnUXVhbH0sIGlzIG5vdyAke3VwZFF1YWx9YCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIE9uY2UgdmFyaWFkaWMsIGNhbiBuZXZlciBiZSBtYWRlIG5vbi12YXJpYWRpYyBhbnltb3JlIChiZWNhdXNlIEkgY291bGQgYWx3YXlzIGhhdmUgYmVlbiBwYXNzaW5nIE4rMSBhcmd1bWVudHMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU5vdE1hZGVOb25WYXJpYWRpYzxcbiAgVCBleHRlbmRzIHJlZmxlY3QuTWV0aG9kIHwgcmVmbGVjdC5Jbml0aWFsaXplcixcbj4ob3JpZ2luYWw6IFQsIHVwZGF0ZWQ6IFQsIG1pc21hdGNoZXM6IElSZXBvcnQpIHtcbiAgaWYgKG9yaWdpbmFsLnZhcmlhZGljICYmICF1cGRhdGVkLnZhcmlhZGljKSB7XG4gICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgcnVsZUtleTogJ2NoYW5nZWQtdmFyaWFkaWMnLFxuICAgICAgdmlvbGF0b3I6IG9yaWdpbmFsLFxuICAgICAgbWVzc2FnZTogJ3VzZWQgdG8gYmUgdmFyaWFkaWMsIG5vdCB2YXJpYWRpYyBhbnltb3JlLicsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayB0aGF0IG5vIG5ldyBhYnN0cmFjdCBtZW1iZXJzIHdlcmUgYWRkZWQgdG8gYSBzdWJjbGFzc2FibGUgdHlwZVxuICpcbiAqIFlvdSBjYW5ub3QgaGF2ZSBhZGRlZCBhYnN0cmFjdCBtZW1iZXJzIHRvIHRoZSBjbGFzcy9pbnRlcmZhY2UsIGFzIHRoZXkgYXJlXG4gKiBhbiBhZGRlZCBidXJkZW4gb24gcG90ZW50aWFsIGltcGxlbWVudG9ycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTm9OZXdBYnN0cmFjdE1lbWJlcnM8VCBleHRlbmRzIHJlZmxlY3QuUmVmZXJlbmNlVHlwZT4oXG4gIG9yaWdpbmFsOiBULFxuICB1cGRhdGVkOiBULFxuICBtaXNtYXRjaGVzOiBJUmVwb3J0LFxuKSB7XG4gIGNvbnN0IGFic01lbWJlck5hbWVzID0gbmV3IFNldChcbiAgICB1cGRhdGVkLmFsbE1lbWJlcnMuZmlsdGVyKChtKSA9PiBtLmFic3RyYWN0KS5tYXAoKG0pID0+IG0ubmFtZSksXG4gICk7XG4gIGNvbnN0IG9yaWdpbmFsTWVtYmVyTmFtZXMgPSBuZXcgU2V0KG9yaWdpbmFsLmFsbE1lbWJlcnMubWFwKChtKSA9PiBtLm5hbWUpKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGFic01lbWJlck5hbWVzKSB7XG4gICAgaWYgKCFvcmlnaW5hbE1lbWJlck5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgICBydWxlS2V5OiAnbmV3LWFic3RyYWN0LW1lbWJlcicsXG4gICAgICAgIG1lc3NhZ2U6IGBhZGRzIHJlcXVpcmVtZW50IGZvciBzdWJjbGFzc2VzIHRvIGltcGxlbWVudCAnJHtuYW1lfScuYCxcbiAgICAgICAgdmlvbGF0b3I6IHVwZGF0ZWQuZ2V0TWVtYmVycyh0cnVlKVtuYW1lXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBtZXRob2QgcmV0dXJuIHR5cGUgaXMgdGhlIHNhbWUgb3Igc3RyZW5ndGhlbmVkXG4gKlxuICogTWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgcmVtYWlucyBjb21waWxhYmxlOlxuICpcbiAqIGBgYFxuICogVCB2YWx1ZSA9IG9iamVjdC5tZXRob2QoKTtcbiAqIGBgYFxuICpcbiAqIFdoZXJlIFJFVFVSTl9UWVBFKG1ldGhvZCkg4omkOiBULlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSZXR1cm5UeXBlTm90V2Vha2VuZWQoXG4gIG9yaWdpbmFsOiByZWZsZWN0Lk1ldGhvZCxcbiAgdXBkYXRlZDogcmVmbGVjdC5NZXRob2QsXG4gIG1pc21hdGNoZXM6IElSZXBvcnQsXG4pIHtcbiAgY29uc3QgcmV0QW5hID0gaXNDb21wYXRpYmxlUmV0dXJuVHlwZShvcmlnaW5hbC5yZXR1cm5zLCB1cGRhdGVkLnJldHVybnMpO1xuICBpZiAoIXJldEFuYS5zdWNjZXNzKSB7XG4gICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgcnVsZUtleTogJ2NoYW5nZS1yZXR1cm4tdHlwZScsXG4gICAgICB2aW9sYXRvcjogb3JpZ2luYWwsXG4gICAgICBtZXNzYWdlOiBgcmV0dXJucyAke2Rlc2NyaWJlT3B0aW9uYWxWYWx1ZU1hdGNoaW5nRmFpbHVyZShcbiAgICAgICAgb3JpZ2luYWwucmV0dXJucyxcbiAgICAgICAgdXBkYXRlZC5yZXR1cm5zLFxuICAgICAgICByZXRBbmEsXG4gICAgICApfWAsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgbWV0aG9kIHJldHVybiB0eXBlIGlzIHRoZSBleGFjdCBzYW1lXG4gKlxuICogTmVjZXNzYXJ5IGZvciBzdWJjbGFzc2FibGUgdHlwZXMgaW4gQyMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJldHVyblR5cGVTYW1lKFxuICBvcmlnaW5hbDogcmVmbGVjdC5NZXRob2QsXG4gIHVwZGF0ZWQ6IHJlZmxlY3QuTWV0aG9kLFxuICBtaXNtYXRjaGVzOiBJUmVwb3J0LFxuKSB7XG4gIGNvbnN0IG9yaWdEZXNjciA9IHJlZmxlY3QuT3B0aW9uYWxWYWx1ZS5kZXNjcmliZShvcmlnaW5hbC5yZXR1cm5zKTtcbiAgY29uc3QgdXBkYURlc2NyID0gcmVmbGVjdC5PcHRpb25hbFZhbHVlLmRlc2NyaWJlKHVwZGF0ZWQucmV0dXJucyk7XG4gIGlmIChvcmlnRGVzY3IgIT09IHVwZGFEZXNjcikge1xuICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgIHJ1bGVLZXk6ICdjaGFuZ2UtcmV0dXJuLXR5cGUnLFxuICAgICAgdmlvbGF0b3I6IG9yaWdpbmFsLFxuICAgICAgbWVzc2FnZTogYHJldHVybnMgJHt1cGRhRGVzY3J9IChmb3JtZXJseSAke29yaWdEZXNjcn0pYCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBwcm9wZXJ0eSB0eXBlIGlzIHRoZSBzYW1lIG9yIHN0cmVuZ3RoZW5lZFxuICpcbiAqIE1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIHJlbWFpbnMgY29tcGlsYWJsZTpcbiAqXG4gKiBgYGBcbiAqIFQgdmFsdWUgPSBvYmplY3QucHJvcDtcbiAqIGBgYFxuICpcbiAqIFdoZXJlIFJFVFVSTl9UWVBFKHByb3ApIOKJpDogVC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlUeXBlTm90V2Vha2VuZWQoXG4gIG9yaWdpbmFsOiByZWZsZWN0LlByb3BlcnR5LFxuICB1cGRhdGVkOiByZWZsZWN0LlByb3BlcnR5LFxuICBtaXNtYXRjaGVzOiBJUmVwb3J0LFxuKSB7XG4gIGNvbnN0IGFuYSA9IGlzQ29tcGF0aWJsZVJldHVyblR5cGUob3JpZ2luYWwsIHVwZGF0ZWQpO1xuICBpZiAoIWFuYS5zdWNjZXNzKSB7XG4gICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgcnVsZUtleTogJ2NoYW5nZWQtdHlwZScsXG4gICAgICB2aW9sYXRvcjogb3JpZ2luYWwsXG4gICAgICBtZXNzYWdlOiBgdHlwZSAke2Rlc2NyaWJlT3B0aW9uYWxWYWx1ZU1hdGNoaW5nRmFpbHVyZShcbiAgICAgICAgb3JpZ2luYWwsXG4gICAgICAgIHVwZGF0ZWQsXG4gICAgICAgIGFuYSxcbiAgICAgICl9YCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBwcm9wZXJ0eSB0eXBlIGlzIHRoZSBleGFjdCBzYW1lXG4gKlxuICogTmVjZXNzYXJ5IGZvciBzdWJjbGFzc2FibGUgdHlwZXMgaW4gQyMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5VHlwZVNhbWUoXG4gIG9yaWdpbmFsOiByZWZsZWN0LlByb3BlcnR5LFxuICB1cGRhdGVkOiByZWZsZWN0LlByb3BlcnR5LFxuICBtaXNtYXRjaGVzOiBJUmVwb3J0LFxuKSB7XG4gIGNvbnN0IG9sZERlc2MgPSByZWZsZWN0Lk9wdGlvbmFsVmFsdWUuZGVzY3JpYmUob3JpZ2luYWwpO1xuICBjb25zdCBuZXdEZXNjID0gcmVmbGVjdC5PcHRpb25hbFZhbHVlLmRlc2NyaWJlKHVwZGF0ZWQpO1xuICBpZiAob2xkRGVzYyAhPT0gbmV3RGVzYykge1xuICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgIHJ1bGVLZXk6ICdjaGFuZ2VkLXR5cGUnLFxuICAgICAgdmlvbGF0b3I6IG9yaWdpbmFsLFxuICAgICAgbWVzc2FnZTogYGNoYW5nZWQgdG8gJHtuZXdEZXNjfSAoZm9ybWVybHkgJHtvbGREZXNjfSlgLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCBhIG1ldGhvZCByZXR1cm4gdHlwZSBpcyB0aGUgc2FtZSBvciB3ZWFrZW5lZFxuICpcbiAqIE1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIHJlbWFpbnMgY29tcGlsYWJsZSBpZiBVIGlzIGNoYW5nZWQ6XG4gKlxuICogYGBgXG4gKiBmdW5jdGlvbiBtZXRob2QoYXJnOiBVKSB7IC4uLiB9XG4gKlxuICogb2JqZWN0Lm1ldGhvZCg8VD52YWx1ZSk7XG4gKiBgYGBcbiAqXG4gKiBXaGVyZSBUIOKJpDogVS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUGFyYW1ldGVyVHlwZVdlYWtlbmVkKFxuICBtZXRob2Q6IHJlZmxlY3QuTWV0aG9kIHwgcmVmbGVjdC5Jbml0aWFsaXplcixcbiAgb3JpZ2luYWw6IHJlZmxlY3QuUGFyYW1ldGVyLFxuICB1cGRhdGVkOiByZWZsZWN0LlBhcmFtZXRlcixcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbikge1xuICBjb25zdCBhcmdBbmEgPSBpc0NvbXBhdGlibGVBcmd1bWVudFR5cGUob3JpZ2luYWwudHlwZSwgdXBkYXRlZC50eXBlKTtcbiAgaWYgKCFhcmdBbmEuc3VjY2Vzcykge1xuICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgIHJ1bGVLZXk6ICdpbmNvbXBhdGlibGUtYXJndW1lbnQnLFxuICAgICAgdmlvbGF0b3I6IG1ldGhvZCxcbiAgICAgIG1lc3NhZ2U6IGBhcmd1bWVudCAke1xuICAgICAgICBvcmlnaW5hbC5uYW1lXG4gICAgICB9LCB0YWtlcyAke2Rlc2NyaWJlT3B0aW9uYWxWYWx1ZU1hdGNoaW5nRmFpbHVyZShcbiAgICAgICAgb3JpZ2luYWwsXG4gICAgICAgIHVwZGF0ZWQsXG4gICAgICAgIGFyZ0FuYSxcbiAgICAgICl9YCxcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgbWV0aG9kIHBhcmFtZXRlciB0eXBlIGlzIHRoZSBleGFjdCBzYW1lXG4gKlxuICogTmVjZXNzYXJ5IGZvciBzdWJjbGFzc2FibGUgdHlwZXMgaW4gQyMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVBhcmFtZXRlclR5cGVTYW1lKFxuICBtZXRob2Q6IHJlZmxlY3QuTWV0aG9kIHwgcmVmbGVjdC5Jbml0aWFsaXplcixcbiAgb3JpZ2luYWw6IHJlZmxlY3QuUGFyYW1ldGVyLFxuICB1cGRhdGVkOiByZWZsZWN0LlBhcmFtZXRlcixcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbikge1xuICBpZiAob3JpZ2luYWwudHlwZS50b1N0cmluZygpICE9PSB1cGRhdGVkLnR5cGUudG9TdHJpbmcoKSkge1xuICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgIHJ1bGVLZXk6ICdpbmNvbXBhdGlibGUtYXJndW1lbnQnLFxuICAgICAgdmlvbGF0b3I6IG1ldGhvZCxcbiAgICAgIG1lc3NhZ2U6IGBhcmd1bWVudCAke1xuICAgICAgICBvcmlnaW5hbC5uYW1lXG4gICAgICB9LCB0YWtlcyAke3VwZGF0ZWQudHlwZS50b1N0cmluZygpfSAoZm9ybWVybHkgJHtvcmlnaW5hbC50eXBlLnRvU3RyaW5nKCl9KTogdHlwZSBpcyBAc3ViY2xhc3NhYmxlYCxcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXNjcmliZU9wdGlvbmFsVmFsdWVNYXRjaGluZ0ZhaWx1cmUoXG4gIG9yaWdUeXBlOiByZWZsZWN0Lk9wdGlvbmFsVmFsdWUsXG4gIHVwZGF0ZWRUeXBlOiByZWZsZWN0Lk9wdGlvbmFsVmFsdWUsXG4gIGFuYWx5c2lzOiBGYWlsZWRBbmFseXNpcyxcbikge1xuICBjb25zdCBvcmlnRGVzY3IgPSByZWZsZWN0Lk9wdGlvbmFsVmFsdWUuZGVzY3JpYmUob3JpZ1R5cGUpO1xuICBjb25zdCB1cGRhRGVzY3IgPSByZWZsZWN0Lk9wdGlvbmFsVmFsdWUuZGVzY3JpYmUodXBkYXRlZFR5cGUpO1xuICBpZiAob3JpZ0Rlc2NyICE9PSB1cGRhRGVzY3IpIHtcbiAgICByZXR1cm4gYCR7dXBkYURlc2NyfSAoZm9ybWVybHkgJHtvcmlnRGVzY3J9KTogJHthbmFseXNpcy5yZWFzb25zLmpvaW4oXG4gICAgICAnLCAnLFxuICAgICl9YDtcbiAgfVxuICByZXR1cm4gYCR7dXBkYURlc2NyfTogJHthbmFseXNpcy5yZWFzb25zLmpvaW4oJywgJyl9YDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGVhY2ggcGFyYW0gaW4gdGhlIG9sZCBjYWxsYWJsZSBpcyBzdGlsbCBhdmFpbGFibGUgaW4gdGhlIG5ldyBjYWxsYWJsZSwgYW5kIGFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIHRvIHRoZSBwYWlyc1xuICpcbiAqIE1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIHJlbWFpbnMgY29tcGlsYWJsZTpcbiAqXG4gKiBgYGBcbiAqIG9iamVjdC5tZXRob2QoYTEsIGEyLCAuLi4sIGFOKTtcbiAqIGBgYFxuICpcbiAqIChBbGwgdHlwZXMgc3RpbGwgYXNzaWduYWJsZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRXhpc3RpbmdQYXJhbXM8XG4gIFQgZXh0ZW5kcyByZWZsZWN0LkluaXRpYWxpemVyIHwgcmVmbGVjdC5NZXRob2QsXG4+KFxuICBvcmlnaW5hbDogVCxcbiAgdXBkYXRlZDogVCxcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbiAgdmFsaWRhdGVQYXJhbTogKFxuICAgIG9sZFBhcmFtOiByZWZsZWN0LlBhcmFtZXRlcixcbiAgICBuZXdQYXJhbTogcmVmbGVjdC5QYXJhbWV0ZXIsXG4gICkgPT4gdm9pZCxcbikge1xuICBvcmlnaW5hbC5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtLCBpKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlZFBhcmFtID0gZmluZFBhcmFtKHVwZGF0ZWQucGFyYW1ldGVycywgaSk7XG4gICAgaWYgKHVwZGF0ZWRQYXJhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtaXNtYXRjaGVzLnJlcG9ydCh7XG4gICAgICAgIHJ1bGVLZXk6ICdyZW1vdmVkLWFyZ3VtZW50JyxcbiAgICAgICAgdmlvbGF0b3I6IG9yaWdpbmFsLFxuICAgICAgICBtZXNzYWdlOiBgYXJndW1lbnQgJHtwYXJhbS5uYW1lfSwgbm90IGFjY2VwdGVkIGFueW1vcmUuYCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhbGlkYXRlUGFyYW0ocGFyYW0sIHVwZGF0ZWRQYXJhbSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgbm8gbmV3IHJlcXVpcmVkIHBhcmFtcyBnb3QgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgbWV0aG9kXG4gKlxuICogTWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgcmVtYWlucyBjb21waWxhYmxlOlxuICpcbiAqIGBgYFxuICogb2JqZWN0Lm1ldGhvZChhMSwgYTIsIC4uLiwgYU4pO1xuICogYGBgXG4gKlxuICogKE5vdCB0b28gZmV3IGFyZ3VtZW50cylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTm9OZXdSZXF1aXJlZFBhcmFtczxcbiAgVCBleHRlbmRzIHJlZmxlY3QuSW5pdGlhbGl6ZXIgfCByZWZsZWN0Lk1ldGhvZCxcbj4ob3JpZ2luYWw6IFQsIHVwZGF0ZWQ6IFQsIG1pc21hdGNoZXM6IElSZXBvcnQpIHtcbiAgdXBkYXRlZC5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtLCBpKSA9PiB7XG4gICAgaWYgKHBhcmFtLm9wdGlvbmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ1BhcmFtID0gZmluZFBhcmFtKG9yaWdpbmFsLnBhcmFtZXRlcnMsIGkpO1xuICAgIGlmICghb3JpZ1BhcmFtIHx8IG9yaWdQYXJhbS5vcHRpb25hbCkge1xuICAgICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgICBydWxlS2V5OiAnbmV3LWFyZ3VtZW50JyxcbiAgICAgICAgdmlvbGF0b3I6IG9yaWdpbmFsLFxuICAgICAgICBtZXNzYWdlOiBgYXJndW1lbnQgJHtwYXJhbS5uYW1lfSwgbmV3bHkgcmVxdWlyZWQgYXJndW1lbnQuYCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1ldGhvZENvbXBhdGlibGU8XG4gIFQgZXh0ZW5kcyByZWZsZWN0Lk1ldGhvZCB8IHJlZmxlY3QuSW5pdGlhbGl6ZXIsXG4+KG9yaWdpbmFsOiBULCB1cGRhdGVkOiBULCBtaXNtYXRjaGVzOiBJUmVwb3J0KSB7XG4gIHZhbGlkYXRlU3RhYmlsaXRpZXMob3JpZ2luYWwsIHVwZGF0ZWQsIG1pc21hdGNoZXMpO1xuXG4gIC8vIFR5cGUgZ3VhcmRzIG9uIG9yaWdpbmFsIGFyZSBkdXBsaWNhdGVkIG9uIHVwZGF0ZWQgdG8gaGVscCB0c2MuLi4gVGhleSBhcmUgcmVxdWlyZWQgdG8gYmUgdGhlIHNhbWUgdHlwZSBieSB0aGUgZGVjbGFyYXRpb24uXG4gIGlmIChyZWZsZWN0LmlzTWV0aG9kKG9yaWdpbmFsKSAmJiByZWZsZWN0LmlzTWV0aG9kKHVwZGF0ZWQpKSB7XG4gICAgdmFsaWRhdGVTdGF0aWNTYW1lKG9yaWdpbmFsLCB1cGRhdGVkLCBtaXNtYXRjaGVzKTtcbiAgICB2YWxpZGF0ZUFzeW5jU2FtZShvcmlnaW5hbCwgdXBkYXRlZCwgbWlzbWF0Y2hlcyk7XG4gICAgdmFsaWRhdGVSZXR1cm5UeXBlTm90V2Vha2VuZWQob3JpZ2luYWwsIHVwZGF0ZWQsIG1pc21hdGNoZXMpO1xuICB9XG5cbiAgdmFsaWRhdGVOb3RNYWRlTm9uVmFyaWFkaWMob3JpZ2luYWwsIHVwZGF0ZWQsIG1pc21hdGNoZXMpO1xuXG4gIC8vIENoZWNrIHRoYXQgZXZlcnkgb3JpZ2luYWwgcGFyYW1ldGVyIGNhbiBzdGlsbCBiZSBtYXBwZWQgdG8gYSBwYXJhbWV0ZXIgaW4gdGhlIHVwZGF0ZWQgbWV0aG9kXG4gIHZhbGlkYXRlRXhpc3RpbmdQYXJhbXMoXG4gICAgb3JpZ2luYWwsXG4gICAgdXBkYXRlZCxcbiAgICBtaXNtYXRjaGVzLFxuICAgIChvbGRQYXJhbSwgbmV3UGFyYW0pID0+IHtcbiAgICAgIHZhbGlkYXRlUGFyYW1ldGVyVHlwZVdlYWtlbmVkKG9yaWdpbmFsLCBvbGRQYXJhbSwgbmV3UGFyYW0sIG1pc21hdGNoZXMpO1xuICAgIH0sXG4gICk7XG5cbiAgdmFsaWRhdGVOb05ld1JlcXVpcmVkUGFyYW1zKG9yaWdpbmFsLCB1cGRhdGVkLCBtaXNtYXRjaGVzKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGNsYXNzL2ludGVyZmFjZSBoYXMgYmVlbiBtYXJrZWQgYXMgQHN1YmNsYXNzYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3ViY2xhc3NhYmxlVHlwZSh4OiByZWZsZWN0LkRvY3VtZW50YWJsZSkge1xuICByZXR1cm4geC5kb2NzLnN1YmNsYXNzYWJsZTtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBpbmRpY2F0ZWQgcGFyYW1ldGVyIHdpdGggdGhlIGdpdmVuIGluZGV4XG4gKlxuICogTWF5IHJldHVybiB0aGUgbGFzdCBwYXJhbWV0ZXIgaWYgaXQncyB2YXJpYWRpY1xuICovXG5mdW5jdGlvbiBmaW5kUGFyYW0oXG4gIHBhcmFtZXRlcnM6IHJlZmxlY3QuUGFyYW1ldGVyW10sXG4gIGk6IG51bWJlcixcbik6IHJlZmxlY3QuUGFyYW1ldGVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGkgPCBwYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgIHJldHVybiBwYXJhbWV0ZXJzW2ldO1xuICB9XG4gIGNvbnN0IGxhc3RQYXJhbSA9XG4gICAgcGFyYW1ldGVycy5sZW5ndGggPiAwID8gcGFyYW1ldGVyc1twYXJhbWV0ZXJzLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICBpZiAobGFzdFBhcmFtICYmIGxhc3RQYXJhbS52YXJpYWRpYykge1xuICAgIHJldHVybiBsYXN0UGFyYW07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgcHJldmlvdXNseSBtdXRhYmxlIHByb3BlcnR5IGlzIG5vdCBtYWRlIGltbXV0YWJsZVxuICpcbiAqIE1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIHJlbWFpbnMgY29tcGlsYWJsZTpcbiAqXG4gKiBgYGBcbiAqIG9iamVjdC5wcm9wID0gdmFsdWU7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTm90TWFkZUltbXV0YWJsZShcbiAgb3JpZ2luYWw6IHJlZmxlY3QuUHJvcGVydHksXG4gIHVwZGF0ZWQ6IHJlZmxlY3QuUHJvcGVydHksXG4gIG1pc21hdGNoZXM6IElSZXBvcnQsXG4pIHtcbiAgaWYgKHVwZGF0ZWQuaW1tdXRhYmxlICYmICFvcmlnaW5hbC5pbW11dGFibGUpIHtcbiAgICBtaXNtYXRjaGVzLnJlcG9ydCh7XG4gICAgICBydWxlS2V5OiAncmVtb3ZlZC1tdXRhYmlsaXR5JyxcbiAgICAgIHZpb2xhdG9yOiBvcmlnaW5hbCxcbiAgICAgIG1lc3NhZ2U6ICd1c2VkIHRvIGJlIG11dGFibGUsIGlzIG5vdyBpbW11dGFibGUnLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogbWVtYmVyUGFpcnM8XG4gIFQgZXh0ZW5kcyByZWZsZWN0LlR5cGVNZW1iZXIsXG4gIFUgZXh0ZW5kcyByZWZsZWN0LlJlZmVyZW5jZVR5cGUsXG4+KFxuICBvcmlnQ2xhc3M6IFUsXG4gIHhzOiBUW10sXG4gIHVwZGF0ZWRDbGFzczogVSxcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbik6IEl0ZXJhYmxlSXRlcmF0b3I8W1QsIHJlZmxlY3QuVHlwZU1lbWJlcl0+IHtcbiAgZm9yIChjb25zdCBvcmlnTWVtYmVyIG9mIHhzKSB7XG4gICAgTE9HLnRyYWNlKGAke29yaWdDbGFzcy5mcW59IyR7b3JpZ01lbWJlci5uYW1lfWApO1xuXG4gICAgY29uc3QgdXBkYXRlZE1lbWJlciA9IHVwZGF0ZWRDbGFzcy5hbGxNZW1iZXJzLmZpbmQoXG4gICAgICAobSkgPT4gbS5uYW1lID09PSBvcmlnTWVtYmVyLm5hbWUsXG4gICAgKTtcbiAgICBpZiAoIXVwZGF0ZWRNZW1iZXIpIHtcbiAgICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgICAgcnVsZUtleTogJ3JlbW92ZWQnLFxuICAgICAgICB2aW9sYXRvcjogb3JpZ01lbWJlcixcbiAgICAgICAgbWVzc2FnZTogJ2hhcyBiZWVuIHJlbW92ZWQnLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAob3JpZ01lbWJlci5raW5kICE9PSB1cGRhdGVkTWVtYmVyLmtpbmQpIHtcbiAgICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgICAgcnVsZUtleTogJ2NoYW5nZWQta2luZCcsXG4gICAgICAgIHZpb2xhdG9yOiBvcmlnTWVtYmVyLFxuICAgICAgICBtZXNzYWdlOiBgY2hhbmdlZCBmcm9tICR7b3JpZ01lbWJlci5raW5kfSB0byAke3VwZGF0ZWRNZW1iZXIua2luZH1gLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFvcmlnTWVtYmVyLnByb3RlY3RlZCAmJiB1cGRhdGVkTWVtYmVyLnByb3RlY3RlZCkge1xuICAgICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgICBydWxlS2V5OiAnaGlkZGVuJyxcbiAgICAgICAgdmlvbGF0b3I6IG9yaWdNZW1iZXIsXG4gICAgICAgIG1lc3NhZ2U6IFwiY2hhbmdlZCBmcm9tICdwdWJsaWMnIHRvICdwcm90ZWN0ZWQnXCIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB5aWVsZCBbb3JpZ01lbWJlciwgdXBkYXRlZE1lbWJlcl07XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIHdlIGFyZSBzdHJlbmd0aGVuaW5nIHRoZSBwb3N0Y29uZGl0aW9uIChvdXRwdXQgdHlwZSBvZiBhIG1ldGhvZCBvciBwcm9wZXJ0eSlcbiAqXG4gKiBTdHJlbmd0aGVuaW5nIG91dHB1dCB2YWx1ZXMgaXMgYWxsb3dlZCFcbiAqL1xuZnVuY3Rpb24gaXNDb21wYXRpYmxlUmV0dXJuVHlwZShcbiAgb3JpZ2luYWw6IHJlZmxlY3QuT3B0aW9uYWxWYWx1ZSxcbiAgdXBkYXRlZDogcmVmbGVjdC5PcHRpb25hbFZhbHVlLFxuKTogQW5hbHlzaXMge1xuICBpZiAob3JpZ2luYWwudHlwZS52b2lkKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICB9IC8vIElmIHdlIGRpZG4ndCB1c2UgdG8gcmV0dXJuIGFueXRoaW5nLCByZXR1cm5pbmcgc29tZXRoaW5nIG5vdyBpcyBmaW5lXG4gIGlmICh1cGRhdGVkLnR5cGUudm9pZCkge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCByZWFzb25zOiBbXCJub3cgcmV0dXJuaW5nICd2b2lkJ1wiXSB9O1xuICB9IC8vIElmIHdlIHVzZWQgdG8gcmV0dXJuIHNvbWV0aGluZywgd2UgY2FuJ3Qgc3RvcCBkb2luZyB0aGF0XG4gIGlmICghb3JpZ2luYWwub3B0aW9uYWwgJiYgdXBkYXRlZC5vcHRpb25hbCkge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCByZWFzb25zOiBbJ291dHB1dCB0eXBlIGlzIG5vdyBvcHRpb25hbCddIH07XG4gIH1cbiAgcmV0dXJuIGlzU3VwZXJUeXBlKG9yaWdpbmFsLnR5cGUsIHVwZGF0ZWQudHlwZSwgdXBkYXRlZC5zeXN0ZW0pO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgd2UgYXJlIHdlYWtlbmluZyB0aGUgcHJlIChpbnB1dCB0eXBlIG9mIGEgbWV0aG9kKVxuICpcbiAqIFdlYWtlbmluZyBwcmVjb25kaXRpb25zIGlzIGFsbG93ZWQhXG4gKi9cbmZ1bmN0aW9uIGlzQ29tcGF0aWJsZUFyZ3VtZW50VHlwZShcbiAgb3JpZ2luYWw6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSxcbiAgdXBkYXRlZDogcmVmbGVjdC5UeXBlUmVmZXJlbmNlLFxuKTogQW5hbHlzaXMge1xuICAvLyBJbnB1dCBjYW4gbmV2ZXIgYmUgdm9pZCwgc28gbm8gbmVlZCB0byBjaGVja1xuICByZXR1cm4gaXNTdXBlclR5cGUodXBkYXRlZCwgb3JpZ2luYWwsIHVwZGF0ZWQuc3lzdGVtKTtcbn1cblxuLyoqXG4gKiBWZXJpZnkgYXNzaWduYWJpbGl0eSB0byBzdXBlcnR5cGVzXG4gKlxuICogRm9yIGV2ZXJ5IGJhc2UgdHlwZSBCIG9mIHR5cGUgVCwgc29tZW9uZSBjb3VsZCBoYXZlIHdyaXR0ZW46XG4gKlxuICogYGBgXG4gKiBjb25zdCB2YXJpYWJsZTogQiA9IG5ldyBUKCk7XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGNvZGUgbmVlZHMgdG8gYmUgdmFsaWQgaW4gdGhlIHVwZGF0ZWQgYXNzZW1ibHksIHNvIGZvciBlYWNoXG4gKiBCIGFuIHVwZGF0ZWQgdHlwZSBCJyBuZWVkcyB0byBleGlzdCBpbiB0aGUgbmV3IGFzc2VtYmx5IHdoaWNoIGlzXG4gKiBzdGlsbCBhIHN1cGVydHlwZSBvZiBUJy5cbiAqL1xuZnVuY3Rpb24gYXNzaWduYWJsZVRvQWxsQmFzZVR5cGVzKFxuICBvcmlnaW5hbDogcmVmbGVjdC5SZWZlcmVuY2VUeXBlLFxuICB1cGRhdGVkOiByZWZsZWN0LlJlZmVyZW5jZVR5cGUsXG4pOiBBbmFseXNpcyB7XG4gIGZvciAoY29uc3QgQiBvZiBiYXNlVHlwZXMob3JpZ2luYWwpKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gaXNOb21pbmFsU3VwZXJUeXBlKFxuICAgICAgQi5yZWZlcmVuY2UsXG4gICAgICB1cGRhdGVkLnJlZmVyZW5jZSxcbiAgICAgIHVwZGF0ZWQuc3lzdGVtLFxuICAgICk7XG4gICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xufVxuXG4vKipcbiAqIFJldHVybiBhbGwgYmFzZSB0eXBlcyBvZiB0aGUgZ2l2ZW4gcmVmZXJlbmNlIHR5cGVcbiAqL1xuZnVuY3Rpb24gYmFzZVR5cGVzKHR5cGU6IHJlZmxlY3QuUmVmZXJlbmNlVHlwZSkge1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8cmVmbGVjdC5SZWZlcmVuY2VUeXBlPigpO1xuICBjb25zdCB0b2RvOiByZWZsZWN0LlJlZmVyZW5jZVR5cGVbXSA9IFt0eXBlXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHdoaWxlICh0b2RvLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBuZXh0ID0gdG9kby5wb3AoKSE7XG4gICAgaWYgKHNlZW4uaGFzKG5leHQuZnFuKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJldC5wdXNoKG5leHQpO1xuICAgIHNlZW4uYWRkKG5leHQuZnFuKTtcblxuICAgIHRvZG8ucHVzaCguLi5uZXh0LmludGVyZmFjZXMpO1xuICAgIGlmIChuZXh0LmlzQ2xhc3NUeXBlKCkgJiYgbmV4dC5iYXNlKSB7XG4gICAgICB0b2RvLnB1c2gobmV4dC5iYXNlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgZWFjaCBlbnVtIG1lbWJlciBpbiB0aGUgb2xkIGVudW0gZW51bSwgYW5kIGFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIHRvIHRoZSBlbnVtc1xuICpcbiAqIE1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIHJlbWFpbnMgY29tcGlsYWJsZTpcbiAqXG4gKiBgYGBcbiAqIFQgeCA9IEVOVU0ubWVtYmVyO1xuICogYGBgXG4gKlxuICogKEZvciBldmVyeSBtZW1iZXIgb2YgZW51bSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRXhpc3RpbmdNZW1iZXJzKFxuICBvcmlnaW5hbDogcmVmbGVjdC5FbnVtVHlwZSxcbiAgdXBkYXRlZDogcmVmbGVjdC5FbnVtVHlwZSxcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbiAgdmFsaWRhdGVNZW1iZXI6IChcbiAgICBvbGRQYXJhbTogcmVmbGVjdC5FbnVtTWVtYmVyLFxuICAgIG5ld1BhcmFtOiByZWZsZWN0LkVudW1NZW1iZXIsXG4gICkgPT4gdm9pZCxcbikge1xuICBmb3IgKGNvbnN0IG9yaWdNZW1iZXIgb2Ygb3JpZ2luYWwubWVtYmVycykge1xuICAgIGNvbnN0IHVwZGF0ZWRNZW1iZXIgPSB1cGRhdGVkLm1lbWJlcnMuZmluZChcbiAgICAgIChtKSA9PiBtLm5hbWUgPT09IG9yaWdNZW1iZXIubmFtZSxcbiAgICApO1xuICAgIGlmICghdXBkYXRlZE1lbWJlcikge1xuICAgICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgICBydWxlS2V5OiAncmVtb3ZlZCcsXG4gICAgICAgIHZpb2xhdG9yOiBvcmlnTWVtYmVyLFxuICAgICAgICBtZXNzYWdlOiBgbWVtYmVyICR7b3JpZ01lbWJlci5uYW1lfSBoYXMgYmVlbiByZW1vdmVkYCxcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVNZW1iZXIob3JpZ01lbWJlciwgdXBkYXRlZE1lbWJlcik7XG4gIH1cbn1cbiJdfQ==
|
package/lib/version.d.ts
ADDED
package/lib/version.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Generated at 2021-09-28T17:08:28Z by generate.sh
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.VERSION = void 0;
|
|
5
|
+
/** The qualified version number for this JSII compiler. */
|
|
6
|
+
exports.VERSION = '1.35.0 (build 6ebef96)';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG1EQUFtRDs7O0FBRW5ELDJEQUEyRDtBQUM5QyxRQUFBLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBhdCAyMDIxLTA5LTI4VDE3OjA4OjI4WiBieSBnZW5lcmF0ZS5zaFxuXG4vKiogVGhlIHF1YWxpZmllZCB2ZXJzaW9uIG51bWJlciBmb3IgdGhpcyBKU0lJIGNvbXBpbGVyLiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMS4zNS4wIChidWlsZCA2ZWJlZjk2KSc7XG4iXX0=
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "jsii-diff",
|
|
3
|
+
"version": "1.35.0",
|
|
4
|
+
"description": "Assembly comparison for jsii",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Amazon Web Services",
|
|
8
|
+
"url": "https://aws.amazon.com"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/aws/jsii",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/aws/jsii/issues"
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "https://github.com/aws/jsii.git",
|
|
17
|
+
"directory": "packages/jsii-diff"
|
|
18
|
+
},
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">= 12.7.0"
|
|
21
|
+
},
|
|
22
|
+
"main": "lib/index.js",
|
|
23
|
+
"bin": {
|
|
24
|
+
"jsii-diff": "bin/jsii-diff"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "bash ./generate.sh && tsc --build && npm run lint",
|
|
28
|
+
"watch": "bash ./generate.sh && tsc --build -w",
|
|
29
|
+
"lint": "eslint . --ext .js,.ts --ignore-path=.gitignore",
|
|
30
|
+
"lint:fix": "yarn lint --fix",
|
|
31
|
+
"test": "jest",
|
|
32
|
+
"test:update": "jest -u",
|
|
33
|
+
"package": "package-js"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@jsii/check-node": "1.35.0",
|
|
37
|
+
"@jsii/spec": "^1.35.0",
|
|
38
|
+
"fs-extra": "^9.1.0",
|
|
39
|
+
"jsii-reflect": "^1.35.0",
|
|
40
|
+
"log4js": "^6.3.0",
|
|
41
|
+
"typescript": "~3.9.10",
|
|
42
|
+
"yargs": "^16.2.0"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/fs-extra": "^9.0.13",
|
|
46
|
+
"@types/jest": "^27.0.2",
|
|
47
|
+
"@types/jest-expect-message": "^1.0.3",
|
|
48
|
+
"@types/node": "^12.20.26",
|
|
49
|
+
"@types/tar-fs": "^2.0.1",
|
|
50
|
+
"eslint": "^7.32.0",
|
|
51
|
+
"jest": "^27.2.1",
|
|
52
|
+
"jest-expect-message": "^1.0.2",
|
|
53
|
+
"jsii": "^1.35.0",
|
|
54
|
+
"jsii-build-tools": "^1.35.0",
|
|
55
|
+
"prettier": "^2.4.1"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|