ecma-evaluator 2.1.0 → 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.
@@ -276,7 +276,7 @@ var blockedGlobalBuiltIns = [
276
276
  "Intl",
277
277
  "Deno"
278
278
  ];
279
- function Evaluator_array_like_to_array(arr, len) {
279
+ function regExpSafety_array_like_to_array(arr, len) {
280
280
  if (null == len || len > arr.length) len = arr.length;
281
281
  for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
282
282
  return arr2;
@@ -284,6 +284,516 @@ function Evaluator_array_like_to_array(arr, len) {
284
284
  function _array_with_holes(arr) {
285
285
  if (Array.isArray(arr)) return arr;
286
286
  }
287
+ function _iterable_to_array_limit(arr, i) {
288
+ var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
289
+ if (null == _i) return;
290
+ var _arr = [];
291
+ var _n = true;
292
+ var _d = false;
293
+ var _s, _e;
294
+ try {
295
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
296
+ _arr.push(_s.value);
297
+ if (i && _arr.length === i) break;
298
+ }
299
+ } catch (err) {
300
+ _d = true;
301
+ _e = err;
302
+ } finally{
303
+ try {
304
+ if (!_n && null != _i["return"]) _i["return"]();
305
+ } finally{
306
+ if (_d) throw _e;
307
+ }
308
+ }
309
+ return _arr;
310
+ }
311
+ function _non_iterable_rest() {
312
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
313
+ }
314
+ function _sliced_to_array(arr, i) {
315
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || regExpSafety_unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
316
+ }
317
+ function regExpSafety_unsupported_iterable_to_array(o, minLen) {
318
+ if (!o) return;
319
+ if ("string" == typeof o) return regExpSafety_array_like_to_array(o, minLen);
320
+ var n = Object.prototype.toString.call(o).slice(8, -1);
321
+ if ("Object" === n && o.constructor) n = o.constructor.name;
322
+ if ("Map" === n || "Set" === n) return Array.from(n);
323
+ if ("Arguments" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return regExpSafety_array_like_to_array(o, minLen);
324
+ }
325
+ function isUnsafeRegExpPattern(pattern) {
326
+ var pos = 0;
327
+ var depth = 0;
328
+ var MAX_DEPTH = 1000;
329
+ function parseAlternation() {
330
+ var start = pos;
331
+ var branches = [
332
+ parseSequence()
333
+ ];
334
+ while("|" === pattern[pos]){
335
+ pos++;
336
+ branches.push(parseSequence());
337
+ }
338
+ if (1 === branches.length) return branches[0];
339
+ return {
340
+ type: "alt",
341
+ branches: branches,
342
+ start: start,
343
+ end: pos
344
+ };
345
+ }
346
+ function parseSequence() {
347
+ var start = pos;
348
+ var terms = [];
349
+ while(pos < pattern.length && "|" !== pattern[pos] && ")" !== pattern[pos])terms.push(parseTerm());
350
+ return {
351
+ type: "seq",
352
+ terms: terms,
353
+ start: start,
354
+ end: pos
355
+ };
356
+ }
357
+ function parseTerm() {
358
+ var atom = parseAtom();
359
+ var quantifier = parseQuantifier();
360
+ if (quantifier) return {
361
+ type: "quant",
362
+ min: quantifier.min,
363
+ max: quantifier.max,
364
+ body: atom,
365
+ start: atom.start,
366
+ end: pos
367
+ };
368
+ return atom;
369
+ }
370
+ function parseQuantifier() {
371
+ var ch = pattern[pos];
372
+ if ("*" === ch) {
373
+ pos++;
374
+ return {
375
+ min: 0,
376
+ max: 1 / 0
377
+ };
378
+ }
379
+ if ("+" === ch) {
380
+ pos++;
381
+ return {
382
+ min: 1,
383
+ max: 1 / 0
384
+ };
385
+ }
386
+ if ("?" === ch) {
387
+ pos++;
388
+ return {
389
+ min: 0,
390
+ max: 1
391
+ };
392
+ }
393
+ if ("{" === ch) {
394
+ var match = /^\{(\d+)(,(\d*))?\}/.exec(pattern.slice(pos));
395
+ if (match) {
396
+ pos += match[0].length;
397
+ var min = Number(match[1]);
398
+ var max;
399
+ max = void 0 === match[2] ? min : "" === match[3] ? 1 / 0 : Number(match[3]);
400
+ return {
401
+ min: min,
402
+ max: max
403
+ };
404
+ }
405
+ }
406
+ return null;
407
+ }
408
+ function parseAtom() {
409
+ var start = pos;
410
+ var ch = pattern[pos];
411
+ if ("(" === ch) {
412
+ pos++;
413
+ var zeroWidth = false;
414
+ if ("?" === pattern[pos]) {
415
+ var rest = pattern.slice(pos);
416
+ if (rest.startsWith("?:")) pos += 2;
417
+ else if (rest.startsWith("?=") || rest.startsWith("?!")) {
418
+ pos += 2;
419
+ zeroWidth = true;
420
+ } else if (rest.startsWith("?<=") || rest.startsWith("?<!")) {
421
+ pos += 3;
422
+ zeroWidth = true;
423
+ } else if (rest.startsWith("?<")) {
424
+ var named = /^\?<[A-Za-z_$][\w$]*>/.exec(rest);
425
+ pos += named ? named[0].length : 2;
426
+ } else pos += 1;
427
+ }
428
+ depth++;
429
+ if (depth > MAX_DEPTH) throw new RangeError("regexp nesting too deep");
430
+ var body = parseAlternation();
431
+ depth--;
432
+ if (")" === pattern[pos]) pos++;
433
+ return {
434
+ type: "group",
435
+ body: body,
436
+ zeroWidth: zeroWidth,
437
+ start: start,
438
+ end: pos
439
+ };
440
+ }
441
+ if ("[" === ch) {
442
+ pos++;
443
+ if ("^" === pattern[pos]) pos++;
444
+ if ("]" === pattern[pos]) pos++;
445
+ while(pos < pattern.length && "]" !== pattern[pos]){
446
+ if ("\\" === pattern[pos]) pos++;
447
+ pos++;
448
+ }
449
+ pos++;
450
+ return {
451
+ type: "char",
452
+ zeroWidth: false,
453
+ start: start,
454
+ end: pos
455
+ };
456
+ }
457
+ if ("\\" === ch) {
458
+ pos += 2;
459
+ var escaped = pattern[start + 1];
460
+ return {
461
+ type: "char",
462
+ zeroWidth: "b" === escaped || "B" === escaped,
463
+ start: start,
464
+ end: pos
465
+ };
466
+ }
467
+ pos++;
468
+ return {
469
+ type: "char",
470
+ zeroWidth: "^" === ch || "$" === ch,
471
+ start: start,
472
+ end: pos
473
+ };
474
+ }
475
+ var raw = function(node) {
476
+ return pattern.slice(node.start, node.end);
477
+ };
478
+ var ANY = Symbol("any");
479
+ var DIGITS = new Set("0123456789".split(""));
480
+ var WORD = new Set("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_".split(""));
481
+ var SPACES = new Set([
482
+ " ",
483
+ "\t",
484
+ "\n",
485
+ "\r",
486
+ "\f",
487
+ "\v",
488
+ "\u00a0",
489
+ "\ufeff",
490
+ "\u2028",
491
+ "\u2029"
492
+ ]);
493
+ function escapeSet(esc) {
494
+ switch(esc){
495
+ case "d":
496
+ return DIGITS;
497
+ case "w":
498
+ return WORD;
499
+ case "s":
500
+ return SPACES;
501
+ case "n":
502
+ return new Set([
503
+ "\n"
504
+ ]);
505
+ case "t":
506
+ return new Set([
507
+ "\t"
508
+ ]);
509
+ case "r":
510
+ return new Set([
511
+ "\r"
512
+ ]);
513
+ case "f":
514
+ return new Set([
515
+ "\f"
516
+ ]);
517
+ case "v":
518
+ return new Set([
519
+ "\v"
520
+ ]);
521
+ case "0":
522
+ return new Set([
523
+ "\0"
524
+ ]);
525
+ default:
526
+ if (/[0-9A-Za-z]/.test(esc)) return ANY;
527
+ return new Set([
528
+ esc
529
+ ]);
530
+ }
531
+ }
532
+ function classSet(text) {
533
+ var inner = text.slice(1, -1);
534
+ if (inner.startsWith("^")) return ANY;
535
+ var set = new Set();
536
+ for(var i = 0; i < inner.length; i++){
537
+ var ch = inner[i];
538
+ if ("\\" === ch) {
539
+ var esc = inner[++i];
540
+ var expanded = escapeSet(esc);
541
+ if (expanded === ANY) return ANY;
542
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
543
+ try {
544
+ for(var _iterator = expanded[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
545
+ var c = _step.value;
546
+ set.add(c);
547
+ }
548
+ } catch (err) {
549
+ _didIteratorError = true;
550
+ _iteratorError = err;
551
+ } finally{
552
+ try {
553
+ if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
554
+ } finally{
555
+ if (_didIteratorError) throw _iteratorError;
556
+ }
557
+ }
558
+ continue;
559
+ }
560
+ if ("-" === inner[i + 1] && void 0 !== inner[i + 2] && "]" !== inner[i + 2]) {
561
+ var end = inner[i + 2];
562
+ var startCode = ch.codePointAt(0);
563
+ var endCode = end.codePointAt(0);
564
+ if (endCode - startCode > 1024) return ANY;
565
+ for(var code = startCode; code <= endCode; code++)set.add(String.fromCodePoint(code));
566
+ i += 2;
567
+ continue;
568
+ }
569
+ set.add(ch);
570
+ }
571
+ return set;
572
+ }
573
+ function firstCharSet(node) {
574
+ switch(node.type){
575
+ case "char":
576
+ var text = raw(node);
577
+ if (node.zeroWidth || text.startsWith("^") || text.startsWith("$")) return new Set();
578
+ if ("." === text) return ANY;
579
+ if (text.startsWith("[")) return classSet(text);
580
+ if (text.startsWith("\\")) {
581
+ var esc = text.slice(1);
582
+ if (1 === esc.length) return escapeSet(esc);
583
+ return ANY;
584
+ }
585
+ return new Set([
586
+ text[0]
587
+ ]);
588
+ case "quant":
589
+ return 0 === node.min ? ANY : firstCharSet(node.body);
590
+ case "group":
591
+ return node.zeroWidth ? ANY : firstCharSet(node.body);
592
+ case "alt":
593
+ var union = new Set();
594
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
595
+ try {
596
+ for(var _iterator = node.branches[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
597
+ var branch = _step.value;
598
+ var set = firstCharSet(branch);
599
+ if (set === ANY) return ANY;
600
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;
601
+ try {
602
+ for(var _iterator1 = set[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
603
+ var ch = _step1.value;
604
+ union.add(ch);
605
+ }
606
+ } catch (err) {
607
+ _didIteratorError1 = true;
608
+ _iteratorError1 = err;
609
+ } finally{
610
+ try {
611
+ if (!_iteratorNormalCompletion1 && null != _iterator1.return) _iterator1.return();
612
+ } finally{
613
+ if (_didIteratorError1) throw _iteratorError1;
614
+ }
615
+ }
616
+ }
617
+ } catch (err) {
618
+ _didIteratorError = true;
619
+ _iteratorError = err;
620
+ } finally{
621
+ try {
622
+ if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
623
+ } finally{
624
+ if (_didIteratorError) throw _iteratorError;
625
+ }
626
+ }
627
+ return union;
628
+ case "seq":
629
+ var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = void 0;
630
+ try {
631
+ for(var _iterator2 = node.terms[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){
632
+ var term = _step2.value;
633
+ var set1 = firstCharSet(term);
634
+ if (set1 === ANY) return ANY;
635
+ if (set1.size > 0) return set1;
636
+ }
637
+ } catch (err) {
638
+ _didIteratorError2 = true;
639
+ _iteratorError2 = err;
640
+ } finally{
641
+ try {
642
+ if (!_iteratorNormalCompletion2 && null != _iterator2.return) _iterator2.return();
643
+ } finally{
644
+ if (_didIteratorError2) throw _iteratorError2;
645
+ }
646
+ }
647
+ return new Set();
648
+ default:
649
+ return ANY;
650
+ }
651
+ }
652
+ function setsIntersect(a, b) {
653
+ if (a === ANY || b === ANY) return true;
654
+ if (0 === a.size || 0 === b.size) return false;
655
+ var _ref = _sliced_to_array(a.size <= b.size ? [
656
+ a,
657
+ b
658
+ ] : [
659
+ b,
660
+ a
661
+ ], 2), small = _ref[0], large = _ref[1];
662
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
663
+ try {
664
+ for(var _iterator = small[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
665
+ var ch = _step.value;
666
+ if (large.has(ch)) return true;
667
+ }
668
+ } catch (err) {
669
+ _didIteratorError = true;
670
+ _iteratorError = err;
671
+ } finally{
672
+ try {
673
+ if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
674
+ } finally{
675
+ if (_didIteratorError) throw _iteratorError;
676
+ }
677
+ }
678
+ return false;
679
+ }
680
+ function consumableCharSet(quantNode) {
681
+ return firstCharSet(quantNode.body);
682
+ }
683
+ function trailingQuantifier(node) {
684
+ switch(node.type){
685
+ case "quant":
686
+ return node.max === 1 / 0 ? node : null;
687
+ case "group":
688
+ return node.zeroWidth ? null : trailingQuantifier(node.body);
689
+ case "seq":
690
+ for(var i = node.terms.length - 1; i >= 0; i--){
691
+ var quantifier = trailingQuantifier(node.terms[i]);
692
+ if (quantifier) return quantifier;
693
+ var set = firstCharSet(node.terms[i]);
694
+ if (set === ANY || set.size > 0) break;
695
+ }
696
+ return null;
697
+ default:
698
+ return null;
699
+ }
700
+ }
701
+ function leadingQuantifier(node) {
702
+ switch(node.type){
703
+ case "quant":
704
+ return node.max === 1 / 0 ? node : null;
705
+ case "group":
706
+ return node.zeroWidth ? null : leadingQuantifier(node.body);
707
+ case "seq":
708
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
709
+ try {
710
+ for(var _iterator = node.terms[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
711
+ var term = _step.value;
712
+ var quantifier = leadingQuantifier(term);
713
+ if (quantifier) return quantifier;
714
+ var set = firstCharSet(term);
715
+ if (set === ANY || set.size > 0) return null;
716
+ }
717
+ } catch (err) {
718
+ _didIteratorError = true;
719
+ _iteratorError = err;
720
+ } finally{
721
+ try {
722
+ if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
723
+ } finally{
724
+ if (_didIteratorError) throw _iteratorError;
725
+ }
726
+ }
727
+ return null;
728
+ default:
729
+ return null;
730
+ }
731
+ }
732
+ function hasAdjacentOverlappingQuantifiers(seqNode) {
733
+ var terms = seqNode.terms;
734
+ for(var i = 0; i + 1 < terms.length; i++){
735
+ var left = trailingQuantifier(terms[i]);
736
+ var right = leadingQuantifier(terms[i + 1]);
737
+ if (left && right && setsIntersect(consumableCharSet(left), consumableCharSet(right))) return true;
738
+ }
739
+ return false;
740
+ }
741
+ function containsUnboundedQuantifier(node) {
742
+ switch(node.type){
743
+ case "quant":
744
+ if (node.max === 1 / 0) return true;
745
+ return containsUnboundedQuantifier(node.body);
746
+ case "group":
747
+ return containsUnboundedQuantifier(node.body);
748
+ case "alt":
749
+ return node.branches.some(containsUnboundedQuantifier);
750
+ case "seq":
751
+ return node.terms.some(containsUnboundedQuantifier);
752
+ default:
753
+ return false;
754
+ }
755
+ }
756
+ function alternationOverlaps(node) {
757
+ if ("alt" !== node.type) return false;
758
+ var texts = node.branches.map(raw).sort();
759
+ for(var i = 0; i + 1 < texts.length; i++)if ("" === texts[i] || texts[i + 1].startsWith(texts[i])) return true;
760
+ var sets = node.branches.map(firstCharSet);
761
+ 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;
762
+ return false;
763
+ }
764
+ function isCatastrophic(node) {
765
+ switch(node.type){
766
+ case "quant":
767
+ if (node.max === 1 / 0) {
768
+ var inner = "group" === node.body.type ? node.body.body : node.body;
769
+ if (containsUnboundedQuantifier(inner)) return true;
770
+ if ("alt" === inner.type && alternationOverlaps(inner)) return true;
771
+ }
772
+ return isCatastrophic(node.body);
773
+ case "group":
774
+ return isCatastrophic(node.body);
775
+ case "alt":
776
+ return node.branches.some(isCatastrophic);
777
+ case "seq":
778
+ return hasAdjacentOverlappingQuantifiers(node) || node.terms.some(isCatastrophic);
779
+ default:
780
+ return false;
781
+ }
782
+ }
783
+ try {
784
+ return isCatastrophic(parseAlternation());
785
+ } catch (e) {
786
+ return false;
787
+ }
788
+ }
789
+ function Evaluator_array_like_to_array(arr, len) {
790
+ if (null == len || len > arr.length) len = arr.length;
791
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
792
+ return arr2;
793
+ }
794
+ function Evaluator_array_with_holes(arr) {
795
+ if (Array.isArray(arr)) return arr;
796
+ }
287
797
  function Evaluator_array_without_holes(arr) {
288
798
  if (Array.isArray(arr)) return Evaluator_array_like_to_array(arr);
289
799
  }
@@ -324,7 +834,7 @@ function _instanceof(left, right) {
324
834
  function Evaluator_iterable_to_array(iter) {
325
835
  if ("undefined" != typeof Symbol && null != iter[Symbol.iterator] || null != iter["@@iterator"]) return Array.from(iter);
326
836
  }
327
- function _non_iterable_rest() {
837
+ function Evaluator_non_iterable_rest() {
328
838
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
329
839
  }
330
840
  function Evaluator_non_iterable_spread() {
@@ -338,7 +848,7 @@ function _set_prototype_of(o, p) {
338
848
  return _set_prototype_of(o, p);
339
849
  }
340
850
  function _to_array(arr) {
341
- return _array_with_holes(arr) || Evaluator_iterable_to_array(arr) || Evaluator_unsupported_iterable_to_array(arr) || _non_iterable_rest();
851
+ return Evaluator_array_with_holes(arr) || Evaluator_iterable_to_array(arr) || Evaluator_unsupported_iterable_to_array(arr) || Evaluator_non_iterable_rest();
342
852
  }
343
853
  function Evaluator_to_consumable_array(arr) {
344
854
  return Evaluator_array_without_holes(arr) || Evaluator_iterable_to_array(arr) || Evaluator_unsupported_iterable_to_array(arr) || Evaluator_non_iterable_spread();
@@ -441,6 +951,56 @@ var TYPED_ARRAY_MUTATORS = function() {
441
951
  }
442
952
  return map;
443
953
  }();
954
+ var REGEXP_SYMBOL_METHODS = new Set([
955
+ Symbol.match,
956
+ Symbol.matchAll,
957
+ Symbol.replace,
958
+ Symbol.search,
959
+ Symbol.split
960
+ ].map(function(symbol) {
961
+ return RegExp.prototype[symbol];
962
+ }).filter(function(method) {
963
+ return "function" == typeof method;
964
+ }));
965
+ var REGEXP_INVOCATION_KIND = function() {
966
+ var map = new Map();
967
+ for(var _i = 0, _iter = [
968
+ String.prototype.match,
969
+ String.prototype.matchAll,
970
+ String.prototype.search
971
+ ]; _i < _iter.length; _i++){
972
+ var method = _iter[_i];
973
+ map.set(method, "stringPattern");
974
+ }
975
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
976
+ try {
977
+ for(var _iterator = [
978
+ RegExp.prototype.test,
979
+ RegExp.prototype.exec
980
+ ].concat(Evaluator_to_consumable_array(REGEXP_SYMBOL_METHODS))[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
981
+ var method1 = _step.value;
982
+ map.set(method1, "receiverPattern");
983
+ }
984
+ } catch (err) {
985
+ _didIteratorError = true;
986
+ _iteratorError = err;
987
+ } finally{
988
+ try {
989
+ if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
990
+ } finally{
991
+ if (_didIteratorError) throw _iteratorError;
992
+ }
993
+ }
994
+ for(var _i1 = 0, _iter1 = [
995
+ String.prototype.replace,
996
+ String.prototype.replaceAll,
997
+ String.prototype.split
998
+ ]; _i1 < _iter1.length; _i1++){
999
+ var method2 = _iter1[_i1];
1000
+ map.set(method2, "regexArgument");
1001
+ }
1002
+ return map;
1003
+ }();
444
1004
  var NO_OBJECT = Symbol("no-object");
445
1005
  var renderErrorMessage = function(template) {
446
1006
  var context = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};
@@ -448,6 +1008,26 @@ var renderErrorMessage = function(template) {
448
1008
  return String(context[key]);
449
1009
  });
450
1010
  };
1011
+ var SAFE_REGEXP_PATTERNS = new Set();
1012
+ var MAX_SAFE_REGEXP_PATTERNS = 1000;
1013
+ function assertSafeRegExpPattern(pattern) {
1014
+ if ("string" != typeof pattern || SAFE_REGEXP_PATTERNS.has(pattern)) return;
1015
+ if (isUnsafeRegExpPattern(pattern)) throw new RangeError("RegExp pattern may cause catastrophic backtracking and is not allowed");
1016
+ if (SAFE_REGEXP_PATTERNS.size >= MAX_SAFE_REGEXP_PATTERNS) SAFE_REGEXP_PATTERNS.delete(SAFE_REGEXP_PATTERNS.values().next().value);
1017
+ SAFE_REGEXP_PATTERNS.add(pattern);
1018
+ }
1019
+ function assertSafeRegExpInvocation(func, target, args) {
1020
+ var kind = REGEXP_INVOCATION_KIND.get(func);
1021
+ if (void 0 === kind) return;
1022
+ if ("stringPattern" === kind) {
1023
+ var pattern = args[0];
1024
+ if ("string" == typeof pattern) assertSafeRegExpPattern(pattern);
1025
+ else if (_instanceof(pattern, RegExp)) assertSafeRegExpPattern(pattern.source);
1026
+ return;
1027
+ }
1028
+ var regexp = "receiverPattern" === kind ? target : args[0];
1029
+ if (_instanceof(regexp, RegExp)) assertSafeRegExpPattern(regexp.source);
1030
+ }
451
1031
  function validateLimit(value, name, defaultValue, maximum) {
452
1032
  if (void 0 === value) return defaultValue;
453
1033
  if (!Number.isSafeInteger(value) || value < 1 || value > maximum) throw new RangeError("".concat(name, " must be an integer between 1 and ").concat(maximum));
@@ -464,7 +1044,59 @@ function countLiteralMatches(value, search, all) {
464
1044
  }
465
1045
  return count;
466
1046
  }
1047
+ function countRegExpMatches(value, regexp, all) {
1048
+ var flags = regexp.flags.includes("g") ? regexp.flags : regexp.flags + "g";
1049
+ var re = new RegExp(regexp.source, flags);
1050
+ var count = 0;
1051
+ var match;
1052
+ while(null !== (match = re.exec(value))){
1053
+ count++;
1054
+ if (!all || count > MAX_STRING_LENGTH) break;
1055
+ if (re.lastIndex === match.index) re.lastIndex++;
1056
+ }
1057
+ return count;
1058
+ }
1059
+ var PARSE_CACHE = new Map();
1060
+ var MAX_PARSE_CACHE_ENTRIES = 1000;
1061
+ var MAX_PARSE_CACHE_CHARS = 200000;
1062
+ var parseCacheChars = 0;
1063
+ function parseExpression(expression) {
1064
+ var cached = PARSE_CACHE.get(expression);
1065
+ if (void 0 !== cached) return cached;
1066
+ var ast;
1067
+ try {
1068
+ ast = external_acorn_namespaceObject.parse(expression, {
1069
+ ecmaVersion: "latest"
1070
+ });
1071
+ } catch (error) {
1072
+ if (_instanceof(error, RangeError) && /call stack/i.test(error.message)) throw new SyntaxError("Expression nesting is too deep to parse");
1073
+ throw error;
1074
+ }
1075
+ if (expression.length <= MAX_PARSE_CACHE_CHARS) {
1076
+ while(PARSE_CACHE.size >= MAX_PARSE_CACHE_ENTRIES || parseCacheChars + expression.length > MAX_PARSE_CACHE_CHARS){
1077
+ var oldestKey = PARSE_CACHE.keys().next().value;
1078
+ if (void 0 === oldestKey) break;
1079
+ parseCacheChars -= oldestKey.length;
1080
+ PARSE_CACHE.delete(oldestKey);
1081
+ }
1082
+ PARSE_CACHE.set(expression, ast);
1083
+ parseCacheChars += expression.length;
1084
+ }
1085
+ return ast;
1086
+ }
467
1087
  function assertBoundedData(value, label) {
1088
+ var valueType = void 0 === value ? "undefined" : _type_of(value);
1089
+ if ("string" === valueType) {
1090
+ if (value.length > MAX_STRING_LENGTH) throw new RangeError("".concat(label, " contains a string that exceeds the maximum length"));
1091
+ return {
1092
+ dataSize: value.length + 8,
1093
+ dataNodes: 1
1094
+ };
1095
+ }
1096
+ if (null === value || "undefined" === valueType || "number" === valueType || "boolean" === valueType || "bigint" === valueType) return {
1097
+ dataSize: 8,
1098
+ dataNodes: 1
1099
+ };
468
1100
  var pending = [
469
1101
  value
470
1102
  ];
@@ -534,74 +1166,140 @@ function assertBoundedData(value, label) {
534
1166
  dataNodes: dataNodes
535
1167
  };
536
1168
  }
537
- var BINARY_OPERATION_MAP = {
538
- "+": function(a, b) {
539
- return a + b;
540
- },
541
- "-": function(a, b) {
542
- return a - b;
543
- },
544
- "*": function(a, b) {
545
- return a * b;
546
- },
547
- "**": function(a, b) {
548
- return Math.pow(a, b);
549
- },
550
- "==": function(a, b) {
551
- return a == b;
552
- },
553
- "===": function(a, b) {
554
- return a === b;
555
- },
556
- "!=": function(a, b) {
557
- return a != b;
558
- },
559
- "!==": function(a, b) {
560
- return a !== b;
561
- },
562
- ">": function(a, b) {
563
- return a > b;
564
- },
565
- ">=": function(a, b) {
566
- return a >= b;
567
- },
568
- "<": function(a, b) {
569
- return a < b;
570
- },
571
- "<=": function(a, b) {
572
- return a <= b;
573
- },
574
- "%": function(a, b) {
575
- return a % b;
576
- },
577
- "/": function(a, b) {
578
- return a / b;
579
- },
580
- "|": function(a, b) {
581
- return a | b;
582
- },
583
- "&": function(a, b) {
584
- return a & b;
585
- },
586
- "^": function(a, b) {
587
- return a ^ b;
588
- },
589
- "<<": function(a, b) {
590
- return a << b;
591
- },
592
- ">>": function(a, b) {
593
- return a >> b;
594
- },
595
- ">>>": function(a, b) {
596
- return a >>> b;
597
- },
598
- in: function(a, b) {
599
- return a in b;
600
- },
601
- instanceof: function(a, b) {
602
- return _instanceof(a, b);
603
- }
604
- };
1169
+ var BINARY_OPERATION_MAP = new Map([
1170
+ [
1171
+ "+",
1172
+ function(a, b) {
1173
+ return a + b;
1174
+ }
1175
+ ],
1176
+ [
1177
+ "-",
1178
+ function(a, b) {
1179
+ return a - b;
1180
+ }
1181
+ ],
1182
+ [
1183
+ "*",
1184
+ function(a, b) {
1185
+ return a * b;
1186
+ }
1187
+ ],
1188
+ [
1189
+ "**",
1190
+ function(a, b) {
1191
+ return Math.pow(a, b);
1192
+ }
1193
+ ],
1194
+ [
1195
+ "==",
1196
+ function(a, b) {
1197
+ return a == b;
1198
+ }
1199
+ ],
1200
+ [
1201
+ "===",
1202
+ function(a, b) {
1203
+ return a === b;
1204
+ }
1205
+ ],
1206
+ [
1207
+ "!=",
1208
+ function(a, b) {
1209
+ return a != b;
1210
+ }
1211
+ ],
1212
+ [
1213
+ "!==",
1214
+ function(a, b) {
1215
+ return a !== b;
1216
+ }
1217
+ ],
1218
+ [
1219
+ ">",
1220
+ function(a, b) {
1221
+ return a > b;
1222
+ }
1223
+ ],
1224
+ [
1225
+ ">=",
1226
+ function(a, b) {
1227
+ return a >= b;
1228
+ }
1229
+ ],
1230
+ [
1231
+ "<",
1232
+ function(a, b) {
1233
+ return a < b;
1234
+ }
1235
+ ],
1236
+ [
1237
+ "<=",
1238
+ function(a, b) {
1239
+ return a <= b;
1240
+ }
1241
+ ],
1242
+ [
1243
+ "%",
1244
+ function(a, b) {
1245
+ return a % b;
1246
+ }
1247
+ ],
1248
+ [
1249
+ "/",
1250
+ function(a, b) {
1251
+ return a / b;
1252
+ }
1253
+ ],
1254
+ [
1255
+ "|",
1256
+ function(a, b) {
1257
+ return a | b;
1258
+ }
1259
+ ],
1260
+ [
1261
+ "&",
1262
+ function(a, b) {
1263
+ return a & b;
1264
+ }
1265
+ ],
1266
+ [
1267
+ "^",
1268
+ function(a, b) {
1269
+ return a ^ b;
1270
+ }
1271
+ ],
1272
+ [
1273
+ "<<",
1274
+ function(a, b) {
1275
+ return a << b;
1276
+ }
1277
+ ],
1278
+ [
1279
+ ">>",
1280
+ function(a, b) {
1281
+ return a >> b;
1282
+ }
1283
+ ],
1284
+ [
1285
+ ">>>",
1286
+ function(a, b) {
1287
+ return a >>> b;
1288
+ }
1289
+ ],
1290
+ [
1291
+ "in",
1292
+ function(a, b) {
1293
+ return a in b;
1294
+ }
1295
+ ],
1296
+ [
1297
+ "instanceof",
1298
+ function(a, b) {
1299
+ return _instanceof(a, b);
1300
+ }
1301
+ ]
1302
+ ]);
605
1303
  function createGlobalScope() {
606
1304
  var scope = Object.create(null);
607
1305
  var builtin = external_globals_namespaceObject.builtin;
@@ -628,7 +1326,12 @@ function createGlobalScope() {
628
1326
  });
629
1327
  return scope;
630
1328
  }
631
- var GLOBAL_SCOPE = createGlobalScope();
1329
+ var GLOBAL_SCOPE = null;
1330
+ function getGlobalScope() {
1331
+ if (null === GLOBAL_SCOPE) GLOBAL_SCOPE = createGlobalScope();
1332
+ return GLOBAL_SCOPE;
1333
+ }
1334
+ var EMPTY_CONTEXT = Object.freeze(Object.create(null));
632
1335
  var getBlockedMethods = function() {
633
1336
  var BLOCKED_METHODS = null;
634
1337
  return function() {
@@ -679,26 +1382,39 @@ var getBlockedMethods = function() {
679
1382
  var Evaluator_Evaluator = /*#__PURE__*/ function() {
680
1383
  "use strict";
681
1384
  function Evaluator() {
682
- var variables = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : Object.create(null), options = arguments.length > 1 ? arguments[1] : void 0;
1385
+ var variables = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : EMPTY_CONTEXT, options = arguments.length > 1 ? arguments[1] : void 0;
683
1386
  _class_call_check(this, Evaluator);
684
1387
  this.maxInputLength = validateLimit(null == options ? void 0 : options.maxInputLength, "maxInputLength", DEFAULT_MAX_INPUT_LENGTH, MAX_CONFIGURABLE_INPUT_LENGTH);
685
1388
  this.maxEvaluationSteps = validateLimit(null == options ? void 0 : options.maxEvaluationSteps, "maxEvaluationSteps", DEFAULT_MAX_EVALUATION_STEPS, MAX_CONFIGURABLE_EVALUATION_STEPS);
686
1389
  this.maxDepth = validateLimit(null == options ? void 0 : options.maxDepth, "maxDepth", DEFAULT_MAX_DEPTH, MAX_CONFIGURABLE_DEPTH);
687
- assertBoundedData(variables, "Evaluation context");
688
- var clonedVariables = structuredClone(variables);
1390
+ var clonedVariables = EMPTY_CONTEXT;
1391
+ if (variables !== EMPTY_CONTEXT) {
1392
+ assertBoundedData(variables, "Evaluation context");
1393
+ clonedVariables = structuredClone(variables);
1394
+ }
689
1395
  this.scopes = [
690
1396
  clonedVariables,
691
- GLOBAL_SCOPE
1397
+ getGlobalScope()
692
1398
  ].filter(function(scope) {
693
1399
  return null != scope;
694
1400
  });
695
1401
  this.source = void 0;
1402
+ this.evaluating = false;
696
1403
  this.remainingEvaluationSteps = 0;
697
1404
  this.remainingDataSize = MAX_BUFFER_BYTES;
698
1405
  this.remainingDataNodes = MAX_DATA_NODES;
699
1406
  this.evaluationDepth = 0;
700
1407
  }
701
1408
  _create_class(Evaluator, [
1409
+ {
1410
+ key: "resetBudget",
1411
+ value: function() {
1412
+ this.remainingEvaluationSteps = this.maxEvaluationSteps;
1413
+ this.remainingDataSize = MAX_BUFFER_BYTES;
1414
+ this.remainingDataNodes = MAX_DATA_NODES;
1415
+ this.evaluationDepth = 0;
1416
+ }
1417
+ },
702
1418
  {
703
1419
  key: "evaluate",
704
1420
  value: function(expression) {
@@ -707,22 +1423,13 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
707
1423
  this.maxInputLength
708
1424
  ]));
709
1425
  this.source = expression;
710
- this.remainingEvaluationSteps = this.maxEvaluationSteps;
711
- this.remainingDataSize = MAX_BUFFER_BYTES;
712
- this.remainingDataNodes = MAX_DATA_NODES;
713
- this.evaluationDepth = 0;
714
- var ast;
715
- try {
716
- ast = external_acorn_namespaceObject.parse(expression, {
717
- ecmaVersion: "latest"
718
- });
719
- } catch (error) {
720
- if (_instanceof(error, RangeError) && /call stack/i.test(error.message)) throw new SyntaxError("Expression nesting is too deep to parse");
721
- throw error;
722
- }
1426
+ this.resetBudget();
1427
+ var ast = parseExpression(expression);
1428
+ this.evaluating = true;
723
1429
  try {
724
1430
  return this.execute(ast.body);
725
1431
  } finally{
1432
+ this.evaluating = false;
726
1433
  this.source = void 0;
727
1434
  }
728
1435
  }
@@ -730,11 +1437,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
730
1437
  {
731
1438
  key: "execute",
732
1439
  value: function(body) {
733
- if (0 === this.remainingEvaluationSteps) {
734
- this.remainingEvaluationSteps = this.maxEvaluationSteps;
735
- this.remainingDataSize = MAX_BUFFER_BYTES;
736
- this.remainingDataNodes = MAX_DATA_NODES;
737
- }
1440
+ if (!this.evaluating) this.resetBudget();
738
1441
  var result;
739
1442
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
740
1443
  try {
@@ -759,6 +1462,8 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
759
1462
  if (_instanceof(result, Promise)) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
760
1463
  "Returning promises from expressions"
761
1464
  ]));
1465
+ var resultType = void 0 === result ? "undefined" : _type_of(result);
1466
+ if (null === result || "string" === resultType || "number" === resultType || "boolean" === resultType || "undefined" === resultType || "bigint" === resultType) return result;
762
1467
  try {
763
1468
  return structuredClone(result);
764
1469
  } catch (error) {
@@ -772,6 +1477,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
772
1477
  {
773
1478
  key: "visit",
774
1479
  value: function(node) {
1480
+ var _this = this;
775
1481
  this.remainingEvaluationSteps--;
776
1482
  if (this.remainingEvaluationSteps < 0) throw new RangeError("Evaluation step limit exceeded");
777
1483
  this.evaluationDepth++;
@@ -780,82 +1486,76 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
780
1486
  throw new RangeError("Maximum evaluation depth exceeded");
781
1487
  }
782
1488
  try {
783
- return this.visitNode(node);
1489
+ switch(node.type){
1490
+ case "ExpressionStatement":
1491
+ return this.visit(node.expression);
1492
+ case "BinaryExpression":
1493
+ return this.handleBinaryExpression(node);
1494
+ case "LogicalExpression":
1495
+ return this.handleLogicalExpression(node);
1496
+ case "UnaryExpression":
1497
+ return this.handleUnaryExpression(node);
1498
+ case "Identifier":
1499
+ return this.handleIdentifier(node);
1500
+ case "Literal":
1501
+ if (node.regex) assertSafeRegExpPattern(node.regex.pattern);
1502
+ return node.value;
1503
+ case "MemberExpression":
1504
+ return this.handleMemberExpression(node);
1505
+ case "ArrayExpression":
1506
+ return this.handleArrayExpression(node);
1507
+ case "SpreadElement":
1508
+ return this.handleSpreadElement(node);
1509
+ case "ObjectExpression":
1510
+ return this.handleObjectExpression(node);
1511
+ case "FunctionExpression":
1512
+ throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1513
+ "Function expression"
1514
+ ]));
1515
+ case "ArrowFunctionExpression":
1516
+ return this.handleArrowFunctionExpression(node);
1517
+ case "CallExpression":
1518
+ return this.handleCallExpression(node);
1519
+ case "ConditionalExpression":
1520
+ return this.visit(node.test) ? this.visit(node.consequent) : this.visit(node.alternate);
1521
+ case "NewExpression":
1522
+ if ("Identifier" !== node.callee.type) throw new Error("Unsupported callee type '".concat(node.callee.type, "' in new expression"));
1523
+ if ("Function" === node.callee.name) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1524
+ "new Function() constructor"
1525
+ ]));
1526
+ if ("Promise" === node.callee.name) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1527
+ "Promise constructor"
1528
+ ]));
1529
+ var Constructor = this.visit(node.callee);
1530
+ var args = node.arguments.length ? node.arguments.map(function(arg) {
1531
+ return _this.visit(arg);
1532
+ }) : [];
1533
+ this.assertBoundedConstruction(Constructor, args);
1534
+ return _construct(Constructor, Evaluator_to_consumable_array(args));
1535
+ case "ChainExpression":
1536
+ return this.visit(node.expression);
1537
+ case "TemplateLiteral":
1538
+ return this.handleTemplateLiteral(node);
1539
+ case "ThisExpression":
1540
+ throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1541
+ "'this' expression"
1542
+ ]));
1543
+ case "WithStatement":
1544
+ throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1545
+ "'with' statement"
1546
+ ]));
1547
+ default:
1548
+ var content = this.source.slice(node.start, node.end);
1549
+ if (content.length > 20) content = content.slice(0, 17) + "...";
1550
+ throw new SyntaxError("'".concat(content, "'") + " " + renderErrorMessage(ERROR_MESSAGES.IS_INVALID_SYNTAX, [
1551
+ content
1552
+ ]));
1553
+ }
784
1554
  } finally{
785
1555
  this.evaluationDepth--;
786
1556
  }
787
1557
  }
