ecma-evaluator 2.1.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -235,7 +235,7 @@ var blockedGlobalBuiltIns = [
235
235
  "Intl",
236
236
  "Deno"
237
237
  ];
238
- function Evaluator_array_like_to_array(arr, len) {
238
+ function regExpSafety_array_like_to_array(arr, len) {
239
239
  if (null == len || len > arr.length) len = arr.length;
240
240
  for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
241
241
  return arr2;
@@ -243,6 +243,516 @@ function Evaluator_array_like_to_array(arr, len) {
243
243
  function _array_with_holes(arr) {
244
244
  if (Array.isArray(arr)) return arr;
245
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
+ }
246
756
  function Evaluator_array_without_holes(arr) {
247
757
  if (Array.isArray(arr)) return Evaluator_array_like_to_array(arr);
248
758
  }
@@ -283,7 +793,7 @@ function _instanceof(left, right) {
283
793
  function Evaluator_iterable_to_array(iter) {
284
794
  if ("undefined" != typeof Symbol && null != iter[Symbol.iterator] || null != iter["@@iterator"]) return Array.from(iter);
285
795
  }
286
- function _non_iterable_rest() {
796
+ function Evaluator_non_iterable_rest() {
287
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.");
288
798
  }
289
799
  function Evaluator_non_iterable_spread() {
@@ -297,7 +807,7 @@ function _set_prototype_of(o, p) {
297
807
  return _set_prototype_of(o, p);
298
808
  }
299
809
  function _to_array(arr) {
300
- 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();
301
811
  }
302
812
  function Evaluator_to_consumable_array(arr) {
303
813
  return Evaluator_array_without_holes(arr) || Evaluator_iterable_to_array(arr) || Evaluator_unsupported_iterable_to_array(arr) || Evaluator_non_iterable_spread();
@@ -400,6 +910,56 @@ var TYPED_ARRAY_MUTATORS = function() {
400
910
  }
401
911
  return map;
402
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
+ }();
403
963
  var NO_OBJECT = Symbol("no-object");
404
964
  var renderErrorMessage = function(template) {
405
965
  var context = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};
@@ -407,6 +967,26 @@ var renderErrorMessage = function(template) {
407
967
  return String(context[key]);
408
968
  });
409
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
+ }
410
990
  function validateLimit(value, name, defaultValue, maximum) {
411
991
  if (void 0 === value) return defaultValue;
412
992
  if (!Number.isSafeInteger(value) || value < 1 || value > maximum) throw new RangeError("".concat(name, " must be an integer between 1 and ").concat(maximum));
@@ -423,7 +1003,59 @@ function countLiteralMatches(value, search, all) {
423
1003
  }
424
1004
  return count;
425
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
+ }
426
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
+ };
427
1059
  var pending = [
428
1060
  value
429
1061
  ];
@@ -493,74 +1125,140 @@ function assertBoundedData(value, label) {
493
1125
  dataNodes: dataNodes
494
1126
  };
495
1127
  }
496
- var BINARY_OPERATION_MAP = {
497
- "+": function(a, b) {
498
- return a + b;
499
- },
500
- "-": function(a, b) {
501
- return a - b;
502
- },
503
- "*": function(a, b) {
504
- return a * b;
505
- },
506
- "**": function(a, b) {
507
- return Math.pow(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
- ">>": function(a, b) {
552
- return a >> b;
553
- },
554
- ">>>": function(a, b) {
555
- return a >>> b;
556
- },
557
- in: function(a, b) {
558
- return a in b;
559
- },
560
- instanceof: function(a, b) {
561
- return _instanceof(a, b);
562
- }
563
- };
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
+ ]);
564
1262
  function createGlobalScope() {
565
1263
  var scope = Object.create(null);
566
1264
  var builtin = globals.builtin;
@@ -587,7 +1285,12 @@ function createGlobalScope() {
587
1285
  });
588
1286
  return scope;
589
1287
  }
590
- var GLOBAL_SCOPE = createGlobalScope();
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));
591
1294
  var getBlockedMethods = function() {
592
1295
  var BLOCKED_METHODS = null;
593
1296
  return function() {
@@ -638,26 +1341,39 @@ var getBlockedMethods = function() {
638
1341
  var Evaluator_Evaluator = /*#__PURE__*/ function() {
639
1342
  "use strict";
640
1343
  function Evaluator() {
641
- 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;
642
1345
  _class_call_check(this, Evaluator);
643
1346
  this.maxInputLength = validateLimit(null == options ? void 0 : options.maxInputLength, "maxInputLength", DEFAULT_MAX_INPUT_LENGTH, MAX_CONFIGURABLE_INPUT_LENGTH);
644
1347
  this.maxEvaluationSteps = validateLimit(null == options ? void 0 : options.maxEvaluationSteps, "maxEvaluationSteps", DEFAULT_MAX_EVALUATION_STEPS, MAX_CONFIGURABLE_EVALUATION_STEPS);
645
1348
  this.maxDepth = validateLimit(null == options ? void 0 : options.maxDepth, "maxDepth", DEFAULT_MAX_DEPTH, MAX_CONFIGURABLE_DEPTH);
646
- assertBoundedData(variables, "Evaluation context");
647
- var clonedVariables = structuredClone(variables);
1349
+ var clonedVariables = EMPTY_CONTEXT;
1350
+ if (variables !== EMPTY_CONTEXT) {
1351
+ assertBoundedData(variables, "Evaluation context");
1352
+ clonedVariables = structuredClone(variables);
1353
+ }
648
1354
  this.scopes = [
649
1355
  clonedVariables,
650
- GLOBAL_SCOPE
1356
+ getGlobalScope()
651
1357
  ].filter(function(scope) {
652
1358
  return null != scope;
653
1359
  });
654
1360
  this.source = void 0;
1361
+ this.evaluating = false;
655
1362
  this.remainingEvaluationSteps = 0;
656
1363
  this.remainingDataSize = MAX_BUFFER_BYTES;
657
1364
  this.remainingDataNodes = MAX_DATA_NODES;
658
1365
  this.evaluationDepth = 0;
659
1366
  }
660
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
+ },
661
1377
  {
662
1378
  key: "evaluate",
663
1379
  value: function(expression) {
@@ -666,22 +1382,13 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
666
1382
  this.maxInputLength
667
1383
  ]));
668
1384
  this.source = expression;
669
- this.remainingEvaluationSteps = this.maxEvaluationSteps;
670
- this.remainingDataSize = MAX_BUFFER_BYTES;
671
- this.remainingDataNodes = MAX_DATA_NODES;
672
- this.evaluationDepth = 0;
673
- var ast;
674
- try {
675
- ast = external_acorn_parse(expression, {
676
- ecmaVersion: "latest"
677
- });
678
- } catch (error) {
679
- if (_instanceof(error, RangeError) && /call stack/i.test(error.message)) throw new SyntaxError("Expression nesting is too deep to parse");
680
- throw error;
681
- }
1385
+ this.resetBudget();
1386
+ var ast = parseExpression(expression);
1387
+ this.evaluating = true;
682
1388
  try {
683
1389
  return this.execute(ast.body);
684
1390
  } finally{
1391
+ this.evaluating = false;
685
1392
  this.source = void 0;
686
1393
  }
687
1394
  }
@@ -689,11 +1396,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
689
1396
  {
690
1397
  key: "execute",
691
1398
  value: function(body) {
692
- if (0 === this.remainingEvaluationSteps) {
693
- this.remainingEvaluationSteps = this.maxEvaluationSteps;
694
- this.remainingDataSize = MAX_BUFFER_BYTES;
695
- this.remainingDataNodes = MAX_DATA_NODES;
696
- }
1399
+ if (!this.evaluating) this.resetBudget();
697
1400
  var result;
698
1401
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
699
1402
  try {
@@ -718,6 +1421,8 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
718
1421
  if (_instanceof(result, Promise)) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
719
1422
  "Returning promises from expressions"
720
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;
721
1426
  try {
722
1427
  return structuredClone(result);
723
1428
  } catch (error) {
@@ -731,6 +1436,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
731
1436
  {
732
1437
  key: "visit",
733
1438
  value: function(node) {
1439
+ var _this = this;
734
1440
  this.remainingEvaluationSteps--;
735
1441
  if (this.remainingEvaluationSteps < 0) throw new RangeError("Evaluation step limit exceeded");
736
1442
  this.evaluationDepth++;
@@ -739,82 +1445,76 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
739
1445
  throw new RangeError("Maximum evaluation depth exceeded");
740
1446
  }
741
1447
  try {
742
- return this.visitNode(node);
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
+ }
743
1513
  } finally{
744
1514
  this.evaluationDepth--;
745
1515
  }
746
1516
  }
747
1517
  },
748
- {
749
- key: "visitNode",
750
- value: function(node) {
751
- var _this = this;
752
- switch(node.type){
753
- case "ExpressionStatement":
754
- return this.visit(node.expression);
755
- case "BinaryExpression":
756
- return this.handleBinaryExpression(node);
757
- case "LogicalExpression":
758
- return this.handleLogicalExpression(node);
759
- case "UnaryExpression":
760
- return this.handleUnaryExpression(node);
761
- case "Identifier":
762
- return this.handleIdentifier(node);
763
- case "Literal":
764
- return node.value;
765
- case "MemberExpression":
766
- return this.handleMemberExpression(node);
767
- case "ArrayExpression":
768
- return this.handleArrayExpression(node);
769
- case "SpreadElement":
770
- return this.handleSpreadElement(node);
771
- case "ObjectExpression":
772
- return this.handleObjectExpression(node);
773
- case "FunctionExpression":
774
- throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
775
- "Function expression"
776
- ]));
777
- case "ArrowFunctionExpression":
778
- return this.handleArrowFunctionExpression(node);
779
- case "CallExpression":
780
- return this.handleCallExpression(node);
781
- case "ConditionalExpression":
782
- return this.visit(node.test) ? this.visit(node.consequent) : this.visit(node.alternate);
783
- case "NewExpression":
784
- if ("Identifier" !== node.callee.type) throw new Error("Unsupported callee type '".concat(node.callee.type, "' in new expression"));
785
- if ("Function" === node.callee.name) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
786
- "new Function() constructor"
787
- ]));
788
- if ("Promise" === node.callee.name) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
789
- "Promise constructor"
790
- ]));
791
- var Constructor = this.visit(node.callee);
792
- var args = node.arguments.length ? node.arguments.map(function(arg) {
793
- return _this.visit(arg);
794
- }) : [];
795
- this.assertBoundedConstruction(Constructor, args);
796
- return _construct(Constructor, Evaluator_to_consumable_array(args));
797
- case "ChainExpression":
798
- return this.visit(node.expression);
799
- case "TemplateLiteral":
800
- return this.handleTemplateLiteral(node);
801
- case "ThisExpression":
802
- throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
803
- "'this' expression"
804
- ]));
805
- case "WithStatement":
806
- throw new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
807
- "'with' statement"
808
- ]));
809
- default:
810
- var content = this.source.slice(node.start, node.end);
811
- if (content.length > 20) content = content.slice(0, 17) + "...";
812
- throw new SyntaxError("'".concat(content, "'") + " " + renderErrorMessage(ERROR_MESSAGES.IS_INVALID_SYNTAX, [
813
- content
814
- ]));
815
- }
816
- }
817
- },
818
1518
  {
819
1519
  key: "handleBinaryExpression",
820
1520
  value: function(node) {
@@ -830,7 +1530,8 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
830
1530
  var rightBits = right.toString(2).length;
831
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");
832
1532
  }
833
- 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);
834
1535
  throw new SyntaxError("Unsupported operator: ".concat(node.operator));
