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.
@@ -76,6 +76,7 @@ var mutableMethods = [
76
76
  "Array.prototype.sort",
77
77
  "Array.prototype.fill",
78
78
  "Array.prototype.copyWithin",
79
+ "Object.create",
79
80
  "Object.defineProperty",
80
81
  "Object.defineProperties",
81
82
  "Object.preventExtensions",
@@ -275,7 +276,7 @@ var blockedGlobalBuiltIns = [
275
276
  "Intl",
276
277
  "Deno"
277
278
  ];
278
- function Evaluator_array_like_to_array(arr, len) {
279
+ function regExpSafety_array_like_to_array(arr, len) {
279
280
  if (null == len || len > arr.length) len = arr.length;
280
281
  for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
281
282
  return arr2;
@@ -283,6 +284,516 @@ function Evaluator_array_like_to_array(arr, len) {
283
284
  function _array_with_holes(arr) {
284
285
  if (Array.isArray(arr)) return arr;
285
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
+ }
286
797
  function Evaluator_array_without_holes(arr) {
287
798
  if (Array.isArray(arr)) return Evaluator_array_like_to_array(arr);
288
799
  }
@@ -323,7 +834,7 @@ function _instanceof(left, right) {
323
834
  function Evaluator_iterable_to_array(iter) {
324
835
  if ("undefined" != typeof Symbol && null != iter[Symbol.iterator] || null != iter["@@iterator"]) return Array.from(iter);
325
836
  }
326
- function _non_iterable_rest() {
837
+ function Evaluator_non_iterable_rest() {
327
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.");
328
839
  }
329
840
  function Evaluator_non_iterable_spread() {
@@ -337,7 +848,7 @@ function _set_prototype_of(o, p) {
337
848
  return _set_prototype_of(o, p);
338
849
  }
339
850
  function _to_array(arr) {
340
- 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();
341
852
  }
342
853
  function Evaluator_to_consumable_array(arr) {
343
854
  return Evaluator_array_without_holes(arr) || Evaluator_iterable_to_array(arr) || Evaluator_unsupported_iterable_to_array(arr) || Evaluator_non_iterable_spread();
@@ -379,6 +890,18 @@ var MAX_STRING_LENGTH = 100000;
379
890
  var MAX_DATA_NODES = 100000;
380
891
  var MAX_BIGINT_EXPONENT = 256n;
381
892
  var MAX_BIGINT_BITS = 65536;
893
+ var DEFAULT_MAX_DEPTH = 1000;
894
+ var MAX_CONFIGURABLE_DEPTH = 2000;
895
+ var MAX_REGEXP_SOURCE_LENGTH = 1000;
896
+ var MAX_REGEXP_FLAGS_LENGTH = 32;
897
+ var NON_SANDBOX_GLOBALS = new Set([
898
+ "WeakRef",
899
+ "FinalizationRegistry",
900
+ "Iterator",
901
+ "SharedArrayBuffer",
902
+ "escape",
903
+ "unescape"
904
+ ]);
382
905
  var TYPED_ARRAY_CONSTRUCTORS = new Set([
383
906
  Int8Array,
384
907
  Uint8Array,
@@ -387,6 +910,7 @@ var TYPED_ARRAY_CONSTRUCTORS = new Set([
387
910
  Uint16Array,
388
911
  Int32Array,
389
912
  Uint32Array,
913
+ "function" == typeof Float16Array ? Float16Array : null,
390
914
  Float32Array,
391
915
  Float64Array,
392
916
  "function" == typeof BigInt64Array ? BigInt64Array : null,
@@ -394,6 +918,89 @@ var TYPED_ARRAY_CONSTRUCTORS = new Set([
394
918
  ].filter(function(constructor) {
395
919
  return "function" == typeof constructor;
396
920
  }));
921
+ function isTypedArrayConstructor(value) {
922
+ return TYPED_ARRAY_CONSTRUCTORS.has(value) || "function" == typeof value && "number" == typeof value.BYTES_PER_ELEMENT;
923
+ }
924
+ var TYPED_ARRAY_MUTATORS = function() {
925
+ var map = new Map();
926
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
927
+ try {
928
+ for(var _iterator = TYPED_ARRAY_CONSTRUCTORS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
929
+ var constructor = _step.value;
930
+ for(var _i = 0, _iter = [
931
+ "set",
932
+ "fill",
933
+ "reverse",
934
+ "sort",
935
+ "copyWithin"
936
+ ]; _i < _iter.length; _i++){
937
+ var name = _iter[_i];
938
+ var method = constructor.prototype[name];
939
+ if ("function" == typeof method && !map.has(method)) map.set(method, name);
940
+ }
941
+ }
942
+ } catch (err) {
943
+ _didIteratorError = true;
944
+ _iteratorError = err;
945
+ } finally{
946
+ try {
947
+ if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
948
+ } finally{
949
+ if (_didIteratorError) throw _iteratorError;
950
+ }
951
+ }
952
+ return map;
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
+ }();
397
1004
  var NO_OBJECT = Symbol("no-object");
398
1005
  var renderErrorMessage = function(template) {
399
1006
  var context = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};
@@ -401,6 +1008,26 @@ var renderErrorMessage = function(template) {
401
1008
  return String(context[key]);
402
1009
  });
403
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
+ }
404
1031
  function validateLimit(value, name, defaultValue, maximum) {
405
1032
  if (void 0 === value) return defaultValue;
406
1033
  if (!Number.isSafeInteger(value) || value < 1 || value > maximum) throw new RangeError("".concat(name, " must be an integer between 1 and ").concat(maximum));
@@ -417,7 +1044,59 @@ function countLiteralMatches(value, search, all) {
417
1044
  }
418
1045
  return count;
419
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
+ }
420
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
+ };
421
1100
  var pending = [
422
1101
  value
423
1102
  ];
@@ -487,85 +1166,157 @@ function assertBoundedData(value, label) {
487
1166
  dataNodes: dataNodes
488
1167
  };
489
1168
  }
490
- var BINARY_OPERATION_MAP = {
491
- "+": function(a, b) {
492
- return a + b;
493
- },
494
- "-": function(a, b) {
495
- return a - b;
496
- },
497
- "*": function(a, b) {
498
- return a * b;
499
- },
500
- "**": function(a, b) {
501
- return Math.pow(a, b);
502
- },
503
- "==": function(a, b) {
504
- return a == b;
505
- },
506
- "===": function(a, b) {
507
- return a === b;
508
- },
509
- "!=": function(a, b) {
510
- return a != b;
511
- },
512
- "!==": function(a, b) {
513
- return a !== b;
514
- },
515
- ">": function(a, b) {
516
- return a > b;
517
- },
518
- ">=": function(a, b) {
519
- return a >= b;
520
- },
521
- "<": function(a, b) {
522
- return a < b;
523
- },
524
- "<=": function(a, b) {
525
- return a <= b;
526
- },
527
- "%": function(a, b) {
528
- return a % b;
529
- },
530
- "/": function(a, b) {
531
- return a / b;
532
- },
533
- "|": function(a, b) {
534
- return a | b;
535
- },
536
- "&": function(a, b) {
537
- return a & b;
538
- },
539
- "^": function(a, b) {
540
- return a ^ b;
541
- },
542
- "<<": function(a, b) {
543
- return a << b;
544
- },
545
- ">>": function(a, b) {
546
- return a >> b;
547
- },
548
- ">>>": function(a, b) {
549
- return a >>> b;
550
- },
551
- in: function(a, b) {
552
- return a in b;
553
- },
554
- instanceof: function(a, b) {
555
- return _instanceof(a, b);
556
- }
557
- };
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
+ ]);
558
1303
  function createGlobalScope() {
559
1304
  var scope = Object.create(null);
560
1305
  var builtin = external_globals_namespaceObject.builtin;
561
- for(var key in builtin)if (!blockedGlobalBuiltIns.includes(key)) {
562
- var isWritable = builtin[key];
563
- Object.defineProperty(scope, key, {
564
- value: globalThis[key],
565
- writable: isWritable,
566
- enumerable: false,
567
- configurable: false
568
- });
1306
+ for(var key in builtin){
1307
+ if (!blockedGlobalBuiltIns.includes(key)) {
1308
+ if (!NON_SANDBOX_GLOBALS.has(key)) {
1309
+ if (Object.hasOwn(globalThis, key)) {
1310
+ var isWritable = builtin[key];
1311
+ Object.defineProperty(scope, key, {
1312
+ value: globalThis[key],
1313
+ writable: isWritable,
1314
+ enumerable: false,
1315
+ configurable: false
1316
+ });
1317
+ }
1318
+ }
1319
+ }
569
1320
  }
570
1321
  Object.defineProperty(scope, "globalThis", {
571
1322
  value: scope,
@@ -575,6 +1326,12 @@ function createGlobalScope() {
575
1326
  });
576
1327
  return scope;
577
1328
  }
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));
578
1335
  var getBlockedMethods = function() {
579
1336
  var BLOCKED_METHODS = null;
580
1337
  return function() {
@@ -625,24 +1382,39 @@ var getBlockedMethods = function() {
625
1382
  var Evaluator_Evaluator = /*#__PURE__*/ function() {
626
1383
  "use strict";
627
1384
  function Evaluator() {
628
- 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;
629
1386
  _class_call_check(this, Evaluator);
630
1387
  this.maxInputLength = validateLimit(null == options ? void 0 : options.maxInputLength, "maxInputLength", DEFAULT_MAX_INPUT_LENGTH, MAX_CONFIGURABLE_INPUT_LENGTH);
631
1388
  this.maxEvaluationSteps = validateLimit(null == options ? void 0 : options.maxEvaluationSteps, "maxEvaluationSteps", DEFAULT_MAX_EVALUATION_STEPS, MAX_CONFIGURABLE_EVALUATION_STEPS);
632
- assertBoundedData(variables, "Evaluation context");
633
- var clonedVariables = structuredClone(variables);
1389
+ this.maxDepth = validateLimit(null == options ? void 0 : options.maxDepth, "maxDepth", DEFAULT_MAX_DEPTH, MAX_CONFIGURABLE_DEPTH);
1390
+ var clonedVariables = EMPTY_CONTEXT;
1391
+ if (variables !== EMPTY_CONTEXT) {
1392
+ assertBoundedData(variables, "Evaluation context");
1393
+ clonedVariables = structuredClone(variables);
1394
+ }
634
1395
  this.scopes = [
635
1396
  clonedVariables,
636
- createGlobalScope()
1397
+ getGlobalScope()
637
1398
  ].filter(function(scope) {
638
1399
  return null != scope;
639
1400
  });
640
1401
  this.source = void 0;
1402
+ this.evaluating = false;
641
1403
  this.remainingEvaluationSteps = 0;
642
1404
  this.remainingDataSize = MAX_BUFFER_BYTES;
643
1405
  this.remainingDataNodes = MAX_DATA_NODES;
1406
+ this.evaluationDepth = 0;
644
1407
  }
645
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
+ },
646
1418
  {
647
1419
  key: "evaluate",
648
1420
  value: function(expression) {
@@ -651,15 +1423,13 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
651
1423
  this.maxInputLength
652
1424
  ]));
653
1425
  this.source = expression;
654
- this.remainingEvaluationSteps = this.maxEvaluationSteps;
655
- this.remainingDataSize = MAX_BUFFER_BYTES;
656
- this.remainingDataNodes = MAX_DATA_NODES;
657
- var ast = external_acorn_namespaceObject.parse(expression, {
658
- ecmaVersion: "latest"
659
- });
1426
+ this.resetBudget();
1427
+ var ast = parseExpression(expression);
1428
+ this.evaluating = true;
660
1429
  try {
661
1430
  return this.execute(ast.body);
662
1431
  } finally{
1432
+ this.evaluating = false;
663
1433
  this.source = void 0;
664
1434
  }
665
1435
  }
@@ -667,11 +1437,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
667
1437
  {
668
1438
  key: "execute",
669
1439
  value: function(body) {
670
- if (0 === this.remainingEvaluationSteps) {
671
- this.remainingEvaluationSteps = this.maxEvaluationSteps;
672
- this.remainingDataSize = MAX_BUFFER_BYTES;
673
- this.remainingDataNodes = MAX_DATA_NODES;
674
- }
1440
+ if (!this.evaluating) this.resetBudget();
675
1441
  var result;
676
1442
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
677
1443
  try {
@@ -696,6 +1462,8 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
696
1462
  if (_instanceof(result, Promise)) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
697
1463
  "Returning promises from expressions"
698
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;
699
1467
  try {
700
1468
  return structuredClone(result);
701
1469
  } catch (error) {
@@ -712,69 +1480,79 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
712
1480
  var _this = this;
713
1481
  this.remainingEvaluationSteps--;
714
1482
  if (this.remainingEvaluationSteps < 0) throw new RangeError("Evaluation step limit exceeded");
715
- switch(node.type){
716
- case "ExpressionStatement":
717
- return this.visit(node.expression);
718
- case "BinaryExpression":
719
- return this.handleBinaryExpression(node);
720
- case "LogicalExpression":
721
- return this.handleLogicalExpression(node);
722
- case "UnaryExpression":
723
- return this.handleUnaryExpression(node);
724
- case "Identifier":
725
- return this.handleIdentifier(node);
726
- case "Literal":
727
- return node.value;
728
- case "MemberExpression":
729
- return this.handleMemberExpression(node);
730
- case "ArrayExpression":
731
- return this.handleArrayExpression(node);
732
- case "SpreadElement":
733
- return this.handleSpreadElement(node);
734
- case "ObjectExpression":
735
- return this.handleObjectExpression(node);
736
- case "FunctionExpression":
737
- throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
738
- "Function expression"
739
- ]));
740
- case "ArrowFunctionExpression":
741
- return this.handleArrowFunctionExpression(node);
742
- case "CallExpression":
743
- return this.handleCallExpression(node);
744
- case "ConditionalExpression":
745
- return this.visit(node.test) ? this.visit(node.consequent) : this.visit(node.alternate);
746
- case "NewExpression":
747
- if ("Identifier" !== node.callee.type) throw new Error("Unsupported callee type '".concat(node.callee.type, "' in new expression"));
748
- if ("Function" === node.callee.name) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
749
- "new Function() constructor"
750
- ]));
751
- if ("Promise" === node.callee.name) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
752
- "Promise constructor"
753
- ]));
754
- var Constructor = this.visit(node.callee);
755
- var args = node.arguments.length ? node.arguments.map(function(arg) {
756
- return _this.visit(arg);
757
- }) : [];
758
- this.assertBoundedConstruction(Constructor, args);
759
- return _construct(Constructor, Evaluator_to_consumable_array(args));
760
- case "ChainExpression":
761
- return this.visit(node.expression);
762
- case "TemplateLiteral":
763
- return this.handleTemplateLiteral(node);
764
- case "ThisExpression":
765
- throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
766
- "'this' expression"
767
- ]));
768
- case "WithStatement":
769
- throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
770
- "'with' statement"
771
- ]));
772
- default:
773
- var content = this.source.slice(node.start, node.end);
774
- if (content.length > 20) content = content.slice(0, 17) + "...";
775
- throw new SyntaxError("'".concat(content, "'") + " " + renderErrorMessage(ERROR_MESSAGES.IS_INVALID_SYNTAX, [
776
- content
777
- ]));
1483
+ this.evaluationDepth++;
1484
+ if (this.evaluationDepth > this.maxDepth) {
1485
+ this.evaluationDepth--;
1486
+ throw new RangeError("Maximum evaluation depth exceeded");
1487
+ }
1488
+ try {
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
+ }
1554
+ } finally{
1555
+ this.evaluationDepth--;
778
1556
  }