788
1558
  },
789
- {
790
- key: "visitNode",
791
- value: function(node) {
792
- var _this = this;
793
- switch(node.type){
794
- case "ExpressionStatement":
795
- return this.visit(node.expression);
796
- case "BinaryExpression":
797
- return this.handleBinaryExpression(node);
798
- case "LogicalExpression":
799
- return this.handleLogicalExpression(node);
800
- case "UnaryExpression":
801
- return this.handleUnaryExpression(node);
802
- case "Identifier":
803
- return this.handleIdentifier(node);
804
- case "Literal":
805
- return node.value;
806
- case "MemberExpression":
807
- return this.handleMemberExpression(node);
808
- case "ArrayExpression":
809
- return this.handleArrayExpression(node);
810
- case "SpreadElement":
811
- return this.handleSpreadElement(node);
812
- case "ObjectExpression":
813
- return this.handleObjectExpression(node);
814
- case "FunctionExpression":
815
- throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
816
- "Function expression"
817
- ]));
818
- case "ArrowFunctionExpression":
819
- return this.handleArrowFunctionExpression(node);
820
- case "CallExpression":
821
- return this.handleCallExpression(node);
822
- case "ConditionalExpression":
823
- return this.visit(node.test) ? this.visit(node.consequent) : this.visit(node.alternate);
824
- case "NewExpression":
825
- if ("Identifier" !== node.callee.type) throw new Error("Unsupported callee type '".concat(node.callee.type, "' in new expression"));
826
- if ("Function" === node.callee.name) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
827
- "new Function() constructor"
828
- ]));
829
- if ("Promise" === node.callee.name) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
830
- "Promise constructor"
831
- ]));
832
- var Constructor = this.visit(node.callee);
833
- var args = node.arguments.length ? node.arguments.map(function(arg) {
834
- return _this.visit(arg);
835
- }) : [];
836
- this.assertBoundedConstruction(Constructor, args);
837
- return _construct(Constructor, Evaluator_to_consumable_array(args));
838
- case "ChainExpression":
839
- return this.visit(node.expression);
840
- case "TemplateLiteral":
841
- return this.handleTemplateLiteral(node);
842
- case "ThisExpression":
843
- throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
844
- "'this' expression"
845
- ]));
846
- case "WithStatement":
847
- throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
848
- "'with' statement"
849
- ]));
850
- default:
851
- var content = this.source.slice(node.start, node.end);
852
- if (content.length > 20) content = content.slice(0, 17) + "...";
853
- throw new SyntaxError("'".concat(content, "'") + " " + renderErrorMessage(ERROR_MESSAGES.IS_INVALID_SYNTAX, [
854
- content
855
- ]));
856
- }
857
- }
858
- },
859
1559
  {
860
1560
  key: "handleBinaryExpression",
861
1561
  value: function(node) {
@@ -871,7 +1571,8 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
871
1571
  var rightBits = right.toString(2).length;
872
1572
  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");
873
1573
  }
874
- if (BINARY_OPERATION_MAP.hasOwnProperty(op)) return BINARY_OPERATION_MAP[op](left, right);
1574
+ var apply = BINARY_OPERATION_MAP.get(op);
1575
+ if (void 0 !== apply) return apply(left, right);
875
1576
  throw new SyntaxError("Unsupported operator: ".concat(node.operator));
876
1577
  }