835
1536
  }
836
1537
  },
@@ -839,6 +1540,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
839
1540
  value: function(args) {
840
1541
  if ("string" == typeof args[0] && args[0].length > MAX_REGEXP_SOURCE_LENGTH) throw new RangeError("RegExp source exceeds the maximum allowed length");
841
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]);
842
1544
  }
843
1545
  },
844
1546
  {
@@ -919,21 +1621,10 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
919
1621
  key: "handleIdentifier",
920
1622
  value: function(node) {
921
1623
  var name = node.name;
922
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
923
- try {
924
- for(var _iterator = this.scopes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
925
- var scope = _step.value;
926
- if (Object.hasOwn(scope, name)) return scope[name];
927
- }
928
- } catch (err) {
929
- _didIteratorError = true;
930
- _iteratorError = err;
931
- } finally{
932
- try {
933
- if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
934
- } finally{
935
- if (_didIteratorError) throw _iteratorError;
936
- }
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];
937
1628
  }
938
1629
  throw new ReferenceError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_DEFINED, [
939
1630
  name
@@ -950,9 +1641,6 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
950
1641
  if ("stack" === property && _instanceof(object, Error)) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
951
1642
  "Accessing error stack"
952
1643
  ]));
953
- if (null != object && void 0 !== object.__proto__ && object[property] === object.__proto__) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
954
- "Accessing prototype properties"
955
- ]));
956
1644
  if (null == object) {
957
1645
  if (node.optional) return;
958
1646
  throw new TypeError(renderErrorMessage(ERROR_MESSAGES.CAN_NOT_READ_PROPERTY, [
@@ -964,6 +1652,10 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
964
1652
  if (result === Function || result === Function.prototype) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
965
1653
  "Function constructor"
966
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
+ ]));
967
1659
  return result;
968
1660
  }