779
1557
  }
780
1558
  },
@@ -793,14 +1571,24 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
793
1571
  var rightBits = right.toString(2).length;
794
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");
795
1573
  }
796
- 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);
797
1576
  throw new SyntaxError("Unsupported operator: ".concat(node.operator));
798
1577
  }
799
1578
  },
1579
+ {
1580
+ key: "assertBoundedRegExp",
1581
+ value: function(args) {
1582
+ if ("string" == typeof args[0] && args[0].length > MAX_REGEXP_SOURCE_LENGTH) throw new RangeError("RegExp source exceeds the maximum allowed length");
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]);
1585
+ }
1586
+ },
800
1587
  {
801
1588
  key: "assertBoundedConstruction",
802
1589
  value: function(Constructor, args) {
803
1590
  var _args_;
1591
+ if (Constructor === RegExp) this.assertBoundedRegExp(args);
804
1592
  var size = args[0];
805
1593
  if (Constructor === Array && 1 === args.length && "number" == typeof size && size > MAX_ARRAY_LENGTH) throw new RangeError("Array length exceeds the maximum allowed length");
806
1594
  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");
@@ -810,7 +1598,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
810
1598
  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;
811
1599
  if ("number" == typeof collectionSize && collectionSize > MAX_ARRAY_LENGTH) throw new RangeError("Collection source exceeds the maximum allowed size");
812
1600
  }
813
- if (TYPED_ARRAY_CONSTRUCTORS.has(Constructor)) {
1601
+ if (isTypedArrayConstructor(Constructor)) {
814
1602
  var byteLength;
815
1603
  if (_instanceof(size, ArrayBuffer)) {
816
1604
  var _args_1;
@@ -874,21 +1662,10 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
874
1662
  key: "handleIdentifier",
875
1663
  value: function(node) {
876
1664
  var name = node.name;
877
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
878
- try {
879
- for(var _iterator = this.scopes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
880
- var scope = _step.value;
881
- if (Object.hasOwn(scope, name)) return scope[name];
882
- }
883
- } catch (err) {
884
- _didIteratorError = true;
885
- _iteratorError = err;
886
- } finally{
887
- try {
888
- if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
889
- } finally{
890
- if (_didIteratorError) throw _iteratorError;
891
- }
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];
892
1669
  }
893
1670
  throw new ReferenceError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_DEFINED, [
894
1671
  name
@@ -905,9 +1682,6 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
905
1682
  if ("stack" === property && _instanceof(object, Error)) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
906
1683
  "Accessing error stack"
907
1684
  ]));
908
- if (null != object && object[property] === (null == object ? void 0 : object.__proto__)) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
909
- "Accessing prototype properties"
910
- ]));
911
1685
  if (null == object) {
912
1686
  if (node.optional) return;
913
1687
  throw new TypeError(renderErrorMessage(ERROR_MESSAGES.CAN_NOT_READ_PROPERTY, [
@@ -919,6 +1693,10 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
919
1693
  if (result === Function || result === Function.prototype) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
920
1694
  "Function constructor"
921
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
+ ]));
922
1700
  return result;
923
1701
  }