877
1578
  },
@@ -880,6 +1581,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
880
1581
  value: function(args) {
881
1582
  if ("string" == typeof args[0] && args[0].length > MAX_REGEXP_SOURCE_LENGTH) throw new RangeError("RegExp source exceeds the maximum allowed length");
882
1583
  if ("string" == typeof args[1] && args[1].length > MAX_REGEXP_FLAGS_LENGTH) throw new RangeError("RegExp flags exceed the maximum allowed length");
1584
+ assertSafeRegExpPattern(args[0]);
883
1585
  }
884
1586
  },
885
1587
  {
@@ -960,21 +1662,10 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
960
1662
  key: "handleIdentifier",
961
1663
  value: function(node) {
962
1664
  var name = node.name;
963
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
964
- try {
965
- for(var _iterator = this.scopes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
966
- var scope = _step.value;
967
- if (Object.hasOwn(scope, name)) return scope[name];
968
- }
969
- } catch (err) {
970
- _didIteratorError = true;
971
- _iteratorError = err;
972
- } finally{
973
- try {
974
- if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
975
- } finally{
976
- if (_didIteratorError) throw _iteratorError;
977
- }
1665
+ var scopes = this.scopes;
1666
+ for(var i = 0; i < scopes.length; i++){
1667
+ var scope = scopes[i];
1668
+ if (Object.hasOwn(scope, name)) return scope[name];
978
1669
  }
979
1670
  throw new ReferenceError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_DEFINED, [
980
1671
  name
@@ -991,9 +1682,6 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
991
1682
  if ("stack" === property && _instanceof(object, Error)) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
992
1683
  "Accessing error stack"
993
1684
  ]));
994
- if (null != object && void 0 !== object.__proto__ && object[property] === object.__proto__) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
995
- "Accessing prototype properties"
996
- ]));
997
1685
  if (null == object) {
998
1686
  if (node.optional) return;
999
1687
  throw new TypeError(renderErrorMessage(ERROR_MESSAGES.CAN_NOT_READ_PROPERTY, [
@@ -1005,6 +1693,10 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
1005
1693
  if (result === Function || result === Function.prototype) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1006
1694
  "Function constructor"
1007
1695
  ]));
1696
+ var prototype = object.__proto__;
1697
+ if (void 0 !== prototype && result === prototype) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1698
+ "Accessing prototype properties"
1699
+ ]));
1008
1700
  return result;
