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,542 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const util_1 = require("./util");
|
|
4
|
+
// ----------------------------------------------------------------------
|
|
5
|
+
test('okay to add a new class', () => util_1.expectNoError(`
|
|
6
|
+
export class Foo1 { }
|
|
7
|
+
`, `
|
|
8
|
+
export class Foo1 { }
|
|
9
|
+
export class Foo2 { }
|
|
10
|
+
`));
|
|
11
|
+
// ----------------------------------------------------------------------
|
|
12
|
+
test('okay to add a new function to a class', () => util_1.expectNoError(`
|
|
13
|
+
export class Foo { }
|
|
14
|
+
`, `
|
|
15
|
+
export class Foo {
|
|
16
|
+
public bar(): void { }
|
|
17
|
+
}
|
|
18
|
+
`));
|
|
19
|
+
// ----------------------------------------------------------------------
|
|
20
|
+
test('not okay to add a required argument to a method', () => util_1.expectError(/newly required argument/, `
|
|
21
|
+
export class Foo {
|
|
22
|
+
public bar(arg1: string): void {
|
|
23
|
+
Array.isArray(arg1);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
`, `
|
|
27
|
+
export class Foo {
|
|
28
|
+
public bar(arg1: string, arg2: string): void {
|
|
29
|
+
Array.isArray(arg1);
|
|
30
|
+
Array.isArray(arg2);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
`));
|
|
34
|
+
// ----------------------------------------------------------------------
|
|
35
|
+
test('okay to make a required argument optional', () => util_1.expectNoError(`
|
|
36
|
+
export class Foo {
|
|
37
|
+
public bar(arg1: string, arg2: string): void {
|
|
38
|
+
Array.isArray(arg1);
|
|
39
|
+
Array.isArray(arg2);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
`, `
|
|
43
|
+
export class Foo {
|
|
44
|
+
public bar(arg1: string, arg2?: string): void {
|
|
45
|
+
Array.isArray(arg1);
|
|
46
|
+
Array.isArray(arg2);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
`));
|
|
50
|
+
// ----------------------------------------------------------------------
|
|
51
|
+
test('okay to turn required arguments into varargs', () => util_1.expectNoError(`
|
|
52
|
+
export class Foo {
|
|
53
|
+
public bar(arg1: string, arg2: number, arg3: number): void {
|
|
54
|
+
Array.isArray(arg1);
|
|
55
|
+
Array.isArray(arg2);
|
|
56
|
+
Array.isArray(arg3);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
`, `
|
|
60
|
+
export class Foo {
|
|
61
|
+
public bar(arg1: string, ...args: number[]): void {
|
|
62
|
+
Array.isArray(arg1);
|
|
63
|
+
Array.isArray(args);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
`));
|
|
67
|
+
// ----------------------------------------------------------------------
|
|
68
|
+
test('not allowed to change argument type to a different scalar', () => util_1.expectError(/method.*foo.*argument arg1, takes number \(formerly string\): string is not assignable to number/i, `
|
|
69
|
+
export class Foo {
|
|
70
|
+
public bar(arg1: string): void {
|
|
71
|
+
Array.isArray(arg1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
`, `
|
|
75
|
+
export class Foo {
|
|
76
|
+
public bar(arg1: number): void {
|
|
77
|
+
Array.isArray(arg1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
`));
|
|
81
|
+
// ----------------------------------------------------------------------
|
|
82
|
+
test('cannot add any abstract members to a subclassable class', () => util_1.expectError(/adds requirement for subclasses to implement 'piet'./, `
|
|
83
|
+
/**
|
|
84
|
+
* @subclassable
|
|
85
|
+
*/
|
|
86
|
+
export abstract class Henk {
|
|
87
|
+
abstract readonly name: string;
|
|
88
|
+
}
|
|
89
|
+
`, `
|
|
90
|
+
/**
|
|
91
|
+
* @subclassable
|
|
92
|
+
*/
|
|
93
|
+
export abstract class Henk {
|
|
94
|
+
abstract readonly name: string;
|
|
95
|
+
abstract readonly piet: string;
|
|
96
|
+
}
|
|
97
|
+
`));
|
|
98
|
+
// ----------------------------------------------------------------------
|
|
99
|
+
test('cannot add any members to a subclassable interface, not even optional ones', () => util_1.expectError(/adds requirement for subclasses to implement 'piet'./, `
|
|
100
|
+
/**
|
|
101
|
+
* @subclassable
|
|
102
|
+
*/
|
|
103
|
+
export interface IHenk {
|
|
104
|
+
name: string;
|
|
105
|
+
}
|
|
106
|
+
`, `
|
|
107
|
+
/**
|
|
108
|
+
* @subclassable
|
|
109
|
+
*/
|
|
110
|
+
export interface IHenk {
|
|
111
|
+
name: string;
|
|
112
|
+
piet?: string;
|
|
113
|
+
}
|
|
114
|
+
`));
|
|
115
|
+
// ----------------------------------------------------------------------
|
|
116
|
+
test('cannot make a member less visible', () => util_1.expectError(/changed from 'public' to 'protected'/, `
|
|
117
|
+
export class Henk {
|
|
118
|
+
public name: string = 'henk';
|
|
119
|
+
}
|
|
120
|
+
`, `
|
|
121
|
+
export class Henk {
|
|
122
|
+
protected name: string = 'henk';
|
|
123
|
+
}
|
|
124
|
+
`));
|
|
125
|
+
// ----------------------------------------------------------------------
|
|
126
|
+
describe('implement base types need to be present in updated type system', () => {
|
|
127
|
+
test('for interfaces', () => util_1.expectError(/not assignable to all base types anymore/, `
|
|
128
|
+
export interface IPapa {
|
|
129
|
+
readonly pipe: string;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export interface IBebe extends IPapa {
|
|
133
|
+
readonly pacifier: string;
|
|
134
|
+
}
|
|
135
|
+
`, `
|
|
136
|
+
export interface IPapa {
|
|
137
|
+
readonly pipe: string;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export interface IBebe {
|
|
141
|
+
readonly pacifier: string;
|
|
142
|
+
}
|
|
143
|
+
`));
|
|
144
|
+
test('for structs', () => util_1.expectError(/not assignable to all base types anymore/, `
|
|
145
|
+
export interface Papa {
|
|
146
|
+
readonly pipe: string;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export interface Bebe extends Papa {
|
|
150
|
+
readonly pacifier: string;
|
|
151
|
+
}
|
|
152
|
+
`, `
|
|
153
|
+
export interface Papa {
|
|
154
|
+
readonly pipe: string;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export interface Bebe {
|
|
158
|
+
readonly pacifier: string;
|
|
159
|
+
}
|
|
160
|
+
`));
|
|
161
|
+
test('for classes', () => util_1.expectError(/not assignable to all base types anymore/, `
|
|
162
|
+
export interface IPapa {
|
|
163
|
+
readonly pipe: string;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export class Bebe implements IPapa {
|
|
167
|
+
readonly pipe: string = 'pff';
|
|
168
|
+
readonly pacifier: string = 'mmm';
|
|
169
|
+
}
|
|
170
|
+
`, `
|
|
171
|
+
export interface IPapa {
|
|
172
|
+
readonly pipe: string;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export class Bebe {
|
|
176
|
+
readonly pipe: string = 'pff';
|
|
177
|
+
readonly pacifier: string = 'mmm';
|
|
178
|
+
}
|
|
179
|
+
`));
|
|
180
|
+
test('for base classes', () => util_1.expectError(/not assignable to all base types anymore/, `
|
|
181
|
+
export class Papa {
|
|
182
|
+
readonly pipe: string = 'pff';
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export class Bebe extends Papa {
|
|
186
|
+
readonly pacifier: string = 'mmm';
|
|
187
|
+
}
|
|
188
|
+
`, `
|
|
189
|
+
export class Papa {
|
|
190
|
+
readonly pipe: string = 'pff';
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export class Bebe {
|
|
194
|
+
readonly pacifier: string = 'mmm';
|
|
195
|
+
}
|
|
196
|
+
`));
|
|
197
|
+
test('new levels of inheritance are allowed', () => util_1.expectNoError(`
|
|
198
|
+
export class Papa {
|
|
199
|
+
readonly pipe: string = 'pff';
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export class Bebe extends Papa {
|
|
203
|
+
readonly pacifier: string = 'mmm';
|
|
204
|
+
}
|
|
205
|
+
`, `
|
|
206
|
+
export class Papa {
|
|
207
|
+
readonly pipe: string = 'pff';
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export class Inbetween extends Papa {
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export class Bebe extends Inbetween {
|
|
214
|
+
readonly pacifier: string = 'mmm';
|
|
215
|
+
}
|
|
216
|
+
`));
|
|
217
|
+
test('change direct implementation to inherited implementation via interface', () => util_1.expectNoError(`
|
|
218
|
+
export interface IPapa {
|
|
219
|
+
readonly pipe: string;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export class Bebe implements IPapa {
|
|
223
|
+
readonly pipe: string = 'pff';
|
|
224
|
+
readonly pacifier: string = 'mmm';
|
|
225
|
+
}
|
|
226
|
+
`, `
|
|
227
|
+
export interface IPapa {
|
|
228
|
+
readonly pipe: string;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export interface IInbetween extends IPapa {
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export class Bebe implements IInbetween {
|
|
235
|
+
readonly pipe: string = 'pff';
|
|
236
|
+
readonly pacifier: string = 'mmm';
|
|
237
|
+
}
|
|
238
|
+
`));
|
|
239
|
+
test('change direct implementation to inherited implementation via base class', () => util_1.expectNoError(`
|
|
240
|
+
export interface IPapa {
|
|
241
|
+
readonly pipe: string;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export class Bebe implements IPapa {
|
|
245
|
+
readonly pipe: string = 'pff';
|
|
246
|
+
readonly pacifier: string = 'mmm';
|
|
247
|
+
}
|
|
248
|
+
`, `
|
|
249
|
+
export interface IPapa {
|
|
250
|
+
readonly pipe: string;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export class Inbetween implements IPapa {
|
|
254
|
+
readonly pipe: string = 'pff';
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export class Bebe extends Inbetween {
|
|
258
|
+
readonly pacifier: string = 'mmm';
|
|
259
|
+
}
|
|
260
|
+
`));
|
|
261
|
+
});
|
|
262
|
+
// ----------------------------------------------------------------------
|
|
263
|
+
test.each([
|
|
264
|
+
{
|
|
265
|
+
oldDecl: 'name: string',
|
|
266
|
+
newDecl: 'name?: string',
|
|
267
|
+
error: /type Optional<string> \(formerly string\): output type is now optional/,
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
oldDecl: 'name?: string',
|
|
271
|
+
newDecl: 'name: string',
|
|
272
|
+
error: undefined,
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
oldDecl: 'name: string',
|
|
276
|
+
newDecl: 'name: string | number',
|
|
277
|
+
error: /string \| number is not assignable to string/,
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
oldDecl: 'name: string | number',
|
|
281
|
+
newDecl: 'name: string',
|
|
282
|
+
error: undefined,
|
|
283
|
+
},
|
|
284
|
+
])('change class property ', ({ oldDecl, newDecl, error }) => util_1.expectError(error, `
|
|
285
|
+
export class Henk {
|
|
286
|
+
public readonly ${oldDecl} = 'henk';
|
|
287
|
+
}
|
|
288
|
+
`, `
|
|
289
|
+
export class Henk {
|
|
290
|
+
public readonly ${newDecl} = 'henk';
|
|
291
|
+
}
|
|
292
|
+
`));
|
|
293
|
+
// ----------------------------------------------------------------------
|
|
294
|
+
test.each([
|
|
295
|
+
{
|
|
296
|
+
oldDecl: 'name: string',
|
|
297
|
+
newDecl: 'name?: string',
|
|
298
|
+
error: /changed to Optional<string> \(formerly string\)/,
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
oldDecl: 'name?: string',
|
|
302
|
+
newDecl: 'name: string',
|
|
303
|
+
error: /changed to string \(formerly Optional<string>\)/,
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
oldDecl: 'name: string',
|
|
307
|
+
newDecl: 'name: string | number',
|
|
308
|
+
error: /changed to string \| number \(formerly string\)/,
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
oldDecl: 'name: string | number',
|
|
312
|
+
newDecl: 'name: string',
|
|
313
|
+
error: /changed to string \(formerly string \| number\)/,
|
|
314
|
+
},
|
|
315
|
+
])('cannot change a mutable class property type: %p to %p', ({ oldDecl, newDecl, error }) => util_1.expectError(error, `
|
|
316
|
+
export class Henk {
|
|
317
|
+
public ${oldDecl} = 'henk';
|
|
318
|
+
}
|
|
319
|
+
`, `
|
|
320
|
+
export class Henk {
|
|
321
|
+
public ${newDecl} = 'henk';
|
|
322
|
+
}
|
|
323
|
+
`));
|
|
324
|
+
// ----------------------------------------------------------------------
|
|
325
|
+
test('consider inherited constructor', () => util_1.expectError(/number is not assignable to string/, `
|
|
326
|
+
export class Super {
|
|
327
|
+
constructor(param: number) {
|
|
328
|
+
Array.isArray(param);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
export class Sub extends Super {
|
|
332
|
+
}
|
|
333
|
+
`, `
|
|
334
|
+
export class Super {
|
|
335
|
+
constructor(param: number) {
|
|
336
|
+
Array.isArray(param);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
export class Sub extends Super {
|
|
340
|
+
constructor(param: string) {
|
|
341
|
+
super(5);
|
|
342
|
+
Array.isArray(param);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
`));
|
|
346
|
+
// ----------------------------------------------------------------------
|
|
347
|
+
test('consider inherited constructor, the other way', () => util_1.expectError(/newly required argument/, `
|
|
348
|
+
export class Super {
|
|
349
|
+
constructor(param: number) {
|
|
350
|
+
Array.isArray(param);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
export class Sub extends Super {
|
|
354
|
+
constructor() {
|
|
355
|
+
super(5);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
`, `
|
|
359
|
+
export class Super {
|
|
360
|
+
constructor(param: number) {
|
|
361
|
+
Array.isArray(param);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
export class Sub extends Super {
|
|
365
|
+
}
|
|
366
|
+
`));
|
|
367
|
+
// ----------------------------------------------------------------------
|
|
368
|
+
test('method can be moved to supertype', () => util_1.expectNoError(`
|
|
369
|
+
export class Super {
|
|
370
|
+
}
|
|
371
|
+
export class Sub extends Super {
|
|
372
|
+
public foo(param: number) {
|
|
373
|
+
Array.isArray(param);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
`, `
|
|
377
|
+
export class Super {
|
|
378
|
+
public foo(param: number) {
|
|
379
|
+
Array.isArray(param);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
export class Sub extends Super {
|
|
383
|
+
}
|
|
384
|
+
`));
|
|
385
|
+
// ----------------------------------------------------------------------
|
|
386
|
+
test('property can be moved to supertype', () => util_1.expectNoError(`
|
|
387
|
+
export class Super {
|
|
388
|
+
}
|
|
389
|
+
export class Sub extends Super {
|
|
390
|
+
public foo: string = 'foo';
|
|
391
|
+
}
|
|
392
|
+
`, `
|
|
393
|
+
export class Super {
|
|
394
|
+
public foo: string = 'foo';
|
|
395
|
+
}
|
|
396
|
+
export class Sub extends Super {
|
|
397
|
+
}
|
|
398
|
+
`));
|
|
399
|
+
// ----------------------------------------------------------------------
|
|
400
|
+
test('subclassable is forever', () => util_1.expectError(/has gone from @subclassable to non-@subclassable/, `
|
|
401
|
+
/**
|
|
402
|
+
* @subclassable
|
|
403
|
+
*/
|
|
404
|
+
export class Super {
|
|
405
|
+
}
|
|
406
|
+
`, `
|
|
407
|
+
export class Super {
|
|
408
|
+
}
|
|
409
|
+
`));
|
|
410
|
+
// ----------------------------------------------------------------------
|
|
411
|
+
test('change from method to property', () => util_1.expectError(/changed from method to property/, `
|
|
412
|
+
export class Boom {
|
|
413
|
+
public foo() { return 12; }
|
|
414
|
+
}
|
|
415
|
+
`, `
|
|
416
|
+
export class Boom {
|
|
417
|
+
public get foo() { return 12; }
|
|
418
|
+
}
|
|
419
|
+
`));
|
|
420
|
+
// ----------------------------------------------------------------------
|
|
421
|
+
test('change from method with arguments to property', () => util_1.expectError(/changed from method to property/, `
|
|
422
|
+
export class Boom {
|
|
423
|
+
public foo(arg: number) { return 12 * arg; }
|
|
424
|
+
}
|
|
425
|
+
`, `
|
|
426
|
+
export class Boom {
|
|
427
|
+
public get foo() { return 12; }
|
|
428
|
+
}
|
|
429
|
+
`));
|
|
430
|
+
// ----------------------------------------------------------------------
|
|
431
|
+
test('change from property to method', () => util_1.expectError(/changed from property to method/, `
|
|
432
|
+
export class Boom {
|
|
433
|
+
public get foo() { return 12; }
|
|
434
|
+
}
|
|
435
|
+
`, `
|
|
436
|
+
export class Boom {
|
|
437
|
+
public foo() { return 12; }
|
|
438
|
+
}
|
|
439
|
+
`));
|
|
440
|
+
// ----------------------------------------------------------------------
|
|
441
|
+
test.each([
|
|
442
|
+
{
|
|
443
|
+
oldDecl: 'foo(arg: string) { Array.isArray(arg); }',
|
|
444
|
+
newDecl: 'foo(arg: string | number) { Array.isArray(arg); }',
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
oldDecl: 'foo(): string { return "x"; }',
|
|
448
|
+
newDecl: 'foo(): string | number { return "x"; }',
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
oldDecl: 'readonly foo: string = "x";',
|
|
452
|
+
newDecl: 'readonly foo: string | number = "x";',
|
|
453
|
+
},
|
|
454
|
+
])('cannot change any type in @subclassable class: %p to %p', ({ oldDecl, newDecl }) => util_1.expectError(/type is @subclassable/, `
|
|
455
|
+
/** @subclassable */
|
|
456
|
+
export class Boom {
|
|
457
|
+
public ${oldDecl}
|
|
458
|
+
}
|
|
459
|
+
`, `
|
|
460
|
+
/** @subclassable */
|
|
461
|
+
export class Boom {
|
|
462
|
+
public ${newDecl}
|
|
463
|
+
}
|
|
464
|
+
`));
|
|
465
|
+
// ----------------------------------------------------------------------
|
|
466
|
+
test.each([
|
|
467
|
+
{
|
|
468
|
+
oldDecl: 'foo(arg: string): void;',
|
|
469
|
+
newDecl: 'foo(arg: string | number): void;',
|
|
470
|
+
},
|
|
471
|
+
{ oldDecl: 'foo(): string;', newDecl: 'foo(): string | number;' },
|
|
472
|
+
{
|
|
473
|
+
oldDecl: 'readonly foo: string;',
|
|
474
|
+
newDecl: 'readonly foo: string | number;',
|
|
475
|
+
},
|
|
476
|
+
])('cannot change any type in @subclassable interface: %p to %p', ({ oldDecl, newDecl }) => util_1.expectError(/type is @subclassable/, `
|
|
477
|
+
/** @subclassable */
|
|
478
|
+
export interface IBoom {
|
|
479
|
+
${oldDecl}
|
|
480
|
+
}
|
|
481
|
+
`, `
|
|
482
|
+
/** @subclassable */
|
|
483
|
+
export interface IBoom {
|
|
484
|
+
${newDecl}
|
|
485
|
+
}
|
|
486
|
+
`));
|
|
487
|
+
// ----------------------------------------------------------------------
|
|
488
|
+
test.each([
|
|
489
|
+
// No usage => can add field
|
|
490
|
+
['', true],
|
|
491
|
+
// Return type => can add field
|
|
492
|
+
['foo(): TheStruct;', true],
|
|
493
|
+
['readonly foo: TheStruct;', true],
|
|
494
|
+
// Input type => can NOT add field
|
|
495
|
+
['foo: TheStruct;', false],
|
|
496
|
+
['foo(arg: TheStruct): void', false],
|
|
497
|
+
])('add required field to structs: refencing via %p -> allowed %p', (usageDecl, allowed) => util_1.expectError(allowed ? undefined : /newly required property 'fieldTwo' added/, `
|
|
498
|
+
export interface TheStruct {
|
|
499
|
+
readonly fieldOne: string;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
export interface IConsumer {
|
|
503
|
+
${usageDecl}
|
|
504
|
+
}
|
|
505
|
+
`, `
|
|
506
|
+
export interface TheStruct {
|
|
507
|
+
readonly fieldOne: string;
|
|
508
|
+
readonly fieldTwo: string;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
export interface IConsumer {
|
|
512
|
+
${usageDecl}
|
|
513
|
+
}
|
|
514
|
+
`));
|
|
515
|
+
// ----------------------------------------------------------------------
|
|
516
|
+
test.each([
|
|
517
|
+
// No usage => can add field
|
|
518
|
+
['', true],
|
|
519
|
+
// Return type => can NOT remove information
|
|
520
|
+
['foo(): TheStruct;', false],
|
|
521
|
+
['readonly foo: TheStruct;', false],
|
|
522
|
+
['foo: TheStruct;', false],
|
|
523
|
+
// Input type => can make optional
|
|
524
|
+
['foo(arg: TheStruct): void', true],
|
|
525
|
+
])('make required field optional: refencing via %p -> allowed %p', (usageDecl, allowed) => util_1.expectError(allowed ? undefined : /formerly required property 'fieldOne' is optional/, `
|
|
526
|
+
export interface TheStruct {
|
|
527
|
+
readonly fieldOne: string;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
export interface IConsumer {
|
|
531
|
+
${usageDecl}
|
|
532
|
+
}
|
|
533
|
+
`, `
|
|
534
|
+
export interface TheStruct {
|
|
535
|
+
readonly fieldOne?: string;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
export interface IConsumer {
|
|
539
|
+
${usageDecl}
|
|
540
|
+
}
|
|
541
|
+
`));
|
|
542
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2xhc3Nlcy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaUNBQW9EO0FBRXBELHlFQUF5RTtBQUV6RSxJQUFJLENBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFLENBQ25DLG9CQUFhLENBQ1g7O0dBRUQsRUFDQzs7O0dBR0QsQ0FDQSxDQUFDLENBQUM7QUFFTCx5RUFBeUU7QUFFekUsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRSxDQUNqRCxvQkFBYSxDQUNYOztHQUVELEVBQ0M7Ozs7R0FJRCxDQUNBLENBQUMsQ0FBQztBQUVMLHlFQUF5RTtBQUV6RSxJQUFJLENBQUMsaURBQWlELEVBQUUsR0FBRyxFQUFFLENBQzNELGtCQUFXLENBQ1QseUJBQXlCLEVBQ3pCOzs7Ozs7R0FNRCxFQUNDOzs7Ozs7O0dBT0QsQ0FDQSxDQUFDLENBQUM7QUFFTCx5RUFBeUU7QUFFekUsSUFBSSxDQUFDLDJDQUEyQyxFQUFFLEdBQUcsRUFBRSxDQUNyRCxvQkFBYSxDQUNYOzs7Ozs7O0dBT0QsRUFDQzs7Ozs7OztHQU9ELENBQ0EsQ0FBQyxDQUFDO0FBRUwseUVBQXlFO0FBRXpFLElBQUksQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLEVBQUUsQ0FDeEQsb0JBQWEsQ0FDWDs7Ozs7Ozs7R0FRRCxFQUNDOzs7Ozs7O0dBT0QsQ0FDQSxDQUFDLENBQUM7QUFFTCx5RUFBeUU7QUFFekUsSUFBSSxDQUFDLDJEQUEyRCxFQUFFLEdBQUcsRUFBRSxDQUNyRSxrQkFBVyxDQUNULG1HQUFtRyxFQUNuRzs7Ozs7O0dBTUQsRUFDQzs7Ozs7O0dBTUQsQ0FDQSxDQUFDLENBQUM7QUFFTCx5RUFBeUU7QUFFekUsSUFBSSxDQUFDLHlEQUF5RCxFQUFFLEdBQUcsRUFBRSxDQUNuRSxrQkFBVyxDQUNULHNEQUFzRCxFQUN0RDs7Ozs7OztHQU9ELEVBQ0M7Ozs7Ozs7O0dBUUQsQ0FDQSxDQUFDLENBQUM7QUFFTCx5RUFBeUU7QUFFekUsSUFBSSxDQUFDLDRFQUE0RSxFQUFFLEdBQUcsRUFBRSxDQUN0RixrQkFBVyxDQUNULHNEQUFzRCxFQUN0RDs7Ozs7OztHQU9ELEVBQ0M7Ozs7Ozs7O0dBUUQsQ0FDQSxDQUFDLENBQUM7QUFFTCx5RUFBeUU7QUFFekUsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsRUFBRSxDQUM3QyxrQkFBVyxDQUNULHNDQUFzQyxFQUN0Qzs7OztHQUlELEVBQ0M7Ozs7R0FJRCxDQUNBLENBQUMsQ0FBQztBQUVMLHlFQUF5RTtBQUV6RSxRQUFRLENBQUMsZ0VBQWdFLEVBQUUsR0FBRyxFQUFFO0lBQzlFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsQ0FDMUIsa0JBQVcsQ0FDVCwwQ0FBMEMsRUFDMUM7Ozs7Ozs7O0tBUUQsRUFDQzs7Ozs7Ozs7S0FRRCxDQUNBLENBQUMsQ0FBQztJQUVMLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQ3ZCLGtCQUFXLENBQ1QsMENBQTBDLEVBQzFDOzs7Ozs7OztLQVFELEVBQ0M7Ozs7Ozs7O0tBUUQsQ0FDQSxDQUFDLENBQUM7SUFFTCxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUN2QixrQkFBVyxDQUNULDBDQUEwQyxFQUMxQzs7Ozs7Ozs7O0tBU0QsRUFDQzs7Ozs7Ozs7O0tBU0QsQ0FDQSxDQUFDLENBQUM7SUFFTCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLENBQzVCLGtCQUFXLENBQ1QsMENBQTBDLEVBQzFDOzs7Ozs7OztLQVFELEVBQ0M7Ozs7Ozs7O0tBUUQsQ0FDQSxDQUFDLENBQUM7SUFFTCxJQUFJLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxFQUFFLENBQ2pELG9CQUFhLENBQ1g7Ozs7Ozs7O0tBUUQsRUFDQzs7Ozs7Ozs7Ozs7S0FXRCxDQUNBLENBQUMsQ0FBQztJQUVMLElBQUksQ0FBQyx3RUFBd0UsRUFBRSxHQUFHLEVBQUUsQ0FDbEYsb0JBQWEsQ0FDWDs7Ozs7Ozs7O0tBU0QsRUFDQzs7Ozs7Ozs7Ozs7O0tBWUQsQ0FDQSxDQUFDLENBQUM7SUFFTCxJQUFJLENBQUMseUVBQXlFLEVBQUUsR0FBRyxFQUFFLENBQ25GLG9CQUFhLENBQ1g7Ozs7Ozs7OztLQVNELEVBQ0M7Ozs7Ozs7Ozs7OztLQVlELENBQ0EsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQUM7QUFFSCx5RUFBeUU7QUFFekUsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNSO1FBQ0UsT0FBTyxFQUFFLGNBQWM7UUFDdkIsT0FBTyxFQUFFLGVBQWU7UUFDeEIsS0FBSyxFQUNILHdFQUF3RTtLQUMzRTtJQUNEO1FBQ0UsT0FBTyxFQUFFLGVBQWU7UUFDeEIsT0FBTyxFQUFFLGNBQWM7UUFDdkIsS0FBSyxFQUFFLFNBQVM7S0FDakI7SUFDRDtRQUNFLE9BQU8sRUFBRSxjQUFjO1FBQ3ZCLE9BQU8sRUFBRSx1QkFBdUI7UUFDaEMsS0FBSyxFQUFFLDhDQUE4QztLQUN0RDtJQUNEO1FBQ0UsT0FBTyxFQUFFLHVCQUF1QjtRQUNoQyxPQUFPLEVBQUUsY0FBYztRQUN2QixLQUFLLEVBQUUsU0FBUztLQUNqQjtDQUNGLENBQUMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQzNELGtCQUFXLENBQ1QsS0FBSyxFQUNMOzt3QkFFb0IsT0FBTzs7R0FFNUIsRUFDQzs7d0JBRW9CLE9BQU87O0dBRTVCLENBQ0EsQ0FDRixDQUFDO0FBRUYseUVBQXlFO0FBRXpFLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDUjtRQUNFLE9BQU8sRUFBRSxjQUFjO1FBQ3ZCLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLEtBQUssRUFBRSxpREFBaUQ7S0FDekQ7SUFDRDtRQUNFLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLE9BQU8sRUFBRSxjQUFjO1FBQ3ZCLEtBQUssRUFBRSxpREFBaUQ7S0FDekQ7SUFDRDtRQUNFLE9BQU8sRUFBRSxjQUFjO1FBQ3ZCLE9BQU8sRUFBRSx1QkFBdUI7UUFDaEMsS0FBSyxFQUFFLGlEQUFpRDtLQUN6RDtJQUNEO1FBQ0UsT0FBTyxFQUFFLHVCQUF1QjtRQUNoQyxPQUFPLEVBQUUsY0FBYztRQUN2QixLQUFLLEVBQUUsaURBQWlEO0tBQ3pEO0NBQ0YsQ0FBQyxDQUNBLHVEQUF1RCxFQUN2RCxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQzlCLGtCQUFXLENBQ1QsS0FBSyxFQUNMOztpQkFFVyxPQUFPOztLQUVuQixFQUNDOztpQkFFVyxPQUFPOztLQUVuQixDQUNBLENBQ0osQ0FBQztBQUVGLHlFQUF5RTtBQUV6RSxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFLENBQzFDLGtCQUFXLENBQ1Qsb0NBQW9DLEVBQ3BDOzs7Ozs7OztHQVFELEVBQ0M7Ozs7Ozs7Ozs7OztHQVlELENBQ0EsQ0FBQyxDQUFDO0FBRUwseUVBQXlFO0FBRXpFLElBQUksQ0FBQywrQ0FBK0MsRUFBRSxHQUFHLEVBQUUsQ0FDekQsa0JBQVcsQ0FDVCx5QkFBeUIsRUFDekI7Ozs7Ozs7Ozs7O0dBV0QsRUFDQzs7Ozs7Ozs7R0FRRCxDQUNBLENBQUMsQ0FBQztBQUVMLHlFQUF5RTtBQUV6RSxJQUFJLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFLENBQzVDLG9CQUFhLENBQ1g7Ozs7Ozs7O0dBUUQsRUFDQzs7Ozs7Ozs7R0FRRCxDQUNBLENBQUMsQ0FBQztBQUVMLHlFQUF5RTtBQUV6RSxJQUFJLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxFQUFFLENBQzlDLG9CQUFhLENBQ1g7Ozs7OztHQU1ELEVBQ0M7Ozs7OztHQU1ELENBQ0EsQ0FBQyxDQUFDO0FBRUwseUVBQXlFO0FBRXpFLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUUsQ0FDbkMsa0JBQVcsQ0FDVCxrREFBa0QsRUFDbEQ7Ozs7OztHQU1ELEVBQ0M7OztHQUdELENBQ0EsQ0FBQyxDQUFDO0FBRUwseUVBQXlFO0FBRXpFLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUUsQ0FDMUMsa0JBQVcsQ0FDVCxpQ0FBaUMsRUFDakM7Ozs7S0FJQyxFQUNEOzs7O0tBSUMsQ0FDRixDQUFDLENBQUM7QUFFTCx5RUFBeUU7QUFFekUsSUFBSSxDQUFDLCtDQUErQyxFQUFFLEdBQUcsRUFBRSxDQUN6RCxrQkFBVyxDQUNULGlDQUFpQyxFQUNqQzs7OztLQUlDLEVBQ0Q7Ozs7S0FJQyxDQUNGLENBQUMsQ0FBQztBQUVMLHlFQUF5RTtBQUV6RSxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFLENBQzFDLGtCQUFXLENBQ1QsaUNBQWlDLEVBQ2pDOzs7O0tBSUMsRUFDRDs7OztLQUlDLENBQ0YsQ0FBQyxDQUFDO0FBRUwseUVBQXlFO0FBRXpFLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDUjtRQUNFLE9BQU8sRUFBRSwwQ0FBMEM7UUFDbkQsT0FBTyxFQUFFLG1EQUFtRDtLQUM3RDtJQUNEO1FBQ0UsT0FBTyxFQUFFLCtCQUErQjtRQUN4QyxPQUFPLEVBQUUsd0NBQXdDO0tBQ2xEO0lBQ0Q7UUFDRSxPQUFPLEVBQUUsNkJBQTZCO1FBQ3RDLE9BQU8sRUFBRSxzQ0FBc0M7S0FDaEQ7Q0FDRixDQUFDLENBQ0EseURBQXlELEVBQ3pELENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUN2QixrQkFBVyxDQUNULHVCQUF1QixFQUN2Qjs7O2lCQUdXLE9BQU87O09BRWpCLEVBQ0Q7OztpQkFHVyxPQUFPOztPQUVqQixDQUNGLENBQ0osQ0FBQztBQUVGLHlFQUF5RTtBQUV6RSxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ1I7UUFDRSxPQUFPLEVBQUUseUJBQXlCO1FBQ2xDLE9BQU8sRUFBRSxrQ0FBa0M7S0FDNUM7SUFDRCxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUU7SUFDakU7UUFDRSxPQUFPLEVBQUUsdUJBQXVCO1FBQ2hDLE9BQU8sRUFBRSxnQ0FBZ0M7S0FDMUM7Q0FDRixDQUFDLENBQ0EsNkRBQTZELEVBQzdELENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUN2QixrQkFBVyxDQUNULHVCQUF1QixFQUN2Qjs7O1VBR0ksT0FBTzs7T0FFVixFQUNEOzs7VUFHSSxPQUFPOztPQUVWLENBQ0YsQ0FDSixDQUFDO0FBRUYseUVBQXlFO0FBRXpFLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDUiw0QkFBNEI7SUFDNUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDO0lBQ1YsK0JBQStCO0lBQy9CLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDO0lBQzNCLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDO0lBQ2xDLGtDQUFrQztJQUNsQyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQztJQUMxQixDQUFDLDJCQUEyQixFQUFFLEtBQUssQ0FBQztDQUNyQyxDQUFDLENBQ0EsK0RBQStELEVBQy9ELENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQ3JCLGtCQUFXLENBQ1QsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLDBDQUEwQyxFQUNoRTs7Ozs7O1VBTUksU0FBUzs7T0FFWixFQUNEOzs7Ozs7O1VBT0ksU0FBUzs7T0FFWixDQUNGLENBQ0osQ0FBQztBQUVGLHlFQUF5RTtBQUV6RSxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ1IsNEJBQTRCO0lBQzVCLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQztJQUNWLDRDQUE0QztJQUM1QyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQztJQUM1QixDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQztJQUNuQyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQztJQUMxQixrQ0FBa0M7SUFDbEMsQ0FBQywyQkFBMkIsRUFBRSxJQUFJLENBQUM7Q0FDcEMsQ0FBQyxDQUNBLDhEQUE4RCxFQUM5RCxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUNyQixrQkFBVyxDQUNULE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxtREFBbUQsRUFDekU7Ozs7OztVQU1JLFNBQVM7O09BRVosRUFDRDs7Ozs7O1VBTUksU0FBUzs7T0FFWixDQUNGLENBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4cGVjdEVycm9yLCBleHBlY3ROb0Vycm9yIH0gZnJvbSAnLi91dGlsJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50ZXN0KCdva2F5IHRvIGFkZCBhIG5ldyBjbGFzcycsICgpID0+XG4gIGV4cGVjdE5vRXJyb3IoXG4gICAgYFxuICAgIGV4cG9ydCBjbGFzcyBGb28xIHsgfVxuICBgLFxuICAgIGBcbiAgICBleHBvcnQgY2xhc3MgRm9vMSB7IH1cbiAgICBleHBvcnQgY2xhc3MgRm9vMiB7IH1cbiAgYCxcbiAgKSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudGVzdCgnb2theSB0byBhZGQgYSBuZXcgZnVuY3Rpb24gdG8gYSBjbGFzcycsICgpID0+XG4gIGV4cGVjdE5vRXJyb3IoXG4gICAgYFxuICAgIGV4cG9ydCBjbGFzcyBGb28geyB9XG4gIGAsXG4gICAgYFxuICAgIGV4cG9ydCBjbGFzcyBGb28ge1xuICAgICAgcHVibGljIGJhcigpOiB2b2lkIHsgfVxuICAgIH1cbiAgYCxcbiAgKSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudGVzdCgnbm90IG9rYXkgdG8gYWRkIGEgcmVxdWlyZWQgYXJndW1lbnQgdG8gYSBtZXRob2QnLCAoKSA9PlxuICBleHBlY3RFcnJvcihcbiAgICAvbmV3bHkgcmVxdWlyZWQgYXJndW1lbnQvLFxuICAgIGBcbiAgICBleHBvcnQgY2xhc3MgRm9vIHtcbiAgICAgIHB1YmxpYyBiYXIoYXJnMTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIEFycmF5LmlzQXJyYXkoYXJnMSk7XG4gICAgICB9XG4gICAgfVxuICBgLFxuICAgIGBcbiAgICBleHBvcnQgY2xhc3MgRm9vIHtcbiAgICAgIHB1YmxpYyBiYXIoYXJnMTogc3RyaW5nLCBhcmcyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgQXJyYXkuaXNBcnJheShhcmcxKTtcbiAgICAgICAgQXJyYXkuaXNBcnJheShhcmcyKTtcbiAgICAgIH1cbiAgICB9XG4gIGAsXG4gICkpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnRlc3QoJ29rYXkgdG8gbWFrZSBhIHJlcXVpcmVkIGFyZ3VtZW50IG9wdGlvbmFsJywgKCkgPT5cbiAgZXhwZWN0Tm9FcnJvcihcbiAgICBgXG4gICAgZXhwb3J0IGNsYXNzIEZvbyB7XG4gICAgICBwdWJsaWMgYmFyKGFyZzE6IHN0cmluZywgYXJnMjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIEFycmF5LmlzQXJyYXkoYXJnMSk7XG4gICAgICAgIEFycmF5LmlzQXJyYXkoYXJnMik7XG4gICAgICB9XG4gICAgfVxuICBgLFxuICAgIGBcbiAgICBleHBvcnQgY2xhc3MgRm9vIHtcbiAgICAgIHB1YmxpYyBiYXIoYXJnMTogc3RyaW5nLCBhcmcyPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIEFycmF5LmlzQXJyYXkoYXJnMSk7XG4gICAgICAgIEFycmF5LmlzQXJyYXkoYXJnMik7XG4gICAgICB9XG4gICAgfVxuICBgLFxuICApKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50ZXN0KCdva2F5IHRvIHR1cm4gcmVxdWlyZWQgYXJndW1lbnRzIGludG8gdmFyYXJncycsICgpID0+XG4gIGV4cGVjdE5vRXJyb3IoXG4gICAgYFxuICAgIGV4cG9ydCBjbGFzcyBGb28ge1xuICAgICAgcHVibGljIGJhcihhcmcxOiBzdHJpbmcsIGFyZzI6IG51bWJlciwgYXJnMzogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIEFycmF5LmlzQXJyYXkoYXJnMSk7XG4gICAgICAgIEFycmF5LmlzQXJyYXkoYXJnMik7XG4gICAgICAgIEFycmF5LmlzQXJyYXkoYXJnMyk7XG4gICAgICB9XG4gICAgfVxuICBgLFxuICAgIGBcbiAgICBleHBvcnQgY2xhc3MgRm9vIHtcbiAgICAgIHB1YmxpYyBiYXIoYXJnMTogc3RyaW5nLCAuLi5hcmdzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgICAgICBBcnJheS5pc0FycmF5KGFyZzEpO1xuICAgICAgICBBcnJheS5pc0FycmF5KGFyZ3MpO1xuICAgICAgfVxuICAgIH1cbiAgYCxcbiAgKSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudGVzdCgnbm90IGFsbG93ZWQgdG8gY2hhbmdlIGFyZ3VtZW50IHR5cGUgdG8gYSBkaWZmZXJlbnQgc2NhbGFyJywgKCkgPT5cbiAgZXhwZWN0RXJyb3IoXG4gICAgL21ldGhvZC4qZm9vLiphcmd1bWVudCBhcmcxLCB0YWtlcyBudW1iZXIgXFwoZm9ybWVybHkgc3RyaW5nXFwpOiBzdHJpbmcgaXMgbm90IGFzc2lnbmFibGUgdG8gbnVtYmVyL2ksXG4gICAgYFxuICAgIGV4cG9ydCBjbGFzcyBGb28ge1xuICAgICAgcHVibGljIGJhcihhcmcxOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgQXJyYXkuaXNBcnJheShhcmcxKTtcbiAgICAgIH1cbiAgICB9XG4gIGAsXG4gICAgYFxuICAgIGV4cG9ydCBjbGFzcyBGb28ge1xuICAgICAgcHVibGljIGJhcihhcmcxOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgQXJyYXkuaXNBcnJheShhcmcxKTtcbiAgICAgIH1cbiAgICB9XG4gIGAsXG4gICkpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnRlc3QoJ2Nhbm5vdCBhZGQgYW55IGFic3RyYWN0IG1lbWJlcnMgdG8gYSBzdWJjbGFzc2FibGUgY2xhc3MnLCAoKSA9PlxuICBleHBlY3RFcnJvcihcbiAgICAvYWRkcyByZXF1aXJlbWVudCBmb3Igc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgJ3BpZXQnLi8sXG4gICAgYFxuICAgIC8qKlxuICAgICAqIEBzdWJjbGFzc2FibGVcbiAgICAgKi9cbiAgICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgSGVuayB7XG4gICAgICBhYnN0cmFjdCByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgfVxuICBgLFxuICAgIGBcbiAgICAvKipcbiAgICAgKiBAc3ViY2xhc3NhYmxlXG4gICAgICovXG4gICAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIEhlbmsge1xuICAgICAgYWJzdHJhY3QgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAgICAgYWJzdHJhY3QgcmVhZG9ubHkgcGlldDogc3RyaW5nO1xuICAgIH1cbiAgYCxcbiAgKSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudGVzdCgnY2Fubm90IGFkZCBhbnkgbWVtYmVycyB0byBhIHN1YmNsYXNzYWJsZSBpbnRlcmZhY2UsIG5vdCBldmVuIG9wdGlvbmFsIG9uZXMnLCAoKSA9PlxuICBleHBlY3RFcnJvcihcbiAgICAvYWRkcyByZXF1aXJlbWVudCBmb3Igc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgJ3BpZXQnLi8sXG4gICAgYFxuICAgIC8qKlxuICAgICAqIEBzdWJjbGFzc2FibGVcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIElIZW5rIHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICB9XG4gIGAsXG4gICAgYFxuICAgIC8qKlxuICAgICAqIEBzdWJjbGFzc2FibGVcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIElIZW5rIHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIHBpZXQ/OiBzdHJpbmc7XG4gICAgfVxuICBgLFxuICApKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50ZXN0KCdjYW5ub3QgbWFrZSBhIG1lbWJlciBsZXNzIHZpc2libGUnLCAoKSA9PlxuICBleHBlY3RFcnJvcihcbiAgICAvY2hhbmdlZCBmcm9tICdwdWJsaWMnIHRvICdwcm90ZWN0ZWQnLyxcbiAgICBgXG4gICAgZXhwb3J0IGNsYXNzIEhlbmsge1xuICAgICAgcHVibGljIG5hbWU6IHN0cmluZyA9ICdoZW5rJztcbiAgICB9XG4gIGAsXG4gICAgYFxuICAgIGV4cG9ydCBjbGFzcyBIZW5rIHtcbiAgICAgIHByb3RlY3RlZCBuYW1lOiBzdHJpbmcgPSAnaGVuayc7XG4gICAgfVxuICBgLFxuICApKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5kZXNjcmliZSgnaW1wbGVtZW50IGJhc2UgdHlwZXMgbmVlZCB0byBiZSBwcmVzZW50IGluIHVwZGF0ZWQgdHlwZSBzeXN0ZW0nLCAoKSA9PiB7XG4gIHRlc3QoJ2ZvciBpbnRlcmZhY2VzJywgKCkgPT5cbiAgICBleHBlY3RFcnJvcihcbiAgICAgIC9ub3QgYXNzaWduYWJsZSB0byBhbGwgYmFzZSB0eXBlcyBhbnltb3JlLyxcbiAgICAgIGBcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgSVBhcGEge1xuICAgICAgICByZWFkb25seSBwaXBlOiBzdHJpbmc7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgSUJlYmUgZXh0ZW5kcyBJUGFwYSB7XG4gICAgICAgIHJlYWRvbmx5IHBhY2lmaWVyOiBzdHJpbmc7XG4gICAgICB9XG4gICAgYCxcbiAgICAgIGBcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgSVBhcGEge1xuICAgICAgICByZWFkb25seSBwaXBlOiBzdHJpbmc7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgSUJlYmUge1xuICAgICAgICByZWFkb25seSBwYWNpZmllcjogc3RyaW5nO1xuICAgICAgfVxuICAgIGAsXG4gICAgKSk7XG5cbiAgdGVzdCgnZm9yIHN0cnVjdHMnLCAoKSA9PlxuICAgIGV4cGVjdEVycm9yKFxuICAgICAgL25vdCBhc3NpZ25hYmxlIHRvIGFsbCBiYXNlIHR5cGVzIGFueW1vcmUvLFxuICAgICAgYFxuICAgICAgZXhwb3J0IGludGVyZmFjZSBQYXBhIHtcbiAgICAgICAgcmVhZG9ubHkgcGlwZTogc3RyaW5nO1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgaW50ZXJmYWNlIEJlYmUgZXh0ZW5kcyBQYXBhIHtcbiAgICAgICAgcmVhZG9ubHkgcGFjaWZpZXI6IHN0cmluZztcbiAgICAgIH1cbiAgICBgLFxuICAgICAgYFxuICAgICAgZXhwb3J0IGludGVyZmFjZSBQYXBhIHtcbiAgICAgICAgcmVhZG9ubHkgcGlwZTogc3RyaW5nO1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgaW50ZXJmYWNlIEJlYmUge1xuICAgICAgICByZWFkb25seSBwYWNpZmllcjogc3RyaW5nO1xuICAgICAgfVxuICAgIGAsXG4gICAgKSk7XG5cbiAgdGVzdCgnZm9yIGNsYXNzZXMnLCAoKSA9PlxuICAgIGV4cGVjdEVycm9yKFxuICAgICAgL25vdCBhc3NpZ25hYmxlIHRvIGFsbCBiYXNlIHR5cGVzIGFueW1vcmUvLFxuICAgICAgYFxuICAgICAgZXhwb3J0IGludGVyZmFjZSBJUGFwYSB7XG4gICAgICAgIHJlYWRvbmx5IHBpcGU6IHN0cmluZztcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGNsYXNzIEJlYmUgaW1wbGVtZW50cyBJUGFwYSB7XG4gICAgICAgIHJlYWRvbmx5IHBpcGU6IHN0cmluZyA9ICdwZmYnO1xuICAgICAgICByZWFkb25seSBwYWNpZmllcjogc3RyaW5nID0gJ21tbSc7XG4gICAgICB9XG4gICAgYCxcbiAgICAgIGBcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgSVBhcGEge1xuICAgICAgICByZWFkb25seSBwaXBlOiBzdHJpbmc7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBjbGFzcyBCZWJlIHtcbiAgICAgICAgcmVhZG9ubHkgcGlwZTogc3RyaW5nID0gJ3BmZic7XG4gICAgICAgIHJlYWRvbmx5IHBhY2lmaWVyOiBzdHJpbmcgPSAnbW1tJztcbiAgICAgIH1cbiAgICBgLFxuICAgICkpO1xuXG4gIHRlc3QoJ2ZvciBiYXNlIGNsYXNzZXMnLCAoKSA9PlxuICAgIGV4cGVjdEVycm9yKFxuICAgICAgL25vdCBhc3NpZ25hYmxlIHRvIGFsbCBiYXNlIHR5cGVzIGFueW1vcmUvLFxuICAgICAgYFxuICAgICAgZXhwb3J0IGNsYXNzIFBhcGEge1xuICAgICAgICByZWFkb25seSBwaXBlOiBzdHJpbmcgPSAncGZmJztcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGNsYXNzIEJlYmUgZXh0ZW5kcyBQYXBhIHtcbiAgICAgICAgcmVhZG9ubHkgcGFjaWZpZXI6IHN0cmluZyA9ICdtbW0nO1xuICAgICAgfVxuICAgIGAsXG4gICAgICBgXG4gICAgICBleHBvcnQgY2xhc3MgUGFwYSB7XG4gICAgICAgIHJlYWRvbmx5IHBpcGU6IHN0cmluZyA9ICdwZmYnO1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgY2xhc3MgQmViZSB7XG4gICAgICAgIHJlYWRvbmx5IHBhY2lmaWVyOiBzdHJpbmcgPSAnbW1tJztcbiAgICAgIH1cbiAgICBgLFxuICAgICkpO1xuXG4gIHRlc3QoJ25ldyBsZXZlbHMgb2YgaW5oZXJpdGFuY2UgYXJlIGFsbG93ZWQnLCAoKSA9PlxuICAgIGV4cGVjdE5vRXJyb3IoXG4gICAgICBgXG4gICAgICBleHBvcnQgY2xhc3MgUGFwYSB7XG4gICAgICAgIHJlYWRvbmx5IHBpcGU6IHN0cmluZyA9ICdwZmYnO1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgY2xhc3MgQmViZSBleHRlbmRzIFBhcGEge1xuICAgICAgICByZWFkb25seSBwYWNpZmllcjogc3RyaW5nID0gJ21tbSc7XG4gICAgICB9XG4gICAgYCxcbiAgICAgIGBcbiAgICAgIGV4cG9ydCBjbGFzcyBQYXBhIHtcbiAgICAgICAgcmVhZG9ubHkgcGlwZTogc3RyaW5nID0gJ3BmZic7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBjbGFzcyBJbmJldHdlZW4gZXh0ZW5kcyBQYXBhIHtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGNsYXNzIEJlYmUgZXh0ZW5kcyBJbmJldHdlZW4ge1xuICAgICAgICByZWFkb25seSBwYWNpZmllcjogc3RyaW5nID0gJ21tbSc7XG4gICAgICB9XG4gICAgYCxcbiAgICApKTtcblxuICB0ZXN0KCdjaGFuZ2UgZGlyZWN0IGltcGxlbWVudGF0aW9uIHRvIGluaGVyaXRlZCBpbXBsZW1lbnRhdGlvbiB2aWEgaW50ZXJmYWNlJywgKCkgPT5cbiAgICBleHBlY3ROb0Vycm9yKFxuICAgICAgYFxuICAgICAgZXhwb3J0IGludGVyZmFjZSBJUGFwYSB7XG4gICAgICAgIHJlYWRvbmx5IHBpcGU6IHN0cmluZztcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGNsYXNzIEJlYmUgaW1wbGVtZW50cyBJUGFwYSB7XG4gICAgICAgIHJlYWRvbmx5IHBpcGU6IHN0cmluZyA9ICdwZmYnO1xuICAgICAgICByZWFkb25seSBwYWNpZmllcjogc3RyaW5nID0gJ21tbSc7XG4gICAgICB9XG4gICAgYCxcbiAgICAgIGBcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgSVBhcGEge1xuICAgICAgICByZWFkb25seSBwaXBlOiBzdHJpbmc7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgSUluYmV0d2VlbiBleHRlbmRzIElQYXBhIHtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGNsYXNzIEJlYmUgaW1wbGVtZW50cyBJSW5iZXR3ZWVuIHtcbiAgICAgICAgcmVhZG9ubHkgcGlwZTogc3RyaW5nID0gJ3BmZic7XG4gICAgICAgIHJlYWRvbmx5IHBhY2lmaWVyOiBzdHJpbmcgPSAnbW1tJztcbiAgICAgIH1cbiAgICBgLFxuICAgICkpO1xuXG4gIHRlc3QoJ2NoYW5nZSBkaXJlY3QgaW1wbGVtZW50YXRpb24gdG8gaW5oZXJpdGVkIGltcGxlbWVudGF0aW9uIHZpYSBiYXNlIGNsYXNzJywgKCkgPT5cbiAgICBleHBlY3ROb0Vycm9yKFxuICAgICAgYFxuICAgICAgZXhwb3J0IGludGVyZmFjZSBJUGFwYSB7XG4gICAgICAgIHJlYWRvbmx5IHBpcGU6IHN0cmluZztcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGNsYXNzIEJlYmUgaW1wbGVtZW50cyBJUGFwYSB7XG4gICAgICAgIHJlYWRvbmx5IHBpcGU6IHN0cmluZyA9ICdwZmYnO1xuICAgICAgICByZWFkb25seSBwYWNpZmllcjogc3RyaW5nID0gJ21tbSc7XG4gICAgICB9XG4gICAgYCxcbiAgICAgIGBcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgSVBhcGEge1xuICAgICAgICByZWFkb25seSBwaXBlOiBzdHJpbmc7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBjbGFzcyBJbmJldHdlZW4gaW1wbGVtZW50cyBJUGFwYSB7XG4gICAgICAgIHJlYWRvbmx5IHBpcGU6IHN0cmluZyA9ICdwZmYnO1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgY2xhc3MgQmViZSBleHRlbmRzIEluYmV0d2VlbiB7XG4gICAgICAgIHJlYWRvbmx5IHBhY2lmaWVyOiBzdHJpbmcgPSAnbW1tJztcbiAgICAgIH1cbiAgICBgLFxuICAgICkpO1xufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudGVzdC5lYWNoKFtcbiAge1xuICAgIG9sZERlY2w6ICduYW1lOiBzdHJpbmcnLFxuICAgIG5ld0RlY2w6ICduYW1lPzogc3RyaW5nJyxcbiAgICBlcnJvcjpcbiAgICAgIC90eXBlIE9wdGlvbmFsPHN0cmluZz4gXFwoZm9ybWVybHkgc3RyaW5nXFwpOiBvdXRwdXQgdHlwZSBpcyBub3cgb3B0aW9uYWwvLFxuICB9LFxuICB7XG4gICAgb2xkRGVjbDogJ25hbWU/OiBzdHJpbmcnLFxuICAgIG5ld0RlY2w6ICduYW1lOiBzdHJpbmcnLFxuICAgIGVycm9yOiB1bmRlZmluZWQsIC8vIFN0cmVuZ3RoZW5pbmcgaXMgb2theVxuICB9LFxuICB7XG4gICAgb2xkRGVjbDogJ25hbWU6IHN0cmluZycsXG4gICAgbmV3RGVjbDogJ25hbWU6IHN0cmluZyB8IG51bWJlcicsXG4gICAgZXJyb3I6IC9zdHJpbmcgXFx8IG51bWJlciBpcyBub3QgYXNzaWduYWJsZSB0byBzdHJpbmcvLFxuICB9LFxuICB7XG4gICAgb2xkRGVjbDogJ25hbWU6IHN0cmluZyB8IG51bWJlcicsXG4gICAgbmV3RGVjbDogJ25hbWU6IHN0cmluZycsXG4gICAgZXJyb3I6IHVuZGVmaW5lZCwgLy8gU3RyZW5ndGhlbmluZyBpcyBva2F5XG4gIH0sXG5dKSgnY2hhbmdlIGNsYXNzIHByb3BlcnR5ICcsICh7IG9sZERlY2wsIG5ld0RlY2wsIGVycm9yIH0pID0+XG4gIGV4cGVjdEVycm9yKFxuICAgIGVycm9yLFxuICAgIGBcbiAgICBleHBvcnQgY2xhc3MgSGVuayB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgJHtvbGREZWNsfSA9ICdoZW5rJztcbiAgICB9XG4gIGAsXG4gICAgYFxuICAgIGV4cG9ydCBjbGFzcyBIZW5rIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSAke25ld0RlY2x9ID0gJ2hlbmsnO1xuICAgIH1cbiAgYCxcbiAgKSxcbik7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudGVzdC5lYWNoKFtcbiAge1xuICAgIG9sZERlY2w6ICduYW1lOiBzdHJpbmcnLFxuICAgIG5ld0RlY2w6ICduYW1lPzogc3RyaW5nJyxcbiAgICBlcnJvcjogL2NoYW5nZWQgdG8gT3B0aW9uYWw8c3RyaW5nPiBcXChmb3JtZXJseSBzdHJpbmdcXCkvLFxuICB9LFxuICB7XG4gICAgb2xkRGVjbDogJ25hbWU/OiBzdHJpbmcnLFxuICAgIG5ld0RlY2w6ICduYW1lOiBzdHJpbmcnLFxuICAgIGVycm9yOiAvY2hhbmdlZCB0byBzdHJpbmcgXFwoZm9ybWVybHkgT3B0aW9uYWw8c3RyaW5nPlxcKS8sXG4gIH0sXG4gIHtcbiAgICBvbGREZWNsOiAnbmFtZTogc3RyaW5nJyxcbiAgICBuZXdEZWNsOiAnbmFtZTogc3RyaW5nIHwgbnVtYmVyJyxcbiAgICBlcnJvcjogL2NoYW5nZWQgdG8gc3RyaW5nIFxcfCBudW1iZXIgXFwoZm9ybWVybHkgc3RyaW5nXFwpLyxcbiAgfSxcbiAge1xuICAgIG9sZERlY2w6ICduYW1lOiBzdHJpbmcgfCBudW1iZXInLFxuICAgIG5ld0RlY2w6ICduYW1lOiBzdHJpbmcnLFxuICAgIGVycm9yOiAvY2hhbmdlZCB0byBzdHJpbmcgXFwoZm9ybWVybHkgc3RyaW5nIFxcfCBudW1iZXJcXCkvLFxuICB9LFxuXSkoXG4gICdjYW5ub3QgY2hhbmdlIGEgbXV0YWJsZSBjbGFzcyBwcm9wZXJ0eSB0eXBlOiAlcCB0byAlcCcsXG4gICh7IG9sZERlY2wsIG5ld0RlY2wsIGVycm9yIH0pID0+XG4gICAgZXhwZWN0RXJyb3IoXG4gICAgICBlcnJvcixcbiAgICAgIGBcbiAgICAgIGV4cG9ydCBjbGFzcyBIZW5rIHtcbiAgICAgICAgcHVibGljICR7b2xkRGVjbH0gPSAnaGVuayc7XG4gICAgICB9XG4gICAgYCxcbiAgICAgIGBcbiAgICAgIGV4cG9ydCBjbGFzcyBIZW5rIHtcbiAgICAgICAgcHVibGljICR7bmV3RGVjbH0gPSAnaGVuayc7XG4gICAgICB9XG4gICAgYCxcbiAgICApLFxuKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50ZXN0KCdjb25zaWRlciBpbmhlcml0ZWQgY29uc3RydWN0b3InLCAoKSA9PlxuICBleHBlY3RFcnJvcihcbiAgICAvbnVtYmVyIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHN0cmluZy8sXG4gICAgYFxuICAgIGV4cG9ydCBjbGFzcyBTdXBlciB7XG4gICAgICBjb25zdHJ1Y3RvcihwYXJhbTogbnVtYmVyKSB7XG4gICAgICAgIEFycmF5LmlzQXJyYXkocGFyYW0pO1xuICAgICAgfVxuICAgIH1cbiAgICBleHBvcnQgY2xhc3MgU3ViIGV4dGVuZHMgU3VwZXIge1xuICAgIH1cbiAgYCxcbiAgICBgXG4gICAgZXhwb3J0IGNsYXNzIFN1cGVyIHtcbiAgICAgIGNvbnN0cnVjdG9yKHBhcmFtOiBudW1iZXIpIHtcbiAgICAgICAgQXJyYXkuaXNBcnJheShwYXJhbSk7XG4gICAgICB9XG4gICAgfVxuICAgIGV4cG9ydCBjbGFzcyBTdWIgZXh0ZW5kcyBTdXBlciB7XG4gICAgICBjb25zdHJ1Y3RvcihwYXJhbTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKDUpO1xuICAgICAgICBBcnJheS5pc0FycmF5KHBhcmFtKTtcbiAgICAgIH1cbiAgICB9XG4gIGAsXG4gICkpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnRlc3QoJ2NvbnNpZGVyIGluaGVyaXRlZCBjb25zdHJ1Y3RvciwgdGhlIG90aGVyIHdheScsICgpID0+XG4gIGV4cGVjdEVycm9yKFxuICAgIC9uZXdseSByZXF1aXJlZCBhcmd1bWVudC8sXG4gICAgYFxuICAgIGV4cG9ydCBjbGFzcyBTdXBlciB7XG4gICAgICBjb25zdHJ1Y3RvcihwYXJhbTogbnVtYmVyKSB7XG4gICAgICAgIEFycmF5LmlzQXJyYXkocGFyYW0pO1xuICAgICAgfVxuICAgIH1cbiAgICBleHBvcnQgY2xhc3MgU3ViIGV4dGVuZHMgU3VwZXIge1xuICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKDUpO1xuICAgICAgfVxuICAgIH1cbiAgYCxcbiAgICBgXG4gICAgZXhwb3J0IGNsYXNzIFN1cGVyIHtcbiAgICAgIGNvbnN0cnVjdG9yKHBhcmFtOiBudW1iZXIpIHtcbiAgICAgICAgQXJyYXkuaXNBcnJheShwYXJhbSk7XG4gICAgICB9XG4gICAgfVxuICAgIGV4cG9ydCBjbGFzcyBTdWIgZXh0ZW5kcyBTdXBlciB7XG4gICAgfVxuICBgLFxuICApKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50ZXN0KCdtZXRob2QgY2FuIGJlIG1vdmVkIHRvIHN1cGVydHlwZScsICgpID0+XG4gIGV4cGVjdE5vRXJyb3IoXG4gICAgYFxuICAgIGV4cG9ydCBjbGFzcyBTdXBlciB7XG4gICAgfVxuICAgIGV4cG9ydCBjbGFzcyBTdWIgZXh0ZW5kcyBTdXBlciB7XG4gICAgICBwdWJsaWMgZm9vKHBhcmFtOiBudW1iZXIpIHtcbiAgICAgICAgQXJyYXkuaXNBcnJheShwYXJhbSk7XG4gICAgICB9XG4gICAgfVxuICBgLFxuICAgIGBcbiAgICBleHBvcnQgY2xhc3MgU3VwZXIge1xuICAgICAgcHVibGljIGZvbyhwYXJhbTogbnVtYmVyKSB7XG4gICAgICAgIEFycmF5LmlzQXJyYXkocGFyYW0pO1xuICAgICAgfVxuICAgIH1cbiAgICBleHBvcnQgY2xhc3MgU3ViIGV4dGVuZHMgU3VwZXIge1xuICAgIH1cbiAgYCxcbiAgKSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudGVzdCgncHJvcGVydHkgY2FuIGJlIG1vdmVkIHRvIHN1cGVydHlwZScsICgpID0+XG4gIGV4cGVjdE5vRXJyb3IoXG4gICAgYFxuICAgIGV4cG9ydCBjbGFzcyBTdXBlciB7XG4gICAgfVxuICAgIGV4cG9ydCBjbGFzcyBTdWIgZXh0ZW5kcyBTdXBlciB7XG4gICAgICBwdWJsaWMgZm9vOiBzdHJpbmcgPSAnZm9vJztcbiAgICB9XG4gIGAsXG4gICAgYFxuICAgIGV4cG9ydCBjbGFzcyBTdXBlciB7XG4gICAgICBwdWJsaWMgZm9vOiBzdHJpbmcgPSAnZm9vJztcbiAgICB9XG4gICAgZXhwb3J0IGNsYXNzIFN1YiBleHRlbmRzIFN1cGVyIHtcbiAgICB9XG4gIGAsXG4gICkpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnRlc3QoJ3N1YmNsYXNzYWJsZSBpcyBmb3JldmVyJywgKCkgPT5cbiAgZXhwZWN0RXJyb3IoXG4gICAgL2hhcyBnb25lIGZyb20gQHN1YmNsYXNzYWJsZSB0byBub24tQHN1YmNsYXNzYWJsZS8sXG4gICAgYFxuICAgIC8qKlxuICAgICAqIEBzdWJjbGFzc2FibGVcbiAgICAgKi9cbiAgICBleHBvcnQgY2xhc3MgU3VwZXIge1xuICAgIH1cbiAgYCxcbiAgICBgXG4gICAgZXhwb3J0IGNsYXNzIFN1cGVyIHtcbiAgICB9XG4gIGAsXG4gICkpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnRlc3QoJ2NoYW5nZSBmcm9tIG1ldGhvZCB0byBwcm9wZXJ0eScsICgpID0+XG4gIGV4cGVjdEVycm9yKFxuICAgIC9jaGFuZ2VkIGZyb20gbWV0aG9kIHRvIHByb3BlcnR5LyxcbiAgICBgXG4gICAgZXhwb3J0IGNsYXNzIEJvb20ge1xuICAgICAgcHVibGljIGZvbygpIHsgcmV0dXJuIDEyOyB9XG4gICAgfVxuICAgIGAsXG4gICAgYFxuICAgIGV4cG9ydCBjbGFzcyBCb29tIHtcbiAgICAgIHB1YmxpYyBnZXQgZm9vKCkgeyByZXR1cm4gMTI7IH1cbiAgICB9XG4gICAgYCxcbiAgKSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudGVzdCgnY2hhbmdlIGZyb20gbWV0aG9kIHdpdGggYXJndW1lbnRzIHRvIHByb3BlcnR5JywgKCkgPT5cbiAgZXhwZWN0RXJyb3IoXG4gICAgL2NoYW5nZWQgZnJvbSBtZXRob2QgdG8gcHJvcGVydHkvLFxuICAgIGBcbiAgICBleHBvcnQgY2xhc3MgQm9vbSB7XG4gICAgICBwdWJsaWMgZm9vKGFyZzogbnVtYmVyKSB7IHJldHVybiAxMiAqIGFyZzsgfVxuICAgIH1cbiAgICBgLFxuICAgIGBcbiAgICBleHBvcnQgY2xhc3MgQm9vbSB7XG4gICAgICBwdWJsaWMgZ2V0IGZvbygpIHsgcmV0dXJuIDEyOyB9XG4gICAgfVxuICAgIGAsXG4gICkpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnRlc3QoJ2NoYW5nZSBmcm9tIHByb3BlcnR5IHRvIG1ldGhvZCcsICgpID0+XG4gIGV4cGVjdEVycm9yKFxuICAgIC9jaGFuZ2VkIGZyb20gcHJvcGVydHkgdG8gbWV0aG9kLyxcbiAgICBgXG4gICAgZXhwb3J0IGNsYXNzIEJvb20ge1xuICAgICAgcHVibGljIGdldCBmb28oKSB7IHJldHVybiAxMjsgfVxuICAgIH1cbiAgICBgLFxuICAgIGBcbiAgICBleHBvcnQgY2xhc3MgQm9vbSB7XG4gICAgICBwdWJsaWMgZm9vKCkgeyByZXR1cm4gMTI7IH1cbiAgICB9XG4gICAgYCxcbiAgKSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudGVzdC5lYWNoKFtcbiAge1xuICAgIG9sZERlY2w6ICdmb28oYXJnOiBzdHJpbmcpIHsgQXJyYXkuaXNBcnJheShhcmcpOyB9JyxcbiAgICBuZXdEZWNsOiAnZm9vKGFyZzogc3RyaW5nIHwgbnVtYmVyKSB7IEFycmF5LmlzQXJyYXkoYXJnKTsgfScsXG4gIH0sXG4gIHtcbiAgICBvbGREZWNsOiAnZm9vKCk6IHN0cmluZyB7IHJldHVybiBcInhcIjsgfScsXG4gICAgbmV3RGVjbDogJ2ZvbygpOiBzdHJpbmcgfCBudW1iZXIgeyByZXR1cm4gXCJ4XCI7IH0nLFxuICB9LFxuICB7XG4gICAgb2xkRGVjbDogJ3JlYWRvbmx5IGZvbzogc3RyaW5nID0gXCJ4XCI7JyxcbiAgICBuZXdEZWNsOiAncmVhZG9ubHkgZm9vOiBzdHJpbmcgfCBudW1iZXIgPSBcInhcIjsnLFxuICB9LFxuXSkoXG4gICdjYW5ub3QgY2hhbmdlIGFueSB0eXBlIGluIEBzdWJjbGFzc2FibGUgY2xhc3M6ICVwIHRvICVwJyxcbiAgKHsgb2xkRGVjbCwgbmV3RGVjbCB9KSA9PlxuICAgIGV4cGVjdEVycm9yKFxuICAgICAgL3R5cGUgaXMgQHN1YmNsYXNzYWJsZS8sXG4gICAgICBgXG4gICAgICAvKiogQHN1YmNsYXNzYWJsZSAqL1xuICAgICAgZXhwb3J0IGNsYXNzIEJvb20ge1xuICAgICAgICBwdWJsaWMgJHtvbGREZWNsfVxuICAgICAgfVxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgIC8qKiBAc3ViY2xhc3NhYmxlICovXG4gICAgICBleHBvcnQgY2xhc3MgQm9vbSB7XG4gICAgICAgIHB1YmxpYyAke25ld0RlY2x9XG4gICAgICB9XG4gICAgICBgLFxuICAgICksXG4pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnRlc3QuZWFjaChbXG4gIHtcbiAgICBvbGREZWNsOiAnZm9vKGFyZzogc3RyaW5nKTogdm9pZDsnLFxuICAgIG5ld0RlY2w6ICdmb28oYXJnOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkOycsXG4gIH0sXG4gIHsgb2xkRGVjbDogJ2ZvbygpOiBzdHJpbmc7JywgbmV3RGVjbDogJ2ZvbygpOiBzdHJpbmcgfCBudW1iZXI7JyB9LFxuICB7XG4gICAgb2xkRGVjbDogJ3JlYWRvbmx5IGZvbzogc3RyaW5nOycsXG4gICAgbmV3RGVjbDogJ3JlYWRvbmx5IGZvbzogc3RyaW5nIHwgbnVtYmVyOycsXG4gIH0sXG5dKShcbiAgJ2Nhbm5vdCBjaGFuZ2UgYW55IHR5cGUgaW4gQHN1YmNsYXNzYWJsZSBpbnRlcmZhY2U6ICVwIHRvICVwJyxcbiAgKHsgb2xkRGVjbCwgbmV3RGVjbCB9KSA9PlxuICAgIGV4cGVjdEVycm9yKFxuICAgICAgL3R5cGUgaXMgQHN1YmNsYXNzYWJsZS8sXG4gICAgICBgXG4gICAgICAvKiogQHN1YmNsYXNzYWJsZSAqL1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBJQm9vbSB7XG4gICAgICAgICR7b2xkRGVjbH1cbiAgICAgIH1cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAvKiogQHN1YmNsYXNzYWJsZSAqL1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBJQm9vbSB7XG4gICAgICAgICR7bmV3RGVjbH1cbiAgICAgIH1cbiAgICAgIGAsXG4gICAgKSxcbik7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudGVzdC5lYWNoKFtcbiAgLy8gTm8gdXNhZ2UgPT4gY2FuIGFkZCBmaWVsZFxuICBbJycsIHRydWVdLFxuICAvLyBSZXR1cm4gdHlwZSA9PiBjYW4gYWRkIGZpZWxkXG4gIFsnZm9vKCk6IFRoZVN0cnVjdDsnLCB0cnVlXSxcbiAgWydyZWFkb25seSBmb286IFRoZVN0cnVjdDsnLCB0cnVlXSxcbiAgLy8gSW5wdXQgdHlwZSA9PiBjYW4gTk9UIGFkZCBmaWVsZFxuICBbJ2ZvbzogVGhlU3RydWN0OycsIGZhbHNlXSxcbiAgWydmb28oYXJnOiBUaGVTdHJ1Y3QpOiB2b2lkJywgZmFsc2VdLFxuXSkoXG4gICdhZGQgcmVxdWlyZWQgZmllbGQgdG8gc3RydWN0czogcmVmZW5jaW5nIHZpYSAlcCAtPiBhbGxvd2VkICVwJyxcbiAgKHVzYWdlRGVjbCwgYWxsb3dlZCkgPT5cbiAgICBleHBlY3RFcnJvcihcbiAgICAgIGFsbG93ZWQgPyB1bmRlZmluZWQgOiAvbmV3bHkgcmVxdWlyZWQgcHJvcGVydHkgJ2ZpZWxkVHdvJyBhZGRlZC8sXG4gICAgICBgXG4gICAgICBleHBvcnQgaW50ZXJmYWNlIFRoZVN0cnVjdCB7XG4gICAgICAgIHJlYWRvbmx5IGZpZWxkT25lOiBzdHJpbmc7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgSUNvbnN1bWVyIHtcbiAgICAgICAgJHt1c2FnZURlY2x9XG4gICAgICB9XG4gICAgICBgLFxuICAgICAgYFxuICAgICAgZXhwb3J0IGludGVyZmFjZSBUaGVTdHJ1Y3Qge1xuICAgICAgICByZWFkb25seSBmaWVsZE9uZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBmaWVsZFR3bzogc3RyaW5nO1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgaW50ZXJmYWNlIElDb25zdW1lciB7XG4gICAgICAgICR7dXNhZ2VEZWNsfVxuICAgICAgfVxuICAgICAgYCxcbiAgICApLFxuKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50ZXN0LmVhY2goW1xuICAvLyBObyB1c2FnZSA9PiBjYW4gYWRkIGZpZWxkXG4gIFsnJywgdHJ1ZV0sXG4gIC8vIFJldHVybiB0eXBlID0+IGNhbiBOT1QgcmVtb3ZlIGluZm9ybWF0aW9uXG4gIFsnZm9vKCk6IFRoZVN0cnVjdDsnLCBmYWxzZV0sXG4gIFsncmVhZG9ubHkgZm9vOiBUaGVTdHJ1Y3Q7JywgZmFsc2VdLFxuICBbJ2ZvbzogVGhlU3RydWN0OycsIGZhbHNlXSxcbiAgLy8gSW5wdXQgdHlwZSA9PiBjYW4gbWFrZSBvcHRpb25hbFxuICBbJ2Zvbyhhcmc6IFRoZVN0cnVjdCk6IHZvaWQnLCB0cnVlXSxcbl0pKFxuICAnbWFrZSByZXF1aXJlZCBmaWVsZCBvcHRpb25hbDogcmVmZW5jaW5nIHZpYSAlcCAtPiBhbGxvd2VkICVwJyxcbiAgKHVzYWdlRGVjbCwgYWxsb3dlZCkgPT5cbiAgICBleHBlY3RFcnJvcihcbiAgICAgIGFsbG93ZWQgPyB1bmRlZmluZWQgOiAvZm9ybWVybHkgcmVxdWlyZWQgcHJvcGVydHkgJ2ZpZWxkT25lJyBpcyBvcHRpb25hbC8sXG4gICAgICBgXG4gICAgICBleHBvcnQgaW50ZXJmYWNlIFRoZVN0cnVjdCB7XG4gICAgICAgIHJlYWRvbmx5IGZpZWxkT25lOiBzdHJpbmc7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgSUNvbnN1bWVyIHtcbiAgICAgICAgJHt1c2FnZURlY2x9XG4gICAgICB9XG4gICAgICBgLFxuICAgICAgYFxuICAgICAgZXhwb3J0IGludGVyZmFjZSBUaGVTdHJ1Y3Qge1xuICAgICAgICByZWFkb25seSBmaWVsZE9uZT86IHN0cmluZztcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGludGVyZmFjZSBJQ29uc3VtZXIge1xuICAgICAgICAke3VzYWdlRGVjbH1cbiAgICAgIH1cbiAgICAgIGAsXG4gICAgKSxcbik7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|