ecma-evaluator 2.0.10 → 2.1.1
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/README.md +4 -4
- package/README.zh-CN.md +4 -4
- package/dist/cjs/Evaluator.d.cts +6 -4
- package/dist/cjs/index.cjs +1024 -194
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/Evaluator.d.mts +6 -4
- package/dist/esm/index.mjs +1024 -194
- package/dist/esm/index.mjs.map +1 -1
- package/package.json +16 -7
package/dist/esm/index.mjs
CHANGED
|
@@ -35,6 +35,7 @@ var mutableMethods = [
|
|
|
35
35
|
"Array.prototype.sort",
|
|
36
36
|
"Array.prototype.fill",
|
|
37
37
|
"Array.prototype.copyWithin",
|
|
38
|
+
"Object.create",
|
|
38
39
|
"Object.defineProperty",
|
|
39
40
|
"Object.defineProperties",
|
|
40
41
|
"Object.preventExtensions",
|
|
@@ -234,7 +235,7 @@ var blockedGlobalBuiltIns = [
|
|
|
234
235
|
"Intl",
|
|
235
236
|
"Deno"
|
|
236
237
|
];
|
|
237
|
-
function
|
|
238
|
+
function regExpSafety_array_like_to_array(arr, len) {
|
|
238
239
|
if (null == len || len > arr.length) len = arr.length;
|
|
239
240
|
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
240
241
|
return arr2;
|
|
@@ -242,6 +243,516 @@ function Evaluator_array_like_to_array(arr, len) {
|
|
|
242
243
|
function _array_with_holes(arr) {
|
|
243
244
|
if (Array.isArray(arr)) return arr;
|
|
244
245
|
}
|
|
246
|
+
function _iterable_to_array_limit(arr, i) {
|
|
247
|
+
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
|
|
248
|
+
if (null == _i) return;
|
|
249
|
+
var _arr = [];
|
|
250
|
+
var _n = true;
|
|
251
|
+
var _d = false;
|
|
252
|
+
var _s, _e;
|
|
253
|
+
try {
|
|
254
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
255
|
+
_arr.push(_s.value);
|
|
256
|
+
if (i && _arr.length === i) break;
|
|
257
|
+
}
|
|
258
|
+
} catch (err) {
|
|
259
|
+
_d = true;
|
|
260
|
+
_e = err;
|
|
261
|
+
} finally{
|
|
262
|
+
try {
|
|
263
|
+
if (!_n && null != _i["return"]) _i["return"]();
|
|
264
|
+
} finally{
|
|
265
|
+
if (_d) throw _e;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return _arr;
|
|
269
|
+
}
|
|
270
|
+
function _non_iterable_rest() {
|
|
271
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
272
|
+
}
|
|
273
|
+
function _sliced_to_array(arr, i) {
|
|
274
|
+
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || regExpSafety_unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
275
|
+
}
|
|
276
|
+
function regExpSafety_unsupported_iterable_to_array(o, minLen) {
|
|
277
|
+
if (!o) return;
|
|
278
|
+
if ("string" == typeof o) return regExpSafety_array_like_to_array(o, minLen);
|
|
279
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
280
|
+
if ("Object" === n && o.constructor) n = o.constructor.name;
|
|
281
|
+
if ("Map" === n || "Set" === n) return Array.from(n);
|
|
282
|
+
if ("Arguments" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return regExpSafety_array_like_to_array(o, minLen);
|
|
283
|
+
}
|
|
284
|
+
function isUnsafeRegExpPattern(pattern) {
|
|
285
|
+
var pos = 0;
|
|
286
|
+
var depth = 0;
|
|
287
|
+
var MAX_DEPTH = 1000;
|
|
288
|
+
function parseAlternation() {
|
|
289
|
+
var start = pos;
|
|
290
|
+
var branches = [
|
|
291
|
+
parseSequence()
|
|
292
|
+
];
|
|
293
|
+
while("|" === pattern[pos]){
|
|
294
|
+
pos++;
|
|
295
|
+
branches.push(parseSequence());
|
|
296
|
+
}
|
|
297
|
+
if (1 === branches.length) return branches[0];
|
|
298
|
+
return {
|
|
299
|
+
type: "alt",
|
|
300
|
+
branches: branches,
|
|
301
|
+
start: start,
|
|
302
|
+
end: pos
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
function parseSequence() {
|
|
306
|
+
var start = pos;
|
|
307
|
+
var terms = [];
|
|
308
|
+
while(pos < pattern.length && "|" !== pattern[pos] && ")" !== pattern[pos])terms.push(parseTerm());
|
|
309
|
+
return {
|
|
310
|
+
type: "seq",
|
|
311
|
+
terms: terms,
|
|
312
|
+
start: start,
|
|
313
|
+
end: pos
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
function parseTerm() {
|
|
317
|
+
var atom = parseAtom();
|
|
318
|
+
var quantifier = parseQuantifier();
|
|
319
|
+
if (quantifier) return {
|
|
320
|
+
type: "quant",
|
|
321
|
+
min: quantifier.min,
|
|
322
|
+
max: quantifier.max,
|
|
323
|
+
body: atom,
|
|
324
|
+
start: atom.start,
|
|
325
|
+
end: pos
|
|
326
|
+
};
|
|
327
|
+
return atom;
|
|
328
|
+
}
|
|
329
|
+
function parseQuantifier() {
|
|
330
|
+
var ch = pattern[pos];
|
|
331
|
+
if ("*" === ch) {
|
|
332
|
+
pos++;
|
|
333
|
+
return {
|
|
334
|
+
min: 0,
|
|
335
|
+
max: 1 / 0
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
if ("+" === ch) {
|
|
339
|
+
pos++;
|
|
340
|
+
return {
|
|
341
|
+
min: 1,
|
|
342
|
+
max: 1 / 0
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
if ("?" === ch) {
|
|
346
|
+
pos++;
|
|
347
|
+
return {
|
|
348
|
+
min: 0,
|
|
349
|
+
max: 1
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
if ("{" === ch) {
|
|
353
|
+
var match = /^\{(\d+)(,(\d*))?\}/.exec(pattern.slice(pos));
|
|
354
|
+
if (match) {
|
|
355
|
+
pos += match[0].length;
|
|
356
|
+
var min = Number(match[1]);
|
|
357
|
+
var max;
|
|
358
|
+
max = void 0 === match[2] ? min : "" === match[3] ? 1 / 0 : Number(match[3]);
|
|
359
|
+
return {
|
|
360
|
+
min: min,
|
|
361
|
+
max: max
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
return null;
|
|
366
|
+
}
|
|
367
|
+
function parseAtom() {
|
|
368
|
+
var start = pos;
|
|
369
|
+
var ch = pattern[pos];
|
|
370
|
+
if ("(" === ch) {
|
|
371
|
+
pos++;
|
|
372
|
+
var zeroWidth = false;
|
|
373
|
+
if ("?" === pattern[pos]) {
|
|
374
|
+
var rest = pattern.slice(pos);
|
|
375
|
+
if (rest.startsWith("?:")) pos += 2;
|
|
376
|
+
else if (rest.startsWith("?=") || rest.startsWith("?!")) {
|
|
377
|
+
pos += 2;
|
|
378
|
+
zeroWidth = true;
|
|
379
|
+
} else if (rest.startsWith("?<=") || rest.startsWith("?<!")) {
|
|
380
|
+
pos += 3;
|
|
381
|
+
zeroWidth = true;
|
|
382
|
+
} else if (rest.startsWith("?<")) {
|
|
383
|
+
var named = /^\?<[A-Za-z_$][\w$]*>/.exec(rest);
|
|
384
|
+
pos += named ? named[0].length : 2;
|
|
385
|
+
} else pos += 1;
|
|
386
|
+
}
|
|
387
|
+
depth++;
|
|
388
|
+
if (depth > MAX_DEPTH) throw new RangeError("regexp nesting too deep");
|
|
389
|
+
var body = parseAlternation();
|
|
390
|
+
depth--;
|
|
391
|
+
if (")" === pattern[pos]) pos++;
|
|
392
|
+
return {
|
|
393
|
+
type: "group",
|
|
394
|
+
body: body,
|
|
395
|
+
zeroWidth: zeroWidth,
|
|
396
|
+
start: start,
|
|
397
|
+
end: pos
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
if ("[" === ch) {
|
|
401
|
+
pos++;
|
|
402
|
+
if ("^" === pattern[pos]) pos++;
|
|
403
|
+
if ("]" === pattern[pos]) pos++;
|
|
404
|
+
while(pos < pattern.length && "]" !== pattern[pos]){
|
|
405
|
+
if ("\\" === pattern[pos]) pos++;
|
|
406
|
+
pos++;
|
|
407
|
+
}
|
|
408
|
+
pos++;
|
|
409
|
+
return {
|
|
410
|
+
type: "char",
|
|
411
|
+
zeroWidth: false,
|
|
412
|
+
start: start,
|
|
413
|
+
end: pos
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
if ("\\" === ch) {
|
|
417
|
+
pos += 2;
|
|
418
|
+
var escaped = pattern[start + 1];
|
|
419
|
+
return {
|
|
420
|
+
type: "char",
|
|
421
|
+
zeroWidth: "b" === escaped || "B" === escaped,
|
|
422
|
+
start: start,
|
|
423
|
+
end: pos
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
pos++;
|
|
427
|
+
return {
|
|
428
|
+
type: "char",
|
|
429
|
+
zeroWidth: "^" === ch || "$" === ch,
|
|
430
|
+
start: start,
|
|
431
|
+
end: pos
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
var raw = function(node) {
|
|
435
|
+
return pattern.slice(node.start, node.end);
|
|
436
|
+
};
|
|
437
|
+
var ANY = Symbol("any");
|
|
438
|
+
var DIGITS = new Set("0123456789".split(""));
|
|
439
|
+
var WORD = new Set("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_".split(""));
|
|
440
|
+
var SPACES = new Set([
|
|
441
|
+
" ",
|
|
442
|
+
"\t",
|
|
443
|
+
"\n",
|
|
444
|
+
"\r",
|
|
445
|
+
"\f",
|
|
446
|
+
"\v",
|
|
447
|
+
"\u00a0",
|
|
448
|
+
"\ufeff",
|
|
449
|
+
"\u2028",
|
|
450
|
+
"\u2029"
|
|
451
|
+
]);
|
|
452
|
+
function escapeSet(esc) {
|
|
453
|
+
switch(esc){
|
|
454
|
+
case "d":
|
|
455
|
+
return DIGITS;
|
|
456
|
+
case "w":
|
|
457
|
+
return WORD;
|
|
458
|
+
case "s":
|
|
459
|
+
return SPACES;
|
|
460
|
+
case "n":
|
|
461
|
+
return new Set([
|
|
462
|
+
"\n"
|
|
463
|
+
]);
|
|
464
|
+
case "t":
|
|
465
|
+
return new Set([
|
|
466
|
+
"\t"
|
|
467
|
+
]);
|
|
468
|
+
case "r":
|
|
469
|
+
return new Set([
|
|
470
|
+
"\r"
|
|
471
|
+
]);
|
|
472
|
+
case "f":
|
|
473
|
+
return new Set([
|
|
474
|
+
"\f"
|
|
475
|
+
]);
|
|
476
|
+
case "v":
|
|
477
|
+
return new Set([
|
|
478
|
+
"\v"
|
|
479
|
+
]);
|
|
480
|
+
case "0":
|
|
481
|
+
return new Set([
|
|
482
|
+
"\0"
|
|
483
|
+
]);
|
|
484
|
+
default:
|
|
485
|
+
if (/[0-9A-Za-z]/.test(esc)) return ANY;
|
|
486
|
+
return new Set([
|
|
487
|
+
esc
|
|
488
|
+
]);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
function classSet(text) {
|
|
492
|
+
var inner = text.slice(1, -1);
|
|
493
|
+
if (inner.startsWith("^")) return ANY;
|
|
494
|
+
var set = new Set();
|
|
495
|
+
for(var i = 0; i < inner.length; i++){
|
|
496
|
+
var ch = inner[i];
|
|
497
|
+
if ("\\" === ch) {
|
|
498
|
+
var esc = inner[++i];
|
|
499
|
+
var expanded = escapeSet(esc);
|
|
500
|
+
if (expanded === ANY) return ANY;
|
|
501
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
|
|
502
|
+
try {
|
|
503
|
+
for(var _iterator = expanded[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
504
|
+
var c = _step.value;
|
|
505
|
+
set.add(c);
|
|
506
|
+
}
|
|
507
|
+
} catch (err) {
|
|
508
|
+
_didIteratorError = true;
|
|
509
|
+
_iteratorError = err;
|
|
510
|
+
} finally{
|
|
511
|
+
try {
|
|
512
|
+
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
|
|
513
|
+
} finally{
|
|
514
|
+
if (_didIteratorError) throw _iteratorError;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
continue;
|
|
518
|
+
}
|
|
519
|
+
if ("-" === inner[i + 1] && void 0 !== inner[i + 2] && "]" !== inner[i + 2]) {
|
|
520
|
+
var end = inner[i + 2];
|
|
521
|
+
var startCode = ch.codePointAt(0);
|
|
522
|
+
var endCode = end.codePointAt(0);
|
|
523
|
+
if (endCode - startCode > 1024) return ANY;
|
|
524
|
+
for(var code = startCode; code <= endCode; code++)set.add(String.fromCodePoint(code));
|
|
525
|
+
i += 2;
|
|
526
|
+
continue;
|
|
527
|
+
}
|
|
528
|
+
set.add(ch);
|
|
529
|
+
}
|
|
530
|
+
return set;
|
|
531
|
+
}
|
|
532
|
+
function firstCharSet(node) {
|
|
533
|
+
switch(node.type){
|
|
534
|
+
case "char":
|
|
535
|
+
var text = raw(node);
|
|
536
|
+
if (node.zeroWidth || text.startsWith("^") || text.startsWith("$")) return new Set();
|
|
537
|
+
if ("." === text) return ANY;
|
|
538
|
+
if (text.startsWith("[")) return classSet(text);
|
|
539
|
+
if (text.startsWith("\\")) {
|
|
540
|
+
var esc = text.slice(1);
|
|
541
|
+
if (1 === esc.length) return escapeSet(esc);
|
|
542
|
+
return ANY;
|
|
543
|
+
}
|
|
544
|
+
return new Set([
|
|
545
|
+
text[0]
|
|
546
|
+
]);
|
|
547
|
+
case "quant":
|
|
548
|
+
return 0 === node.min ? ANY : firstCharSet(node.body);
|
|
549
|
+
case "group":
|
|
550
|
+
return node.zeroWidth ? ANY : firstCharSet(node.body);
|
|
551
|
+
case "alt":
|
|
552
|
+
var union = new Set();
|
|
553
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
|
|
554
|
+
try {
|
|
555
|
+
for(var _iterator = node.branches[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
556
|
+
var branch = _step.value;
|
|
557
|
+
var set = firstCharSet(branch);
|
|
558
|
+
if (set === ANY) return ANY;
|
|
559
|
+
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;
|
|
560
|
+
try {
|
|
561
|
+
for(var _iterator1 = set[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
|
|
562
|
+
var ch = _step1.value;
|
|
563
|
+
union.add(ch);
|
|
564
|
+
}
|
|
565
|
+
} catch (err) {
|
|
566
|
+
_didIteratorError1 = true;
|
|
567
|
+
_iteratorError1 = err;
|
|
568
|
+
} finally{
|
|
569
|
+
try {
|
|
570
|
+
if (!_iteratorNormalCompletion1 && null != _iterator1.return) _iterator1.return();
|
|
571
|
+
} finally{
|
|
572
|
+
if (_didIteratorError1) throw _iteratorError1;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
} catch (err) {
|
|
577
|
+
_didIteratorError = true;
|
|
578
|
+
_iteratorError = err;
|
|
579
|
+
} finally{
|
|
580
|
+
try {
|
|
581
|
+
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
|
|
582
|
+
} finally{
|
|
583
|
+
if (_didIteratorError) throw _iteratorError;
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
return union;
|
|
587
|
+
case "seq":
|
|
588
|
+
var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = void 0;
|
|
589
|
+
try {
|
|
590
|
+
for(var _iterator2 = node.terms[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){
|
|
591
|
+
var term = _step2.value;
|
|
592
|
+
var set1 = firstCharSet(term);
|
|
593
|
+
if (set1 === ANY) return ANY;
|
|
594
|
+
if (set1.size > 0) return set1;
|
|
595
|
+
}
|
|
596
|
+
} catch (err) {
|
|
597
|
+
_didIteratorError2 = true;
|
|
598
|
+
_iteratorError2 = err;
|
|
599
|
+
} finally{
|
|
600
|
+
try {
|
|
601
|
+
if (!_iteratorNormalCompletion2 && null != _iterator2.return) _iterator2.return();
|
|
602
|
+
} finally{
|
|
603
|
+
if (_didIteratorError2) throw _iteratorError2;
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
return new Set();
|
|
607
|
+
default:
|
|
608
|
+
return ANY;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
function setsIntersect(a, b) {
|
|
612
|
+
if (a === ANY || b === ANY) return true;
|
|
613
|
+
if (0 === a.size || 0 === b.size) return false;
|
|
614
|
+
var _ref = _sliced_to_array(a.size <= b.size ? [
|
|
615
|
+
a,
|
|
616
|
+
b
|
|
617
|
+
] : [
|
|
618
|
+
b,
|
|
619
|
+
a
|
|
620
|
+
], 2), small = _ref[0], large = _ref[1];
|
|
621
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
|
|
622
|
+
try {
|
|
623
|
+
for(var _iterator = small[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
624
|
+
var ch = _step.value;
|
|
625
|
+
if (large.has(ch)) return true;
|
|
626
|
+
}
|
|
627
|
+
} catch (err) {
|
|
628
|
+
_didIteratorError = true;
|
|
629
|
+
_iteratorError = err;
|
|
630
|
+
} finally{
|
|
631
|
+
try {
|
|
632
|
+
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
|
|
633
|
+
} finally{
|
|
634
|
+
if (_didIteratorError) throw _iteratorError;
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
return false;
|
|
638
|
+
}
|
|
639
|
+
function consumableCharSet(quantNode) {
|
|
640
|
+
return firstCharSet(quantNode.body);
|
|
641
|
+
}
|
|
642
|
+
function trailingQuantifier(node) {
|
|
643
|
+
switch(node.type){
|
|
644
|
+
case "quant":
|
|
645
|
+
return node.max === 1 / 0 ? node : null;
|
|
646
|
+
case "group":
|
|
647
|
+
return node.zeroWidth ? null : trailingQuantifier(node.body);
|
|
648
|
+
case "seq":
|
|
649
|
+
for(var i = node.terms.length - 1; i >= 0; i--){
|
|
650
|
+
var quantifier = trailingQuantifier(node.terms[i]);
|
|
651
|
+
if (quantifier) return quantifier;
|
|
652
|
+
var set = firstCharSet(node.terms[i]);
|
|
653
|
+
if (set === ANY || set.size > 0) break;
|
|
654
|
+
}
|
|
655
|
+
return null;
|
|
656
|
+
default:
|
|
657
|
+
return null;
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
function leadingQuantifier(node) {
|
|
661
|
+
switch(node.type){
|
|
662
|
+
case "quant":
|
|
663
|
+
return node.max === 1 / 0 ? node : null;
|
|
664
|
+
case "group":
|
|
665
|
+
return node.zeroWidth ? null : leadingQuantifier(node.body);
|
|
666
|
+
case "seq":
|
|
667
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
|
|
668
|
+
try {
|
|
669
|
+
for(var _iterator = node.terms[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
670
|
+
var term = _step.value;
|
|
671
|
+
var quantifier = leadingQuantifier(term);
|
|
672
|
+
if (quantifier) return quantifier;
|
|
673
|
+
var set = firstCharSet(term);
|
|
674
|
+
if (set === ANY || set.size > 0) return null;
|
|
675
|
+
}
|
|
676
|
+
} catch (err) {
|
|
677
|
+
_didIteratorError = true;
|
|
678
|
+
_iteratorError = err;
|
|
679
|
+
} finally{
|
|
680
|
+
try {
|
|
681
|
+
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
|
|
682
|
+
} finally{
|
|
683
|
+
if (_didIteratorError) throw _iteratorError;
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
return null;
|
|
687
|
+
default:
|
|
688
|
+
return null;
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
function hasAdjacentOverlappingQuantifiers(seqNode) {
|
|
692
|
+
var terms = seqNode.terms;
|
|
693
|
+
for(var i = 0; i + 1 < terms.length; i++){
|
|
694
|
+
var left = trailingQuantifier(terms[i]);
|
|
695
|
+
var right = leadingQuantifier(terms[i + 1]);
|
|
696
|
+
if (left && right && setsIntersect(consumableCharSet(left), consumableCharSet(right))) return true;
|
|
697
|
+
}
|
|
698
|
+
return false;
|
|
699
|
+
}
|
|
700
|
+
function containsUnboundedQuantifier(node) {
|
|
701
|
+
switch(node.type){
|
|
702
|
+
case "quant":
|
|
703
|
+
if (node.max === 1 / 0) return true;
|
|
704
|
+
return containsUnboundedQuantifier(node.body);
|
|
705
|
+
case "group":
|
|
706
|
+
return containsUnboundedQuantifier(node.body);
|
|
707
|
+
case "alt":
|
|
708
|
+
return node.branches.some(containsUnboundedQuantifier);
|
|
709
|
+
case "seq":
|
|
710
|
+
return node.terms.some(containsUnboundedQuantifier);
|
|
711
|
+
default:
|
|
712
|
+
return false;
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
function alternationOverlaps(node) {
|
|
716
|
+
if ("alt" !== node.type) return false;
|
|
717
|
+
var texts = node.branches.map(raw).sort();
|
|
718
|
+
for(var i = 0; i + 1 < texts.length; i++)if ("" === texts[i] || texts[i + 1].startsWith(texts[i])) return true;
|
|
719
|
+
var sets = node.branches.map(firstCharSet);
|
|
720
|
+
for(var i1 = 0; i1 < sets.length; i1++)for(var j = i1 + 1; j < sets.length; j++)if (setsIntersect(sets[i1], sets[j])) return true;
|
|
721
|
+
return false;
|
|
722
|
+
}
|
|
723
|
+
function isCatastrophic(node) {
|
|
724
|
+
switch(node.type){
|
|
725
|
+
case "quant":
|
|
726
|
+
if (node.max === 1 / 0) {
|
|
727
|
+
var inner = "group" === node.body.type ? node.body.body : node.body;
|
|
728
|
+
if (containsUnboundedQuantifier(inner)) return true;
|
|
729
|
+
if ("alt" === inner.type && alternationOverlaps(inner)) return true;
|
|
730
|
+
}
|
|
731
|
+
return isCatastrophic(node.body);
|
|
732
|
+
case "group":
|
|
733
|
+
return isCatastrophic(node.body);
|
|
734
|
+
case "alt":
|
|
735
|
+
return node.branches.some(isCatastrophic);
|
|
736
|
+
case "seq":
|
|
737
|
+
return hasAdjacentOverlappingQuantifiers(node) || node.terms.some(isCatastrophic);
|
|
738
|
+
default:
|
|
739
|
+
return false;
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
try {
|
|
743
|
+
return isCatastrophic(parseAlternation());
|
|
744
|
+
} catch (e) {
|
|
745
|
+
return false;
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
function Evaluator_array_like_to_array(arr, len) {
|
|
749
|
+
if (null == len || len > arr.length) len = arr.length;
|
|
750
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
751
|
+
return arr2;
|
|
752
|
+
}
|
|
753
|
+
function Evaluator_array_with_holes(arr) {
|
|
754
|
+
if (Array.isArray(arr)) return arr;
|
|
755
|
+
}
|
|
245
756
|
function Evaluator_array_without_holes(arr) {
|
|
246
757
|
if (Array.isArray(arr)) return Evaluator_array_like_to_array(arr);
|
|
247
758
|
}
|
|
@@ -282,7 +793,7 @@ function _instanceof(left, right) {
|
|
|
282
793
|
function Evaluator_iterable_to_array(iter) {
|
|
283
794
|
if ("undefined" != typeof Symbol && null != iter[Symbol.iterator] || null != iter["@@iterator"]) return Array.from(iter);
|
|
284
795
|
}
|
|
285
|
-
function
|
|
796
|
+
function Evaluator_non_iterable_rest() {
|
|
286
797
|
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
287
798
|
}
|
|
288
799
|
function Evaluator_non_iterable_spread() {
|
|
@@ -296,7 +807,7 @@ function _set_prototype_of(o, p) {
|
|
|
296
807
|
return _set_prototype_of(o, p);
|
|
297
808
|
}
|
|
298
809
|
function _to_array(arr) {
|
|
299
|
-
return
|
|
810
|
+
return Evaluator_array_with_holes(arr) || Evaluator_iterable_to_array(arr) || Evaluator_unsupported_iterable_to_array(arr) || Evaluator_non_iterable_rest();
|
|
300
811
|
}
|
|
301
812
|
function Evaluator_to_consumable_array(arr) {
|
|
302
813
|
return Evaluator_array_without_holes(arr) || Evaluator_iterable_to_array(arr) || Evaluator_unsupported_iterable_to_array(arr) || Evaluator_non_iterable_spread();
|
|
@@ -338,6 +849,18 @@ var MAX_STRING_LENGTH = 100000;
|
|
|
338
849
|
var MAX_DATA_NODES = 100000;
|
|
339
850
|
var MAX_BIGINT_EXPONENT = 256n;
|
|
340
851
|
var MAX_BIGINT_BITS = 65536;
|
|
852
|
+
var DEFAULT_MAX_DEPTH = 1000;
|
|
853
|
+
var MAX_CONFIGURABLE_DEPTH = 2000;
|
|
854
|
+
var MAX_REGEXP_SOURCE_LENGTH = 1000;
|
|
855
|
+
var MAX_REGEXP_FLAGS_LENGTH = 32;
|
|
856
|
+
var NON_SANDBOX_GLOBALS = new Set([
|
|
857
|
+
"WeakRef",
|
|
858
|
+
"FinalizationRegistry",
|
|
859
|
+
"Iterator",
|
|
860
|
+
"SharedArrayBuffer",
|
|
861
|
+
"escape",
|
|
862
|
+
"unescape"
|
|
863
|
+
]);
|
|
341
864
|
var TYPED_ARRAY_CONSTRUCTORS = new Set([
|
|
342
865
|
Int8Array,
|
|
343
866
|
Uint8Array,
|
|
@@ -346,6 +869,7 @@ var TYPED_ARRAY_CONSTRUCTORS = new Set([
|
|
|
346
869
|
Uint16Array,
|
|
347
870
|
Int32Array,
|
|
348
871
|
Uint32Array,
|
|
872
|
+
"function" == typeof Float16Array ? Float16Array : null,
|
|
349
873
|
Float32Array,
|
|
350
874
|
Float64Array,
|
|
351
875
|
"function" == typeof BigInt64Array ? BigInt64Array : null,
|
|
@@ -353,6 +877,89 @@ var TYPED_ARRAY_CONSTRUCTORS = new Set([
|
|
|
353
877
|
].filter(function(constructor) {
|
|
354
878
|
return "function" == typeof constructor;
|
|
355
879
|
}));
|
|
880
|
+
function isTypedArrayConstructor(value) {
|
|
881
|
+
return TYPED_ARRAY_CONSTRUCTORS.has(value) || "function" == typeof value && "number" == typeof value.BYTES_PER_ELEMENT;
|
|
882
|
+
}
|
|
883
|
+
var TYPED_ARRAY_MUTATORS = function() {
|
|
884
|
+
var map = new Map();
|
|
885
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
|
|
886
|
+
try {
|
|
887
|
+
for(var _iterator = TYPED_ARRAY_CONSTRUCTORS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
888
|
+
var constructor = _step.value;
|
|
889
|
+
for(var _i = 0, _iter = [
|
|
890
|
+
"set",
|
|
891
|
+
"fill",
|
|
892
|
+
"reverse",
|
|
893
|
+
"sort",
|
|
894
|
+
"copyWithin"
|
|
895
|
+
]; _i < _iter.length; _i++){
|
|
896
|
+
var name = _iter[_i];
|
|
897
|
+
var method = constructor.prototype[name];
|
|
898
|
+
if ("function" == typeof method && !map.has(method)) map.set(method, name);
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
} catch (err) {
|
|
902
|
+
_didIteratorError = true;
|
|
903
|
+
_iteratorError = err;
|
|
904
|
+
} finally{
|
|
905
|
+
try {
|
|
906
|
+
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
|
|
907
|
+
} finally{
|
|
908
|
+
if (_didIteratorError) throw _iteratorError;
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
return map;
|
|
912
|
+
}();
|
|
913
|
+
var REGEXP_SYMBOL_METHODS = new Set([
|
|
914
|
+
Symbol.match,
|
|
915
|
+
Symbol.matchAll,
|
|
916
|
+
Symbol.replace,
|
|
917
|
+
Symbol.search,
|
|
918
|
+
Symbol.split
|
|
919
|
+
].map(function(symbol) {
|
|
920
|
+
return RegExp.prototype[symbol];
|
|
921
|
+
}).filter(function(method) {
|
|
922
|
+
return "function" == typeof method;
|
|
923
|
+
}));
|
|
924
|
+
var REGEXP_INVOCATION_KIND = function() {
|
|
925
|
+
var map = new Map();
|
|
926
|
+
for(var _i = 0, _iter = [
|
|
927
|
+
String.prototype.match,
|
|
928
|
+
String.prototype.matchAll,
|
|
929
|
+
String.prototype.search
|
|
930
|
+
]; _i < _iter.length; _i++){
|
|
931
|
+
var method = _iter[_i];
|
|
932
|
+
map.set(method, "stringPattern");
|
|
933
|
+
}
|
|
934
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
|
|
935
|
+
try {
|
|
936
|
+
for(var _iterator = [
|
|
937
|
+
RegExp.prototype.test,
|
|
938
|
+
RegExp.prototype.exec
|
|
939
|
+
].concat(Evaluator_to_consumable_array(REGEXP_SYMBOL_METHODS))[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
940
|
+
var method1 = _step.value;
|
|
941
|
+
map.set(method1, "receiverPattern");
|
|
942
|
+
}
|
|
943
|
+
} catch (err) {
|
|
944
|
+
_didIteratorError = true;
|
|
945
|
+
_iteratorError = err;
|
|
946
|
+
} finally{
|
|
947
|
+
try {
|
|
948
|
+
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
|
|
949
|
+
} finally{
|
|
950
|
+
if (_didIteratorError) throw _iteratorError;
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
for(var _i1 = 0, _iter1 = [
|
|
954
|
+
String.prototype.replace,
|
|
955
|
+
String.prototype.replaceAll,
|
|
956
|
+
String.prototype.split
|
|
957
|
+
]; _i1 < _iter1.length; _i1++){
|
|
958
|
+
var method2 = _iter1[_i1];
|
|
959
|
+
map.set(method2, "regexArgument");
|
|
960
|
+
}
|
|
961
|
+
return map;
|
|
962
|
+
}();
|
|
356
963
|
var NO_OBJECT = Symbol("no-object");
|
|
357
964
|
var renderErrorMessage = function(template) {
|
|
358
965
|
var context = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};
|
|
@@ -360,6 +967,26 @@ var renderErrorMessage = function(template) {
|
|
|
360
967
|
return String(context[key]);
|
|
361
968
|
});
|
|
362
969
|
};
|
|
970
|
+
var SAFE_REGEXP_PATTERNS = new Set();
|
|
971
|
+
var MAX_SAFE_REGEXP_PATTERNS = 1000;
|
|
972
|
+
function assertSafeRegExpPattern(pattern) {
|
|
973
|
+
if ("string" != typeof pattern || SAFE_REGEXP_PATTERNS.has(pattern)) return;
|
|
974
|
+
if (isUnsafeRegExpPattern(pattern)) throw new RangeError("RegExp pattern may cause catastrophic backtracking and is not allowed");
|
|
975
|
+
if (SAFE_REGEXP_PATTERNS.size >= MAX_SAFE_REGEXP_PATTERNS) SAFE_REGEXP_PATTERNS.delete(SAFE_REGEXP_PATTERNS.values().next().value);
|
|
976
|
+
SAFE_REGEXP_PATTERNS.add(pattern);
|
|
977
|
+
}
|
|
978
|
+
function assertSafeRegExpInvocation(func, target, args) {
|
|
979
|
+
var kind = REGEXP_INVOCATION_KIND.get(func);
|
|
980
|
+
if (void 0 === kind) return;
|
|
981
|
+
if ("stringPattern" === kind) {
|
|
982
|
+
var pattern = args[0];
|
|
983
|
+
if ("string" == typeof pattern) assertSafeRegExpPattern(pattern);
|
|
984
|
+
else if (_instanceof(pattern, RegExp)) assertSafeRegExpPattern(pattern.source);
|
|
985
|
+
return;
|
|
986
|
+
}
|
|
987
|
+
var regexp = "receiverPattern" === kind ? target : args[0];
|
|
988
|
+
if (_instanceof(regexp, RegExp)) assertSafeRegExpPattern(regexp.source);
|
|
989
|
+
}
|
|
363
990
|
function validateLimit(value, name, defaultValue, maximum) {
|
|
364
991
|
if (void 0 === value) return defaultValue;
|
|
365
992
|
if (!Number.isSafeInteger(value) || value < 1 || value > maximum) throw new RangeError("".concat(name, " must be an integer between 1 and ").concat(maximum));
|
|
@@ -376,7 +1003,59 @@ function countLiteralMatches(value, search, all) {
|
|
|
376
1003
|
}
|
|
377
1004
|
return count;
|
|
378
1005
|
}
|
|
1006
|
+
function countRegExpMatches(value, regexp, all) {
|
|
1007
|
+
var flags = regexp.flags.includes("g") ? regexp.flags : regexp.flags + "g";
|
|
1008
|
+
var re = new RegExp(regexp.source, flags);
|
|
1009
|
+
var count = 0;
|
|
1010
|
+
var match;
|
|
1011
|
+
while(null !== (match = re.exec(value))){
|
|
1012
|
+
count++;
|
|
1013
|
+
if (!all || count > MAX_STRING_LENGTH) break;
|
|
1014
|
+
if (re.lastIndex === match.index) re.lastIndex++;
|
|
1015
|
+
}
|
|
1016
|
+
return count;
|
|
1017
|
+
}
|
|
1018
|
+
var PARSE_CACHE = new Map();
|
|
1019
|
+
var MAX_PARSE_CACHE_ENTRIES = 1000;
|
|
1020
|
+
var MAX_PARSE_CACHE_CHARS = 200000;
|
|
1021
|
+
var parseCacheChars = 0;
|
|
1022
|
+
function parseExpression(expression) {
|
|
1023
|
+
var cached = PARSE_CACHE.get(expression);
|
|
1024
|
+
if (void 0 !== cached) return cached;
|
|
1025
|
+
var ast;
|
|
1026
|
+
try {
|
|
1027
|
+
ast = external_acorn_parse(expression, {
|
|
1028
|
+
ecmaVersion: "latest"
|
|
1029
|
+
});
|
|
1030
|
+
} catch (error) {
|
|
1031
|
+
if (_instanceof(error, RangeError) && /call stack/i.test(error.message)) throw new SyntaxError("Expression nesting is too deep to parse");
|
|
1032
|
+
throw error;
|
|
1033
|
+
}
|
|
1034
|
+
if (expression.length <= MAX_PARSE_CACHE_CHARS) {
|
|
1035
|
+
while(PARSE_CACHE.size >= MAX_PARSE_CACHE_ENTRIES || parseCacheChars + expression.length > MAX_PARSE_CACHE_CHARS){
|
|
1036
|
+
var oldestKey = PARSE_CACHE.keys().next().value;
|
|
1037
|
+
if (void 0 === oldestKey) break;
|
|
1038
|
+
parseCacheChars -= oldestKey.length;
|
|
1039
|
+
PARSE_CACHE.delete(oldestKey);
|
|
1040
|
+
}
|
|
1041
|
+
PARSE_CACHE.set(expression, ast);
|
|
1042
|
+
parseCacheChars += expression.length;
|
|
1043
|
+
}
|
|
1044
|
+
return ast;
|
|
1045
|
+
}
|
|
379
1046
|
function assertBoundedData(value, label) {
|
|
1047
|
+
var valueType = void 0 === value ? "undefined" : _type_of(value);
|
|
1048
|
+
if ("string" === valueType) {
|
|
1049
|
+
if (value.length > MAX_STRING_LENGTH) throw new RangeError("".concat(label, " contains a string that exceeds the maximum length"));
|
|
1050
|
+
return {
|
|
1051
|
+
dataSize: value.length + 8,
|
|
1052
|
+
dataNodes: 1
|
|
1053
|
+
};
|
|
1054
|
+
}
|
|
1055
|
+
if (null === value || "undefined" === valueType || "number" === valueType || "boolean" === valueType || "bigint" === valueType) return {
|
|
1056
|
+
dataSize: 8,
|
|
1057
|
+
dataNodes: 1
|
|
1058
|
+
};
|
|
380
1059
|
var pending = [
|
|
381
1060
|
value
|
|
382
1061
|
];
|
|
@@ -446,85 +1125,157 @@ function assertBoundedData(value, label) {
|
|
|
446
1125
|
dataNodes: dataNodes
|
|
447
1126
|
};
|
|
448
1127
|
}
|
|
449
|
-
var BINARY_OPERATION_MAP =
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
1128
|
+
var BINARY_OPERATION_MAP = new Map([
|
|
1129
|
+
[
|
|
1130
|
+
"+",
|
|
1131
|
+
function(a, b) {
|
|
1132
|
+
return a + b;
|
|
1133
|
+
}
|
|
1134
|
+
],
|
|
1135
|
+
[
|
|
1136
|
+
"-",
|
|
1137
|
+
function(a, b) {
|
|
1138
|
+
return a - b;
|
|
1139
|
+
}
|
|
1140
|
+
],
|
|
1141
|
+
[
|
|
1142
|
+
"*",
|
|
1143
|
+
function(a, b) {
|
|
1144
|
+
return a * b;
|
|
1145
|
+
}
|
|
1146
|
+
],
|
|
1147
|
+
[
|
|
1148
|
+
"**",
|
|
1149
|
+
function(a, b) {
|
|
1150
|
+
return Math.pow(a, b);
|
|
1151
|
+
}
|
|
1152
|
+
],
|
|
1153
|
+
[
|
|
1154
|
+
"==",
|
|
1155
|
+
function(a, b) {
|
|
1156
|
+
return a == b;
|
|
1157
|
+
}
|
|
1158
|
+
],
|
|
1159
|
+
[
|
|
1160
|
+
"===",
|
|
1161
|
+
function(a, b) {
|
|
1162
|
+
return a === b;
|
|
1163
|
+
}
|
|
1164
|
+
],
|
|
1165
|
+
[
|
|
1166
|
+
"!=",
|
|
1167
|
+
function(a, b) {
|
|
1168
|
+
return a != b;
|
|
1169
|
+
}
|
|
1170
|
+
],
|
|
1171
|
+
[
|
|
1172
|
+
"!==",
|
|
1173
|
+
function(a, b) {
|
|
1174
|
+
return a !== b;
|
|
1175
|
+
}
|
|
1176
|
+
],
|
|
1177
|
+
[
|
|
1178
|
+
">",
|
|
1179
|
+
function(a, b) {
|
|
1180
|
+
return a > b;
|
|
1181
|
+
}
|
|
1182
|
+
],
|
|
1183
|
+
[
|
|
1184
|
+
">=",
|
|
1185
|
+
function(a, b) {
|
|
1186
|
+
return a >= b;
|
|
1187
|
+
}
|
|
1188
|
+
],
|
|
1189
|
+
[
|
|
1190
|
+
"<",
|
|
1191
|
+
function(a, b) {
|
|
1192
|
+
return a < b;
|
|
1193
|
+
}
|
|
1194
|
+
],
|
|
1195
|
+
[
|
|
1196
|
+
"<=",
|
|
1197
|
+
function(a, b) {
|
|
1198
|
+
return a <= b;
|
|
1199
|
+
}
|
|
1200
|
+
],
|
|
1201
|
+
[
|
|
1202
|
+
"%",
|
|
1203
|
+
function(a, b) {
|
|
1204
|
+
return a % b;
|
|
1205
|
+
}
|
|
1206
|
+
],
|
|
1207
|
+
[
|
|
1208
|
+
"/",
|
|
1209
|
+
function(a, b) {
|
|
1210
|
+
return a / b;
|
|
1211
|
+
}
|
|
1212
|
+
],
|
|
1213
|
+
[
|
|
1214
|
+
"|",
|
|
1215
|
+
function(a, b) {
|
|
1216
|
+
return a | b;
|
|
1217
|
+
}
|
|
1218
|
+
],
|
|
1219
|
+
[
|
|
1220
|
+
"&",
|
|
1221
|
+
function(a, b) {
|
|
1222
|
+
return a & b;
|
|
1223
|
+
}
|
|
1224
|
+
],
|
|
1225
|
+
[
|
|
1226
|
+
"^",
|
|
1227
|
+
function(a, b) {
|
|
1228
|
+
return a ^ b;
|
|
1229
|
+
}
|
|
1230
|
+
],
|
|
1231
|
+
[
|
|
1232
|
+
"<<",
|
|
1233
|
+
function(a, b) {
|
|
1234
|
+
return a << b;
|
|
1235
|
+
}
|
|
1236
|
+
],
|
|
1237
|
+
[
|
|
1238
|
+
">>",
|
|
1239
|
+
function(a, b) {
|
|
1240
|
+
return a >> b;
|
|
1241
|
+
}
|
|
1242
|
+
],
|
|
1243
|
+
[
|
|
1244
|
+
">>>",
|
|
1245
|
+
function(a, b) {
|
|
1246
|
+
return a >>> b;
|
|
1247
|
+
}
|
|
1248
|
+
],
|
|
1249
|
+
[
|
|
1250
|
+
"in",
|
|
1251
|
+
function(a, b) {
|
|
1252
|
+
return a in b;
|
|
1253
|
+
}
|
|
1254
|
+
],
|
|
1255
|
+
[
|
|
1256
|
+
"instanceof",
|
|
1257
|
+
function(a, b) {
|
|
1258
|
+
return _instanceof(a, b);
|
|
1259
|
+
}
|
|
1260
|
+
]
|
|
1261
|
+
]);
|
|
517
1262
|
function createGlobalScope() {
|
|
518
1263
|
var scope = Object.create(null);
|
|
519
1264
|
var builtin = globals.builtin;
|
|
520
|
-
for(var key in builtin)
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
1265
|
+
for(var key in builtin){
|
|
1266
|
+
if (!blockedGlobalBuiltIns.includes(key)) {
|
|
1267
|
+
if (!NON_SANDBOX_GLOBALS.has(key)) {
|
|
1268
|
+
if (Object.hasOwn(globalThis, key)) {
|
|
1269
|
+
var isWritable = builtin[key];
|
|
1270
|
+
Object.defineProperty(scope, key, {
|
|
1271
|
+
value: globalThis[key],
|
|
1272
|
+
writable: isWritable,
|
|
1273
|
+
enumerable: false,
|
|
1274
|
+
configurable: false
|
|
1275
|
+
});
|
|
1276
|
+
}
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
528
1279
|
}
|
|
529
1280
|
Object.defineProperty(scope, "globalThis", {
|
|
530
1281
|
value: scope,
|
|
@@ -534,6 +1285,12 @@ function createGlobalScope() {
|
|
|
534
1285
|
});
|
|
535
1286
|
return scope;
|
|
536
1287
|
}
|
|
1288
|
+
var GLOBAL_SCOPE = null;
|
|
1289
|
+
function getGlobalScope() {
|
|
1290
|
+
if (null === GLOBAL_SCOPE) GLOBAL_SCOPE = createGlobalScope();
|
|
1291
|
+
return GLOBAL_SCOPE;
|
|
1292
|
+
}
|
|
1293
|
+
var EMPTY_CONTEXT = Object.freeze(Object.create(null));
|
|
537
1294
|
var getBlockedMethods = function() {
|
|
538
1295
|
var BLOCKED_METHODS = null;
|
|
539
1296
|
return function() {
|
|
@@ -584,24 +1341,39 @@ var getBlockedMethods = function() {
|
|
|
584
1341
|
var Evaluator_Evaluator = /*#__PURE__*/ function() {
|
|
585
1342
|
"use strict";
|
|
586
1343
|
function Evaluator() {
|
|
587
|
-
var variables = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] :
|
|
1344
|
+
var variables = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : EMPTY_CONTEXT, options = arguments.length > 1 ? arguments[1] : void 0;
|
|
588
1345
|
_class_call_check(this, Evaluator);
|
|
589
1346
|
this.maxInputLength = validateLimit(null == options ? void 0 : options.maxInputLength, "maxInputLength", DEFAULT_MAX_INPUT_LENGTH, MAX_CONFIGURABLE_INPUT_LENGTH);
|
|
590
1347
|
this.maxEvaluationSteps = validateLimit(null == options ? void 0 : options.maxEvaluationSteps, "maxEvaluationSteps", DEFAULT_MAX_EVALUATION_STEPS, MAX_CONFIGURABLE_EVALUATION_STEPS);
|
|
591
|
-
|
|
592
|
-
var clonedVariables =
|
|
1348
|
+
this.maxDepth = validateLimit(null == options ? void 0 : options.maxDepth, "maxDepth", DEFAULT_MAX_DEPTH, MAX_CONFIGURABLE_DEPTH);
|
|
1349
|
+
var clonedVariables = EMPTY_CONTEXT;
|
|
1350
|
+
if (variables !== EMPTY_CONTEXT) {
|
|
1351
|
+
assertBoundedData(variables, "Evaluation context");
|
|
1352
|
+
clonedVariables = structuredClone(variables);
|
|
1353
|
+
}
|
|
593
1354
|
this.scopes = [
|
|
594
1355
|
clonedVariables,
|
|
595
|
-
|
|
1356
|
+
getGlobalScope()
|
|
596
1357
|
].filter(function(scope) {
|
|
597
1358
|
return null != scope;
|
|
598
1359
|
});
|
|
599
1360
|
this.source = void 0;
|
|
1361
|
+
this.evaluating = false;
|
|
600
1362
|
this.remainingEvaluationSteps = 0;
|
|
601
1363
|
this.remainingDataSize = MAX_BUFFER_BYTES;
|
|
602
1364
|
this.remainingDataNodes = MAX_DATA_NODES;
|
|
1365
|
+
this.evaluationDepth = 0;
|
|
603
1366
|
}
|
|
604
1367
|
_create_class(Evaluator, [
|
|
1368
|
+
{
|
|
1369
|
+
key: "resetBudget",
|
|
1370
|
+
value: function() {
|
|
1371
|
+
this.remainingEvaluationSteps = this.maxEvaluationSteps;
|
|
1372
|
+
this.remainingDataSize = MAX_BUFFER_BYTES;
|
|
1373
|
+
this.remainingDataNodes = MAX_DATA_NODES;
|
|
1374
|
+
this.evaluationDepth = 0;
|
|
1375
|
+
}
|
|
1376
|
+
},
|
|
605
1377
|
{
|
|
606
1378
|
key: "evaluate",
|
|
607
1379
|
value: function(expression) {
|
|
@@ -610,15 +1382,13 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
|
|
|
610
1382
|
this.maxInputLength
|
|
611
1383
|
]));
|
|
612
1384
|
this.source = expression;
|
|
613
|
-
this.
|
|
614
|
-
|
|
615
|
-
this.
|
|
616
|
-
var ast = external_acorn_parse(expression, {
|
|
617
|
-
ecmaVersion: "latest"
|
|
618
|
-
});
|
|
1385
|
+
this.resetBudget();
|
|
1386
|
+
var ast = parseExpression(expression);
|
|
1387
|
+
this.evaluating = true;
|
|
619
1388
|
try {
|
|
620
1389
|
return this.execute(ast.body);
|
|
621
1390
|
} finally{
|
|
1391
|
+
this.evaluating = false;
|
|
622
1392
|
this.source = void 0;
|
|
623
1393
|
}
|
|
624
1394
|
}
|
|
@@ -626,11 +1396,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
|
|
|
626
1396
|
{
|
|
627
1397
|
key: "execute",
|
|
628
1398
|
value: function(body) {
|
|
629
|
-
if (
|
|
630
|
-
this.remainingEvaluationSteps = this.maxEvaluationSteps;
|
|
631
|
-
this.remainingDataSize = MAX_BUFFER_BYTES;
|
|
632
|
-
this.remainingDataNodes = MAX_DATA_NODES;
|
|
633
|
-
}
|
|
1399
|
+
if (!this.evaluating) this.resetBudget();
|
|
634
1400
|
var result;
|
|
635
1401
|
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
|
|
636
1402
|
try {
|
|
@@ -655,6 +1421,8 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
|
|
|
655
1421
|
if (_instanceof(result, Promise)) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
656
1422
|
"Returning promises from expressions"
|
|
657
1423
|
]));
|
|
1424
|
+
var resultType = void 0 === result ? "undefined" : _type_of(result);
|
|
1425
|
+
if (null === result || "string" === resultType || "number" === resultType || "boolean" === resultType || "undefined" === resultType || "bigint" === resultType) return result;
|
|
658
1426
|
try {
|
|
659
1427
|
return structuredClone(result);
|
|
660
1428
|
} catch (error) {
|
|
@@ -671,69 +1439,79 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
|
|
|
671
1439
|
var _this = this;
|
|
672
1440
|
this.remainingEvaluationSteps--;
|
|
673
1441
|
if (this.remainingEvaluationSteps < 0) throw new RangeError("Evaluation step limit exceeded");
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
1442
|
+
this.evaluationDepth++;
|
|
1443
|
+
if (this.evaluationDepth > this.maxDepth) {
|
|
1444
|
+
this.evaluationDepth--;
|
|
1445
|
+
throw new RangeError("Maximum evaluation depth exceeded");
|
|
1446
|
+
}
|
|
1447
|
+
try {
|
|
1448
|
+
switch(node.type){
|
|
1449
|
+
case "ExpressionStatement":
|
|
1450
|
+
return this.visit(node.expression);
|
|
1451
|
+
case "BinaryExpression":
|
|
1452
|
+
return this.handleBinaryExpression(node);
|
|
1453
|
+
case "LogicalExpression":
|
|
1454
|
+
return this.handleLogicalExpression(node);
|
|
1455
|
+
case "UnaryExpression":
|
|
1456
|
+
return this.handleUnaryExpression(node);
|
|
1457
|
+
case "Identifier":
|
|
1458
|
+
return this.handleIdentifier(node);
|
|
1459
|
+
case "Literal":
|
|
1460
|
+
if (node.regex) assertSafeRegExpPattern(node.regex.pattern);
|
|
1461
|
+
return node.value;
|
|
1462
|
+
case "MemberExpression":
|
|
1463
|
+
return this.handleMemberExpression(node);
|
|
1464
|
+
case "ArrayExpression":
|
|
1465
|
+
return this.handleArrayExpression(node);
|
|
1466
|
+
case "SpreadElement":
|
|
1467
|
+
return this.handleSpreadElement(node);
|
|
1468
|
+
case "ObjectExpression":
|
|
1469
|
+
return this.handleObjectExpression(node);
|
|
1470
|
+
case "FunctionExpression":
|
|
1471
|
+
throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
1472
|
+
"Function expression"
|
|
1473
|
+
]));
|
|
1474
|
+
case "ArrowFunctionExpression":
|
|
1475
|
+
return this.handleArrowFunctionExpression(node);
|
|
1476
|
+
case "CallExpression":
|
|
1477
|
+
return this.handleCallExpression(node);
|
|
1478
|
+
case "ConditionalExpression":
|
|
1479
|
+
return this.visit(node.test) ? this.visit(node.consequent) : this.visit(node.alternate);
|
|
1480
|
+
case "NewExpression":
|
|
1481
|
+
if ("Identifier" !== node.callee.type) throw new Error("Unsupported callee type '".concat(node.callee.type, "' in new expression"));
|
|
1482
|
+
if ("Function" === node.callee.name) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
1483
|
+
"new Function() constructor"
|
|
1484
|
+
]));
|
|
1485
|
+
if ("Promise" === node.callee.name) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
1486
|
+
"Promise constructor"
|
|
1487
|
+
]));
|
|
1488
|
+
var Constructor = this.visit(node.callee);
|
|
1489
|
+
var args = node.arguments.length ? node.arguments.map(function(arg) {
|
|
1490
|
+
return _this.visit(arg);
|
|
1491
|
+
}) : [];
|
|
1492
|
+
this.assertBoundedConstruction(Constructor, args);
|
|
1493
|
+
return _construct(Constructor, Evaluator_to_consumable_array(args));
|
|
1494
|
+
case "ChainExpression":
|
|
1495
|
+
return this.visit(node.expression);
|
|
1496
|
+
case "TemplateLiteral":
|
|
1497
|
+
return this.handleTemplateLiteral(node);
|
|
1498
|
+
case "ThisExpression":
|
|
1499
|
+
throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
1500
|
+
"'this' expression"
|
|
1501
|
+
]));
|
|
1502
|
+
case "WithStatement":
|
|
1503
|
+
throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
1504
|
+
"'with' statement"
|
|
1505
|
+
]));
|
|
1506
|
+
default:
|
|
1507
|
+
var content = this.source.slice(node.start, node.end);
|
|
1508
|
+
if (content.length > 20) content = content.slice(0, 17) + "...";
|
|
1509
|
+
throw new SyntaxError("'".concat(content, "'") + " " + renderErrorMessage(ERROR_MESSAGES.IS_INVALID_SYNTAX, [
|
|
1510
|
+
content
|
|
1511
|
+
]));
|
|
1512
|
+
}
|
|
1513
|
+
} finally{
|
|
1514
|
+
this.evaluationDepth--;
|
|
737
1515
|
}
|
|
738
1516
|
}
|
|
739
1517
|
},
|
|
@@ -752,14 +1530,24 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
|
|
|
752
1530
|
var rightBits = right.toString(2).length;
|
|
753
1531
|
if ("**" === op && leftBits * Number(right) > MAX_BIGINT_BITS || "<<" === op && right > BigInt(MAX_BIGINT_BITS) || "<<" === op && right >= 0n && leftBits + Number(right) > MAX_BIGINT_BITS || "*" === op && leftBits + rightBits > MAX_BIGINT_BITS || ("+" === op || "-" === op) && Math.max(leftBits, rightBits) + 1 > MAX_BIGINT_BITS) throw new RangeError("BigInt result exceeds the maximum allowed size");
|
|
754
1532
|
}
|
|
755
|
-
|
|
1533
|
+
var apply = BINARY_OPERATION_MAP.get(op);
|
|
1534
|
+
if (void 0 !== apply) return apply(left, right);
|
|
756
1535
|
throw new SyntaxError("Unsupported operator: ".concat(node.operator));
|
|
757
1536
|
}
|
|
758
1537
|
},
|
|
1538
|
+
{
|
|
1539
|
+
key: "assertBoundedRegExp",
|
|
1540
|
+
value: function(args) {
|
|
1541
|
+
if ("string" == typeof args[0] && args[0].length > MAX_REGEXP_SOURCE_LENGTH) throw new RangeError("RegExp source exceeds the maximum allowed length");
|
|
1542
|
+
if ("string" == typeof args[1] && args[1].length > MAX_REGEXP_FLAGS_LENGTH) throw new RangeError("RegExp flags exceed the maximum allowed length");
|
|
1543
|
+
assertSafeRegExpPattern(args[0]);
|
|
1544
|
+
}
|
|
1545
|
+
},
|
|
759
1546
|
{
|
|
760
1547
|
key: "assertBoundedConstruction",
|
|
761
1548
|
value: function(Constructor, args) {
|
|
762
1549
|
var _args_;
|
|
1550
|
+
if (Constructor === RegExp) this.assertBoundedRegExp(args);
|
|
763
1551
|
var size = args[0];
|
|
764
1552
|
if (Constructor === Array && 1 === args.length && "number" == typeof size && size > MAX_ARRAY_LENGTH) throw new RangeError("Array length exceeds the maximum allowed length");
|
|
765
1553
|
if (Constructor === ArrayBuffer && (size > MAX_BUFFER_BYTES || (null == (_args_ = args[1]) ? void 0 : _args_.maxByteLength) > MAX_BUFFER_BYTES)) throw new RangeError("ArrayBuffer size exceeds the maximum allowed size");
|
|
@@ -769,7 +1557,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
|
|
|
769
1557
|
var collectionSize = "string" == typeof size || Array.isArray(size) ? size.length : null != (_size_size = null == size ? void 0 : size.size) ? _size_size : null == size ? void 0 : size.length;
|
|
770
1558
|
if ("number" == typeof collectionSize && collectionSize > MAX_ARRAY_LENGTH) throw new RangeError("Collection source exceeds the maximum allowed size");
|
|
771
1559
|
}
|
|
772
|
-
if (
|
|
1560
|
+
if (isTypedArrayConstructor(Constructor)) {
|
|
773
1561
|
var byteLength;
|
|
774
1562
|
if (_instanceof(size, ArrayBuffer)) {
|
|
775
1563
|
var _args_1;
|
|
@@ -833,21 +1621,10 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
|
|
|
833
1621
|
key: "handleIdentifier",
|
|
834
1622
|
value: function(node) {
|
|
835
1623
|
var name = node.name;
|
|
836
|
-
var
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
if (Object.hasOwn(scope, name)) return scope[name];
|
|
841
|
-
}
|
|
842
|
-
} catch (err) {
|
|
843
|
-
_didIteratorError = true;
|
|
844
|
-
_iteratorError = err;
|
|
845
|
-
} finally{
|
|
846
|
-
try {
|
|
847
|
-
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
|
|
848
|
-
} finally{
|
|
849
|
-
if (_didIteratorError) throw _iteratorError;
|
|
850
|
-
}
|
|
1624
|
+
var scopes = this.scopes;
|
|
1625
|
+
for(var i = 0; i < scopes.length; i++){
|
|
1626
|
+
var scope = scopes[i];
|
|
1627
|
+
if (Object.hasOwn(scope, name)) return scope[name];
|
|
851
1628
|
}
|
|
852
1629
|
throw new ReferenceError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_DEFINED, [
|
|
853
1630
|
name
|
|
@@ -864,9 +1641,6 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
|
|
|
864
1641
|
if ("stack" === property && _instanceof(object, Error)) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
865
1642
|
"Accessing error stack"
|
|
866
1643
|
]));
|
|
867
|
-
if (null != object && object[property] === (null == object ? void 0 : object.__proto__)) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
868
|
-
"Accessing prototype properties"
|
|
869
|
-
]));
|
|
870
1644
|
if (null == object) {
|
|
871
1645
|
if (node.optional) return;
|
|
872
1646
|
throw new TypeError(renderErrorMessage(ERROR_MESSAGES.CAN_NOT_READ_PROPERTY, [
|
|
@@ -878,6 +1652,10 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
|
|
|
878
1652
|
if (result === Function || result === Function.prototype) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
879
1653
|
"Function constructor"
|
|
880
1654
|
]));
|
|
1655
|
+
var prototype = object.__proto__;
|
|
1656
|
+
if (void 0 !== prototype && result === prototype) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
1657
|
+
"Accessing prototype properties"
|
|
1658
|
+
]));
|
|
881
1659
|
return result;
|
|
882
1660
|
}
|
|
883
1661
|
},
|
|
@@ -886,7 +1664,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
|
|
|
886
1664
|
value: function(node) {
|
|
887
1665
|
var result = [];
|
|
888
1666
|
for(var i = 0; i < node.elements.length; i++){
|
|
889
|
-
var element = node.elements
|
|
1667
|
+
var element = node.elements[i];
|
|
890
1668
|
if (null === element) {
|
|
891
1669
|
result.length++;
|
|
892
1670
|
continue;
|
|
@@ -957,6 +1735,24 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
|
|
|
957
1735
|
key: "handleArrowFunctionExpression",
|
|
958
1736
|
value: function(node) {
|
|
959
1737
|
var _this = this;
|
|
1738
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
|
|
1739
|
+
try {
|
|
1740
|
+
for(var _iterator = node.params[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1741
|
+
var param = _step.value;
|
|
1742
|
+
if ("Identifier" !== param.type) throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
1743
|
+
"Destructuring, default, and rest parameters"
|
|
1744
|
+
]));
|
|
1745
|
+
}
|
|
1746
|
+
} catch (err) {
|
|
1747
|
+
_didIteratorError = true;
|
|
1748
|
+
_iteratorError = err;
|
|
1749
|
+
} finally{
|
|
1750
|
+
try {
|
|
1751
|
+
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
|
|
1752
|
+
} finally{
|
|
1753
|
+
if (_didIteratorError) throw _iteratorError;
|
|
1754
|
+
}
|
|
1755
|
+
}
|
|
960
1756
|
return function() {
|
|
961
1757
|
for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++)args[_key] = arguments[_key];
|
|
962
1758
|
var newScope = {};
|
|
@@ -997,20 +1793,21 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
|
|
|
997
1793
|
if (func === Function) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
998
1794
|
"Function constructor"
|
|
999
1795
|
]));
|
|
1000
|
-
if (func === Error.prepareStackTrace) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
1796
|
+
if ("function" == typeof func && func === Error.prepareStackTrace) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
1001
1797
|
"Error.prepareStackTrace"
|
|
1002
1798
|
]));
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1799
|
+
var blockedPath = getBlockedMethods().get(func);
|
|
1800
|
+
if (void 0 !== blockedPath) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
1801
|
+
blockedPath
|
|
1802
|
+
]));
|
|
1803
|
+
if (TYPED_ARRAY_MUTATORS.has(func)) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
|
|
1804
|
+
"TypedArray.prototype.".concat(TYPED_ARRAY_MUTATORS.get(func))
|
|
1805
|
+
]));
|
|
1009
1806
|
var args = function() {
|
|
1010
1807
|
if (0 === node.arguments.length) return [];
|
|
1011
1808
|
var result = [];
|
|
1012
1809
|
for(var i = 0; i < node.arguments.length; i++){
|
|
1013
|
-
var element = node.arguments
|
|
1810
|
+
var element = node.arguments[i];
|
|
1014
1811
|
var value = _this.visit(element);
|
|
1015
1812
|
if ("SpreadElement" === element.type) {
|
|
1016
1813
|
var _result;
|
|
@@ -1035,19 +1832,27 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
|
|
|
1035
1832
|
if (resultLength > MAX_STRING_LENGTH) throw new RangeError("String result exceeds the maximum allowed length");
|
|
1036
1833
|
}
|
|
1037
1834
|
if (String.prototype.replace && func === String.prototype.replace || String.prototype.replaceAll && func === String.prototype.replaceAll) {
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1835
|
+
var all = func === String.prototype.replaceAll;
|
|
1836
|
+
var search = args[0];
|
|
1837
|
+
var replacement = args[1];
|
|
1838
|
+
if ("function" == typeof replacement) throw new Error("Only literal string replacements are allowed");
|
|
1839
|
+
if ("string" == typeof replacement && RegExp("\\$(?:[$&'`])", "u").test(replacement)) throw new Error("Only literal string replacements are allowed");
|
|
1840
|
+
var matchCount;
|
|
1841
|
+
if ("string" == typeof search) {
|
|
1842
|
+
if (target.length * Math.max(1, search.length) > 10000000) throw new RangeError("String operation exceeds the maximum work limit");
|
|
1843
|
+
matchCount = countLiteralMatches(target, search, all);
|
|
1844
|
+
} else matchCount = _instanceof(search, RegExp) ? countRegExpMatches(target, search, all || search.flags.includes("g")) : 0;
|
|
1845
|
+
if (target.length + matchCount * String(replacement).length > MAX_STRING_LENGTH) throw new RangeError("String result exceeds the maximum allowed length");
|
|
1044
1846
|
}
|
|
1045
1847
|
if (func === String.prototype.split) {
|
|
1046
1848
|
if ("" === args[0] && target.length > MAX_ARRAY_LENGTH) throw new RangeError("Split result exceeds the maximum allowed length");
|
|
1047
1849
|
if ("string" == typeof args[0] && "" !== args[0] && countLiteralMatches(target, args[0], true) >= MAX_ARRAY_LENGTH) throw new RangeError("Split result exceeds the maximum allowed length");
|
|
1850
|
+
if (_instanceof(args[0], RegExp) && countRegExpMatches(target, args[0], true) >= MAX_ARRAY_LENGTH) throw new RangeError("Split result exceeds the maximum allowed length");
|
|
1048
1851
|
}
|
|
1049
1852
|
}
|
|
1050
|
-
if (
|
|
1853
|
+
if (func === RegExp) this.assertBoundedRegExp(args);
|
|
1854
|
+
assertSafeRegExpInvocation(func, target, args);
|
|
1855
|
+
if ((target === Array || isTypedArrayConstructor(target)) && func === target.from) {
|
|
1051
1856
|
var source = args[0];
|
|
1052
1857
|
var _source_size;
|
|
1053
1858
|
var size = "string" == typeof source || Array.isArray(source) ? source.length : null != (_source_size = null == source ? void 0 : source.size) ? _source_size : null == source ? void 0 : source.length;
|
|
@@ -1097,7 +1902,7 @@ function getNodeString(node) {
|
|
|
1097
1902
|
return node.raw;
|
|
1098
1903
|
case "ArrayExpression":
|
|
1099
1904
|
return "[".concat(node.elements.map(function(child) {
|
|
1100
|
-
return getNodeString(child);
|
|
1905
|
+
return null === child ? "" : getNodeString(child);
|
|
1101
1906
|
}).join(","), "]");
|
|
1102
1907
|
case "ObjectExpression":
|
|
1103
1908
|
if (0 === node.properties.length) return "{}";
|
|
@@ -1170,6 +1975,7 @@ var TemplateParser_TemplateParser = /*#__PURE__*/ function() {
|
|
|
1170
1975
|
var buffer = "";
|
|
1171
1976
|
var exprStartPos = 0;
|
|
1172
1977
|
var pos = 0;
|
|
1978
|
+
var prevExprChar = "";
|
|
1173
1979
|
while(pos < length){
|
|
1174
1980
|
var char = template[pos];
|
|
1175
1981
|
var nextChar = template[pos + 1];
|
|
@@ -1187,6 +1993,7 @@ var TemplateParser_TemplateParser = /*#__PURE__*/ function() {
|
|
|
1187
1993
|
}
|
|
1188
1994
|
state = "EXPR";
|
|
1189
1995
|
exprStartPos = pos;
|
|
1996
|
+
prevExprChar = "";
|
|
1190
1997
|
pos += this.startLen;
|
|
1191
1998
|
continue;
|
|
1192
1999
|
}
|
|
@@ -1196,6 +2003,7 @@ var TemplateParser_TemplateParser = /*#__PURE__*/ function() {
|
|
|
1196
2003
|
if ("'" === char) state = "STRING_SQ";
|
|
1197
2004
|
else if ('"' === char) state = "STRING_DQ";
|
|
1198
2005
|
else if ("`" === char) state = "TEMPLATE";
|
|
2006
|
+
else if ("/" === char && this._isRegexPosition(prevExprChar)) state = "REGEX";
|
|
1199
2007
|
else if ("\\" === char) state = "'" === nextChar ? "ESCAPE_SQ" : '"' === nextChar ? "ESCAPE_DQ" : "`" === nextChar ? "ESCAPE_TEMPLATE" : "ESCAPE_EXPR";
|
|
1200
2008
|
else if (this._isMatch(pos, template, this.exprEnd)) {
|
|
1201
2009
|
var exprValue = this.preserveWhitespace ? buffer : buffer.trim();
|
|
@@ -1212,6 +2020,7 @@ var TemplateParser_TemplateParser = /*#__PURE__*/ function() {
|
|
|
1212
2020
|
pos += this.endLen;
|
|
1213
2021
|
continue;
|
|
1214
2022
|
}
|
|
2023
|
+
if (!RegExp("\\s", "u").test(char)) prevExprChar = char;
|
|
1215
2024
|
buffer += char;
|
|
1216
2025
|
break;
|
|
1217
2026
|
case "STRING_SQ":
|
|
@@ -1229,6 +2038,17 @@ var TemplateParser_TemplateParser = /*#__PURE__*/ function() {
|
|
|
1229
2038
|
else if ("`" === char) state = "EXPR";
|
|
1230
2039
|
buffer += char;
|
|
1231
2040
|
break;
|
|
2041
|
+
case "REGEX":
|
|
2042
|
+
if ("\\" === char) state = "ESCAPE_REGEX";
|
|
2043
|
+
else if ("[" === char) state = "REGEX_CLASS";
|
|
2044
|
+
else if ("/" === char) state = "EXPR";
|
|
2045
|
+
buffer += char;
|
|
2046
|
+
break;
|
|
2047
|
+
case "REGEX_CLASS":
|
|
2048
|
+
if ("\\" === char) state = "ESCAPE_REGEX";
|
|
2049
|
+
else if ("]" === char) state = "REGEX";
|
|
2050
|
+
buffer += char;
|
|
2051
|
+
break;
|
|
1232
2052
|
case "ESCAPE_SQ":
|
|
1233
2053
|
buffer += char;
|
|
1234
2054
|
state = "STRING_SQ";
|
|
@@ -1241,6 +2061,10 @@ var TemplateParser_TemplateParser = /*#__PURE__*/ function() {
|
|
|
1241
2061
|
buffer += char;
|
|
1242
2062
|
state = "TEMPLATE";
|
|
1243
2063
|
break;
|
|
2064
|
+
case "ESCAPE_REGEX":
|
|
2065
|
+
buffer += char;
|
|
2066
|
+
state = "REGEX";
|
|
2067
|
+
break;
|
|
1244
2068
|
case "ESCAPE_EXPR":
|
|
1245
2069
|
buffer += char;
|
|
1246
2070
|
state = "EXPR";
|
|
@@ -1266,6 +2090,12 @@ var TemplateParser_TemplateParser = /*#__PURE__*/ function() {
|
|
|
1266
2090
|
return tokens;
|
|
1267
2091
|
}
|
|
1268
2092
|
},
|
|
2093
|
+
{
|
|
2094
|
+
key: "_isRegexPosition",
|
|
2095
|
+
value: function(prev) {
|
|
2096
|
+
return "" === prev || "(,=:[!&|?{};+-*%^~<>".includes(prev);
|
|
2097
|
+
}
|
|
2098
|
+
},
|
|
1269
2099
|
{
|
|
1270
2100
|
key: "_isMatch",
|
|
1271
2101
|
value: function(pos, template, sequence) {
|