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