1009
1701
  }
1010
1702
  },
@@ -1013,7 +1705,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
1013
1705
  value: function(node) {
1014
1706
  var result = [];
1015
1707
  for(var i = 0; i < node.elements.length; i++){
1016
- var element = node.elements.at(i);
1708
+ var element = node.elements[i];
1017
1709
  if (null === element) {
1018
1710
  result.length++;
1019
1711
  continue;
@@ -1084,6 +1776,24 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
1084
1776
  key: "handleArrowFunctionExpression",
1085
1777
  value: function(node) {
1086
1778
  var _this = this;
1779
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
1780
+ try {
1781
+ for(var _iterator = node.params[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1782
+ var param = _step.value;
1783
+ if ("Identifier" !== param.type) throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1784
+ "Destructuring, default, and rest parameters"
1785
+ ]));
1786
+ }
1787
+ } catch (err) {
1788
+ _didIteratorError = true;
1789
+ _iteratorError = err;
1790
+ } finally{
1791
+ try {
1792
+ if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
1793
+ } finally{
1794
+ if (_didIteratorError) throw _iteratorError;
1795
+ }
1796
+ }
1087
1797
  return function() {
1088
1798
  for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++)args[_key] = arguments[_key];
1089
1799
  var newScope = {};
@@ -1124,15 +1834,13 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
1124
1834
  if (func === Function) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1125
1835
  "Function constructor"
1126
1836
  ]));