924
1702
  },
@@ -927,7 +1705,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
927
1705
  value: function(node) {
928
1706
  var result = [];
929
1707
  for(var i = 0; i < node.elements.length; i++){
930
- var element = node.elements.at(i);
1708
+ var element = node.elements[i];
931
1709
  if (null === element) {
932
1710
  result.length++;
933
1711
  continue;
@@ -998,6 +1776,24 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
998
1776
  key: "handleArrowFunctionExpression",
999
1777
  value: function(node) {
1000
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
+ }
1001
1797
  return function() {
1002
1798
  for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++)args[_key] = arguments[_key];
1003
1799
  var newScope = {};
@@ -1038,20 +1834,21 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
1038
1834
  if (func === Function) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1039
1835
  "Function constructor"
1040
1836
  ]));
1041
- 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, [
1042
1838
  "Error.prepareStackTrace"
1043
1839
  ]));
1044
- if (getBlockedMethods().has(func)) {
1045
- var path = getBlockedMethods().get(func);
1046
- throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1047
- path
1048
- ]));
1049
- }
1840
+ var blockedPath = getBlockedMethods().get(func);
1841
+ if (void 0 !== blockedPath) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1842
+ blockedPath
1843
+ ]));
1844
+ if (TYPED_ARRAY_MUTATORS.has(func)) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1845
+ "TypedArray.prototype.".concat(TYPED_ARRAY_MUTATORS.get(func))
1846
+ ]));
1050
1847
  var args = function() {
1051
1848
  if (0 === node.arguments.length) return [];
1052
1849
  var result = [];
1053
1850
  for(var i = 0; i < node.arguments.length; i++){
1054
- var element = node.arguments.at(i);
1851
+ var element = node.arguments[i];
1055
1852
  var value = _this.visit(element);
1056
1853
  if ("SpreadElement" === element.type) {
1057
1854
  var _result;
@@ -1076,19 +1873,27 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
1076
1873
  if (resultLength > MAX_STRING_LENGTH) throw new RangeError("String result exceeds the maximum allowed length");
1077
1874
  }
1078
1875
  if (String.prototype.replace && func === String.prototype.replace || String.prototype.replaceAll && func === String.prototype.replaceAll) {
1079
- if ("string" == typeof args[0]) {
1080
- if ("function" == typeof args[1] || "string" == typeof args[1] && RegExp("\\$(?:[$&'`])", "u").test(args[1])) throw new Error("Only literal string replacements are allowed");
1081
- if (target.length * Math.max(1, args[0].length) > 10000000) throw new RangeError("String operation exceeds the maximum work limit");
1082
- var matchCount = countLiteralMatches(target, args[0], func === String.prototype.replaceAll);
1083
- if (target.length + matchCount * String(args[1]).length > MAX_STRING_LENGTH) throw new RangeError("String result exceeds the maximum allowed length");
1084
- }
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");
1085
1887
  }
1086
1888
  if (func === String.prototype.split) {
1087
1889
  if ("" === args[0] && target.length > MAX_ARRAY_LENGTH) throw new RangeError("Split result exceeds the maximum allowed length");
1088
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");
1089
1892
  }
1090
1893
  }
1091
- if ((target === Array || TYPED_ARRAY_CONSTRUCTORS.has(target)) && func === target.from) {
1894
+ if (func === RegExp) this.assertBoundedRegExp(args);
1895
+ assertSafeRegExpInvocation(func, target, args);
1896
+ if ((target === Array || isTypedArrayConstructor(target)) && func === target.from) {
1092
1897
  var source = args[0];
1093
1898
  var _source_size;
1094
1899
  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;
@@ -1138,7 +1943,7 @@ function getNodeString(node) {
1138
1943
  return node.raw;
1139
1944
  case "ArrayExpression":
1140
1945
  return "[".concat(node.elements.map(function(child) {
1141
- return getNodeString(child);
1946
+ return null === child ? "" : getNodeString(child);
1142
1947
  }).join(","), "]");
1143
1948
  case "ObjectExpression":
1144
1949
  if (0 === node.properties.length) return "{}";
@@ -1211,6 +2016,7 @@ var TemplateParser_TemplateParser = /*#__PURE__*/ function() {
1211
2016
  var buffer = "";
1212
2017
  var exprStartPos = 0;
1213
2018
  var pos = 0;
2019
+ var prevExprChar = "";
1214
2020
  while(pos < length){
1215
2021
  var char = template[pos];
1216
2022
  var nextChar = template[pos + 1];
@@ -1228,6 +2034,7 @@ var TemplateParser_TemplateParser = /*#__PURE__*/ function() {
1228
2034
  }
1229
2035
  state = "EXPR";
1230
2036
  exprStartPos = pos;
2037
+ prevExprChar = "";
1231
2038
  pos += this.startLen;
1232
2039
  continue;
1233
2040
  }
@@ -1237,6 +2044,7 @@ var TemplateParser_TemplateParser = /*#__PURE__*/ function() {
1237
2044
  if ("'" === char) state = "STRING_SQ";
1238
2045
  else if ('"' === char) state = "STRING_DQ";
1239
2046
  else if ("`" === char) state = "TEMPLATE";
2047
+ else if ("/" === char && this._isRegexPosition(prevExprChar)) state = "REGEX";
1240
2048
  else if ("\\" === char) state = "'" === nextChar ? "ESCAPE_SQ" : '"' === nextChar ? "ESCAPE_DQ" : "`" === nextChar ? "ESCAPE_TEMPLATE" : "ESCAPE_EXPR";
1241
2049
  else if (this._isMatch(pos, template, this.exprEnd)) {
1242
2050
  var exprValue = this.preserveWhitespace ? buffer : buffer.trim();
@@ -1253,6 +2061,7 @@ var TemplateParser_TemplateParser = /*#__PURE__*/ function() {
1253
2061
  pos += this.endLen;
1254
2062
  continue;
1255
2063
  }
2064
+ if (!RegExp("\\s", "u").test(char)) prevExprChar = char;
1256
2065
  buffer += char;
1257
2066
  break;
1258
2067
  case "STRING_SQ":
@@ -1270,6 +2079,17 @@ var TemplateParser_TemplateParser = /*#__PURE__*/ function() {
1270
2079
  else if ("`" === char) state = "EXPR";
1271
2080
  buffer += char;
1272
2081
  break;
2082
+ case "REGEX":
2083
+ if ("\\" === char) state = "ESCAPE_REGEX";
2084
+ else if ("[" === char) state = "REGEX_CLASS";
2085
+ else if ("/" === char) state = "EXPR";
2086
+ buffer += char;
2087
+ break;
2088
+ case "REGEX_CLASS":
2089
+ if ("\\" === char) state = "ESCAPE_REGEX";
2090
+ else if ("]" === char) state = "REGEX";
2091
+ buffer += char;
2092
+ break;
1273
2093
  case "ESCAPE_SQ":
1274
2094
  buffer += char;
1275
2095
  state = "STRING_SQ";
@@ -1282,6 +2102,10 @@ var TemplateParser_TemplateParser = /*#__PURE__*/ function() {
1282
2102
  buffer += char;
1283
2103
  state = "TEMPLATE";
1284
2104
  break;
2105
+ case "ESCAPE_REGEX":
2106
+ buffer += char;
2107
+ state = "REGEX";
2108
+ break;
1285
2109
  case "ESCAPE_EXPR":
1286
2110
  buffer += char;
1287
2111
  state = "EXPR";
@@ -1307,6 +2131,12 @@ var TemplateParser_TemplateParser = /*#__PURE__*/ function() {
1307
2131
  return tokens;
1308
2132
  }
1309
2133
  },
2134
+ {
2135
+ key: "_isRegexPosition",
2136
+ value: function(prev) {
2137
+ return "" === prev || "(,=:[!&|?{};+-*%^~<>".includes(prev);
2138
+ }
2139
+ },
1310
2140
  {
1311
2141
  key: "_isMatch",
1312
2142
  value: function(pos, template, sequence) {