969
1661
  },
@@ -972,7 +1664,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
972
1664
  value: function(node) {
973
1665
  var result = [];
974
1666
  for(var i = 0; i < node.elements.length; i++){
975
- var element = node.elements.at(i);
1667
+ var element = node.elements[i];
976
1668
  if (null === element) {
977
1669
  result.length++;
978
1670
  continue;
@@ -1043,6 +1735,24 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
1043
1735
  key: "handleArrowFunctionExpression",
1044
1736
  value: function(node) {
1045
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
+ }
1046
1756
  return function() {
1047
1757
  for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++)args[_key] = arguments[_key];
1048
1758
  var newScope = {};
@@ -1083,15 +1793,13 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
1083
1793
  if (func === Function) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1084
1794
  "Function constructor"
1085
1795
  ]));
1086
- 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, [
1087
1797
  "Error.prepareStackTrace"
1088
1798
  ]));
1089
- if (getBlockedMethods().has(func)) {
1090
- var path = getBlockedMethods().get(func);
1091
- throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1092
- path
1093
- ]));
1094
- }
1799
+ var blockedPath = getBlockedMethods().get(func);
1800
+ if (void 0 !== blockedPath) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1801
+ blockedPath
1802
+ ]));
1095
1803
  if (TYPED_ARRAY_MUTATORS.has(func)) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
