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