testcafe 3.7.4 → 3.7.5
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/lib/assertions/executor.js +2 -2
- package/lib/browser/provider/utils/client-functions.js +1 -3
- package/lib/cli/argument-parser/index.js +3 -3
- package/lib/client/automation/index.js +5 -4
- package/lib/client/automation/playback/press/utils.js +3 -2
- package/lib/client/browser/service-worker.js +1 -1
- package/lib/client/core/index.js +6 -10
- package/lib/client/core/utils/dom.js +2 -2
- package/lib/client/driver/index.js +429 -425
- package/lib/client/driver/index.min.js +1 -1
- package/lib/client/ui/favicon.ico +0 -0
- package/lib/client/ui/index.js +426 -426
- package/lib/client/ui/index.min.js +1 -1
- package/lib/client/ui/sprite.png +0 -0
- package/lib/client-functions/replicator.js +2 -2
- package/lib/client-functions/selectors/selector-attribute-filter.js +1 -3
- package/lib/client-functions/selectors/selector-text-filter.js +1 -3
- package/lib/configuration/types.js +1 -2
- package/lib/custom-client-scripts/client-script-init.js +1 -1
- package/lib/custom-client-scripts/problematic-scripts.js +1 -1
- package/lib/custom-client-scripts/utils.js +4 -4
- package/lib/live/controller.js +5 -5
- package/lib/reporter/plugin-host.js +3 -1
- package/lib/test-run/commands/validations/argument.js +3 -2
- package/lib/test-run/index.js +2 -2
- package/lib/utils/replicator/index.js +442 -0
- package/package.json +20 -23
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable no-var */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
// Const
|
|
5
|
+
var TRANSFORMED_TYPE_KEY = '@t';
|
|
6
|
+
var CIRCULAR_REF_KEY = '@r';
|
|
7
|
+
var KEY_REQUIRE_ESCAPING_RE = /^#*@(t|r)$/;
|
|
8
|
+
var TYPED_ARRAY_CTORS = {
|
|
9
|
+
'Int8Array': typeof Int8Array === 'function' ? Int8Array : void 0,
|
|
10
|
+
'Uint8Array': typeof Uint8Array === 'function' ? Uint8Array : void 0,
|
|
11
|
+
'Uint8ClampedArray': typeof Uint8ClampedArray === 'function' ? Uint8ClampedArray : void 0,
|
|
12
|
+
'Int16Array': typeof Int16Array === 'function' ? Int16Array : void 0,
|
|
13
|
+
'Uint16Array': typeof Uint16Array === 'function' ? Uint16Array : void 0,
|
|
14
|
+
'Int32Array': typeof Int32Array === 'function' ? Int32Array : void 0,
|
|
15
|
+
'Uint32Array': typeof Uint32Array === 'function' ? Uint32Array : void 0,
|
|
16
|
+
'Float32Array': typeof Float32Array === 'function' ? Float32Array : void 0,
|
|
17
|
+
'Float64Array': typeof Float64Array === 'function' ? Float64Array : void 0,
|
|
18
|
+
};
|
|
19
|
+
var SAFE_ERROR_CTORS = {
|
|
20
|
+
'Error': Error,
|
|
21
|
+
'EvalError': EvalError,
|
|
22
|
+
'RangeError': RangeError,
|
|
23
|
+
'ReferenceError': ReferenceError,
|
|
24
|
+
'SyntaxError': SyntaxError,
|
|
25
|
+
'TypeError': TypeError,
|
|
26
|
+
'URIError': URIError,
|
|
27
|
+
};
|
|
28
|
+
var ARRAY_BUFFER_SUPPORTED = typeof ArrayBuffer === 'function';
|
|
29
|
+
var MAP_SUPPORTED = typeof Map === 'function';
|
|
30
|
+
var SET_SUPPORTED = typeof Set === 'function';
|
|
31
|
+
var BUFFER_FROM_SUPPORTED = typeof Buffer === 'function';
|
|
32
|
+
var TYPED_ARRAY_SUPPORTED = function (typeName) {
|
|
33
|
+
return !!TYPED_ARRAY_CTORS[typeName];
|
|
34
|
+
};
|
|
35
|
+
// Saved proto functions
|
|
36
|
+
var arrSlice = Array.prototype.slice;
|
|
37
|
+
// Default serializer
|
|
38
|
+
var JSONSerializer = {
|
|
39
|
+
serialize: function (val) {
|
|
40
|
+
return JSON.stringify(val);
|
|
41
|
+
},
|
|
42
|
+
deserialize: function (val) {
|
|
43
|
+
return JSON.parse(val);
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
// EncodingTransformer
|
|
47
|
+
var EncodingTransformer = function (val, transforms) {
|
|
48
|
+
this.references = val;
|
|
49
|
+
this.transforms = transforms;
|
|
50
|
+
this.circularCandidates = [];
|
|
51
|
+
this.circularCandidatesDescrs = [];
|
|
52
|
+
this.circularRefCount = 0;
|
|
53
|
+
};
|
|
54
|
+
EncodingTransformer._createRefMark = function (idx) {
|
|
55
|
+
var obj = Object.create(null);
|
|
56
|
+
obj[CIRCULAR_REF_KEY] = idx;
|
|
57
|
+
return obj;
|
|
58
|
+
};
|
|
59
|
+
EncodingTransformer.prototype._createCircularCandidate = function (val, parent, key) {
|
|
60
|
+
this.circularCandidates.push(val);
|
|
61
|
+
this.circularCandidatesDescrs.push({ parent: parent, key: key, refIdx: -1 });
|
|
62
|
+
};
|
|
63
|
+
EncodingTransformer.prototype._applyTransform = function (val, parent, key, transform) {
|
|
64
|
+
var result = Object.create(null);
|
|
65
|
+
var serializableVal = transform.toSerializable(val);
|
|
66
|
+
if (typeof serializableVal === 'object')
|
|
67
|
+
this._createCircularCandidate(val, parent, key);
|
|
68
|
+
result[TRANSFORMED_TYPE_KEY] = transform.type;
|
|
69
|
+
result.data = this._handleValue(serializableVal, parent, key);
|
|
70
|
+
return result;
|
|
71
|
+
};
|
|
72
|
+
EncodingTransformer.prototype._handleArray = function (arr) {
|
|
73
|
+
var result = [];
|
|
74
|
+
for (var i = 0; i < arr.length; i++)
|
|
75
|
+
result[i] = this._handleValue(arr[i], result, i);
|
|
76
|
+
return result;
|
|
77
|
+
};
|
|
78
|
+
EncodingTransformer.prototype._handlePlainObject = function (obj) {
|
|
79
|
+
var replicator = this;
|
|
80
|
+
var result = Object.create(null);
|
|
81
|
+
var ownPropertyNames = Object.getOwnPropertyNames(obj);
|
|
82
|
+
ownPropertyNames.forEach(key => {
|
|
83
|
+
var resultKey = KEY_REQUIRE_ESCAPING_RE.test(key) ? '#' + key : key;
|
|
84
|
+
result[resultKey] = replicator._handleValue(obj[key], result, resultKey);
|
|
85
|
+
});
|
|
86
|
+
return result;
|
|
87
|
+
};
|
|
88
|
+
EncodingTransformer.prototype._handleObject = function (obj, parent, key) {
|
|
89
|
+
this._createCircularCandidate(obj, parent, key);
|
|
90
|
+
return Array.isArray(obj) ? this._handleArray(obj) : this._handlePlainObject(obj);
|
|
91
|
+
};
|
|
92
|
+
EncodingTransformer.prototype._ensureCircularReference = function (obj) {
|
|
93
|
+
var circularCandidateIdx = this.circularCandidates.indexOf(obj);
|
|
94
|
+
if (circularCandidateIdx > -1) {
|
|
95
|
+
var descr = this.circularCandidatesDescrs[circularCandidateIdx];
|
|
96
|
+
if (descr.refIdx === -1)
|
|
97
|
+
descr.refIdx = descr.parent ? ++this.circularRefCount : 0;
|
|
98
|
+
return EncodingTransformer._createRefMark(descr.refIdx);
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
};
|
|
102
|
+
EncodingTransformer.prototype._handleValue = function (val, parent, key) {
|
|
103
|
+
var type = typeof val;
|
|
104
|
+
var isObject = type === 'object' && val !== null;
|
|
105
|
+
if (isObject) {
|
|
106
|
+
var refMark = this._ensureCircularReference(val);
|
|
107
|
+
if (refMark)
|
|
108
|
+
return refMark;
|
|
109
|
+
}
|
|
110
|
+
for (var i = 0; i < this.transforms.length; i++) {
|
|
111
|
+
var transform = this.transforms[i];
|
|
112
|
+
if (transform.shouldTransform(type, val))
|
|
113
|
+
return this._applyTransform(val, parent, key, transform);
|
|
114
|
+
}
|
|
115
|
+
if (isObject)
|
|
116
|
+
return this._handleObject(val, parent, key);
|
|
117
|
+
return val;
|
|
118
|
+
};
|
|
119
|
+
EncodingTransformer.prototype.transform = function () {
|
|
120
|
+
var references = [this._handleValue(this.references, null, null)];
|
|
121
|
+
for (var i = 0; i < this.circularCandidatesDescrs.length; i++) {
|
|
122
|
+
var descr = this.circularCandidatesDescrs[i];
|
|
123
|
+
if (descr.refIdx > 0) {
|
|
124
|
+
references[descr.refIdx] = descr.parent[descr.key];
|
|
125
|
+
descr.parent[descr.key] = EncodingTransformer._createRefMark(descr.refIdx);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return references;
|
|
129
|
+
};
|
|
130
|
+
// DecodingTransformer
|
|
131
|
+
var DecodingTransformer = function (references, transformsMap) {
|
|
132
|
+
this.references = references;
|
|
133
|
+
this.transformMap = transformsMap;
|
|
134
|
+
this.activeTransformsStack = [];
|
|
135
|
+
this.visitedRefs = Object.create(null);
|
|
136
|
+
};
|
|
137
|
+
DecodingTransformer.prototype._handlePlainObject = function (obj) {
|
|
138
|
+
var replicator = this;
|
|
139
|
+
var unescaped = Object.create(null);
|
|
140
|
+
var ownPropertyNames = Object.getOwnPropertyNames(obj);
|
|
141
|
+
ownPropertyNames.forEach(key => {
|
|
142
|
+
replicator._handleValue(obj[key], obj, key);
|
|
143
|
+
if (KEY_REQUIRE_ESCAPING_RE.test(key)) {
|
|
144
|
+
// NOTE: use intermediate object to avoid unescaped and escaped keys interference
|
|
145
|
+
// E.g. unescaped "##@t" will be "#@t" which can overwrite escaped "#@t".
|
|
146
|
+
unescaped[key.substring(1)] = obj[key];
|
|
147
|
+
delete obj[key];
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
for (var unescapedKey in unescaped)
|
|
151
|
+
obj[unescapedKey] = unescaped[unescapedKey];
|
|
152
|
+
};
|
|
153
|
+
DecodingTransformer.prototype._handleTransformedObject = function (obj, parent, key) {
|
|
154
|
+
var transformType = obj[TRANSFORMED_TYPE_KEY];
|
|
155
|
+
var transform = this.transformMap[transformType];
|
|
156
|
+
if (!transform)
|
|
157
|
+
throw new Error('Can\'t find transform for "' + transformType + '" type.');
|
|
158
|
+
this.activeTransformsStack.push(obj);
|
|
159
|
+
this._handleValue(obj.data, obj, 'data');
|
|
160
|
+
this.activeTransformsStack.pop();
|
|
161
|
+
parent[key] = transform.fromSerializable(obj.data);
|
|
162
|
+
};
|
|
163
|
+
DecodingTransformer.prototype._handleCircularSelfRefDuringTransform = function (refIdx, parent, key) {
|
|
164
|
+
// NOTE: we've hit a hard case: object reference itself during transformation.
|
|
165
|
+
// We can't dereference it since we don't have resulting object yet. And we'll
|
|
166
|
+
// not be able to restore reference lately because we will need to traverse
|
|
167
|
+
// transformed object again and reference might be unreachable or new object contain
|
|
168
|
+
// new circular references. As a workaround we create getter, so once transformation
|
|
169
|
+
// complete, dereferenced property will point to correct transformed object.
|
|
170
|
+
var references = this.references;
|
|
171
|
+
var val = void 0;
|
|
172
|
+
Object.defineProperty(parent, key, {
|
|
173
|
+
configurable: true,
|
|
174
|
+
enumerable: true,
|
|
175
|
+
get: function () {
|
|
176
|
+
if (val === void 0)
|
|
177
|
+
val = references[refIdx];
|
|
178
|
+
return val;
|
|
179
|
+
},
|
|
180
|
+
set: function (value) {
|
|
181
|
+
val = value;
|
|
182
|
+
// eslint-disable-next-line no-setter-return
|
|
183
|
+
return val;
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
};
|
|
187
|
+
DecodingTransformer.prototype._handleCircularRef = function (refIdx, parent, key) {
|
|
188
|
+
if (this.activeTransformsStack.indexOf(this.references[refIdx]) > -1)
|
|
189
|
+
this._handleCircularSelfRefDuringTransform(refIdx, parent, key);
|
|
190
|
+
else {
|
|
191
|
+
if (!this.visitedRefs[refIdx]) {
|
|
192
|
+
this.visitedRefs[refIdx] = true;
|
|
193
|
+
this._handleValue(this.references[refIdx], this.references, refIdx);
|
|
194
|
+
}
|
|
195
|
+
parent[key] = this.references[refIdx];
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
DecodingTransformer.prototype._handleValue = function (val, parent, key) {
|
|
199
|
+
if (typeof val !== 'object' || val === null)
|
|
200
|
+
return;
|
|
201
|
+
var refIdx = val[CIRCULAR_REF_KEY];
|
|
202
|
+
if (refIdx !== void 0)
|
|
203
|
+
this._handleCircularRef(refIdx, parent, key);
|
|
204
|
+
else if (val[TRANSFORMED_TYPE_KEY])
|
|
205
|
+
this._handleTransformedObject(val, parent, key);
|
|
206
|
+
else if (Array.isArray(val)) {
|
|
207
|
+
for (var i = 0; i < val.length; i++)
|
|
208
|
+
this._handleValue(val[i], val, i);
|
|
209
|
+
}
|
|
210
|
+
else
|
|
211
|
+
this._handlePlainObject(val);
|
|
212
|
+
};
|
|
213
|
+
DecodingTransformer.prototype.transform = function () {
|
|
214
|
+
this.visitedRefs[0] = true;
|
|
215
|
+
this._handleValue(this.references[0], this.references, 0);
|
|
216
|
+
return this.references[0];
|
|
217
|
+
};
|
|
218
|
+
// Transforms
|
|
219
|
+
var builtInTransforms = [
|
|
220
|
+
{
|
|
221
|
+
type: '[[NaN]]',
|
|
222
|
+
shouldTransform: function (type, val) {
|
|
223
|
+
return type === 'number' && isNaN(val);
|
|
224
|
+
},
|
|
225
|
+
toSerializable: function () {
|
|
226
|
+
return '';
|
|
227
|
+
},
|
|
228
|
+
fromSerializable: function () {
|
|
229
|
+
return NaN;
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
type: '[[undefined]]',
|
|
234
|
+
shouldTransform: function (type) {
|
|
235
|
+
return type === 'undefined';
|
|
236
|
+
},
|
|
237
|
+
toSerializable: function () {
|
|
238
|
+
return '';
|
|
239
|
+
},
|
|
240
|
+
fromSerializable: function () {
|
|
241
|
+
return void 0;
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
type: '[[Date]]',
|
|
246
|
+
shouldTransform: function (type, val) {
|
|
247
|
+
return val instanceof Date;
|
|
248
|
+
},
|
|
249
|
+
toSerializable: function (date) {
|
|
250
|
+
return date.getTime();
|
|
251
|
+
},
|
|
252
|
+
fromSerializable: function (val) {
|
|
253
|
+
var date = new Date();
|
|
254
|
+
date.setTime(val);
|
|
255
|
+
return date;
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
type: '[[RegExp]]',
|
|
260
|
+
shouldTransform: function (type, val) {
|
|
261
|
+
return val instanceof RegExp;
|
|
262
|
+
},
|
|
263
|
+
toSerializable: function (re) {
|
|
264
|
+
var result = {
|
|
265
|
+
src: re.source,
|
|
266
|
+
flags: '',
|
|
267
|
+
};
|
|
268
|
+
if (re.global)
|
|
269
|
+
result.flags += 'g';
|
|
270
|
+
if (re.ignoreCase)
|
|
271
|
+
result.flags += 'i';
|
|
272
|
+
if (re.multiline)
|
|
273
|
+
result.flags += 'm';
|
|
274
|
+
return result;
|
|
275
|
+
},
|
|
276
|
+
fromSerializable: function (val) {
|
|
277
|
+
return new RegExp(val.src, val.flags);
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
type: '[[Error]]',
|
|
282
|
+
shouldTransform: function (type, val) {
|
|
283
|
+
return val instanceof Error;
|
|
284
|
+
},
|
|
285
|
+
toSerializable: function (err) {
|
|
286
|
+
return {
|
|
287
|
+
name: err.name,
|
|
288
|
+
message: err.message,
|
|
289
|
+
stack: err.stack,
|
|
290
|
+
};
|
|
291
|
+
},
|
|
292
|
+
fromSerializable: function (val) {
|
|
293
|
+
var Ctor = SAFE_ERROR_CTORS[val.name] || Error;
|
|
294
|
+
var err = new Ctor(val.message);
|
|
295
|
+
err.stack = val.stack;
|
|
296
|
+
return err;
|
|
297
|
+
},
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
type: '[[ArrayBuffer]]',
|
|
301
|
+
shouldTransform: function (type, val) {
|
|
302
|
+
return ARRAY_BUFFER_SUPPORTED && val instanceof ArrayBuffer;
|
|
303
|
+
},
|
|
304
|
+
toSerializable: function (buffer) {
|
|
305
|
+
var view = new Int8Array(buffer);
|
|
306
|
+
return arrSlice.call(view);
|
|
307
|
+
},
|
|
308
|
+
fromSerializable: function (val) {
|
|
309
|
+
if (ARRAY_BUFFER_SUPPORTED) {
|
|
310
|
+
var buffer = new ArrayBuffer(val.length);
|
|
311
|
+
var view = new Int8Array(buffer);
|
|
312
|
+
view.set(val);
|
|
313
|
+
return buffer;
|
|
314
|
+
}
|
|
315
|
+
return val;
|
|
316
|
+
},
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
type: '[[Buffer]]',
|
|
320
|
+
shouldTransform: function (type, val) {
|
|
321
|
+
return BUFFER_FROM_SUPPORTED && val instanceof Buffer;
|
|
322
|
+
},
|
|
323
|
+
toSerializable: function (buffer) {
|
|
324
|
+
return arrSlice.call(buffer);
|
|
325
|
+
},
|
|
326
|
+
fromSerializable: function (val) {
|
|
327
|
+
if (BUFFER_FROM_SUPPORTED)
|
|
328
|
+
return Buffer.from(val);
|
|
329
|
+
return val;
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
type: '[[TypedArray]]',
|
|
334
|
+
shouldTransform: function (type, val) {
|
|
335
|
+
return Object.keys(TYPED_ARRAY_CTORS).some(ctorName => {
|
|
336
|
+
return TYPED_ARRAY_SUPPORTED(ctorName) && val instanceof TYPED_ARRAY_CTORS[ctorName];
|
|
337
|
+
});
|
|
338
|
+
},
|
|
339
|
+
toSerializable: function (arr) {
|
|
340
|
+
return {
|
|
341
|
+
ctorName: arr.constructor.name,
|
|
342
|
+
arr: arrSlice.call(arr),
|
|
343
|
+
};
|
|
344
|
+
},
|
|
345
|
+
fromSerializable: function (val) {
|
|
346
|
+
return TYPED_ARRAY_SUPPORTED(val.ctorName) ? new TYPED_ARRAY_CTORS[val.ctorName](val.arr) : val.arr;
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
type: '[[Map]]',
|
|
351
|
+
shouldTransform: function (type, val) {
|
|
352
|
+
return MAP_SUPPORTED && val instanceof Map;
|
|
353
|
+
},
|
|
354
|
+
toSerializable: function (map) {
|
|
355
|
+
var flattenedKVArr = [];
|
|
356
|
+
map.forEach((val, key) => {
|
|
357
|
+
flattenedKVArr.push(key);
|
|
358
|
+
flattenedKVArr.push(val);
|
|
359
|
+
});
|
|
360
|
+
return flattenedKVArr;
|
|
361
|
+
},
|
|
362
|
+
fromSerializable: function (val) {
|
|
363
|
+
if (MAP_SUPPORTED) {
|
|
364
|
+
// NOTE: new Map(iterable) is not supported by all browsers
|
|
365
|
+
var map = new Map();
|
|
366
|
+
for (var i = 0; i < val.length; i += 2)
|
|
367
|
+
map.set(val[i], val[i + 1]);
|
|
368
|
+
return map;
|
|
369
|
+
}
|
|
370
|
+
var kvArr = [];
|
|
371
|
+
for (var j = 0; j < val.length; j += 2)
|
|
372
|
+
kvArr.push([val[j], val[j + 1]]);
|
|
373
|
+
return kvArr;
|
|
374
|
+
},
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
type: '[[Set]]',
|
|
378
|
+
shouldTransform: function (type, val) {
|
|
379
|
+
return SET_SUPPORTED && val instanceof Set;
|
|
380
|
+
},
|
|
381
|
+
toSerializable: function (set) {
|
|
382
|
+
var arr = [];
|
|
383
|
+
set.forEach(val => {
|
|
384
|
+
arr.push(val);
|
|
385
|
+
});
|
|
386
|
+
return arr;
|
|
387
|
+
},
|
|
388
|
+
fromSerializable: function (val) {
|
|
389
|
+
if (SET_SUPPORTED) {
|
|
390
|
+
// NOTE: new Set(iterable) is not supported by all browsers
|
|
391
|
+
var set = new Set();
|
|
392
|
+
for (var i = 0; i < val.length; i++)
|
|
393
|
+
set.add(val[i]);
|
|
394
|
+
return set;
|
|
395
|
+
}
|
|
396
|
+
return val;
|
|
397
|
+
},
|
|
398
|
+
},
|
|
399
|
+
];
|
|
400
|
+
// Replicator
|
|
401
|
+
var Replicator = function (serializer) {
|
|
402
|
+
this.transforms = [];
|
|
403
|
+
this.transformsMap = Object.create(null);
|
|
404
|
+
this.serializer = serializer || JSONSerializer;
|
|
405
|
+
this.addTransforms(builtInTransforms);
|
|
406
|
+
};
|
|
407
|
+
// Manage transforms
|
|
408
|
+
Replicator.prototype.addTransforms = function (transforms) {
|
|
409
|
+
transforms = Array.isArray(transforms) ? transforms : [transforms];
|
|
410
|
+
for (var i = 0; i < transforms.length; i++) {
|
|
411
|
+
var transform = transforms[i];
|
|
412
|
+
if (this.transformsMap[transform.type])
|
|
413
|
+
throw new Error('Transform with type "' + transform.type + '" was already added.');
|
|
414
|
+
this.transforms.push(transform);
|
|
415
|
+
this.transformsMap[transform.type] = transform;
|
|
416
|
+
}
|
|
417
|
+
return this;
|
|
418
|
+
};
|
|
419
|
+
Replicator.prototype.removeTransforms = function (transforms) {
|
|
420
|
+
transforms = Array.isArray(transforms) ? transforms : [transforms];
|
|
421
|
+
for (var i = 0; i < transforms.length; i++) {
|
|
422
|
+
var transform = transforms[i];
|
|
423
|
+
var idx = this.transforms.indexOf(transform);
|
|
424
|
+
if (idx > -1)
|
|
425
|
+
this.transforms.splice(idx, 1);
|
|
426
|
+
delete this.transformsMap[transform.type];
|
|
427
|
+
}
|
|
428
|
+
return this;
|
|
429
|
+
};
|
|
430
|
+
Replicator.prototype.encode = function (val) {
|
|
431
|
+
var transformer = new EncodingTransformer(val, this.transforms);
|
|
432
|
+
var references = transformer.transform();
|
|
433
|
+
return this.serializer.serialize(references);
|
|
434
|
+
};
|
|
435
|
+
Replicator.prototype.decode = function (val) {
|
|
436
|
+
var references = this.serializer.deserialize(val);
|
|
437
|
+
var transformer = new DecodingTransformer(references, this.transformsMap);
|
|
438
|
+
return transformer.transform();
|
|
439
|
+
};
|
|
440
|
+
exports.default = Replicator;
|
|
441
|
+
module.exports = exports.default;
|
|
442
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmVwbGljYXRvci9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMkJBQTJCOztBQUUzQixRQUFRO0FBQ1IsSUFBSSxvQkFBb0IsR0FBTSxJQUFJLENBQUM7QUFDbkMsSUFBSSxnQkFBZ0IsR0FBVSxJQUFJLENBQUM7QUFDbkMsSUFBSSx1QkFBdUIsR0FBRyxZQUFZLENBQUM7QUFFM0MsSUFBSSxpQkFBaUIsR0FBRztJQUNwQixXQUFXLEVBQVUsT0FBTyxTQUFTLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN6RSxZQUFZLEVBQVMsT0FBTyxVQUFVLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMzRSxtQkFBbUIsRUFBRSxPQUFPLGlCQUFpQixLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN6RixZQUFZLEVBQVMsT0FBTyxVQUFVLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMzRSxhQUFhLEVBQVEsT0FBTyxXQUFXLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM3RSxZQUFZLEVBQVMsT0FBTyxVQUFVLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMzRSxhQUFhLEVBQVEsT0FBTyxXQUFXLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM3RSxjQUFjLEVBQU8sT0FBTyxZQUFZLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENB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QVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDakQsQ0FBQyxDQUFDO0FBRUYsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHO0lBQ3ZDLElBQUksVUFBVSxHQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELElBQUksV0FBVyxHQUFHLElBQUksbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUUxRSxPQUFPLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNuQyxDQUFDLENBQUM7QUFFRixrQkFBZSxVQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cblxuLy8gQ29uc3RcbnZhciBUUkFOU0ZPUk1FRF9UWVBFX0tFWSAgICA9ICdAdCc7XG52YXIgQ0lSQ1VMQVJfUkVGX0tFWSAgICAgICAgPSAnQHInO1xudmFyIEtFWV9SRVFVSVJFX0VTQ0FQSU5HX1JFID0gL14jKkAodHxyKSQvO1xuXG52YXIgVFlQRURfQVJSQVlfQ1RPUlMgPSB7XG4gICAgJ0ludDhBcnJheSc6ICAgICAgICAgdHlwZW9mIEludDhBcnJheSA9PT0gJ2Z1bmN0aW9uJyA/IEludDhBcnJheSA6IHZvaWQgMCxcbiAgICAnVWludDhBcnJheSc6ICAgICAgICB0eXBlb2YgVWludDhBcnJheSA9PT0gJ2Z1bmN0aW9uJyA/IFVpbnQ4QXJyYXkgOiB2b2lkIDAsXG4gICAgJ1VpbnQ4Q2xhbXBlZEFycmF5JzogdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ID09PSAnZnVuY3Rpb24nID8gVWludDhDbGFtcGVkQXJyYXkgOiB2b2lkIDAsXG4gICAgJ0ludDE2QXJyYXknOiAgICAgICAgdHlwZW9mIEludDE2QXJyYXkgPT09ICdmdW5jdGlvbicgPyBJbnQxNkFycmF5IDogdm9pZCAwLFxuICAgICdVaW50MTZBcnJheSc6ICAgICAgIHR5cGVvZiBVaW50MTZBcnJheSA9PT0gJ2Z1bmN0aW9uJyA/IFVpbnQxNkFycmF5IDogdm9pZCAwLFxuICAgICdJbnQzMkFycmF5JzogICAgICAgIHR5cGVvZiBJbnQzMkFycmF5ID09PSAnZnVuY3Rpb24nID8gSW50MzJBcnJheSA6IHZvaWQgMCxcbiAgICAnVWludDMyQXJyYXknOiAgICAgICB0eXBlb2YgVWludDMyQXJyYXkgPT09ICdmdW5jdGlvbicgPyBVaW50MzJBcnJheSA6IHZvaWQgMCxcbiAgICAnRmxvYXQzMkFycmF5JzogICAgICB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAnZnVuY3Rpb24nID8gRmxvYXQzMkFycmF5IDogdm9pZCAwLFxuICAgICdGbG9hdDY0QXJyYXknOiAgICAgIHR5cGVvZiBGbG9hdDY0QXJyYXkgPT09ICdmdW5jdGlvbicgPyBGbG9hdDY0QXJyYXkgOiB2b2lkIDAsXG59O1xuXG52YXIgU0FGRV9FUlJPUl9DVE9SUyA9IHtcbiAgICAnRXJyb3InOiAgICAgICAgICBFcnJvcixcbiAgICAnRXZhbEVycm9yJzogICAgICBFdmFsRXJyb3IsXG4gICAgJ1JhbmdlRXJyb3InOiAgICAgUmFuZ2VFcnJvcixcbiAgICAnUmVmZXJlbmNlRXJyb3InOiBSZWZlcmVuY2VFcnJvcixcbiAgICAnU3ludGF4RXJyb3InOiAgICBTeW50YXhFcnJvcixcbiAgICAnVHlwZUVycm9yJzogICAgICBUeXBlRXJyb3IsXG4gICAgJ1VSSUVycm9yJzogICAgICAgVVJJRXJyb3IsXG59O1xuXG52YXIgQVJSQVlfQlVGRkVSX1NVUFBPUlRFRCA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJztcbnZhciBNQVBfU1VQUE9SVEVEICAgICAgICAgID0gdHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJztcbnZhciBTRVRfU1VQUE9SVEVEICAgICAgICAgID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJztcbnZhciBCVUZGRVJfRlJPTV9TVVBQT1JURUQgID0gdHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJztcblxudmFyIFRZUEVEX0FSUkFZX1NVUFBPUlRFRCA9IGZ1bmN0aW9uICh0eXBlTmFtZSkge1xuICAgIHJldHVybiAhIVRZUEVEX0FSUkFZX0NUT1JTW3R5cGVOYW1lXTtcbn07XG5cbi8vIFNhdmVkIHByb3RvIGZ1bmN0aW9uc1xudmFyIGFyclNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG4vLyBEZWZhdWx0IHNlcmlhbGl6ZXJcbnZhciBKU09OU2VyaWFsaXplciA9IHtcbiAgICBzZXJpYWxpemU6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbCk7XG4gICAgfSxcblxuICAgIGRlc2VyaWFsaXplOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbCk7XG4gICAgfSxcbn07XG5cbi8vIEVuY29kaW5nVHJhbnNmb3JtZXJcbnZhciBFbmNvZGluZ1RyYW5zZm9ybWVyID0gZnVuY3Rpb24gKHZhbCwgdHJhbnNmb3Jtcykge1xuICAgIHRoaXMucmVmZXJlbmNlcyAgICAgICAgICAgICAgID0gdmFsO1xuICAgIHRoaXMudHJhbnNmb3JtcyAgICAgICAgICAgICAgID0gdHJhbnNmb3JtcztcbiAgICB0aGlzLmNpcmN1bGFyQ2FuZGlkYXRlcyAgICAgICA9IFtdO1xuICAgIHRoaXMuY2lyY3VsYXJDYW5kaWRhdGVzRGVzY3JzID0gW107XG4gICAgdGhpcy5jaXJjdWxhclJlZkNvdW50ICAgICAgICAgPSAwO1xufTtcblxuRW5jb2RpbmdUcmFuc2Zvcm1lci5fY3JlYXRlUmVmTWFyayA9IGZ1bmN0aW9uIChpZHgpIHtcbiAgICB2YXIgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIG9ialtDSVJDVUxBUl9SRUZfS0VZXSA9IGlkeDtcblxuICAgIHJldHVybiBvYmo7XG59O1xuXG5FbmNvZGluZ1RyYW5zZm9ybWVyLnByb3RvdHlwZS5fY3JlYXRlQ2lyY3VsYXJDYW5kaWRhdGUgPSBmdW5jdGlvbiAodmFsLCBwYXJlbnQsIGtleSkge1xuICAgIHRoaXMuY2lyY3VsYXJDYW5kaWRhdGVzLnB1c2godmFsKTtcbiAgICB0aGlzLmNpcmN1bGFyQ2FuZGlkYXRlc0Rlc2Nycy5wdXNoKHsgcGFyZW50OiBwYXJlbnQsIGtleToga2V5LCByZWZJZHg6IC0xIH0pO1xufTtcblxuRW5jb2RpbmdUcmFuc2Zvcm1lci5wcm90b3R5cGUuX2FwcGx5VHJhbnNmb3JtID0gZnVuY3Rpb24gKHZhbCwgcGFyZW50LCBrZXksIHRyYW5zZm9ybSkge1xuICAgIHZhciByZXN1bHQgICAgICAgICAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBzZXJpYWxpemFibGVWYWwgPSB0cmFuc2Zvcm0udG9TZXJpYWxpemFibGUodmFsKTtcblxuICAgIGlmICh0eXBlb2Ygc2VyaWFsaXphYmxlVmFsID09PSAnb2JqZWN0JylcbiAgICAgICAgdGhpcy5fY3JlYXRlQ2lyY3VsYXJDYW5kaWRhdGUodmFsLCBwYXJlbnQsIGtleSk7XG5cbiAgICByZXN1bHRbVFJBTlNGT1JNRURfVFlQRV9LRVldID0gdHJhbnNmb3JtLnR5cGU7XG4gICAgcmVzdWx0LmRhdGEgICAgICAgICAgICAgICAgICA9IHRoaXMuX2hhbmRsZVZhbHVlKHNlcmlhbGl6YWJsZVZhbCwgcGFyZW50LCBrZXkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkVuY29kaW5nVHJhbnNmb3JtZXIucHJvdG90eXBlLl9oYW5kbGVBcnJheSA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKylcbiAgICAgICAgcmVzdWx0W2ldID0gdGhpcy5faGFuZGxlVmFsdWUoYXJyW2ldLCByZXN1bHQsIGkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkVuY29kaW5nVHJhbnNmb3JtZXIucHJvdG90eXBlLl9oYW5kbGVQbGFpbk9iamVjdCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICB2YXIgcmVwbGljYXRvciAgICAgICA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCAgICAgICAgICAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBvd25Qcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKTtcblxuICAgIG93blByb3BlcnR5TmFtZXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICB2YXIgcmVzdWx0S2V5ID0gS0VZX1JFUVVJUkVfRVNDQVBJTkdfUkUudGVzdChrZXkpID8gJyMnICsga2V5IDoga2V5O1xuXG4gICAgICAgIHJlc3VsdFtyZXN1bHRLZXldID0gcmVwbGljYXRvci5faGFuZGxlVmFsdWUob2JqW2tleV0sIHJlc3VsdCwgcmVzdWx0S2V5KTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5FbmNvZGluZ1RyYW5zZm9ybWVyLnByb3RvdHlwZS5faGFuZGxlT2JqZWN0ID0gZnVuY3Rpb24gKG9iaiwgcGFyZW50LCBrZXkpIHtcbiAgICB0aGlzLl9jcmVhdGVDaXJjdWxhckNhbmRpZGF0ZShvYmosIHBhcmVudCwga2V5KTtcblxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9iaikgPyB0aGlzLl9oYW5kbGVBcnJheShvYmopIDogdGhpcy5faGFuZGxlUGxhaW5PYmplY3Qob2JqKTtcbn07XG5cbkVuY29kaW5nVHJhbnNmb3JtZXIucHJvdG90eXBlLl9lbnN1cmVDaXJjdWxhclJlZmVyZW5jZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICB2YXIgY2lyY3VsYXJDYW5kaWRhdGVJZHggPSB0aGlzLmNpcmN1bGFyQ2FuZGlkYXRlcy5pbmRleE9mKG9iaik7XG5cbiAgICBpZiAoY2lyY3VsYXJDYW5kaWRhdGVJZHggPiAtMSkge1xuICAgICAgICB2YXIgZGVzY3IgPSB0aGlzLmNpcmN1bGFyQ2FuZGlkYXRlc0Rlc2Nyc1tjaXJjdWxhckNhbmRpZGF0ZUlkeF07XG5cbiAgICAgICAgaWYgKGRlc2NyLnJlZklkeCA9PT0gLTEpXG4gICAgICAgICAgICBkZXNjci5yZWZJZHggPSBkZXNjci5wYXJlbnQgPyArK3RoaXMuY2lyY3VsYXJSZWZDb3VudCA6IDA7XG5cbiAgICAgICAgcmV0dXJuIEVuY29kaW5nVHJhbnNmb3JtZXIuX2NyZWF0ZVJlZk1hcmsoZGVzY3IucmVmSWR4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbkVuY29kaW5nVHJhbnNmb3JtZXIucHJvdG90eXBlLl9oYW5kbGVWYWx1ZSA9IGZ1bmN0aW9uICh2YWwsIHBhcmVudCwga2V5KSB7XG4gICAgdmFyIHR5cGUgICAgID0gdHlwZW9mIHZhbDtcbiAgICB2YXIgaXNPYmplY3QgPSB0eXBlID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGw7XG5cbiAgICBpZiAoaXNPYmplY3QpIHtcbiAgICAgICAgdmFyIHJlZk1hcmsgPSB0aGlzLl9lbnN1cmVDaXJjdWxhclJlZmVyZW5jZSh2YWwpO1xuXG4gICAgICAgIGlmIChyZWZNYXJrKVxuICAgICAgICAgICAgcmV0dXJuIHJlZk1hcms7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3Jtc1tpXTtcblxuICAgICAgICBpZiAodHJhbnNmb3JtLnNob3VsZFRyYW5zZm9ybSh0eXBlLCB2YWwpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5VHJhbnNmb3JtKHZhbCwgcGFyZW50LCBrZXksIHRyYW5zZm9ybSk7XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0KVxuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlT2JqZWN0KHZhbCwgcGFyZW50LCBrZXkpO1xuXG4gICAgcmV0dXJuIHZhbDtcbn07XG5cbkVuY29kaW5nVHJhbnNmb3JtZXIucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVmZXJlbmNlcyA9IFt0aGlzLl9oYW5kbGVWYWx1ZSh0aGlzLnJlZmVyZW5jZXMsIG51bGwsIG51bGwpXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaXJjdWxhckNhbmRpZGF0ZXNEZXNjcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGRlc2NyID0gdGhpcy5jaXJjdWxhckNhbmRpZGF0ZXNEZXNjcnNbaV07XG5cbiAgICAgICAgaWYgKGRlc2NyLnJlZklkeCA+IDApIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZXNbZGVzY3IucmVmSWR4XSA9IGRlc2NyLnBhcmVudFtkZXNjci5rZXldO1xuICAgICAgICAgICAgZGVzY3IucGFyZW50W2Rlc2NyLmtleV0gID0gRW5jb2RpbmdUcmFuc2Zvcm1lci5fY3JlYXRlUmVmTWFyayhkZXNjci5yZWZJZHgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZXM7XG59O1xuXG4vLyBEZWNvZGluZ1RyYW5zZm9ybWVyXG52YXIgRGVjb2RpbmdUcmFuc2Zvcm1lciA9IGZ1bmN0aW9uIChyZWZlcmVuY2VzLCB0cmFuc2Zvcm1zTWFwKSB7XG4gICAgdGhpcy5yZWZlcmVuY2VzICAgICAgICAgICAgPSByZWZlcmVuY2VzO1xuICAgIHRoaXMudHJhbnNmb3JtTWFwICAgICAgICAgID0gdHJhbnNmb3Jtc01hcDtcbiAgICB0aGlzLmFjdGl2ZVRyYW5zZm9ybXNTdGFjayA9IFtdO1xuICAgIHRoaXMudmlzaXRlZFJlZnMgICAgICAgICAgID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn07XG5cbkRlY29kaW5nVHJhbnNmb3JtZXIucHJvdG90eXBlLl9oYW5kbGVQbGFpbk9iamVjdCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICB2YXIgcmVwbGljYXRvciAgICAgICA9IHRoaXM7XG4gICAgdmFyIHVuZXNjYXBlZCAgICAgICAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBvd25Qcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKTtcblxuICAgIG93blByb3BlcnR5TmFtZXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICByZXBsaWNhdG9yLl9oYW5kbGVWYWx1ZShvYmpba2V5XSwgb2JqLCBrZXkpO1xuXG4gICAgICAgIGlmIChLRVlfUkVRVUlSRV9FU0NBUElOR19SRS50ZXN0KGtleSkpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IHVzZSBpbnRlcm1lZGlhdGUgb2JqZWN0IHRvIGF2b2lkIHVuZXNjYXBlZCBhbmQgZXNjYXBlZCBrZXlzIGludGVyZmVyZW5jZVxuICAgICAgICAgICAgLy8gRS5nLiB1bmVzY2FwZWQgXCIjI0B0XCIgd2lsbCBiZSBcIiNAdFwiIHdoaWNoIGNhbiBvdmVyd3JpdGUgZXNjYXBlZCBcIiNAdFwiLlxuICAgICAgICAgICAgdW5lc2NhcGVkW2tleS5zdWJzdHJpbmcoMSldID0gb2JqW2tleV07XG4gICAgICAgICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZvciAodmFyIHVuZXNjYXBlZEtleSBpbiB1bmVzY2FwZWQpXG4gICAgICAgIG9ialt1bmVzY2FwZWRLZXldID0gdW5lc2NhcGVkW3VuZXNjYXBlZEtleV07XG59O1xuXG5EZWNvZGluZ1RyYW5zZm9ybWVyLnByb3RvdHlwZS5faGFuZGxlVHJhbnNmb3JtZWRPYmplY3QgPSBmdW5jdGlvbiAob2JqLCBwYXJlbnQsIGtleSkge1xuICAgIHZhciB0cmFuc2Zvcm1UeXBlID0gb2JqW1RSQU5TRk9STUVEX1RZUEVfS0VZXTtcbiAgICB2YXIgdHJhbnNmb3JtICAgICA9IHRoaXMudHJhbnNmb3JtTWFwW3RyYW5zZm9ybVR5cGVdO1xuXG4gICAgaWYgKCF0cmFuc2Zvcm0pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBmaW5kIHRyYW5zZm9ybSBmb3IgXCInICsgdHJhbnNmb3JtVHlwZSArICdcIiB0eXBlLicpO1xuXG4gICAgdGhpcy5hY3RpdmVUcmFuc2Zvcm1zU3RhY2sucHVzaChvYmopO1xuICAgIHRoaXMuX2hhbmRsZVZhbHVlKG9iai5kYXRhLCBvYmosICdkYXRhJyk7XG4gICAgdGhpcy5hY3RpdmVUcmFuc2Zvcm1zU3RhY2sucG9wKCk7XG5cbiAgICBwYXJlbnRba2V5XSA9IHRyYW5zZm9ybS5mcm9tU2VyaWFsaXphYmxlKG9iai5kYXRhKTtcbn07XG5cbkRlY29kaW5nVHJhbnNmb3JtZXIucHJvdG90eXBlLl9oYW5kbGVDaXJjdWxhclNlbGZSZWZEdXJpbmdUcmFuc2Zvcm0gPSBmdW5jdGlvbiAocmVmSWR4LCBwYXJlbnQsIGtleSkge1xuICAgIC8vIE5PVEU6IHdlJ3ZlIGhpdCBhIGhhcmQgY2FzZTogb2JqZWN0IHJlZmVyZW5jZSBpdHNlbGYgZHVyaW5nIHRyYW5zZm9ybWF0aW9uLlxuICAgIC8vIFdlIGNhbid0IGRlcmVmZXJlbmNlIGl0IHNpbmNlIHdlIGRvbid0IGhhdmUgcmVzdWx0aW5nIG9iamVjdCB5ZXQuIEFuZCB3ZSdsbFxuICAgIC8vIG5vdCBiZSBhYmxlIHRvIHJlc3RvcmUgcmVmZXJlbmNlIGxhdGVseSBiZWNhdXNlIHdlIHdpbGwgbmVlZCB0byB0cmF2ZXJzZVxuICAgIC8vIHRyYW5zZm9ybWVkIG9iamVjdCBhZ2FpbiBhbmQgcmVmZXJlbmNlIG1pZ2h0IGJlIHVucmVhY2hhYmxlIG9yIG5ldyBvYmplY3QgY29udGFpblxuICAgIC8vIG5ldyBjaXJjdWxhciByZWZlcmVuY2VzLiBBcyBhIHdvcmthcm91bmQgd2UgY3JlYXRlIGdldHRlciwgc28gb25jZSB0cmFuc2Zvcm1hdGlvblxuICAgIC8vIGNvbXBsZXRlLCBkZXJlZmVyZW5jZWQgcHJvcGVydHkgd2lsbCBwb2ludCB0byBjb3JyZWN0IHRyYW5zZm9ybWVkIG9iamVjdC5cbiAgICB2YXIgcmVmZXJlbmNlcyA9IHRoaXMucmVmZXJlbmNlcztcbiAgICB2YXIgdmFsICAgICAgICA9IHZvaWQgMDtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJlbnQsIGtleSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6ICAgdHJ1ZSxcblxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh2YWwgPT09IHZvaWQgMClcbiAgICAgICAgICAgICAgICB2YWwgPSByZWZlcmVuY2VzW3JlZklkeF07XG5cbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbHVlO1xuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2V0dGVyLXJldHVyblxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfSxcbiAgICB9KTtcbn07XG5cbkRlY29kaW5nVHJhbnNmb3JtZXIucHJvdG90eXBlLl9oYW5kbGVDaXJjdWxhclJlZiA9IGZ1bmN0aW9uIChyZWZJZHgsIHBhcmVudCwga2V5KSB7XG4gICAgaWYgKHRoaXMuYWN0aXZlVHJhbnNmb3Jtc1N0YWNrLmluZGV4T2YodGhpcy5yZWZlcmVuY2VzW3JlZklkeF0pID4gLTEpXG4gICAgICAgIHRoaXMuX2hhbmRsZUNpcmN1bGFyU2VsZlJlZkR1cmluZ1RyYW5zZm9ybShyZWZJZHgsIHBhcmVudCwga2V5KTtcblxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMudmlzaXRlZFJlZnNbcmVmSWR4XSkge1xuICAgICAgICAgICAgdGhpcy52aXNpdGVkUmVmc1tyZWZJZHhdID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVZhbHVlKHRoaXMucmVmZXJlbmNlc1tyZWZJZHhdLCB0aGlzLnJlZmVyZW5jZXMsIHJlZklkeCk7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJlbnRba2V5XSA9IHRoaXMucmVmZXJlbmNlc1tyZWZJZHhdO1xuICAgIH1cbn07XG5cbkRlY29kaW5nVHJhbnNmb3JtZXIucHJvdG90eXBlLl9oYW5kbGVWYWx1ZSA9IGZ1bmN0aW9uICh2YWwsIHBhcmVudCwga2V5KSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgIT09ICdvYmplY3QnIHx8IHZhbCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIHJlZklkeCA9IHZhbFtDSVJDVUxBUl9SRUZfS0VZXTtcblxuICAgIGlmIChyZWZJZHggIT09IHZvaWQgMClcbiAgICAgICAgdGhpcy5faGFuZGxlQ2lyY3VsYXJSZWYocmVmSWR4LCBwYXJlbnQsIGtleSk7XG5cbiAgICBlbHNlIGlmICh2YWxbVFJBTlNGT1JNRURfVFlQRV9LRVldKVxuICAgICAgICB0aGlzLl9oYW5kbGVUcmFuc2Zvcm1lZE9iamVjdCh2YWwsIHBhcmVudCwga2V5KTtcblxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVZhbHVlKHZhbFtpXSwgdmFsLCBpKTtcbiAgICB9XG5cbiAgICBlbHNlXG4gICAgICAgIHRoaXMuX2hhbmRsZVBsYWluT2JqZWN0KHZhbCk7XG59O1xuXG5EZWNvZGluZ1RyYW5zZm9ybWVyLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy52aXNpdGVkUmVmc1swXSA9IHRydWU7XG4gICAgdGhpcy5faGFuZGxlVmFsdWUodGhpcy5yZWZlcmVuY2VzWzBdLCB0aGlzLnJlZmVyZW5jZXMsIDApO1xuXG4gICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlc1swXTtcbn07XG5cbi8vIFRyYW5zZm9ybXNcbnZhciBidWlsdEluVHJhbnNmb3JtcyA9IFtcbiAgICB7XG4gICAgICAgIHR5cGU6ICdbW05hTl1dJyxcblxuICAgICAgICBzaG91bGRUcmFuc2Zvcm06IGZ1bmN0aW9uICh0eXBlLCB2YWwpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvU2VyaWFsaXphYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZnJvbVNlcmlhbGl6YWJsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfSxcbiAgICB9LFxuXG4gICAge1xuICAgICAgICB0eXBlOiAnW1t1bmRlZmluZWRdXScsXG5cbiAgICAgICAgc2hvdWxkVHJhbnNmb3JtOiBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvU2VyaWFsaXphYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZnJvbVNlcmlhbGl6YWJsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgfSxcbiAgICB9LFxuXG4gICAge1xuICAgICAgICB0eXBlOiAnW1tEYXRlXV0nLFxuXG4gICAgICAgIHNob3VsZFRyYW5zZm9ybTogZnVuY3Rpb24gKHR5cGUsIHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIERhdGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9TZXJpYWxpemFibGU6IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZnJvbVNlcmlhbGl6YWJsZTogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgICAgICBkYXRlLnNldFRpbWUodmFsKTtcblxuICAgICAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICAgIH0sXG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgdHlwZTogJ1tbUmVnRXhwXV0nLFxuXG4gICAgICAgIHNob3VsZFRyYW5zZm9ybTogZnVuY3Rpb24gKHR5cGUsIHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIFJlZ0V4cDtcbiAgICAgICAgfSxcblxuICAgICAgICB0b1NlcmlhbGl6YWJsZTogZnVuY3Rpb24gKHJlKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIHNyYzogICByZS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgZmxhZ3M6ICcnLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHJlLmdsb2JhbClcbiAgICAgICAgICAgICAgICByZXN1bHQuZmxhZ3MgKz0gJ2cnO1xuXG4gICAgICAgICAgICBpZiAocmUuaWdub3JlQ2FzZSlcbiAgICAgICAgICAgICAgICByZXN1bHQuZmxhZ3MgKz0gJ2knO1xuXG4gICAgICAgICAgICBpZiAocmUubXVsdGlsaW5lKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5mbGFncyArPSAnbSc7XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZnJvbVNlcmlhbGl6YWJsZTogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodmFsLnNyYywgdmFsLmZsYWdzKTtcbiAgICAgICAgfSxcbiAgICB9LFxuXG4gICAge1xuICAgICAgICB0eXBlOiAnW1tFcnJvcl1dJyxcblxuICAgICAgICBzaG91bGRUcmFuc2Zvcm06IGZ1bmN0aW9uICh0eXBlLCB2YWwpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWwgaW5zdGFuY2VvZiBFcnJvcjtcbiAgICAgICAgfSxcblxuICAgICAgICB0b1NlcmlhbGl6YWJsZTogZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAgICBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICBzdGFjazogICBlcnIuc3RhY2ssXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGZyb21TZXJpYWxpemFibGU6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIHZhciBDdG9yID0gU0FGRV9FUlJPUl9DVE9SU1t2YWwubmFtZV0gfHwgRXJyb3I7XG4gICAgICAgICAgICB2YXIgZXJyICA9IG5ldyBDdG9yKHZhbC5tZXNzYWdlKTtcblxuICAgICAgICAgICAgZXJyLnN0YWNrID0gdmFsLnN0YWNrO1xuXG4gICAgICAgICAgICByZXR1cm4gZXJyO1xuICAgICAgICB9LFxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHR5cGU6ICdbW0FycmF5QnVmZmVyXV0nLFxuXG4gICAgICAgIHNob3VsZFRyYW5zZm9ybTogZnVuY3Rpb24gKHR5cGUsIHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIEFSUkFZX0JVRkZFUl9TVVBQT1JURUQgJiYgdmFsIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9TZXJpYWxpemFibGU6IGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgICAgICAgICAgIHZhciB2aWV3ID0gbmV3IEludDhBcnJheShidWZmZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gYXJyU2xpY2UuY2FsbCh2aWV3KTtcbiAgICAgICAgfSxcblxuICAgICAgICBmcm9tU2VyaWFsaXphYmxlOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICBpZiAoQVJSQVlfQlVGRkVSX1NVUFBPUlRFRCkge1xuICAgICAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIodmFsLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdmFyIHZpZXcgICA9IG5ldyBJbnQ4QXJyYXkoYnVmZmVyKTtcblxuICAgICAgICAgICAgICAgIHZpZXcuc2V0KHZhbCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9LFxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHR5cGU6ICdbW0J1ZmZlcl1dJyxcblxuICAgICAgICBzaG91bGRUcmFuc2Zvcm06IGZ1bmN0aW9uICh0eXBlLCB2YWwpIHtcbiAgICAgICAgICAgIHJldHVybiBCVUZGRVJfRlJPTV9TVVBQT1JURUQgJiYgdmFsIGluc3RhbmNlb2YgQnVmZmVyO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvU2VyaWFsaXphYmxlOiBmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyU2xpY2UuY2FsbChidWZmZXIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGZyb21TZXJpYWxpemFibGU6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIGlmIChCVUZGRVJfRlJPTV9TVVBQT1JURUQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbCk7XG5cbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH0sXG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgdHlwZTogJ1tbVHlwZWRBcnJheV1dJyxcblxuICAgICAgICBzaG91bGRUcmFuc2Zvcm06IGZ1bmN0aW9uICh0eXBlLCB2YWwpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhUWVBFRF9BUlJBWV9DVE9SUykuc29tZShjdG9yTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRZUEVEX0FSUkFZX1NVUFBPUlRFRChjdG9yTmFtZSkgJiYgdmFsIGluc3RhbmNlb2YgVFlQRURfQVJSQVlfQ1RPUlNbY3Rvck5hbWVdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9TZXJpYWxpemFibGU6IGZ1bmN0aW9uIChhcnIpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY3Rvck5hbWU6IGFyci5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICAgICAgICAgIGFycjogICAgICBhcnJTbGljZS5jYWxsKGFyciksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGZyb21TZXJpYWxpemFibGU6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIHJldHVybiBUWVBFRF9BUlJBWV9TVVBQT1JURUQodmFsLmN0b3JOYW1lKSA/IG5ldyBUWVBFRF9BUlJBWV9DVE9SU1t2YWwuY3Rvck5hbWVdKHZhbC5hcnIpIDogdmFsLmFycjtcbiAgICAgICAgfSxcbiAgICB9LFxuXG4gICAge1xuICAgICAgICB0eXBlOiAnW1tNYXBdXScsXG5cbiAgICAgICAgc2hvdWxkVHJhbnNmb3JtOiBmdW5jdGlvbiAodHlwZSwgdmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTUFQX1NVUFBPUlRFRCAmJiB2YWwgaW5zdGFuY2VvZiBNYXA7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9TZXJpYWxpemFibGU6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICAgIHZhciBmbGF0dGVuZWRLVkFyciA9IFtdO1xuXG4gICAgICAgICAgICBtYXAuZm9yRWFjaCgodmFsLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBmbGF0dGVuZWRLVkFyci5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgZmxhdHRlbmVkS1ZBcnIucHVzaCh2YWwpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBmbGF0dGVuZWRLVkFycjtcbiAgICAgICAgfSxcblxuICAgICAgICBmcm9tU2VyaWFsaXphYmxlOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICBpZiAoTUFQX1NVUFBPUlRFRCkge1xuICAgICAgICAgICAgICAgIC8vIE5PVEU6IG5ldyBNYXAoaXRlcmFibGUpIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGJyb3dzZXJzXG4gICAgICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KHZhbFtpXSwgdmFsW2kgKyAxXSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIga3ZBcnIgPSBbXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWwubGVuZ3RoOyBqICs9IDIpXG4gICAgICAgICAgICAgICAga3ZBcnIucHVzaChbdmFsW2pdLCB2YWxbaiArIDFdXSk7XG5cbiAgICAgICAgICAgIHJldHVybiBrdkFycjtcbiAgICAgICAgfSxcbiAgICB9LFxuXG4gICAge1xuICAgICAgICB0eXBlOiAnW1tTZXRdXScsXG5cbiAgICAgICAgc2hvdWxkVHJhbnNmb3JtOiBmdW5jdGlvbiAodHlwZSwgdmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gU0VUX1NVUFBPUlRFRCAmJiB2YWwgaW5zdGFuY2VvZiBTZXQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9TZXJpYWxpemFibGU6IGZ1bmN0aW9uIChzZXQpIHtcbiAgICAgICAgICAgIHZhciBhcnIgPSBbXTtcblxuICAgICAgICAgICAgc2V0LmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICAgICAgICBhcnIucHVzaCh2YWwpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBhcnI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZnJvbVNlcmlhbGl6YWJsZTogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgaWYgKFNFVF9TVVBQT1JURUQpIHtcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBuZXcgU2V0KGl0ZXJhYmxlKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBicm93c2Vyc1xuICAgICAgICAgICAgICAgIHZhciBzZXQgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgc2V0LmFkZCh2YWxbaV0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfSxcbiAgICB9LFxuXTtcblxuLy8gUmVwbGljYXRvclxudmFyIFJlcGxpY2F0b3IgPSBmdW5jdGlvbiAoc2VyaWFsaXplcikge1xuICAgIHRoaXMudHJhbnNmb3JtcyAgICA9IFtdO1xuICAgIHRoaXMudHJhbnNmb3Jtc01hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5zZXJpYWxpemVyICAgID0gc2VyaWFsaXplciB8fCBKU09OU2VyaWFsaXplcjtcblxuICAgIHRoaXMuYWRkVHJhbnNmb3JtcyhidWlsdEluVHJhbnNmb3Jtcyk7XG59O1xuXG4vLyBNYW5hZ2UgdHJhbnNmb3Jtc1xuUmVwbGljYXRvci5wcm90b3R5cGUuYWRkVHJhbnNmb3JtcyA9IGZ1bmN0aW9uICh0cmFuc2Zvcm1zKSB7XG4gICAgdHJhbnNmb3JtcyA9IEFycmF5LmlzQXJyYXkodHJhbnNmb3JtcykgPyB0cmFuc2Zvcm1zIDogW3RyYW5zZm9ybXNdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFuc2Zvcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm1zW2ldO1xuXG4gICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybXNNYXBbdHJhbnNmb3JtLnR5cGVdKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2Zvcm0gd2l0aCB0eXBlIFwiJyArIHRyYW5zZm9ybS50eXBlICsgJ1wiIHdhcyBhbHJlYWR5IGFkZGVkLicpO1xuXG4gICAgICAgIHRoaXMudHJhbnNmb3Jtcy5wdXNoKHRyYW5zZm9ybSk7XG4gICAgICAgIHRoaXMudHJhbnNmb3Jtc01hcFt0cmFuc2Zvcm0udHlwZV0gPSB0cmFuc2Zvcm07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXBsaWNhdG9yLnByb3RvdHlwZS5yZW1vdmVUcmFuc2Zvcm1zID0gZnVuY3Rpb24gKHRyYW5zZm9ybXMpIHtcbiAgICB0cmFuc2Zvcm1zID0gQXJyYXkuaXNBcnJheSh0cmFuc2Zvcm1zKSA/IHRyYW5zZm9ybXMgOiBbdHJhbnNmb3Jtc107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IHRyYW5zZm9ybXNbaV07XG4gICAgICAgIHZhciBpZHggICAgICAgPSB0aGlzLnRyYW5zZm9ybXMuaW5kZXhPZih0cmFuc2Zvcm0pO1xuXG4gICAgICAgIGlmIChpZHggPiAtMSlcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3Jtcy5zcGxpY2UoaWR4LCAxKTtcblxuICAgICAgICBkZWxldGUgdGhpcy50cmFuc2Zvcm1zTWFwW3RyYW5zZm9ybS50eXBlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cblJlcGxpY2F0b3IucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YXIgdHJhbnNmb3JtZXIgPSBuZXcgRW5jb2RpbmdUcmFuc2Zvcm1lcih2YWwsIHRoaXMudHJhbnNmb3Jtcyk7XG4gICAgdmFyIHJlZmVyZW5jZXMgID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtKCk7XG5cbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShyZWZlcmVuY2VzKTtcbn07XG5cblJlcGxpY2F0b3IucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YXIgcmVmZXJlbmNlcyAgPSB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodmFsKTtcbiAgICB2YXIgdHJhbnNmb3JtZXIgPSBuZXcgRGVjb2RpbmdUcmFuc2Zvcm1lcihyZWZlcmVuY2VzLCB0aGlzLnRyYW5zZm9ybXNNYXApO1xuXG4gICAgcmV0dXJuIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSgpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUmVwbGljYXRvcjtcbiJdfQ==
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "testcafe",
|
|
3
3
|
"description": "Automated browser testing for the modern web development stack.",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"version": "3.7.
|
|
5
|
+
"version": "3.7.5",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Developer Express Inc.",
|
|
8
8
|
"url": "https://www.devexpress.com/"
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"url": "git+https://github.com/DevExpress/testcafe.git"
|
|
20
20
|
},
|
|
21
21
|
"engines": {
|
|
22
|
-
"node": ">=
|
|
22
|
+
"node": ">=20.0.0"
|
|
23
23
|
},
|
|
24
24
|
"main": "lib/index",
|
|
25
25
|
"types": "ts-defs/index.d.ts",
|
|
@@ -55,10 +55,7 @@
|
|
|
55
55
|
"test": "gulp travis",
|
|
56
56
|
"build": "gulp build",
|
|
57
57
|
"test-functional-local-headless-chrome-run-esm": "cross-env NODE_OPTIONS='--experimental-loader=./lib/compiler/esm-loader.js' gulp test-functional-local-headless-chrome-run --steps-as-tasks",
|
|
58
|
-
"test-functional-local-headless-chrome-esm": "npm run build && npm run test-functional-local-headless-chrome-run-esm"
|
|
59
|
-
"publish-please-only": "publish-please",
|
|
60
|
-
"publish-please": "del-cli package-lock.json node_modules && npm i && publish-please",
|
|
61
|
-
"prepublishOnly": "publish-please guard"
|
|
58
|
+
"test-functional-local-headless-chrome-esm": "npm run build && npm run test-functional-local-headless-chrome-run-esm"
|
|
62
59
|
},
|
|
63
60
|
"dependencies": {
|
|
64
61
|
"@babel/core": "^7.23.2",
|
|
@@ -74,7 +71,7 @@
|
|
|
74
71
|
"@babel/plugin-transform-object-rest-spread": "^7.24.7",
|
|
75
72
|
"@babel/plugin-transform-private-methods": "^7.25.4",
|
|
76
73
|
"@babel/plugin-transform-runtime": "7.23.3",
|
|
77
|
-
"@babel/preset-env": "^7.
|
|
74
|
+
"@babel/preset-env": "^7.29.5",
|
|
78
75
|
"@babel/preset-flow": "^7.22.15",
|
|
79
76
|
"@babel/preset-react": "^7.22.15",
|
|
80
77
|
"@babel/runtime": "^7.23.2",
|
|
@@ -135,7 +132,6 @@
|
|
|
135
132
|
"prompts": "^2.4.2",
|
|
136
133
|
"qrcode-terminal": "^0.10.0",
|
|
137
134
|
"read-file-relative": "^1.2.0",
|
|
138
|
-
"replicator": "^1.0.5",
|
|
139
135
|
"resolve-cwd": "^1.0.0",
|
|
140
136
|
"resolve-from": "^4.0.0",
|
|
141
137
|
"sanitize-filename": "^1.6.0",
|
|
@@ -144,7 +140,7 @@
|
|
|
144
140
|
"source-map-support": "^0.5.16",
|
|
145
141
|
"strip-bom": "^2.0.0",
|
|
146
142
|
"testcafe-browser-tools": "2.0.26",
|
|
147
|
-
"testcafe-hammerhead": "31.7.
|
|
143
|
+
"testcafe-hammerhead": "31.7.8",
|
|
148
144
|
"testcafe-legacy-api": "5.1.8",
|
|
149
145
|
"testcafe-reporter-json": "^2.1.0",
|
|
150
146
|
"testcafe-reporter-list": "^2.2.0",
|
|
@@ -153,9 +149,9 @@
|
|
|
153
149
|
"testcafe-reporter-xunit": "^2.2.1",
|
|
154
150
|
"testcafe-selector-generator": "^0.1.0",
|
|
155
151
|
"time-limit-promise": "^1.0.2",
|
|
156
|
-
"tmp": "0.2.
|
|
152
|
+
"tmp": "0.2.6",
|
|
157
153
|
"tree-kill": "^1.2.2",
|
|
158
|
-
"typescript": "4.
|
|
154
|
+
"typescript": "4.9.5",
|
|
159
155
|
"unquote": "^1.1.1",
|
|
160
156
|
"url-to-options": "^2.0.0"
|
|
161
157
|
},
|
|
@@ -167,7 +163,6 @@
|
|
|
167
163
|
"@rollup/plugin-commonjs": "^11.0.2",
|
|
168
164
|
"@rollup/plugin-inject": "^4.0.2",
|
|
169
165
|
"@rollup/plugin-node-resolve": "^7.1.1",
|
|
170
|
-
"@testcafe/publish-please": "^5.6.0",
|
|
171
166
|
"@types/callsite": "^1.0.30",
|
|
172
167
|
"@types/chai": "^3.5.2",
|
|
173
168
|
"@types/debug": "^4.1.5",
|
|
@@ -181,8 +176,8 @@
|
|
|
181
176
|
"@types/set-cookie-parser": "^2.4.2",
|
|
182
177
|
"@types/source-map-support": "^0.5.0",
|
|
183
178
|
"@types/useragent": "^2.1.1",
|
|
184
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
185
|
-
"@typescript-eslint/parser": "^
|
|
179
|
+
"@typescript-eslint/eslint-plugin": "^8.59.2",
|
|
180
|
+
"@typescript-eslint/parser": "^8.59.2",
|
|
186
181
|
"babel-plugin-add-module-exports": "^0.2.0",
|
|
187
182
|
"basic-auth": "^1.1.0",
|
|
188
183
|
"body-parser": "^1.17.1",
|
|
@@ -196,34 +191,32 @@
|
|
|
196
191
|
"cross-env": "^7.0.3",
|
|
197
192
|
"dom-walk": "^0.1.1",
|
|
198
193
|
"escape-string-regexp": "^4.0.0",
|
|
199
|
-
"eslint": "^
|
|
194
|
+
"eslint": "^9.39.4",
|
|
200
195
|
"eslint-plugin-hammerhead": "0.4.0",
|
|
201
196
|
"eslint-plugin-no-only-tests": "^2.0.1",
|
|
202
197
|
"express": "^4.13.3",
|
|
203
198
|
"express-ntlm": "2.4.0",
|
|
204
|
-
"gulp": "^
|
|
199
|
+
"gulp": "^5.0.1",
|
|
205
200
|
"gulp-babel": "^8.0.0",
|
|
206
201
|
"gulp-clone": "^2.0.1",
|
|
207
202
|
"gulp-data": "^1.3.1",
|
|
208
|
-
"gulp-eslint": "^6.
|
|
203
|
+
"gulp-eslint-new": "^2.6.2",
|
|
209
204
|
"gulp-less": "^5.0.0",
|
|
210
205
|
"gulp-ll-next": "^2.1.0",
|
|
211
|
-
"gulp-mocha-simple": "^2.0.0",
|
|
212
206
|
"gulp-mustache": "^3.0.1",
|
|
213
207
|
"gulp-rename": "^1.3.0",
|
|
214
208
|
"gulp-step": "^1.0.1",
|
|
215
209
|
"gulp-uglify": "^3.0.0",
|
|
216
210
|
"license-checker": "^20.0.0",
|
|
217
|
-
"markdownlint": "^0.34.0",
|
|
218
211
|
"merge-stream": "^1.0.1",
|
|
219
212
|
"minimist": "^1.2.0",
|
|
220
|
-
"mocha
|
|
221
|
-
"multer": "2.
|
|
213
|
+
"mocha": "^11.7.5",
|
|
214
|
+
"multer": "^2.1.1",
|
|
222
215
|
"openssl-self-signed-certificate": "^1.1.6",
|
|
223
216
|
"proxyquire": "^2.1.0",
|
|
224
217
|
"react": "^16.13.1",
|
|
225
218
|
"recursive-copy": "^2.0.5",
|
|
226
|
-
"rollup": "2.
|
|
219
|
+
"rollup": "^2.80.0",
|
|
227
220
|
"rollup-plugin-typescript2": "^0.32.1",
|
|
228
221
|
"serve-static": "^1.10.0",
|
|
229
222
|
"sinon": "^7.3.0",
|
|
@@ -234,6 +227,10 @@
|
|
|
234
227
|
"uglify-js": "~3.10.4"
|
|
235
228
|
},
|
|
236
229
|
"overrides": {
|
|
237
|
-
"glob": "8.1.0"
|
|
230
|
+
"glob": "8.1.0",
|
|
231
|
+
"mocha": {
|
|
232
|
+
"serialize-javascript": "^7.0.5",
|
|
233
|
+
"diff": "^8.0.0"
|
|
234
|
+
}
|
|
238
235
|
}
|
|
239
236
|
}
|