1096
1804
  "TypedArray.prototype.".concat(TYPED_ARRAY_MUTATORS.get(func))
1097
1805
  ]));
@@ -1099,7 +1807,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
1099
1807
  if (0 === node.arguments.length) return [];
1100
1808
  var result = [];
1101
1809
  for(var i = 0; i < node.arguments.length; i++){
1102
- var element = node.arguments.at(i);
1810
+ var element = node.arguments[i];
1103
1811
  var value = _this.visit(element);
1104
1812
  if ("SpreadElement" === element.type) {
1105
1813
  var _result;
@@ -1124,19 +1832,26 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
1124
1832
  if (resultLength > MAX_STRING_LENGTH) throw new RangeError("String result exceeds the maximum allowed length");
1125
1833
  }
1126
1834
  if (String.prototype.replace && func === String.prototype.replace || String.prototype.replaceAll && func === String.prototype.replaceAll) {
1127
- if ("string" == typeof args[0]) {
1128
- if ("function" == typeof args[1] || "string" == typeof args[1] && RegExp("\\$(?:[$&'`])", "u").test(args[1])) throw new Error("Only literal string replacements are allowed");
1129
- if (target.length * Math.max(1, args[0].length) > 10000000) throw new RangeError("String operation exceeds the maximum work limit");
1130
- var matchCount = countLiteralMatches(target, args[0], func === String.prototype.replaceAll);
1131
- if (target.length + matchCount * String(args[1]).length > MAX_STRING_LENGTH) throw new RangeError("String result exceeds the maximum allowed length");
1132
- }
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");
1133
1846
  }
1134
1847
  if (func === String.prototype.split) {
1135
1848
  if ("" === args[0] && target.length > MAX_ARRAY_LENGTH) throw new RangeError("Split result exceeds the maximum allowed length");
1136
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");
1137
1851
  }
1138
1852
  }
1139
1853
  if (func === RegExp) this.assertBoundedRegExp(args);
1854
+ assertSafeRegExpInvocation(func, target, args);
1140
1855
  if ((target === Array || isTypedArrayConstructor(target)) && func === target.from) {
1141
1856
  var source = args[0];
1142
1857
  var _source_size;