1127
- if (func === Error.prepareStackTrace) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1837
+ if ("function" == typeof func && func === Error.prepareStackTrace) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1128
1838
  "Error.prepareStackTrace"
1129
1839
  ]));
1130
- if (getBlockedMethods().has(func)) {
1131
- var path = getBlockedMethods().get(func);
1132
- throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1133
- path
1134
- ]));
1135
- }
1840
+ var blockedPath = getBlockedMethods().get(func);
1841
+ if (void 0 !== blockedPath) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1842
+ blockedPath
1843
+ ]));
1136
1844
  if (TYPED_ARRAY_MUTATORS.has(func)) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1137
1845
  "TypedArray.prototype.".concat(TYPED_ARRAY_MUTATORS.get(func))
1138
1846
  ]));
@@ -1140,7 +1848,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
1140
1848
  if (0 === node.arguments.length) return [];
1141
1849
  var result = [];
1142
1850
  for(var i = 0; i < node.arguments.length; i++){
1143
- var element = node.arguments.at(i);
1851
+ var element = node.arguments[i];
1144
1852
  var value = _this.visit(element);
1145
1853
  if ("SpreadElement" === element.type) {
1146
1854
  var _result;
@@ -1165,19 +1873,26 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
1165
1873
  if (resultLength > MAX_STRING_LENGTH) throw new RangeError("String result exceeds the maximum allowed length");
1166
1874
  }
1167
1875
  if (String.prototype.replace && func === String.prototype.replace || String.prototype.replaceAll && func === String.prototype.replaceAll) {
1168
- if ("string" == typeof args[0]) {
1169
- if ("function" == typeof args[1] || "string" == typeof args[1] && RegExp("\\$(?:[$&'`])", "u").test(args[1])) throw new Error("Only literal string replacements are allowed");
1170
- if (target.length * Math.max(1, args[0].length) > 10000000) throw new RangeError("String operation exceeds the maximum work limit");
1171
- var matchCount = countLiteralMatches(target, args[0], func === String.prototype.replaceAll);
1172
- if (target.length + matchCount * String(args[1]).length > MAX_STRING_LENGTH) throw new RangeError("String result exceeds the maximum allowed length");
1173
- }
1876
+ var all = func === String.prototype.replaceAll;
1877
+ var search = args[0];
1878
+ var replacement = args[1];
1879
+ if ("function" == typeof replacement) throw new Error("Only literal string replacements are allowed");
1880
+ if ("string" == typeof replacement && RegExp("\\$(?:[$&'`])", "u").test(replacement)) throw new Error("Only literal string replacements are allowed");
1881
+ var matchCount;
1882
+ if ("string" == typeof search) {
1883
+ if (target.length * Math.max(1, search.length) > 10000000) throw new RangeError("String operation exceeds the maximum work limit");
1884
+ matchCount = countLiteralMatches(target, search, all);
1885
+ } else matchCount = _instanceof(search, RegExp) ? countRegExpMatches(target, search, all || search.flags.includes("g")) : 0;
1886
+ if (target.length + matchCount * String(replacement).length > MAX_STRING_LENGTH) throw new RangeError("String result exceeds the maximum allowed length");
1174
1887
  }
1175
1888
  if (func === String.prototype.split) {
1176
1889
  if ("" === args[0] && target.length > MAX_ARRAY_LENGTH) throw new RangeError("Split result exceeds the maximum allowed length");
1177
1890
  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");
1891
+ if (_instanceof(args[0], RegExp) && countRegExpMatches(target, args[0], true) >= MAX_ARRAY_LENGTH) throw new RangeError("Split result exceeds the maximum allowed length");
1178
1892
  }
1179
1893
  }
1180
1894
  if (func === RegExp) this.assertBoundedRegExp(args);
1895
+ assertSafeRegExpInvocation(func, target, args);
1181
1896
  if ((target === Array || isTypedArrayConstructor(target)) && func === target.from) {
1182
1897
  var source = args[0];
1183
1898
  var _source_size;