ecma-evaluator 2.0.7 → 2.0.9

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 CHANGED
@@ -366,14 +366,6 @@ The following built-in objects are available in the sandboxed environment:
366
366
  - **Errors**: `Error`, `EvalError`, `RangeError`, `ReferenceError`, `SyntaxError`, `TypeError`, `URIError`
367
367
  - **Promises**: `Promise`
368
368
 
369
- ### ❌ Unsafe Context (Strict)
370
-
371
- ```js
372
- // Do not pass unsafe functions into the context:
373
- evalExpression(`eval("alert('this is a unsafe script')")`, { eval: eval });
374
- evalExpression(`Function("return 1")()`, { Function: Function });
375
- evalExpression(`require('fs').readFileSync('/etc/passwd')`, { require: require });
376
- ```
377
369
 
378
370
  ### Error Prevention
379
371
 
@@ -467,6 +459,7 @@ const isValid = evalExpression(validationRule, {
467
459
  5. **No function declarations** - Only arrow functions in expressions are supported
468
460
  6. **Limited error recovery** - Syntax errors will throw immediately
469
461
  7. **No imports/requires** - Cannot import external modules
462
+ 8. **Cloneable context only** - Context objects must be cloneable (no functions, DOM nodes, etc.)
470
463
 
471
464
  ## Advanced Usage
472
465
 
@@ -512,6 +505,15 @@ evalTemplate(
512
505
 
513
506
  The package includes TypeScript type definitions:
514
507
 
508
+ ## Compatibility
509
+
510
+ Compatible with Nodejs and major browsers. For older environments, use Babel for transpilation and polyfills.
511
+
512
+ ```js
513
+ import 'core-js/actual/structured-clone.js';
514
+ import 'core-js/actual/object/has-own.js';
515
+ ```
516
+
515
517
  ## Contributing
516
518
 
517
519
  Contributions are welcome! Please feel free to submit a Pull Request.
package/README.zh-CN.md CHANGED
@@ -351,6 +351,7 @@ evalExpression("new Map([['a', 1], ['b', 2]])"); // Map {"a" => 1, "b" => 2}
351
351
  5. **无文件系统或网络访问** - 无法访问 Node.js API 或执行 I/O 操作
352
352
  6. **无法访问进程或全局变量** - 无法访问 `process`、`global`、`require` 等
353
353
  7. **防止原型污染** - 阻止访问原型属性(例如,`__proto__`)
354
+ 8. **上下文克隆** - 提供给求值器的上下文对象会被克隆以防止外部修改
354
355
 
355
356
  ### 安全的内置对象
356
357
 
@@ -366,15 +367,6 @@ evalExpression("new Map([['a', 1], ['b', 2]])"); // Map {"a" => 1, "b" => 2}
366
367
  - **错误**: `Error`, `EvalError`, `RangeError`, `ReferenceError`, `SyntaxError`, `TypeError`, `URIError`
367
368
  - **Promise**: `Promise`
368
369
 
369
- ### ❌ 不安全的上下文(严谨)
370
-
371
- ```js
372
- // 不要将不安全的函数传递给上下文:
373
- evalExpression(`eval("alert('this is a unsafe script')")`, { eval: eval });
374
- evalExpression(`Function("return 1")()`, { Function: Function });
375
- evalExpression(`require('fs').readFileSync('/etc/passwd')`, { require: require });
376
- ```
377
-
378
370
  ### 错误预防
379
371
 
380
372
  ```js
@@ -512,6 +504,15 @@ evalTemplate(
512
504
 
513
505
  该包包含 TypeScript 类型定义。
514
506
 
507
+ ## 兼容性
508
+
509
+ 兼容 Nodejs 和主流浏览器环境。如需支持更老版本的环境,请使用 Babel 进行转译以及 polyfill。
510
+
511
+ ```js
512
+ import 'core-js/actual/structured-clone.js';
513
+ import 'core-js/actual/object/has-own.js';
514
+ ```
515
+
515
516
  ## 贡献
516
517
 
517
518
  欢迎贡献!请随时提交 Pull Request。
@@ -360,9 +360,9 @@ function _is_native_reflect_construct() {
360
360
  }
361
361
  var ERROR_MESSAGES = {
362
362
  CAN_NOT_READ_PROPERTY: "Cannot read property of {0} (reading '{1}')",
363
+ IS_INVALID_SYNTAX: "{0} is not a valid syntax",
363
364
  IS_NOT_FUNCTION: "{0} is not a function",
364
365
  IS_NOT_DEFINED: "{0} is not defined",
365
- IS_NOT_VALID_SYNTAX: "{0} is not a valid syntax",
366
366
  IS_NOT_ALLOWED: "{0} is not allowed"
367
367
  };
368
368
  var renderErrorMessage = function(template) {
@@ -509,12 +509,14 @@ var getBlockedMethods = function() {
509
509
  var Evaluator_Evaluator = /*#__PURE__*/ function() {
510
510
  "use strict";
511
511
  function Evaluator() {
512
- var variables = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
512
+ var variables = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : Object.create(null);
513
513
  _class_call_check(this, Evaluator);
514
514
  this.scopes = [
515
- variables,
515
+ structuredClone(variables),
516
516
  createGlobalScope()
517
- ];
517
+ ].filter(function(scope) {
518
+ return null != scope;
519
+ });
518
520
  this.source = void 0;
519
521
  }
520
522
  _create_class(Evaluator, [
@@ -552,6 +554,9 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
552
554
  if (_didIteratorError) throw _iteratorError;
553
555
  }
554
556
  }
557
+ if ("function" == typeof result) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
558
+ "Returning functions from expressions"
559
+ ]));
555
560
  return result;
556
561
  }
557
562
  },
@@ -615,7 +620,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
615
620
  default:
616
621
  var content = this.source.slice(node.start, node.end);
617
622
  if (content.length > 20) content = content.slice(0, 17) + "...";
618
- throw new SyntaxError("'".concat(content, "'") + " " + renderErrorMessage(ERROR_MESSAGES.IS_NOT_VALID_SYNTAX, [
623
+ throw new SyntaxError("'".concat(content, "'") + " " + renderErrorMessage(ERROR_MESSAGES.IS_INVALID_SYNTAX, [
619
624
  content
620
625
  ]));
621
626
  }
@@ -715,7 +720,11 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
715
720
  property
716
721
  ]));
717
722
  }
718
- return object[property];
723
+ var result = object[property];
724
+ if (result === Function || result === Function.prototype) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
725
+ "Function constructor"
726
+ ]));
727
+ return result;
719
728
  }
720
729
  },
721
730
  {
@@ -814,6 +823,11 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
814
823
  return result;
815
824
  }();
816
825
  var target = "MemberExpression" === node.callee.type ? this.visit(node.callee.object) : null;
826
+ if (args.some(function(arg) {
827
+ return arg === Function;
828
+ })) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
829
+ "Function constructor"
830
+ ]));
817
831
  if ("function" != typeof func) {
818
832
  var calledString = getNodeString(node.callee);
819
833
  throw new TypeError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_FUNCTION, [
@@ -1032,17 +1046,26 @@ function evalExpression(expression, context) {
1032
1046
  }
1033
1047
  function evalTemplate(template, context, templateParserOptions) {
1034
1048
  var result = "";
1049
+ var typeHandler = {
1050
+ text: function(token) {
1051
+ return token.value;
1052
+ },
1053
+ expression: function(token) {
1054
+ try {
1055
+ return Evaluator_Evaluator.evaluate(token.value, context);
1056
+ } catch (error) {
1057
+ if (src_instanceof(error, ReferenceError) && error.message.endsWith("is not defined")) return "undefined";
1058
+ throw error;
1059
+ }
1060
+ }
1061
+ };
1035
1062
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
1036
1063
  try {
1037
1064
  for(var _iterator = TemplateParser_TemplateParser.parse(template, templateParserOptions)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1038
1065
  var token = _step.value;
1039
- if ("text" === token.type) result += token.value;
1040
- else if ("expression" === token.type) try {
1041
- result += Evaluator_Evaluator.evaluate(token.value, context);
1042
- } catch (error) {
1043
- if (src_instanceof(error, ReferenceError) && error.message.endsWith("is not defined")) result += "undefined";
1044
- else throw error;
1045
- }
1066
+ var _typeHandler_token_type;
1067
+ var handler = null != (_typeHandler_token_type = typeHandler[token.type]) ? _typeHandler_token_type : typeHandler["text"];
1068
+ result += handler(token);
1046
1069
  }
1047
1070
  } catch (err) {
1048
1071
  _didIteratorError = true;
@@ -1 +1 @@
1
- {"version":3,"file":"cjs/index.cjs","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/block.js","../../src/Evaluator.js","../../src/TemplateParser.js","../../src/index.js"],"sourcesContent":["__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const mutableMethods = [\n\t\"Array.prototype.push\",\n\t\"Array.prototype.pop\",\n\t\"Array.prototype.shift\",\n\t\"Array.prototype.unshift\",\n\t\"Array.prototype.splice\",\n\t\"Array.prototype.reverse\",\n\t\"Array.prototype.sort\",\n\t\"Array.prototype.fill\",\n\t\"Array.prototype.copyWithin\",\n\n\t\"Object.defineProperty\",\n\t\"Object.defineProperties\",\n\t\"Object.preventExtensions\",\n\t\"Object.seal\",\n\t\"Object.freeze\",\n\t\"Object.setPrototypeOf\",\n\t\"Object.assign\",\n\t\"Object.prototype.__defineGetter__\",\n\t\"Object.prototype.__defineSetter__\",\n\n\t\"Reflect.set\",\n\t\"Reflect.defineProperty\",\n\t\"Reflect.deleteProperty\",\n\t\"Reflect.setPrototypeOf\",\n\t\"Reflect.preventExtensions\",\n\n\t\"Set.prototype.add\",\n\t\"Set.prototype.delete\",\n\t\"Set.prototype.clear\",\n\t\"WeakSet.prototype.add\",\n\t\"WeakSet.prototype.delete\",\n\n\t\"Map.prototype.set\",\n\t\"Map.prototype.delete\",\n\t\"Map.prototype.clear\",\n\t\"WeakMap.prototype.set\",\n\t\"WeakMap.prototype.delete\",\n\n\t\"Date.prototype.setTime\",\n\t\"Date.prototype.setMilliseconds\",\n\t\"Date.prototype.setUTCSeconds\",\n\t\"Date.prototype.setSeconds\",\n\t\"Date.prototype.setMinutes\",\n\t\"Date.prototype.setHours\",\n\t\"Date.prototype.setDate\",\n\t\"Date.prototype.setMonth\",\n\t\"Date.prototype.setFullYear\",\n\t\"Date.prototype.setYear\",\n\t\"Date.prototype.setUTCMilliseconds\",\n\t\"Date.prototype.setUTCMinutes\",\n\t\"Date.prototype.setUTCHours\",\n\t\"Date.prototype.setUTCDate\",\n\t\"Date.prototype.setUTCMonth\",\n\t\"Date.prototype.setUTCFullYear\",\n\n\t\"RegExp.prototype.compile\",\n\n\t\"Int8Array.prototype.set\",\n\t\"Uint8Array.prototype.set\",\n\t\"Uint8ClampedArray.prototype.set\",\n\t\"Int16Array.prototype.set\",\n\t\"Uint16Array.prototype.set\",\n\t\"Int32Array.prototype.set\",\n\t\"Uint32Array.prototype.set\",\n\t\"Float32Array.prototype.set\",\n\t\"Float64Array.prototype.set\",\n\t\"BigInt64Array.prototype.set\",\n\t\"BigUint64Array.prototype.set\",\n\n\t\"Int8Array.prototype.fill\",\n\t\"Uint8Array.prototype.fill\",\n\t\"Uint8ClampedArray.prototype.fill\",\n\t\"Int16Array.prototype.fill\",\n\t\"Uint16Array.prototype.fill\",\n\t\"Int32Array.prototype.fill\",\n\t\"Uint32Array.prototype.fill\",\n\t\"Float32Array.prototype.fill\",\n\t\"Float64Array.prototype.fill\",\n\t\"BigInt64Array.prototype.fill\",\n\t\"BigUint64Array.prototype.fill\",\n\n\t\"Int8Array.prototype.reverse\",\n\t\"Uint8Array.prototype.reverse\",\n\t\"Uint8ClampedArray.prototype.reverse\",\n\t\"Int16Array.prototype.reverse\",\n\t\"Uint16Array.prototype.reverse\",\n\t\"Int32Array.prototype.reverse\",\n\t\"Uint32Array.prototype.reverse\",\n\t\"Float32Array.prototype.reverse\",\n\t\"Float64Array.prototype.reverse\",\n\t\"BigInt64Array.prototype.reverse\",\n\t\"BigUint64Array.prototype.reverse\",\n\n\t\"Int8Array.prototype.sort\",\n\t\"Uint8Array.prototype.sort\",\n\t\"Uint8ClampedArray.prototype.sort\",\n\t\"Int16Array.prototype.sort\",\n\t\"Uint16Array.prototype.sort\",\n\t\"Int32Array.prototype.sort\",\n\t\"Uint32Array.prototype.sort\",\n\t\"Float32Array.prototype.sort\",\n\t\"Float64Array.prototype.sort\",\n\t\"BigInt64Array.prototype.sort\",\n\t\"BigUint64Array.prototype.sort\",\n\n\t\"Int8Array.prototype.copyWithin\",\n\t\"Uint8Array.prototype.copyWithin\",\n\t\"Uint8ClampedArray.prototype.copyWithin\",\n\t\"Int16Array.prototype.copyWithin\",\n\t\"Uint16Array.prototype.copyWithin\",\n\t\"Int32Array.prototype.copyWithin\",\n\t\"Uint32Array.prototype.copyWithin\",\n\t\"Float32Array.prototype.copyWithin\",\n\t\"Float64Array.prototype.copyWithin\",\n\t\"BigInt64Array.prototype.copyWithin\",\n\t\"BigUint64Array.prototype.copyWithin\",\n\n\t\"ArrayBuffer.prototype.transfer\",\n\t\"ArrayBuffer.prototype.transferToFixedLength\",\n\n\t\"SharedArrayBuffer.prototype.grow\",\n\n\t\"DataView.prototype.setInt8\",\n\t\"DataView.prototype.setUint8\",\n\t\"DataView.prototype.setInt16\",\n\t\"DataView.prototype.setUint16\",\n\t\"DataView.prototype.setInt32\",\n\t\"DataView.prototype.setUint32\",\n\t\"DataView.prototype.setFloat32\",\n\t\"DataView.prototype.setFloat64\",\n\t\"DataView.prototype.setBigInt64\",\n\t\"DataView.prototype.setBigUint64\",\n\n\t\"Promise.prototype.catch\",\n\t\"Promise.prototype.finally\",\n\n\t\"Generator.prototype.next\",\n\t\"Generator.prototype.return\",\n\t\"Generator.prototype.throw\",\n\n\t\"AsyncGenerator.prototype.next\",\n\t\"AsyncGenerator.prototype.return\",\n\t\"AsyncGenerator.prototype.throw\",\n\n\t\"Iterator.prototype.next\",\n\n\t\"WeakRef.prototype.deref\",\n\n\t\"FinalizationRegistry.prototype.register\",\n\t\"FinalizationRegistry.prototype.unregister\",\n\n\t\"URLSearchParams.prototype.append\",\n\t\"URLSearchParams.prototype.delete\",\n\t\"URLSearchParams.prototype.set\",\n\t\"URLSearchParams.prototype.sort\",\n\n\t\"FormData.prototype.append\",\n\t\"FormData.prototype.delete\",\n\t\"FormData.prototype.set\",\n\n\t\"Headers.prototype.append\",\n\t\"Headers.prototype.delete\",\n\t\"Headers.prototype.set\",\n\n\t// Function call/apply/bind can be used to invoke with arbitrary `this`\n\t\"Function.prototype.call\",\n\t\"Function.prototype.apply\",\n\t\"Function.prototype.bind\",\n\t\"Function.prototype.constructor\",\n\n\t// Legacy lookup helpers\n\t\"Object.prototype.__lookupGetter__\",\n\t\"Object.prototype.__lookupSetter__\",\n\n\t// Constructor property can be abused to retrieve the Function constructor\n\t\"Object.prototype.constructor\",\n];\n\nconst dangerousMethods = [\n\t\"Object.getPrototypeOf\",\n\t// Various reflective/object-inspection APIs that may expose internals\n\t\"Object.getOwnPropertyDescriptor\",\n\t\"Object.getOwnPropertyDescriptors\",\n\t\"Object.getOwnPropertyNames\",\n\t\"Object.getOwnPropertySymbols\",\n\t\"Object.getOwnPropertyDescriptors\",\n];\n\n// Some prototype-style aliases/properties that can be used to break sandboxes\nmutableMethods.push(\"Object.prototype.__proto__\");\n\n/**\n * List of methods to block due to mutability or dangerousness\n */\nexport const blockedMethods = [...mutableMethods, ...dangerousMethods];\n\n/**\n * List of global built-ins to block entirely\n */\nexport const blockedGlobalBuiltIns = [\n\t\"Function\",\n\t\"GeneratorFunction\",\n\t\"AsyncFunction\",\n\t\"AsyncGeneratorFunction\",\n\t\"eval\",\n\t\"setTimeout\",\n\t\"setInterval\",\n\t\"clearTimeout\",\n\t\"clearInterval\",\n\t\"setImmediate\",\n\t\"XMLHttpRequest\",\n\t\"fetch\",\n\t\"WebSocket\",\n\t\"globalThis\",\n\n\t// Node / runtime globals\n\t\"process\",\n\t\"require\",\n\t\"module\",\n\t\"exports\",\n\t\"global\",\n\t\"Buffer\",\n\t\"setImmediate\",\n\t\"clearImmediate\",\n\n\t// Worker / threading / messaging\n\t\"importScripts\",\n\t\"Worker\",\n\t\"SharedWorker\",\n\t\"ServiceWorker\",\n\t\"BroadcastChannel\",\n\t\"MessageChannel\",\n\t\"MessagePort\",\n\t\"postMessage\",\n\n\t// Host environment globals (browser)\n\t\"window\",\n\t\"document\",\n\t\"navigator\",\n\t\"location\",\n\t\"localStorage\",\n\t\"sessionStorage\",\n\t\"indexedDB\",\n\t\"performance\",\n\n\t// Low-level / concurrent / binary APIs\n\t\"Proxy\",\n\t\"Reflect\",\n\t\"Atomics\",\n\t\"WebAssembly\",\n\n\t// Console and internationalization\n\t\"console\",\n\t\"Intl\",\n\n\t// Other runtimes\n\t\"Deno\",\n];\n","import * as acorn from \"acorn\";\nimport globals from \"globals\";\nimport { blockedGlobalBuiltIns, blockedMethods } from \"./block.js\";\n\n// Error message constants for better maintainability\nconst ERROR_MESSAGES = {\n\tCAN_NOT_READ_PROPERTY: \"Cannot read property of {0} (reading '{1}')\",\n\tIS_NOT_FUNCTION: \"{0} is not a function\",\n\tIS_NOT_DEFINED: \"{0} is not defined\",\n\tIS_NOT_VALID_SYNTAX: \"{0} is not a valid syntax\",\n\tIS_NOT_ALLOWED: \"{0} is not allowed\",\n};\n\n/**\n * Renders an error message by replacing placeholders with context values.\n * @param {string} template\n * @param {Record<string, any>} context\n * @example\n * ```js\n * const msg = renderErrorMessage(\"Cannot call mutable prototype method: {method}\", { method: \"push\" });\n * ```\n */\nconst renderErrorMessage = (template, context = {}) => template.replace(/{(\\w+)}/g, (_, key) => String(context[key]));\n\nconst BINARY_OPERATION_MAP = {\n\t\"+\": (a, b) => a + b,\n\t\"-\": (a, b) => a - b,\n\t\"*\": (a, b) => a * b,\n\t\"**\": (a, b) => a ** b,\n\t\"==\": (a, b) => a == b,\n\t\"===\": (a, b) => a === b,\n\t\"!=\": (a, b) => a != b,\n\t\"!==\": (a, b) => a !== b,\n\t\">\": (a, b) => a > b,\n\t\">=\": (a, b) => a >= b,\n\t\"<\": (a, b) => a < b,\n\t\"<=\": (a, b) => a <= b,\n\t\"%\": (a, b) => a % b,\n\t\"/\": (a, b) => a / b,\n\t\"|\": (a, b) => a | b,\n\t\"&\": (a, b) => a & b,\n\t\"^\": (a, b) => a ^ b,\n\t\"<<\": (a, b) => a << b,\n\t\">>\": (a, b) => a >> b,\n\t\">>>\": (a, b) => a >>> b,\n\tin: (a, b) => a in b,\n\tinstanceof: (a, b) => a instanceof b,\n};\n\nfunction createGlobalScope() {\n\tconst scope = Object.create(null);\n\tconst { builtin } = globals;\n\n\tfor (const key in builtin) {\n\t\tif (blockedGlobalBuiltIns.includes(key)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t/** @type {boolean} */\n\t\tconst isWritable = builtin[key];\n\n\t\tObject.defineProperty(scope, key, {\n\t\t\tvalue: globalThis[key],\n\t\t\twritable: isWritable,\n\t\t\tenumerable: false,\n\t\t\tconfigurable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(scope, \"globalThis\", {\n\t\tvalue: scope,\n\t\twritable: false,\n\t\tenumerable: false,\n\t\tconfigurable: false,\n\t});\n\n\treturn scope;\n}\n\nconst getBlockedMethods = (() => {\n\t/**\n\t * @type {Map<Function, string>}\n\t */\n\tlet BLOCKED_METHODS = null;\n\n\treturn () => {\n\t\tif (BLOCKED_METHODS) return BLOCKED_METHODS;\n\n\t\tconst map = new Map();\n\t\tfor (const path of blockedMethods) {\n\t\t\tconst [object, ...properties] = path.split(\".\");\n\t\t\tlet current = globalThis[object];\n\t\t\tfor (const prop of properties) {\n\t\t\t\tif (current && Object.hasOwn(current, prop)) {\n\t\t\t\t\tcurrent = current[prop];\n\t\t\t\t} else {\n\t\t\t\t\tcurrent = null;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof current === \"function\") map.set(current, path);\n\t\t}\n\t\tBLOCKED_METHODS = map;\n\n\t\treturn BLOCKED_METHODS;\n\t};\n})();\n\n/**\n * A JavaScript expression evaluator that safely evaluates expressions within a sandboxed environment.\n * Supports various JavaScript features including arithmetic, logical operations, functions, and more.\n *\n * Security features:\n * - Blocks mutable methods to prevent side effects\n * - No access to eval() or Function() constructor\n * - Sandboxed scope with limited global objects\n *\n * @example\n * const evaluator = new Evaluator({ x: 10, y: 20 });\n * evaluator.evaluate('x + y') // returns 30\n */\nexport class Evaluator {\n\t/**\n\t * Creates a new Evaluator instance with a custom variable context.\n\t * The scope hierarchy is: user variables -> global scope\n\t * @param {Object} [variables={}] - An optional object containing variables to make available in the evaluation context\n\t */\n\tconstructor(variables = {}) {\n\t\tthis.scopes = [variables, createGlobalScope()];\n\t\tthis.source = undefined;\n\t}\n\n\t/**\n\t * Evaluates a JavaScript expression with an optional context.\n\t * @param {string} expression\n\t * @param {unknown} [context]\n\t * @returns\n\t */\n\tstatic evaluate(expression, context) {\n\t\tconst evaluator = new Evaluator(context);\n\t\treturn evaluator.evaluate(expression);\n\t}\n\n\t/**\n\t * Parses and evaluates a JavaScript expression using acorn parser.\n\t * @param {string} expression - The JavaScript expression to evaluate\n\t * @returns {*} The result of the evaluation\n\t * @throws {SyntaxError} If the expression has invalid syntax\n\t * @throws {ReferenceError} If referencing undefined variables\n\t * @throws {TypeError} If performing invalid operations\n\t */\n\tevaluate(expression) {\n\t\tthis.source = expression;\n\n\t\tconst ast = acorn.parse(expression, { ecmaVersion: \"latest\" });\n\n\t\t// Start recursive evaluation from the root node\n\t\ttry {\n\t\t\treturn this.execute(ast.body);\n\t\t} finally {\n\t\t\tthis.source = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Executes an array of AST body nodes sequentially.\n\t * @private\n\t * @param {Array} body - Array of AST nodes to execute\n\t * @returns {*} The result of the last executed node\n\t */\n\texecute(body) {\n\t\tlet result;\n\t\tfor (const node of body) {\n\t\t\tresult = this.visit(node);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Visits an AST node and delegates to the appropriate handler based on node type.\n\t * @private\n\t * @param {import(\"acorn\").Node} node - The AST node to visit\n\t * @returns {*} The result of visiting the node\n\t */\n\tvisit(node) {\n\t\tswitch (node.type) {\n\t\t\tcase \"ExpressionStatement\": {\n\t\t\t\treturn this.visit(node.expression);\n\t\t\t}\n\t\t\tcase \"BinaryExpression\": {\n\t\t\t\treturn this.handleBinaryExpression(node);\n\t\t\t}\n\t\t\tcase \"LogicalExpression\": {\n\t\t\t\treturn this.handleLogicalExpression(node);\n\t\t\t}\n\t\t\tcase \"UnaryExpression\": {\n\t\t\t\treturn this.handleUnaryExpression(node);\n\t\t\t}\n\t\t\tcase \"Identifier\": {\n\t\t\t\treturn this.handleIdentifier(node);\n\t\t\t}\n\t\t\tcase \"Literal\": {\n\t\t\t\treturn node.value;\n\t\t\t}\n\t\t\tcase \"MemberExpression\": {\n\t\t\t\treturn this.handleMemberExpression(node);\n\t\t\t}\n\t\t\tcase \"ArrayExpression\": {\n\t\t\t\treturn this.handleArrayExpression(node);\n\t\t\t}\n\t\t\tcase \"SpreadElement\": {\n\t\t\t\treturn this.handleSpreadElement(node);\n\t\t\t}\n\t\t\tcase \"ObjectExpression\": {\n\t\t\t\treturn this.handleObjectExpression(node);\n\t\t\t}\n\t\t\tcase \"FunctionExpression\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Function expression\"]));\n\t\t\t}\n\t\t\tcase \"ArrowFunctionExpression\": {\n\t\t\t\treturn this.handleArrowFunctionExpression(node);\n\t\t\t}\n\t\t\tcase \"CallExpression\": {\n\t\t\t\treturn this.handleCallExpression(node);\n\t\t\t}\n\t\t\tcase \"ConditionalExpression\": {\n\t\t\t\treturn this.visit(node.test) ? this.visit(node.consequent) : this.visit(node.alternate);\n\t\t\t}\n\t\t\tcase \"NewExpression\": {\n\t\t\t\tif (node.callee.type !== \"Identifier\") {\n\t\t\t\t\tthrow new Error(`Unsupported callee type '${node.callee.type}' in new expression`);\n\t\t\t\t}\n\n\t\t\t\tif (node.callee.name === \"Function\") {\n\t\t\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"new Function() constructor\"]));\n\t\t\t\t}\n\n\t\t\t\tconst Constructor = this.visit(node.callee);\n\n\t\t\t\t// 仅在存在参数时构建数组\n\t\t\t\tconst args = node.arguments.length ? node.arguments.map((arg) => this.visit(arg)) : [];\n\n\t\t\t\treturn new Constructor(...args);\n\t\t\t}\n\t\t\tcase \"ChainExpression\": {\n\t\t\t\treturn this.visit(node.expression);\n\t\t\t}\n\t\t\tcase \"TemplateLiteral\": {\n\t\t\t\treturn this.handleTemplateLiteral(node);\n\t\t\t}\n\t\t\tcase \"ThisExpression\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"'this' expression\"]));\n\t\t\t}\n\t\t\tcase \"WithStatement\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"'with' statement\"]));\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tlet content = this.source.slice(node.start, node.end);\n\n\t\t\t\tif (content.length > 20) {\n\t\t\t\t\tcontent = content.slice(0, 17) + \"...\";\n\t\t\t\t}\n\n\t\t\t\tthrow new SyntaxError(`'${content}'` + \" \" + renderErrorMessage(ERROR_MESSAGES.IS_NOT_VALID_SYNTAX, [content]));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles binary expressions (arithmetic and comparison operations).\n\t * @param {import('acorn').BinaryExpression} node\n\t * @private\n\t */\n\thandleBinaryExpression(node) {\n\t\tconst op = node.operator;\n\t\tconst left = this.visit(node.left);\n\t\tconst right = this.visit(node.right);\n\n\t\tif (BINARY_OPERATION_MAP.hasOwnProperty(op)) {\n\t\t\treturn BINARY_OPERATION_MAP[op](left, right);\n\t\t}\n\n\t\tthrow new SyntaxError(`Unsupported operator: ${node.operator}`);\n\t}\n\n\t/**\n\t * Handles logical expressions (&&, ||, ??).\n\t * Implements proper short-circuit evaluation for performance.\n\t * @private\n\t */\n\thandleLogicalExpression(node) {\n\t\tswitch (node.operator) {\n\t\t\tcase \"&&\": {\n\t\t\t\tconst left = this.visit(node.left);\n\t\t\t\treturn left ? this.visit(node.right) : left;\n\t\t\t}\n\t\t\tcase \"||\": {\n\t\t\t\tconst left = this.visit(node.left);\n\t\t\t\treturn left ? left : this.visit(node.right);\n\t\t\t}\n\t\t\tcase \"??\": {\n\t\t\t\tconst left = this.visit(node.left);\n\t\t\t\treturn left !== null && left !== undefined ? left : this.visit(node.right);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new SyntaxError(`Unsupported logical operator: ${node.operator}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles unary expressions (-, +, !, ~, typeof, void).\n\t * @private\n\t */\n\thandleUnaryExpression(node) {\n\t\tswitch (node.operator) {\n\t\t\tcase \"-\": {\n\t\t\t\treturn -this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"+\": {\n\t\t\t\treturn +this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"!\": {\n\t\t\t\treturn !this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"~\": {\n\t\t\t\treturn ~this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"typeof\": {\n\t\t\t\treturn typeof this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"void\": {\n\t\t\t\treturn void this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"delete\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Delete operator\"]));\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new SyntaxError(`Unsupported unary operator: ${node.operator}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles identifier (variable) lookups in the scope chain.\n\t * @private\n\t */\n\thandleIdentifier(node) {\n\t\tconst name = node.name;\n\t\tfor (const scope of this.scopes) {\n\t\t\tif (Object.hasOwn(scope, name)) {\n\t\t\t\treturn scope[name];\n\t\t\t}\n\t\t}\n\n\t\tthrow new ReferenceError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_DEFINED, [name]));\n\t}\n\n\t/**\n\t * Handles member expressions (property access like obj.prop or obj[prop]).\n\t * @private\n\t */\n\thandleMemberExpression(node) {\n\t\tconst object = this.visit(node.object);\n\n\t\t// Determine property name: either identifier name or computed value\n\t\tconst isStaticProperty = node.property.type === \"Identifier\" && !node.computed;\n\t\tconst property = isStaticProperty ? node.property.name : this.visit(node.property);\n\n\t\t// Prevent access to prototype properties\n\t\tif (typeof object !== \"undefined\" && object !== null && object[property] === object?.__proto__) {\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Accessing prototype properties\"]));\n\t\t}\n\n\t\tif (object === null || object === undefined) {\n\t\t\t// optional chaining\n\t\t\tif (node.optional) {\n\t\t\t\treturn void 0;\n\t\t\t}\n\t\t\tthrow new TypeError(renderErrorMessage(ERROR_MESSAGES.CAN_NOT_READ_PROPERTY, [object, property]));\n\t\t}\n\n\t\treturn object[property];\n\t}\n\n\t/**\n\t * Handles array literal expressions.\n\t * @private\n\t */\n\thandleArrayExpression(node) {\n\t\tconst result = [];\n\n\t\tfor (let i = 0; i < node.elements.length; i++) {\n\t\t\tconst element = node.elements.at(i);\n\t\t\tconst value = this.visit(element);\n\n\t\t\tif (element.type === \"SpreadElement\") {\n\t\t\t\tresult.push(...value);\n\t\t\t} else {\n\t\t\t\tresult.push(value);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Handles object literal expressions.\n\t * @returns\n\t */\n\thandleObjectExpression(node) {\n\t\tconst obj = {};\n\t\tfor (const prop of node.properties) {\n\t\t\tif (prop.type === \"SpreadElement\") {\n\t\t\t\tObject.assign(obj, this.visit(prop.argument));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst key = prop.key.name || prop.key.value;\n\t\t\tconst value = this.visit(prop.value);\n\t\t\tobj[key] = value;\n\t\t}\n\t\treturn obj;\n\t}\n\n\thandleSpreadElement(node) {\n\t\treturn this.visit(node.argument);\n\t}\n\n\t/**\n\t * Handles arrow function expressions.\n\t * Creates a closure that captures the current scope and executes the function body\n\t * with parameters bound to a new scope.\n\t * @private\n\t */\n\thandleArrowFunctionExpression(node) {\n\t\treturn (...args) => {\n\t\t\t// Create new scope with parameters bound to arguments\n\t\t\tconst newScope = {};\n\t\t\tconst paramCount = node.params.length;\n\t\t\tfor (let i = 0; i < paramCount; i++) {\n\t\t\t\tnewScope[node.params[i].name] = args[i];\n\t\t\t}\n\n\t\t\t// Push new scope, evaluate body, then pop scope\n\t\t\tthis.scopes.unshift(newScope);\n\t\t\tconst result = this.visit(node.body);\n\t\t\tthis.scopes.shift();\n\t\t\treturn result;\n\t\t};\n\t}\n\n\t/**\n\t * Handles function call expressions, including optional chaining.\n\t * @private\n\t */\n\thandleCallExpression(node) {\n\t\tconst func = this.visit(node.callee);\n\n\t\tconst isOptional = node.optional || node.callee.optional;\n\t\tif ((func === undefined || func === null) && isOptional) {\n\t\t\treturn void 0;\n\t\t}\n\n\t\tif (func === Function) {\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Function constructor\"]));\n\t\t}\n\n\t\tif (getBlockedMethods().has(func)) {\n\t\t\tconst path = getBlockedMethods().get(func);\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [path]));\n\t\t}\n\n\t\t// 仅在存在参数时构建数组\n\t\tconst args = (() => {\n\t\t\tif (node.arguments.length === 0) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tlet result = [];\n\n\t\t\tfor (let i = 0; i < node.arguments.length; i++) {\n\t\t\t\tconst element = node.arguments.at(i);\n\t\t\t\tconst value = this.visit(element);\n\n\t\t\t\tif (element.type === \"SpreadElement\") {\n\t\t\t\t\tresult.push(...value);\n\t\t\t\t} else {\n\t\t\t\t\tresult.push(value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t})();\n\n\t\tconst target = node.callee.type === \"MemberExpression\" ? this.visit(node.callee.object) : null;\n\n\t\tif (typeof func !== \"function\") {\n\t\t\tconst calledString = getNodeString(node.callee);\n\t\t\tthrow new TypeError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_FUNCTION, [calledString]));\n\t\t}\n\n\t\treturn func.apply(target, args);\n\t}\n\n\t/**\n\t * Handles template literal expressions.\n\t * More efficient implementation that interleaves quasis and expressions without sorting.\n\t * @private\n\t */\n\thandleTemplateLiteral(node) {\n\t\tlet result = \"\";\n\t\tconst expressionCount = node.expressions.length;\n\n\t\tfor (let i = 0; i < node.quasis.length; i++) {\n\t\t\tresult += node.quasis[i].value.raw;\n\t\t\tif (i < expressionCount) {\n\t\t\t\tresult += this.visit(node.expressions[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n}\n\n/**\n *\n * @param {import('acorn').Node} node\n * @returns\n */\nexport function getNodeString(node) {\n\tswitch (node.type) {\n\t\tcase \"Identifier\": {\n\t\t\treturn node.name;\n\t\t}\n\t\tcase \"Literal\": {\n\t\t\treturn node.raw;\n\t\t}\n\t\tcase \"ArrayExpression\": {\n\t\t\treturn `[${node.elements.map((child) => getNodeString(child)).join(\",\")}]`;\n\t\t}\n\t\tcase \"ObjectExpression\": {\n\t\t\t// if keys is empty\n\t\t\tif (node.properties.length === 0) {\n\t\t\t\treturn \"{}\";\n\t\t\t}\n\n\t\t\treturn \"{(intermediate value)}\";\n\t\t}\n\t\tcase \"MemberExpression\": {\n\t\t\tconst objectStr = getNodeString(node.object);\n\t\t\tconst propertyStr = getNodeString(node.property);\n\n\t\t\tif (node.computed) {\n\t\t\t\treturn `${objectStr}[${propertyStr}]`;\n\t\t\t}\n\t\t\treturn `${objectStr}.${propertyStr}`;\n\t\t}\n\t\tdefault: {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n","/**\n * 简单状态机模板解析器\n * 能够正确处理表达式中包含字符串、转义字符和结束标记的情况\n * @class SimpleStateTemplateParser\n */\nclass TemplateParser {\n\t/**\n\t * 创建解析器实例\n\t * @param {Object} [options] - 配置选项\n\t * @param {string} [options.expressionStart='{{'] - 表达式开始标记\n\t * @param {string} [options.expressionEnd='}}'] - 表达式结束标记\n\t * @param {boolean} [options.preserveWhitespace=true] - 是否保留表达式周围的空白字符\n\t */\n\tconstructor(options = {}) {\n\t\t// 表达式标记配置\n\t\tthis.exprStart = options.expressionStart || \"{{\";\n\t\tthis.exprEnd = options.expressionEnd || \"}}\";\n\n\t\t// 标记长度缓存,避免重复计算\n\t\tthis.startLen = this.exprStart.length;\n\t\tthis.endLen = this.exprEnd.length;\n\n\t\t// 其他配置\n\t\tthis.preserveWhitespace = options.preserveWhitespace === true;\n\t}\n\n\t/**\n\t * 解析模板字符串,将其转换为 token 数组\n\t * @param {string} template - 要解析的模板字符串\n\t * @returns {Array<{type: string, value: string}>} token 数组\n\t */\n\tparse(template) {\n\t\t// 输入验证\n\t\tif (typeof template !== \"string\") {\n\t\t\tthrow new TypeError(\"模板必须是字符串\");\n\t\t}\n\n\t\tconst tokens = []; // 存储解析结果的 token 数组\n\t\tconst length = template.length;\n\n\t\t// 状态机变量\n\t\tlet state = \"TEXT\"; // 当前状态:TEXT | EXPR | STRING_SQ | STRING_DQ | TEMPLATE | ESCAPE_*\n\t\tlet buffer = \"\"; // 当前状态的字符缓冲区\n\t\tlet exprStartPos = 0; // 当前表达式的开始位置(用于错误恢复)\n\t\tlet pos = 0; // 当前扫描位置\n\n\t\t// 主解析循环:逐个字符扫描模板\n\t\twhile (pos < length) {\n\t\t\tconst char = template[pos];\n\t\t\tconst nextChar = template[pos + 1];\n\n\t\t\t// 状态机核心逻辑\n\t\t\tswitch (state) {\n\t\t\t\t// ==================== 文本状态 ====================\n\t\t\t\tcase \"TEXT\":\n\t\t\t\t\t// 检查是否遇到表达式开始标记\n\t\t\t\t\tif (this._isMatch(pos, template, this.exprStart)) {\n\t\t\t\t\t\t// 将缓冲区中的文本保存为 token\n\t\t\t\t\t\tif (buffer.length > 0) {\n\t\t\t\t\t\t\ttokens.push({ type: \"text\", value: buffer, start: pos - buffer.length, end: pos });\n\t\t\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// 切换到表达式状态\n\t\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\t\texprStartPos = pos; // 记录表达式开始位置\n\t\t\t\t\t\tpos += this.startLen; // 跳过开始标记\n\t\t\t\t\t\tcontinue; // 继续处理下一个字符(跳过本次循环的剩余部分)\n\t\t\t\t\t}\n\t\t\t\t\t// 普通文本字符,添加到缓冲区\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// ==================== 表达式状态 ====================\n\t\t\t\tcase \"EXPR\":\n\t\t\t\t\t// 在表达式中,需要处理各种字符串和转义字符\n\t\t\t\t\tif (char === \"'\") {\n\t\t\t\t\t\t// 进入单引号字符串状态\n\t\t\t\t\t\tstate = \"STRING_SQ\";\n\t\t\t\t\t} else if (char === '\"') {\n\t\t\t\t\t\t// 进入双引号字符串状态\n\t\t\t\t\t\tstate = \"STRING_DQ\";\n\t\t\t\t\t} else if (char === \"`\") {\n\t\t\t\t\t\t// 进入模板字符串状态\n\t\t\t\t\t\tstate = \"TEMPLATE\";\n\t\t\t\t\t} else if (char === \"\\\\\") {\n\t\t\t\t\t\t// 遇到转义字符,根据当前上下文进入相应的转义状态\n\t\t\t\t\t\tif (nextChar === \"'\") state = \"ESCAPE_SQ\";\n\t\t\t\t\t\telse if (nextChar === '\"') state = \"ESCAPE_DQ\";\n\t\t\t\t\t\telse if (nextChar === \"`\") state = \"ESCAPE_TEMPLATE\";\n\t\t\t\t\t\telse state = \"ESCAPE_EXPR\";\n\t\t\t\t\t} else if (this._isMatch(pos, template, this.exprEnd)) {\n\t\t\t\t\t\t// 找到表达式结束标记,且不在字符串中\n\t\t\t\t\t\tconst exprValue = this.preserveWhitespace ? buffer : buffer.trim();\n\t\t\t\t\t\tif (exprValue.length > 0) {\n\t\t\t\t\t\t\ttokens.push({\n\t\t\t\t\t\t\t\ttype: \"expression\",\n\t\t\t\t\t\t\t\tvalue: exprValue,\n\t\t\t\t\t\t\t\tstart: exprStartPos,\n\t\t\t\t\t\t\t\tend: pos + this.endLen,\n\t\t\t\t\t\t\t\tcontentStart: exprStartPos + this.startLen,\n\t\t\t\t\t\t\t\tcontentEnd: pos,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// 重置状态,准备处理后续文本\n\t\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\t\tstate = \"TEXT\";\n\t\t\t\t\t\tpos += this.endLen; // 跳过结束标记\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t// 将当前字符添加到表达式缓冲区\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// ==================== 字符串状态 ====================\n\t\t\t\tcase \"STRING_SQ\": // 单引号字符串\n\t\t\t\t\tif (char === \"\\\\\") {\n\t\t\t\t\t\tstate = \"ESCAPE_SQ\"; // 遇到转义字符\n\t\t\t\t\t} else if (char === \"'\") {\n\t\t\t\t\t\tstate = \"EXPR\"; // 字符串结束,回到表达式状态\n\t\t\t\t\t}\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"STRING_DQ\": // 双引号字符串\n\t\t\t\t\tif (char === \"\\\\\") {\n\t\t\t\t\t\tstate = \"ESCAPE_DQ\";\n\t\t\t\t\t} else if (char === '\"') {\n\t\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\t}\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"TEMPLATE\": // 模板字符串\n\t\t\t\t\tif (char === \"\\\\\") {\n\t\t\t\t\t\tstate = \"ESCAPE_TEMPLATE\";\n\t\t\t\t\t} else if (char === \"`\") {\n\t\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\t}\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// ==================== 转义状态 ====================\n\t\t\t\t// 转义状态:处理转义字符,然后返回到之前的状态\n\t\t\t\tcase \"ESCAPE_SQ\":\n\t\t\t\t\tbuffer += char; // 添加转义后的字符\n\t\t\t\t\tstate = \"STRING_SQ\"; // 回到单引号字符串状态\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ESCAPE_DQ\":\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tstate = \"STRING_DQ\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ESCAPE_TEMPLATE\":\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tstate = \"TEMPLATE\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ESCAPE_EXPR\":\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// 移动到下一个字符\n\t\t\tpos++;\n\t\t}\n\n\t\t// ==================== 后处理 ====================\n\t\t// 处理扫描结束后缓冲区中剩余的内容\n\t\tif (buffer.length > 0) {\n\t\t\tif (state === \"TEXT\") {\n\t\t\t\t// 剩余的文本内容\n\t\t\t\ttokens.push({ type: \"text\", value: buffer, start: pos - buffer.length, end: pos });\n\t\t\t} else {\n\t\t\t\t// 未完成的表达式,将其作为普通文本处理\n\t\t\t\t// 这里可以根据需要选择不同的错误处理策略:\n\t\t\t\t// 1. 抛出错误\n\t\t\t\t// 2. 忽略未完成的表达式\n\t\t\t\t// 3. 将其作为文本处理(当前实现)\n\t\t\t\tconst incompleteExpr = this.exprStart + buffer;\n\t\t\t\ttokens.push({ type: \"text\", value: incompleteExpr, start: exprStartPos, end: pos });\n\n\t\t\t\t// 可选:输出警告\n\t\t\t\tconsole.warn(`警告:在位置 ${exprStartPos} 开始的表达式未正确结束`);\n\t\t\t}\n\t\t}\n\n\t\treturn tokens;\n\t}\n\n\t/**\n\t * 检查指定位置是否匹配给定的字符序列\n\t * @param {number} pos - 开始检查的位置\n\t * @param {string} template - 模板字符串\n\t * @param {string} sequence - 要匹配的字符序列\n\t * @returns {boolean} 是否匹配\n\t * @private\n\t */\n\t_isMatch(pos, template, sequence) {\n\t\t// 检查剩余长度是否足够\n\t\tif (pos + sequence.length > template.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// 逐个字符比较\n\t\tfor (let i = 0; i < sequence.length; i++) {\n\t\t\tif (template[pos + i] !== sequence[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * 静态方法:快速解析模板\n\t * @param {string} template - 模板字符串\n\t * @param {Object} [options] - 配置选项\n\t * @returns {Array} token 数组\n\t */\n\tstatic parse(template, options) {\n\t\tconst parser = new TemplateParser(options);\n\t\treturn parser.parse(template);\n\t}\n}\n\nexport { TemplateParser };\n","import { Evaluator } from \"./Evaluator.js\";\nimport { TemplateParser } from \"./TemplateParser.js\";\n\nexport { Evaluator, TemplateParser };\n\n/**\n * Evaluates a JavaScript expression with an optional context.\n * @param {string} expression - The JavaScript expression to evaluate\n * @param {unknown} [context] - Optional context object with variables to use in the expression\n * @returns {*} The result of evaluating the expression\n * @example\n * evalExpression('a + b', { a: 1, b: 2 }) // returns 3\n */\nexport function evalExpression(expression, context) {\n\treturn Evaluator.evaluate(expression, context);\n}\n\n/**\n * Evaluates a template string by replacing {{ expression }} patterns with their evaluated values.\n * Undefined variables in expressions are replaced with empty strings instead of throwing errors.\n * @param {string} template - The template string containing {{ expression }} patterns\n * @param {Object} [context] - Optional context object with variables to use in expressions\n * @param {Object} [templateParserOptions] - Optional options for the template parser\n * @returns {string} The template with all expressions evaluated and replaced\n * @example\n * evalTemplate('Hello {{ name }}!', { name: 'World' }) // returns 'Hello World!'\n */\nexport function evalTemplate(template, context, templateParserOptions) {\n\tlet result = \"\";\n\n\tfor (const token of TemplateParser.parse(template, templateParserOptions)) {\n\t\tif (token.type === \"text\") {\n\t\t\tresult += token.value;\n\t\t} else if (token.type === \"expression\") {\n\t\t\ttry {\n\t\t\t\tresult += Evaluator.evaluate(token.value, context);\n\t\t\t} catch (error) {\n\t\t\t\t// Replace undefined variables with empty string for graceful degradation\n\t\t\t\tif (error instanceof ReferenceError && error.message.endsWith(\"is not defined\")) {\n\t\t\t\t\tresult += \"undefined\";\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","mutableMethods","dangerousMethods","blockedMethods","blockedGlobalBuiltIns","ERROR_MESSAGES","renderErrorMessage","template","context","_","String","BINARY_OPERATION_MAP","a","b","_instanceof","createGlobalScope","scope","builtin","globals","isWritable","globalThis","getBlockedMethods","BLOCKED_METHODS","map","Map","_iteratorError","path","_path_split","object","properties","current","_iteratorError1","Evaluator","variables","undefined","evaluate","expression","ast","acorn","execute","body","result","node","visit","SyntaxError","Error","Constructor","args","arg","content","handleBinaryExpression","op","left","right","handleLogicalExpression","left1","left2","handleUnaryExpression","_type_of","handleIdentifier","name","ReferenceError","handleMemberExpression","isStaticProperty","property","TypeError","handleArrayExpression","i","element","value","_result","handleObjectExpression","handleSpreadElement","handleArrowFunctionExpression","newScope","paramCount","handleCallExpression","func","isOptional","Function","target","calledString","getNodeString","handleTemplateLiteral","expressionCount","evaluator","child","objectStr","propertyStr","TemplateParser","options","parse","tokens","length","state","buffer","exprStartPos","pos","char","nextChar","exprValue","incompleteExpr","console","_isMatch","sequence","parser","evalExpression","evalTemplate","templateParserOptions","token","error"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,SAAS,QAAO,EAAEC,UAAU;QACnD,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,SAASI,GAAG,EAAEC,IAAI;QAAI,OAAOF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;IAAO;;;ICCtGL,oBAAoB,CAAC,GAAG,SAAS,QAAO;QACvC,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNA,IAAMI,iBAAiB;IACtB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IAEA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IAEA;IACA;IACA;IAEA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"}
1
+ {"version":3,"file":"cjs/index.cjs","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/block.js","../../src/Evaluator.js","../../src/TemplateParser.js","../../src/index.js"],"sourcesContent":["__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const mutableMethods = [\n\t\"Array.prototype.push\",\n\t\"Array.prototype.pop\",\n\t\"Array.prototype.shift\",\n\t\"Array.prototype.unshift\",\n\t\"Array.prototype.splice\",\n\t\"Array.prototype.reverse\",\n\t\"Array.prototype.sort\",\n\t\"Array.prototype.fill\",\n\t\"Array.prototype.copyWithin\",\n\n\t\"Object.defineProperty\",\n\t\"Object.defineProperties\",\n\t\"Object.preventExtensions\",\n\t\"Object.seal\",\n\t\"Object.freeze\",\n\t\"Object.setPrototypeOf\",\n\t\"Object.assign\",\n\t\"Object.prototype.__defineGetter__\",\n\t\"Object.prototype.__defineSetter__\",\n\n\t\"Reflect.set\",\n\t\"Reflect.defineProperty\",\n\t\"Reflect.deleteProperty\",\n\t\"Reflect.setPrototypeOf\",\n\t\"Reflect.preventExtensions\",\n\n\t\"Set.prototype.add\",\n\t\"Set.prototype.delete\",\n\t\"Set.prototype.clear\",\n\t\"WeakSet.prototype.add\",\n\t\"WeakSet.prototype.delete\",\n\n\t\"Map.prototype.set\",\n\t\"Map.prototype.delete\",\n\t\"Map.prototype.clear\",\n\t\"WeakMap.prototype.set\",\n\t\"WeakMap.prototype.delete\",\n\n\t\"Date.prototype.setTime\",\n\t\"Date.prototype.setMilliseconds\",\n\t\"Date.prototype.setUTCSeconds\",\n\t\"Date.prototype.setSeconds\",\n\t\"Date.prototype.setMinutes\",\n\t\"Date.prototype.setHours\",\n\t\"Date.prototype.setDate\",\n\t\"Date.prototype.setMonth\",\n\t\"Date.prototype.setFullYear\",\n\t\"Date.prototype.setYear\",\n\t\"Date.prototype.setUTCMilliseconds\",\n\t\"Date.prototype.setUTCMinutes\",\n\t\"Date.prototype.setUTCHours\",\n\t\"Date.prototype.setUTCDate\",\n\t\"Date.prototype.setUTCMonth\",\n\t\"Date.prototype.setUTCFullYear\",\n\n\t\"RegExp.prototype.compile\",\n\n\t\"Int8Array.prototype.set\",\n\t\"Uint8Array.prototype.set\",\n\t\"Uint8ClampedArray.prototype.set\",\n\t\"Int16Array.prototype.set\",\n\t\"Uint16Array.prototype.set\",\n\t\"Int32Array.prototype.set\",\n\t\"Uint32Array.prototype.set\",\n\t\"Float32Array.prototype.set\",\n\t\"Float64Array.prototype.set\",\n\t\"BigInt64Array.prototype.set\",\n\t\"BigUint64Array.prototype.set\",\n\n\t\"Int8Array.prototype.fill\",\n\t\"Uint8Array.prototype.fill\",\n\t\"Uint8ClampedArray.prototype.fill\",\n\t\"Int16Array.prototype.fill\",\n\t\"Uint16Array.prototype.fill\",\n\t\"Int32Array.prototype.fill\",\n\t\"Uint32Array.prototype.fill\",\n\t\"Float32Array.prototype.fill\",\n\t\"Float64Array.prototype.fill\",\n\t\"BigInt64Array.prototype.fill\",\n\t\"BigUint64Array.prototype.fill\",\n\n\t\"Int8Array.prototype.reverse\",\n\t\"Uint8Array.prototype.reverse\",\n\t\"Uint8ClampedArray.prototype.reverse\",\n\t\"Int16Array.prototype.reverse\",\n\t\"Uint16Array.prototype.reverse\",\n\t\"Int32Array.prototype.reverse\",\n\t\"Uint32Array.prototype.reverse\",\n\t\"Float32Array.prototype.reverse\",\n\t\"Float64Array.prototype.reverse\",\n\t\"BigInt64Array.prototype.reverse\",\n\t\"BigUint64Array.prototype.reverse\",\n\n\t\"Int8Array.prototype.sort\",\n\t\"Uint8Array.prototype.sort\",\n\t\"Uint8ClampedArray.prototype.sort\",\n\t\"Int16Array.prototype.sort\",\n\t\"Uint16Array.prototype.sort\",\n\t\"Int32Array.prototype.sort\",\n\t\"Uint32Array.prototype.sort\",\n\t\"Float32Array.prototype.sort\",\n\t\"Float64Array.prototype.sort\",\n\t\"BigInt64Array.prototype.sort\",\n\t\"BigUint64Array.prototype.sort\",\n\n\t\"Int8Array.prototype.copyWithin\",\n\t\"Uint8Array.prototype.copyWithin\",\n\t\"Uint8ClampedArray.prototype.copyWithin\",\n\t\"Int16Array.prototype.copyWithin\",\n\t\"Uint16Array.prototype.copyWithin\",\n\t\"Int32Array.prototype.copyWithin\",\n\t\"Uint32Array.prototype.copyWithin\",\n\t\"Float32Array.prototype.copyWithin\",\n\t\"Float64Array.prototype.copyWithin\",\n\t\"BigInt64Array.prototype.copyWithin\",\n\t\"BigUint64Array.prototype.copyWithin\",\n\n\t\"ArrayBuffer.prototype.transfer\",\n\t\"ArrayBuffer.prototype.transferToFixedLength\",\n\n\t\"SharedArrayBuffer.prototype.grow\",\n\n\t\"DataView.prototype.setInt8\",\n\t\"DataView.prototype.setUint8\",\n\t\"DataView.prototype.setInt16\",\n\t\"DataView.prototype.setUint16\",\n\t\"DataView.prototype.setInt32\",\n\t\"DataView.prototype.setUint32\",\n\t\"DataView.prototype.setFloat32\",\n\t\"DataView.prototype.setFloat64\",\n\t\"DataView.prototype.setBigInt64\",\n\t\"DataView.prototype.setBigUint64\",\n\n\t\"Promise.prototype.catch\",\n\t\"Promise.prototype.finally\",\n\n\t\"Generator.prototype.next\",\n\t\"Generator.prototype.return\",\n\t\"Generator.prototype.throw\",\n\n\t\"AsyncGenerator.prototype.next\",\n\t\"AsyncGenerator.prototype.return\",\n\t\"AsyncGenerator.prototype.throw\",\n\n\t\"Iterator.prototype.next\",\n\n\t\"WeakRef.prototype.deref\",\n\n\t\"FinalizationRegistry.prototype.register\",\n\t\"FinalizationRegistry.prototype.unregister\",\n\n\t\"URLSearchParams.prototype.append\",\n\t\"URLSearchParams.prototype.delete\",\n\t\"URLSearchParams.prototype.set\",\n\t\"URLSearchParams.prototype.sort\",\n\n\t\"FormData.prototype.append\",\n\t\"FormData.prototype.delete\",\n\t\"FormData.prototype.set\",\n\n\t\"Headers.prototype.append\",\n\t\"Headers.prototype.delete\",\n\t\"Headers.prototype.set\",\n\n\t// Function call/apply/bind can be used to invoke with arbitrary `this`\n\t\"Function.prototype.call\",\n\t\"Function.prototype.apply\",\n\t\"Function.prototype.bind\",\n\t\"Function.prototype.constructor\",\n\n\t// Legacy lookup helpers\n\t\"Object.prototype.__lookupGetter__\",\n\t\"Object.prototype.__lookupSetter__\",\n\n\t// Constructor property can be abused to retrieve the Function constructor\n\t\"Object.prototype.constructor\",\n];\n\nconst dangerousMethods = [\n\t\"Object.getPrototypeOf\",\n\t// Various reflective/object-inspection APIs that may expose internals\n\t\"Object.getOwnPropertyDescriptor\",\n\t\"Object.getOwnPropertyDescriptors\",\n\t\"Object.getOwnPropertyNames\",\n\t\"Object.getOwnPropertySymbols\",\n\t\"Object.getOwnPropertyDescriptors\",\n];\n\n// Some prototype-style aliases/properties that can be used to break sandboxes\nmutableMethods.push(\"Object.prototype.__proto__\");\n\n/**\n * List of methods to block due to mutability or dangerousness\n */\nexport const blockedMethods = [...mutableMethods, ...dangerousMethods];\n\n/**\n * List of global built-ins to block entirely\n */\nexport const blockedGlobalBuiltIns = [\n\t\"Function\",\n\t\"GeneratorFunction\",\n\t\"AsyncFunction\",\n\t\"AsyncGeneratorFunction\",\n\t\"eval\",\n\t\"setTimeout\",\n\t\"setInterval\",\n\t\"clearTimeout\",\n\t\"clearInterval\",\n\t\"setImmediate\",\n\t\"XMLHttpRequest\",\n\t\"fetch\",\n\t\"WebSocket\",\n\t\"globalThis\",\n\n\t// Node / runtime globals\n\t\"process\",\n\t\"require\",\n\t\"module\",\n\t\"exports\",\n\t\"global\",\n\t\"Buffer\",\n\t\"setImmediate\",\n\t\"clearImmediate\",\n\n\t// Worker / threading / messaging\n\t\"importScripts\",\n\t\"Worker\",\n\t\"SharedWorker\",\n\t\"ServiceWorker\",\n\t\"BroadcastChannel\",\n\t\"MessageChannel\",\n\t\"MessagePort\",\n\t\"postMessage\",\n\n\t// Host environment globals (browser)\n\t\"window\",\n\t\"document\",\n\t\"navigator\",\n\t\"location\",\n\t\"localStorage\",\n\t\"sessionStorage\",\n\t\"indexedDB\",\n\t\"performance\",\n\n\t// Low-level / concurrent / binary APIs\n\t\"Proxy\",\n\t\"Reflect\",\n\t\"Atomics\",\n\t\"WebAssembly\",\n\n\t// Console and internationalization\n\t\"console\",\n\t\"Intl\",\n\n\t// Other runtimes\n\t\"Deno\",\n];\n","import * as acorn from \"acorn\";\nimport globals from \"globals\";\nimport { blockedGlobalBuiltIns, blockedMethods } from \"./block.js\";\n\n// Error message constants for better maintainability\nconst ERROR_MESSAGES = {\n\tCAN_NOT_READ_PROPERTY: \"Cannot read property of {0} (reading '{1}')\",\n\tIS_INVALID_SYNTAX: \"{0} is not a valid syntax\",\n\tIS_NOT_FUNCTION: \"{0} is not a function\",\n\tIS_NOT_DEFINED: \"{0} is not defined\",\n\tIS_NOT_ALLOWED: \"{0} is not allowed\",\n};\n\n/**\n * Renders an error message by replacing placeholders with context values.\n * @param {string} template\n * @param {Record<string, any>} context\n * @example\n * ```js\n * const msg = renderErrorMessage(\"Cannot call mutable prototype method: {method}\", { method: \"push\" });\n * ```\n */\nconst renderErrorMessage = (template, context = {}) => template.replace(/{(\\w+)}/g, (_, key) => String(context[key]));\n\nconst BINARY_OPERATION_MAP = {\n\t\"+\": (a, b) => a + b,\n\t\"-\": (a, b) => a - b,\n\t\"*\": (a, b) => a * b,\n\t\"**\": (a, b) => a ** b,\n\t\"==\": (a, b) => a == b,\n\t\"===\": (a, b) => a === b,\n\t\"!=\": (a, b) => a != b,\n\t\"!==\": (a, b) => a !== b,\n\t\">\": (a, b) => a > b,\n\t\">=\": (a, b) => a >= b,\n\t\"<\": (a, b) => a < b,\n\t\"<=\": (a, b) => a <= b,\n\t\"%\": (a, b) => a % b,\n\t\"/\": (a, b) => a / b,\n\t\"|\": (a, b) => a | b,\n\t\"&\": (a, b) => a & b,\n\t\"^\": (a, b) => a ^ b,\n\t\"<<\": (a, b) => a << b,\n\t\">>\": (a, b) => a >> b,\n\t\">>>\": (a, b) => a >>> b,\n\tin: (a, b) => a in b,\n\tinstanceof: (a, b) => a instanceof b,\n};\n\nfunction createGlobalScope() {\n\tconst scope = Object.create(null);\n\tconst { builtin } = globals;\n\n\tfor (const key in builtin) {\n\t\tif (blockedGlobalBuiltIns.includes(key)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t/** @type {boolean} */\n\t\tconst isWritable = builtin[key];\n\n\t\tObject.defineProperty(scope, key, {\n\t\t\tvalue: globalThis[key],\n\t\t\twritable: isWritable,\n\t\t\tenumerable: false,\n\t\t\tconfigurable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(scope, \"globalThis\", {\n\t\tvalue: scope,\n\t\twritable: false,\n\t\tenumerable: false,\n\t\tconfigurable: false,\n\t});\n\n\treturn scope;\n}\n\nconst getBlockedMethods = (() => {\n\t/**\n\t * @type {Map<Function, string>}\n\t */\n\tlet BLOCKED_METHODS = null;\n\n\treturn () => {\n\t\tif (BLOCKED_METHODS) return BLOCKED_METHODS;\n\n\t\tconst map = new Map();\n\t\tfor (const path of blockedMethods) {\n\t\t\tconst [object, ...properties] = path.split(\".\");\n\t\t\tlet current = globalThis[object];\n\t\t\tfor (const prop of properties) {\n\t\t\t\tif (current && Object.hasOwn(current, prop)) {\n\t\t\t\t\tcurrent = current[prop];\n\t\t\t\t} else {\n\t\t\t\t\tcurrent = null;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof current === \"function\") map.set(current, path);\n\t\t}\n\t\tBLOCKED_METHODS = map;\n\n\t\treturn BLOCKED_METHODS;\n\t};\n})();\n\n/**\n * A JavaScript expression evaluator that safely evaluates expressions within a sandboxed environment.\n * Supports various JavaScript features including arithmetic, logical operations, functions, and more.\n *\n * Security features:\n * - Blocks mutable methods to prevent side effects\n * - No access to eval() or Function() constructor\n * - Sandboxed scope with limited global objects\n *\n * @example\n * const evaluator = new Evaluator({ x: 10, y: 20 });\n * evaluator.evaluate('x + y') // returns 30\n */\nexport class Evaluator {\n\t/**\n\t * Creates a new Evaluator instance with a custom variable context.\n\t * The scope hierarchy is: user variables -> global scope\n\t * @param {Object} [variables={}] - An optional object containing variables to make available in the evaluation context\n\t */\n\tconstructor(variables = Object.create(null)) {\n\t\tthis.scopes = [structuredClone(variables), createGlobalScope()].filter((scope) => scope !== null && scope !== undefined);\n\t\tthis.source = undefined;\n\t}\n\n\t/**\n\t * Evaluates a JavaScript expression with an optional context.\n\t * @param {string} expression\n\t * @param {unknown} [context]\n\t * @returns\n\t */\n\tstatic evaluate(expression, context) {\n\t\tconst evaluator = new Evaluator(context);\n\t\treturn evaluator.evaluate(expression);\n\t}\n\n\t/**\n\t * Parses and evaluates a JavaScript expression using acorn parser.\n\t * @param {string} expression - The JavaScript expression to evaluate\n\t * @returns {*} The result of the evaluation\n\t * @throws {SyntaxError} If the expression has invalid syntax\n\t * @throws {ReferenceError} If referencing undefined variables\n\t * @throws {TypeError} If performing invalid operations\n\t */\n\tevaluate(expression) {\n\t\tthis.source = expression;\n\n\t\tconst ast = acorn.parse(expression, { ecmaVersion: \"latest\" });\n\n\t\t// Start recursive evaluation from the root node\n\t\ttry {\n\t\t\treturn this.execute(ast.body);\n\t\t} finally {\n\t\t\tthis.source = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Executes an array of AST body nodes sequentially.\n\t * @private\n\t * @param {Array} body - Array of AST nodes to execute\n\t * @returns {*} The result of the last executed node\n\t */\n\texecute(body) {\n\t\tlet result;\n\n\t\tfor (const node of body) {\n\t\t\tresult = this.visit(node);\n\t\t}\n\n\t\tif (typeof result === \"function\") {\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Returning functions from expressions\"]));\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Visits an AST node and delegates to the appropriate handler based on node type.\n\t * @private\n\t * @param {import(\"acorn\").Node} node - The AST node to visit\n\t * @returns {*} The result of visiting the node\n\t */\n\tvisit(node) {\n\t\tswitch (node.type) {\n\t\t\tcase \"ExpressionStatement\": {\n\t\t\t\treturn this.visit(node.expression);\n\t\t\t}\n\t\t\tcase \"BinaryExpression\": {\n\t\t\t\treturn this.handleBinaryExpression(node);\n\t\t\t}\n\t\t\tcase \"LogicalExpression\": {\n\t\t\t\treturn this.handleLogicalExpression(node);\n\t\t\t}\n\t\t\tcase \"UnaryExpression\": {\n\t\t\t\treturn this.handleUnaryExpression(node);\n\t\t\t}\n\t\t\tcase \"Identifier\": {\n\t\t\t\treturn this.handleIdentifier(node);\n\t\t\t}\n\t\t\tcase \"Literal\": {\n\t\t\t\treturn node.value;\n\t\t\t}\n\t\t\tcase \"MemberExpression\": {\n\t\t\t\treturn this.handleMemberExpression(node);\n\t\t\t}\n\t\t\tcase \"ArrayExpression\": {\n\t\t\t\treturn this.handleArrayExpression(node);\n\t\t\t}\n\t\t\tcase \"SpreadElement\": {\n\t\t\t\treturn this.handleSpreadElement(node);\n\t\t\t}\n\t\t\tcase \"ObjectExpression\": {\n\t\t\t\treturn this.handleObjectExpression(node);\n\t\t\t}\n\t\t\tcase \"FunctionExpression\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Function expression\"]));\n\t\t\t}\n\t\t\tcase \"ArrowFunctionExpression\": {\n\t\t\t\treturn this.handleArrowFunctionExpression(node);\n\t\t\t}\n\t\t\tcase \"CallExpression\": {\n\t\t\t\treturn this.handleCallExpression(node);\n\t\t\t}\n\t\t\tcase \"ConditionalExpression\": {\n\t\t\t\treturn this.visit(node.test) ? this.visit(node.consequent) : this.visit(node.alternate);\n\t\t\t}\n\t\t\tcase \"NewExpression\": {\n\t\t\t\tif (node.callee.type !== \"Identifier\") {\n\t\t\t\t\tthrow new Error(`Unsupported callee type '${node.callee.type}' in new expression`);\n\t\t\t\t}\n\n\t\t\t\tif (node.callee.name === \"Function\") {\n\t\t\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"new Function() constructor\"]));\n\t\t\t\t}\n\n\t\t\t\tconst Constructor = this.visit(node.callee);\n\n\t\t\t\t// 仅在存在参数时构建数组\n\t\t\t\tconst args = node.arguments.length ? node.arguments.map((arg) => this.visit(arg)) : [];\n\n\t\t\t\treturn new Constructor(...args);\n\t\t\t}\n\t\t\tcase \"ChainExpression\": {\n\t\t\t\treturn this.visit(node.expression);\n\t\t\t}\n\t\t\tcase \"TemplateLiteral\": {\n\t\t\t\treturn this.handleTemplateLiteral(node);\n\t\t\t}\n\t\t\tcase \"ThisExpression\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"'this' expression\"]));\n\t\t\t}\n\t\t\tcase \"WithStatement\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"'with' statement\"]));\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tlet content = this.source.slice(node.start, node.end);\n\n\t\t\t\tif (content.length > 20) {\n\t\t\t\t\tcontent = content.slice(0, 17) + \"...\";\n\t\t\t\t}\n\n\t\t\t\tthrow new SyntaxError(`'${content}'` + \" \" + renderErrorMessage(ERROR_MESSAGES.IS_INVALID_SYNTAX, [content]));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles binary expressions (arithmetic and comparison operations).\n\t * @param {import('acorn').BinaryExpression} node\n\t * @private\n\t */\n\thandleBinaryExpression(node) {\n\t\tconst op = node.operator;\n\t\tconst left = this.visit(node.left);\n\t\tconst right = this.visit(node.right);\n\n\t\tif (BINARY_OPERATION_MAP.hasOwnProperty(op)) {\n\t\t\treturn BINARY_OPERATION_MAP[op](left, right);\n\t\t}\n\n\t\tthrow new SyntaxError(`Unsupported operator: ${node.operator}`);\n\t}\n\n\t/**\n\t * Handles logical expressions (&&, ||, ??).\n\t * Implements proper short-circuit evaluation for performance.\n\t * @private\n\t */\n\thandleLogicalExpression(node) {\n\t\tswitch (node.operator) {\n\t\t\tcase \"&&\": {\n\t\t\t\tconst left = this.visit(node.left);\n\t\t\t\treturn left ? this.visit(node.right) : left;\n\t\t\t}\n\t\t\tcase \"||\": {\n\t\t\t\tconst left = this.visit(node.left);\n\t\t\t\treturn left ? left : this.visit(node.right);\n\t\t\t}\n\t\t\tcase \"??\": {\n\t\t\t\tconst left = this.visit(node.left);\n\t\t\t\treturn left !== null && left !== undefined ? left : this.visit(node.right);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new SyntaxError(`Unsupported logical operator: ${node.operator}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles unary expressions (-, +, !, ~, typeof, void).\n\t * @private\n\t */\n\thandleUnaryExpression(node) {\n\t\tswitch (node.operator) {\n\t\t\tcase \"-\": {\n\t\t\t\treturn -this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"+\": {\n\t\t\t\treturn +this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"!\": {\n\t\t\t\treturn !this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"~\": {\n\t\t\t\treturn ~this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"typeof\": {\n\t\t\t\treturn typeof this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"void\": {\n\t\t\t\treturn void this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"delete\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Delete operator\"]));\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new SyntaxError(`Unsupported unary operator: ${node.operator}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles identifier (variable) lookups in the scope chain.\n\t * @private\n\t */\n\thandleIdentifier(node) {\n\t\tconst name = node.name;\n\t\tfor (const scope of this.scopes) {\n\t\t\tif (Object.hasOwn(scope, name)) {\n\t\t\t\treturn scope[name];\n\t\t\t}\n\t\t}\n\n\t\tthrow new ReferenceError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_DEFINED, [name]));\n\t}\n\n\t/**\n\t * Handles member expressions (property access like obj.prop or obj[prop]).\n\t * @private\n\t */\n\thandleMemberExpression(node) {\n\t\tconst object = this.visit(node.object);\n\n\t\t// Determine property name: either identifier name or computed value\n\t\tconst isStaticProperty = node.property.type === \"Identifier\" && !node.computed;\n\t\tconst property = isStaticProperty ? node.property.name : this.visit(node.property);\n\n\t\t// Prevent access to prototype properties\n\t\tif (typeof object !== \"undefined\" && object !== null && object[property] === object?.__proto__) {\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Accessing prototype properties\"]));\n\t\t}\n\n\t\tif (object === null || object === undefined) {\n\t\t\t// optional chaining\n\t\t\tif (node.optional) {\n\t\t\t\treturn void 0;\n\t\t\t}\n\t\t\tthrow new TypeError(renderErrorMessage(ERROR_MESSAGES.CAN_NOT_READ_PROPERTY, [object, property]));\n\t\t}\n\n\t\tconst result = object[property];\n\n\t\t// The Function constructor must never be reachable from an expression.\n\t\t// If it escapes as a value, native callbacks (e.g. Promise.then,\n\t\t// Array.prototype.map) invoke it outside the interpreter's call path,\n\t\t// enabling arbitrary host code execution. This is a structural guard:\n\t\t// no matter how many `.constructor` hops an expression takes, the\n\t\t// final value can never be `Function` (or its prototype).\n\t\tif (result === Function || result === Function.prototype) {\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Function constructor\"]));\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Handles array literal expressions.\n\t * @private\n\t */\n\thandleArrayExpression(node) {\n\t\tconst result = [];\n\n\t\tfor (let i = 0; i < node.elements.length; i++) {\n\t\t\tconst element = node.elements.at(i);\n\t\t\tconst value = this.visit(element);\n\n\t\t\tif (element.type === \"SpreadElement\") {\n\t\t\t\tresult.push(...value);\n\t\t\t} else {\n\t\t\t\tresult.push(value);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Handles object literal expressions.\n\t * @returns\n\t */\n\thandleObjectExpression(node) {\n\t\tconst obj = {};\n\t\tfor (const prop of node.properties) {\n\t\t\tif (prop.type === \"SpreadElement\") {\n\t\t\t\tObject.assign(obj, this.visit(prop.argument));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst key = prop.key.name || prop.key.value;\n\t\t\tconst value = this.visit(prop.value);\n\t\t\tobj[key] = value;\n\t\t}\n\t\treturn obj;\n\t}\n\n\thandleSpreadElement(node) {\n\t\treturn this.visit(node.argument);\n\t}\n\n\t/**\n\t * Handles arrow function expressions.\n\t * Creates a closure that captures the current scope and executes the function body\n\t * with parameters bound to a new scope.\n\t * @private\n\t */\n\thandleArrowFunctionExpression(node) {\n\t\treturn (...args) => {\n\t\t\t// Create new scope with parameters bound to arguments\n\t\t\tconst newScope = {};\n\t\t\tconst paramCount = node.params.length;\n\t\t\tfor (let i = 0; i < paramCount; i++) {\n\t\t\t\tnewScope[node.params[i].name] = args[i];\n\t\t\t}\n\n\t\t\t// Push new scope, evaluate body, then pop scope\n\t\t\tthis.scopes.unshift(newScope);\n\t\t\tconst result = this.visit(node.body);\n\t\t\tthis.scopes.shift();\n\t\t\treturn result;\n\t\t};\n\t}\n\n\t/**\n\t * Handles function call expressions, including optional chaining.\n\t * @private\n\t */\n\thandleCallExpression(node) {\n\t\tconst func = this.visit(node.callee);\n\n\t\tconst isOptional = node.optional || node.callee.optional;\n\t\tif ((func === undefined || func === null) && isOptional) {\n\t\t\treturn void 0;\n\t\t}\n\n\t\tif (func === Function) {\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Function constructor\"]));\n\t\t}\n\n\t\tif (getBlockedMethods().has(func)) {\n\t\t\tconst path = getBlockedMethods().get(func);\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [path]));\n\t\t}\n\n\t\t// 仅在存在参数时构建数组\n\t\tconst args = (() => {\n\t\t\tif (node.arguments.length === 0) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tlet result = [];\n\n\t\t\tfor (let i = 0; i < node.arguments.length; i++) {\n\t\t\t\tconst element = node.arguments.at(i);\n\t\t\t\tconst value = this.visit(element);\n\n\t\t\t\tif (element.type === \"SpreadElement\") {\n\t\t\t\t\tresult.push(...value);\n\t\t\t\t} else {\n\t\t\t\t\tresult.push(value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t})();\n\n\t\tconst target = node.callee.type === \"MemberExpression\" ? this.visit(node.callee.object) : null;\n\n\t\t// Defense in depth: even if a `Function` reference were somehow\n\t\t// produced by an expression, it must not be passed as an argument.\n\t\t// Native methods (Promise.then, Array.prototype.map, ...) would\n\t\t// invoke it in the host runtime, outside this interpreter's checks.\n\t\tif (args.some((arg) => arg === Function)) {\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Function constructor\"]));\n\t\t}\n\n\t\tif (typeof func !== \"function\") {\n\t\t\tconst calledString = getNodeString(node.callee);\n\t\t\tthrow new TypeError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_FUNCTION, [calledString]));\n\t\t}\n\n\t\treturn func.apply(target, args);\n\t}\n\n\t/**\n\t * Handles template literal expressions.\n\t * More efficient implementation that interleaves quasis and expressions without sorting.\n\t * @private\n\t */\n\thandleTemplateLiteral(node) {\n\t\tlet result = \"\";\n\t\tconst expressionCount = node.expressions.length;\n\n\t\tfor (let i = 0; i < node.quasis.length; i++) {\n\t\t\tresult += node.quasis[i].value.raw;\n\t\t\tif (i < expressionCount) {\n\t\t\t\tresult += this.visit(node.expressions[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n}\n\n/**\n *\n * @param {import('acorn').Node} node\n * @returns\n */\nexport function getNodeString(node) {\n\tswitch (node.type) {\n\t\tcase \"Identifier\": {\n\t\t\treturn node.name;\n\t\t}\n\t\tcase \"Literal\": {\n\t\t\treturn node.raw;\n\t\t}\n\t\tcase \"ArrayExpression\": {\n\t\t\treturn `[${node.elements.map((child) => getNodeString(child)).join(\",\")}]`;\n\t\t}\n\t\tcase \"ObjectExpression\": {\n\t\t\t// if keys is empty\n\t\t\tif (node.properties.length === 0) {\n\t\t\t\treturn \"{}\";\n\t\t\t}\n\n\t\t\treturn \"{(intermediate value)}\";\n\t\t}\n\t\tcase \"MemberExpression\": {\n\t\t\tconst objectStr = getNodeString(node.object);\n\t\t\tconst propertyStr = getNodeString(node.property);\n\n\t\t\tif (node.computed) {\n\t\t\t\treturn `${objectStr}[${propertyStr}]`;\n\t\t\t}\n\t\t\treturn `${objectStr}.${propertyStr}`;\n\t\t}\n\t\tdefault: {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n","/**\n * 简单状态机模板解析器\n * 能够正确处理表达式中包含字符串、转义字符和结束标记的情况\n * @class SimpleStateTemplateParser\n */\nclass TemplateParser {\n\t/**\n\t * 创建解析器实例\n\t * @param {Object} [options] - 配置选项\n\t * @param {string} [options.expressionStart='{{'] - 表达式开始标记\n\t * @param {string} [options.expressionEnd='}}'] - 表达式结束标记\n\t * @param {boolean} [options.preserveWhitespace=true] - 是否保留表达式周围的空白字符\n\t */\n\tconstructor(options = {}) {\n\t\t// 表达式标记配置\n\t\tthis.exprStart = options.expressionStart || \"{{\";\n\t\tthis.exprEnd = options.expressionEnd || \"}}\";\n\n\t\t// 标记长度缓存,避免重复计算\n\t\tthis.startLen = this.exprStart.length;\n\t\tthis.endLen = this.exprEnd.length;\n\n\t\t// 其他配置\n\t\tthis.preserveWhitespace = options.preserveWhitespace === true;\n\t}\n\n\t/**\n\t * 解析模板字符串,将其转换为 token 数组\n\t * @param {string} template - 要解析的模板字符串\n\t * @returns {Array<{type: string, value: string}>} token 数组\n\t */\n\tparse(template) {\n\t\t// 输入验证\n\t\tif (typeof template !== \"string\") {\n\t\t\tthrow new TypeError(\"模板必须是字符串\");\n\t\t}\n\n\t\tconst tokens = []; // 存储解析结果的 token 数组\n\t\tconst length = template.length;\n\n\t\t// 状态机变量\n\t\tlet state = \"TEXT\"; // 当前状态:TEXT | EXPR | STRING_SQ | STRING_DQ | TEMPLATE | ESCAPE_*\n\t\tlet buffer = \"\"; // 当前状态的字符缓冲区\n\t\tlet exprStartPos = 0; // 当前表达式的开始位置(用于错误恢复)\n\t\tlet pos = 0; // 当前扫描位置\n\n\t\t// 主解析循环:逐个字符扫描模板\n\t\twhile (pos < length) {\n\t\t\tconst char = template[pos];\n\t\t\tconst nextChar = template[pos + 1];\n\n\t\t\t// 状态机核心逻辑\n\t\t\tswitch (state) {\n\t\t\t\t// ==================== 文本状态 ====================\n\t\t\t\tcase \"TEXT\":\n\t\t\t\t\t// 检查是否遇到表达式开始标记\n\t\t\t\t\tif (this._isMatch(pos, template, this.exprStart)) {\n\t\t\t\t\t\t// 将缓冲区中的文本保存为 token\n\t\t\t\t\t\tif (buffer.length > 0) {\n\t\t\t\t\t\t\ttokens.push({ type: \"text\", value: buffer, start: pos - buffer.length, end: pos });\n\t\t\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// 切换到表达式状态\n\t\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\t\texprStartPos = pos; // 记录表达式开始位置\n\t\t\t\t\t\tpos += this.startLen; // 跳过开始标记\n\t\t\t\t\t\tcontinue; // 继续处理下一个字符(跳过本次循环的剩余部分)\n\t\t\t\t\t}\n\t\t\t\t\t// 普通文本字符,添加到缓冲区\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// ==================== 表达式状态 ====================\n\t\t\t\tcase \"EXPR\":\n\t\t\t\t\t// 在表达式中,需要处理各种字符串和转义字符\n\t\t\t\t\tif (char === \"'\") {\n\t\t\t\t\t\t// 进入单引号字符串状态\n\t\t\t\t\t\tstate = \"STRING_SQ\";\n\t\t\t\t\t} else if (char === '\"') {\n\t\t\t\t\t\t// 进入双引号字符串状态\n\t\t\t\t\t\tstate = \"STRING_DQ\";\n\t\t\t\t\t} else if (char === \"`\") {\n\t\t\t\t\t\t// 进入模板字符串状态\n\t\t\t\t\t\tstate = \"TEMPLATE\";\n\t\t\t\t\t} else if (char === \"\\\\\") {\n\t\t\t\t\t\t// 遇到转义字符,根据当前上下文进入相应的转义状态\n\t\t\t\t\t\tif (nextChar === \"'\") state = \"ESCAPE_SQ\";\n\t\t\t\t\t\telse if (nextChar === '\"') state = \"ESCAPE_DQ\";\n\t\t\t\t\t\telse if (nextChar === \"`\") state = \"ESCAPE_TEMPLATE\";\n\t\t\t\t\t\telse state = \"ESCAPE_EXPR\";\n\t\t\t\t\t} else if (this._isMatch(pos, template, this.exprEnd)) {\n\t\t\t\t\t\t// 找到表达式结束标记,且不在字符串中\n\t\t\t\t\t\tconst exprValue = this.preserveWhitespace ? buffer : buffer.trim();\n\t\t\t\t\t\tif (exprValue.length > 0) {\n\t\t\t\t\t\t\ttokens.push({\n\t\t\t\t\t\t\t\ttype: \"expression\",\n\t\t\t\t\t\t\t\tvalue: exprValue,\n\t\t\t\t\t\t\t\tstart: exprStartPos,\n\t\t\t\t\t\t\t\tend: pos + this.endLen,\n\t\t\t\t\t\t\t\tcontentStart: exprStartPos + this.startLen,\n\t\t\t\t\t\t\t\tcontentEnd: pos,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// 重置状态,准备处理后续文本\n\t\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\t\tstate = \"TEXT\";\n\t\t\t\t\t\tpos += this.endLen; // 跳过结束标记\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t// 将当前字符添加到表达式缓冲区\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// ==================== 字符串状态 ====================\n\t\t\t\tcase \"STRING_SQ\": // 单引号字符串\n\t\t\t\t\tif (char === \"\\\\\") {\n\t\t\t\t\t\tstate = \"ESCAPE_SQ\"; // 遇到转义字符\n\t\t\t\t\t} else if (char === \"'\") {\n\t\t\t\t\t\tstate = \"EXPR\"; // 字符串结束,回到表达式状态\n\t\t\t\t\t}\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"STRING_DQ\": // 双引号字符串\n\t\t\t\t\tif (char === \"\\\\\") {\n\t\t\t\t\t\tstate = \"ESCAPE_DQ\";\n\t\t\t\t\t} else if (char === '\"') {\n\t\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\t}\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"TEMPLATE\": // 模板字符串\n\t\t\t\t\tif (char === \"\\\\\") {\n\t\t\t\t\t\tstate = \"ESCAPE_TEMPLATE\";\n\t\t\t\t\t} else if (char === \"`\") {\n\t\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\t}\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// ==================== 转义状态 ====================\n\t\t\t\t// 转义状态:处理转义字符,然后返回到之前的状态\n\t\t\t\tcase \"ESCAPE_SQ\":\n\t\t\t\t\tbuffer += char; // 添加转义后的字符\n\t\t\t\t\tstate = \"STRING_SQ\"; // 回到单引号字符串状态\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ESCAPE_DQ\":\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tstate = \"STRING_DQ\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ESCAPE_TEMPLATE\":\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tstate = \"TEMPLATE\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ESCAPE_EXPR\":\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// 移动到下一个字符\n\t\t\tpos++;\n\t\t}\n\n\t\t// ==================== 后处理 ====================\n\t\t// 处理扫描结束后缓冲区中剩余的内容\n\t\tif (buffer.length > 0) {\n\t\t\tif (state === \"TEXT\") {\n\t\t\t\t// 剩余的文本内容\n\t\t\t\ttokens.push({ type: \"text\", value: buffer, start: pos - buffer.length, end: pos });\n\t\t\t} else {\n\t\t\t\t// 未完成的表达式,将其作为普通文本处理\n\t\t\t\t// 这里可以根据需要选择不同的错误处理策略:\n\t\t\t\t// 1. 抛出错误\n\t\t\t\t// 2. 忽略未完成的表达式\n\t\t\t\t// 3. 将其作为文本处理(当前实现)\n\t\t\t\tconst incompleteExpr = this.exprStart + buffer;\n\t\t\t\ttokens.push({ type: \"text\", value: incompleteExpr, start: exprStartPos, end: pos });\n\n\t\t\t\t// 可选:输出警告\n\t\t\t\tconsole.warn(`警告:在位置 ${exprStartPos} 开始的表达式未正确结束`);\n\t\t\t}\n\t\t}\n\n\t\treturn tokens;\n\t}\n\n\t/**\n\t * 检查指定位置是否匹配给定的字符序列\n\t * @param {number} pos - 开始检查的位置\n\t * @param {string} template - 模板字符串\n\t * @param {string} sequence - 要匹配的字符序列\n\t * @returns {boolean} 是否匹配\n\t * @private\n\t */\n\t_isMatch(pos, template, sequence) {\n\t\t// 检查剩余长度是否足够\n\t\tif (pos + sequence.length > template.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// 逐个字符比较\n\t\tfor (let i = 0; i < sequence.length; i++) {\n\t\t\tif (template[pos + i] !== sequence[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * 静态方法:快速解析模板\n\t * @param {string} template - 模板字符串\n\t * @param {Object} [options] - 配置选项\n\t * @returns {Array} token 数组\n\t */\n\tstatic parse(template, options) {\n\t\tconst parser = new TemplateParser(options);\n\t\treturn parser.parse(template);\n\t}\n}\n\nexport { TemplateParser };\n","import { Evaluator } from \"./Evaluator.js\";\nimport { TemplateParser } from \"./TemplateParser.js\";\n\nexport { Evaluator, TemplateParser };\n\n/**\n * Evaluates a JavaScript expression with an optional context.\n * @param {string} expression - The JavaScript expression to evaluate\n * @param {unknown} [context] - Optional context object with variables to use in the expression\n * @returns {*} The result of evaluating the expression\n * @example\n * evalExpression('a + b', { a: 1, b: 2 }) // returns 3\n */\nexport function evalExpression(expression, context) {\n\treturn Evaluator.evaluate(expression, context);\n}\n\n/**\n * Evaluates a template string by replacing {{ expression }} patterns with their evaluated values.\n * Undefined variables in expressions are replaced with empty strings instead of throwing errors.\n * @param {string} template - The template string containing {{ expression }} patterns\n * @param {Object} [context] - Optional context object with variables to use in expressions\n * @param {Object} [templateParserOptions] - Optional options for the template parser\n * @returns {string} The template with all expressions evaluated and replaced\n * @example\n * evalTemplate('Hello {{ name }}!', { name: 'World' }) // returns 'Hello World!'\n */\nexport function evalTemplate(template, context, templateParserOptions) {\n\tlet result = \"\";\n\n\tconst typeHandler = {\n\t\ttext: (token) => token.value,\n\t\texpression: (token) => {\n\t\t\ttry {\n\t\t\t\treturn Evaluator.evaluate(token.value, context);\n\t\t\t} catch (error) {\n\t\t\t\t// Replace undefined variables with empty string for graceful degradation\n\t\t\t\tif (error instanceof ReferenceError && error.message.endsWith(\"is not defined\")) {\n\t\t\t\t\treturn \"undefined\";\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n\n\tfor (const token of TemplateParser.parse(template, templateParserOptions)) {\n\t\t// Unknown token type, treat as text\n\t\tconst handler = typeHandler[token.type] ?? typeHandler[\"text\"];\n\n\t\tresult += handler(token);\n\t}\n\n\treturn result;\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","mutableMethods","dangerousMethods","blockedMethods","blockedGlobalBuiltIns","ERROR_MESSAGES","renderErrorMessage","template","context","_","String","BINARY_OPERATION_MAP","a","b","_instanceof","createGlobalScope","scope","builtin","globals","isWritable","globalThis","getBlockedMethods","BLOCKED_METHODS","map","Map","_iteratorError","path","_path_split","object","properties","current","_iteratorError1","Evaluator","variables","structuredClone","undefined","evaluate","expression","ast","acorn","execute","body","result","node","Error","visit","SyntaxError","Constructor","args","arg","content","handleBinaryExpression","op","left","right","handleLogicalExpression","left1","left2","handleUnaryExpression","_type_of","handleIdentifier","name","ReferenceError","handleMemberExpression","isStaticProperty","property","TypeError","Function","handleArrayExpression","i","element","value","_result","handleObjectExpression","handleSpreadElement","handleArrowFunctionExpression","newScope","paramCount","handleCallExpression","func","isOptional","target","calledString","getNodeString","handleTemplateLiteral","expressionCount","evaluator","child","objectStr","propertyStr","TemplateParser","options","parse","tokens","length","state","buffer","exprStartPos","pos","char","nextChar","exprValue","incompleteExpr","console","_isMatch","sequence","parser","evalExpression","evalTemplate","templateParserOptions","typeHandler","token","error","_typeHandler_token_type","handler"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,SAAS,QAAO,EAAEC,UAAU;QACnD,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,SAASI,GAAG,EAAEC,IAAI;QAAI,OAAOF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;IAAO;;;ICCtGL,oBAAoB,CAAC,GAAG,SAAS,QAAO;QACvC,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNA,IAAMI,iBAAiB;IACtB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IAEA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IAEA;IACA;IACA;IAEA;IACA;IACA;IAEA;IAEA;IAEA;IACA;IAEA;IACA;IACA;IACA;IAEA;IACA;IACA;IAEA;IACA;IACA;IAGA;IACA;IACA;IACA;IAGA;IACA;IAGA;CACA;AAED,IAAMC,mBAAmB;IACxB;IAEA;IACA;IACA;IACA;IACA;CACA;AAGDD,eAAe,IAAI,CAAC;AAKb,IAAME,iBAAkB,qBAAGF,gBAAAA,MAAAA,CAAgB,qBAAGC;AAK9C,IAAME,wBAAwB;IACpC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAGA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAGA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAGA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAGA;IACA;IACA;IACA;IAGA;IACA;IAGA;CACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7PD,IAAMC,iBAAiB;IACtB,uBAAuB;IACvB,mBAAmB;IACnB,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;AACjB;AAWA,IAAMC,qBAAqB,SAACC,QAAQ;QAAEC,UAAU,UAAVA,MAAAA,GAAAA,KAAAA,AAAAA,KAAAA,MAAAA,SAAAA,CAAAA,EAAAA,GAAAA,SAAAA,CAAAA,EAAAA,GAAU,CAAC;WAAMD,SAAS,OAAO,CAAC,YAAY,SAACE,CAAC,EAAEb,GAAG;eAAKc,OAAOF,OAAO,CAACZ,IAAI;;;AAEnH,IAAMe,uBAAuB;IAC5B,KAAK,SAACC,CAAC,EAAEC,CAAC;eAAKD,IAAIC;;IACnB,KAAK,SAACD,CAAC,EAAEC,CAAC;eAAKD,IAAIC;;IACnB,KAAK,SAACD,CAAC,EAAEC,CAAC;eAAKD,IAAIC;;IACnB,MAAM,SAACD,CAAC,EAAEC,CAAC;eAAKD,KAAAA,GAAAA,CAAAA,GAAKC;;IACrB,MAAM,SAACD,CAAC,EAAEC,CAAC;eAAKD,KAAKC;;IACrB,OAAO,SAACD,CAAC,EAAEC,CAAC;eAAKD,MAAMC;;IACvB,MAAM,SAACD,CAAC,EAAEC,CAAC;eAAKD,KAAKC;;IACrB,OAAO,SAACD,CAAC,EAAEC,CAAC;eAAKD,MAAMC;;IACvB,KAAK,SAACD,CAAC,EAAEC,CAAC;eAAKD,IAAIC;;IACnB,MAAM,SAACD,CAAC,EAAEC,CAAC;eAAKD,KAAKC;;IACrB,KAAK,SAACD,CAAC,EAAEC,CAAC;eAAKD,IAAIC;;IACnB,MAAM,SAACD,CAAC,EAAEC,CAAC;eAAKD,KAAKC;;IACrB,KAAK,SAACD,CAAC,EAAEC,CAAC;eAAKD,IAAIC;;IACnB,KAAK,SAACD,CAAC,EAAEC,CAAC;eAAKD,IAAIC;;IACnB,KAAK,SAACD,CAAC,EAAEC,CAAC;eAAKD,IAAIC;;IACnB,KAAK,SAACD,CAAC,EAAEC,CAAC;eAAKD,IAAIC;;IACnB,KAAK,SAACD,CAAC,EAAEC,CAAC;eAAKD,IAAIC;;IACnB,MAAM,SAACD,CAAC,EAAEC,CAAC;eAAKD,KAAKC;;IACrB,MAAM,SAACD,CAAC,EAAEC,CAAC;eAAKD,KAAKC;;IACrB,OAAO,SAACD,CAAC,EAAEC,CAAC;eAAKD,MAAMC;;IACvB,IAAI,SAACD,CAAC,EAAEC,CAAC;eAAKD,KAAKC;;IACnB,YAAY,SAACD,CAAC,EAAEC,CAAC;eAAMC,YAADF,GAAaC;;AACpC;AAEA,SAASE;IACR,IAAMC,QAAQnB,OAAO,MAAM,CAAC;IAC5B,IAAQoB,UAAYC,iCAAAA,OAALD;IAEf,IAAK,IAAMrB,OAAOqB,QACjB,KAAIb,sBAAsB,QAAQ,CAACR;QAKnC,IAAMuB,aAAaF,OAAO,CAACrB,IAAI;QAE/BC,OAAO,cAAc,CAACmB,OAAOpB,KAAK;YACjC,OAAOwB,UAAU,CAACxB,IAAI;YACtB,UAAUuB;YACV,YAAY;YACZ,cAAc;QACf;;IAGDtB,OAAO,cAAc,CAACmB,OAAO,cAAc;QAC1C,OAAOA;QACP,UAAU;QACV,YAAY;QACZ,cAAc;IACf;IAEA,OAAOA;AACR;AAEA,IAAMK,oBAAqB;IAI1B,IAAIC,kBAAkB;IAEtB,OAAO;QACN,IAAIA,iBAAiB,OAAOA;QAE5B,IAAMC,MAAM,IAAIC;YACXC,4BAAAA,MAAAA,oBAAAA,OAAAA,iBAAAA;;YAAL,QAAKA,YAActB,cAAcA,CAAAA,OAAAA,QAAAA,CAAAA,IAA5BsB,OAAAA,CAAAA,CAAAA,4BAAAA,AAAAA,CAAAA,QAAAA,UAAAA,IAAAA,EAAAA,EAAAA,IAAAA,AAAAA,GAAAA,4BAAAA,KAA8B;gBAA9BA,IAAMC,OAAND,MAAAA,KAAAA;gBACJ,IAAgCE,cAAAA,UAAAA,KAAK,KAAK,CAAC,OAApCC,SAAyBD,WAAAA,CAAAA,EAAAA,EAAdE,aAAcF,YAAAA,KAAAA,CAAjB;gBACf,IAAIG,UAAUV,UAAU,CAACQ,OAAO;oBAC3BG,6BAAAA,MAAAA,qBAAAA,OAAAA,kBAAAA;;oBAAL,QAAKA,aAAcF,UAAU,CAAVA,OAAAA,QAAAA,CAAAA,IAAdE,QAAAA,CAAAA,CAAAA,6BAAAA,AAAAA,CAAAA,SAAAA,WAAAA,IAAAA,EAAAA,EAAAA,IAAAA,AAAAA,GAAAA,6BAAAA,KAA0B;wBAA1BA,IAAMhC,OAANgC,OAAAA,KAAAA;wBACJ,IAAID,WAAWjC,OAAO,MAAM,CAACiC,SAAS/B,OACrC+B,UAAUA,OAAO,CAAC/B,KAAK;6BACjB;4BACN+B,UAAU;4BACV;wBACD;oBACD;;oBAPKC,qBAAAA;oBAAAA,kBAAAA;;;6BAAAA,8BAAAA,AAAAA,QAAAA,WAAAA,MAAAA,EAAAA,WAAAA,MAAAA;;4BAAAA,oB,MAAAA;;;gBAQL,IAAI,AAAmB,cAAnB,OAAOD,SAAwBP,IAAI,GAAG,CAACO,SAASJ;YACrD;;YAZKD,oBAAAA;YAAAA,iBAAAA;;;qBAAAA,6BAAAA,AAAAA,QAAAA,UAAAA,MAAAA,EAAAA,UAAAA,MAAAA;;oBAAAA,mB,MAAAA;;;QAaLH,kBAAkBC;QAElB,OAAOD;IACR;AACD;AAeO,IAAMU,sBAASA,WAAAA,GAAf;;aAAMA;YAMAC,YAAAA,UAAAA,MAAAA,GAAAA,KAAAA,AAAAA,KAAAA,MAAAA,SAAAA,CAAAA,EAAAA,GAAAA,SAAAA,CAAAA,EAAAA,GAAYpC,OAAO,MAAM,CAAC;gCAN1BmC;QAOX,IAAI,CAAC,MAAM,GAAG;YAACE,gBAAgBD;YAAYlB;SAAoB,CAAC,MAAM,CAAC,SAACC,KAAK;mBAAKA,QAAAA;;QAClF,IAAI,CAAC,MAAM,GAAGmB;;kBARHH,WAAAA;;YA8BZI,KAAAA;mBAAAA,SAASC,UAAU;gBAClB,IAAI,CAAC,MAAM,GAAGA;gBAEd,IAAMC,MAAMC,+BAAAA,KAAW,CAACF,YAAY;oBAAE,aAAa;gBAAS;gBAG5D,IAAI;oBACH,OAAO,IAAI,CAAC,OAAO,CAACC,IAAI,IAAI;gBAC7B,SAAU;oBACT,IAAI,CAAC,MAAM,GAAGH;gBACf;YACD;;;YAQAK,KAAAA;mBAAAA,SAAQC,IAAI;gBACX,IAAIC;oBAECjB,4BAAAA,MAAAA,oBAAAA,OAAAA,iBAAAA;;oBAAL,QAAKA,YAAcgB,IAAI,CAAJA,OAAAA,QAAAA,CAAAA,IAAdhB,OAAAA,CAAAA,CAAAA,4BAAAA,AAAAA,CAAAA,QAAAA,UAAAA,IAAAA,EAAAA,EAAAA,IAAAA,AAAAA,GAAAA,4BAAAA,KAAoB;wBAApBA,IAAMkB,OAANlB,MAAAA,KAAAA;wBACJiB,SAAS,IAAI,CAAC,KAAK,CAACC;oBACrB;;oBAFKlB,oBAAAA;oBAAAA,iBAAAA;;;6BAAAA,6BAAAA,AAAAA,QAAAA,UAAAA,MAAAA,EAAAA,UAAAA,MAAAA;;4BAAAA,mB,MAAAA;;;gBAIL,IAAI,AAAkB,cAAlB,OAAOiB,QACV,MAAM,IAAIE,MAAMtC,mBAAmBD,eAAe,cAAc,EAAE;oBAAC;iBAAuC;gBAG3G,OAAOqC;YACR;;;YAQAG,KAAAA;mBAAAA,SAAMF,IAAI;;gBACT,OAAQA,KAAK,IAAI;oBAChB,KAAK;wBACJ,OAAO,IAAI,CAAC,KAAK,CAACA,KAAK,UAAU;oBAElC,KAAK;wBACJ,OAAO,IAAI,CAAC,sBAAsB,CAACA;oBAEpC,KAAK;wBACJ,OAAO,IAAI,CAAC,uBAAuB,CAACA;oBAErC,KAAK;wBACJ,OAAO,IAAI,CAAC,qBAAqB,CAACA;oBAEnC,KAAK;wBACJ,OAAO,IAAI,CAAC,gBAAgB,CAACA;oBAE9B,KAAK;wBACJ,OAAOA,KAAK,KAAK;oBAElB,KAAK;wBACJ,OAAO,IAAI,CAAC,sBAAsB,CAACA;oBAEpC,KAAK;wBACJ,OAAO,IAAI,CAAC,qBAAqB,CAACA;oBAEnC,KAAK;wBACJ,OAAO,IAAI,CAAC,mBAAmB,CAACA;oBAEjC,KAAK;wBACJ,OAAO,IAAI,CAAC,sBAAsB,CAACA;oBAEpC,KAAK;wBACJ,MAAM,IAAIG,YAAYxC,mBAAmBD,eAAe,cAAc,EAAE;4BAAC;yBAAsB;oBAEhG,KAAK;wBACJ,OAAO,IAAI,CAAC,6BAA6B,CAACsC;oBAE3C,KAAK;wBACJ,OAAO,IAAI,CAAC,oBAAoB,CAACA;oBAElC,KAAK;wBACJ,OAAO,IAAI,CAAC,KAAK,CAACA,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAACA,KAAK,UAAU,IAAI,IAAI,CAAC,KAAK,CAACA,KAAK,SAAS;oBAEvF,KAAK;wBACJ,IAAIA,AAAqB,iBAArBA,KAAK,MAAM,CAAC,IAAI,EACnB,MAAM,IAAIC,MAAO,4BAA4C,OAAjBD,KAAK,MAAM,CAAC,IAAI,EAAC;wBAG9D,IAAIA,AAAqB,eAArBA,KAAK,MAAM,CAAC,IAAI,EACnB,MAAM,IAAIC,MAAMtC,mBAAmBD,eAAe,cAAc,EAAE;4BAAC;yBAA6B;wBAGjG,IAAM0C,cAAc,IAAI,CAAC,KAAK,CAACJ,KAAK,MAAM;wBAG1C,IAAMK,OAAOL,KAAK,SAAS,CAAC,MAAM,GAAGA,KAAK,SAAS,CAAC,GAAG,CAAC,SAACM,GAAG;mCAAK,MAAK,KAAK,CAACA;6BAAQ,EAAE;wBAEtF,OAAO,WAAIF,aAAY,8BAAGC;oBAE3B,KAAK;wBACJ,OAAO,IAAI,CAAC,KAAK,CAACL,KAAK,UAAU;oBAElC,KAAK;wBACJ,OAAO,IAAI,CAAC,qBAAqB,CAACA;oBAEnC,KAAK;wBACJ,MAAM,IAAIG,YAAYxC,mBAAmBD,eAAe,cAAc,EAAE;4BAAC;yBAAoB;oBAE9F,KAAK;wBACJ,MAAM,IAAIyC,YAAYxC,mBAAmBD,eAAe,cAAc,EAAE;4BAAC;yBAAmB;oBAE7F;wBACC,IAAI6C,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,CAACP,KAAK,KAAK,EAAEA,KAAK,GAAG;wBAEpD,IAAIO,QAAQ,MAAM,GAAG,IACpBA,UAAUA,QAAQ,KAAK,CAAC,GAAG,MAAM;wBAGlC,MAAM,IAAIJ,YAAa,IAAW,OAARI,SAAQ,OAAK,MAAM5C,mBAAmBD,eAAe,iBAAiB,EAAE;4BAAC6C;yBAAQ;gBAE7G;YACD;;;YAOAC,KAAAA;mBAAAA,SAAuBR,IAAI;gBAC1B,IAAMS,KAAKT,KAAK,QAAQ;gBACxB,IAAMU,OAAO,IAAI,CAAC,KAAK,CAACV,KAAK,IAAI;gBACjC,IAAMW,QAAQ,IAAI,CAAC,KAAK,CAACX,KAAK,KAAK;gBAEnC,IAAIhC,qBAAqB,cAAc,CAACyC,KACvC,OAAOzC,oBAAoB,CAACyC,GAAG,CAACC,MAAMC;gBAGvC,MAAM,IAAIR,YAAa,yBAAsC,OAAdH,KAAK,QAAQ;YAC7D;;;YAOAY,KAAAA;mBAAAA,SAAwBZ,IAAI;gBAC3B,OAAQA,KAAK,QAAQ;oBACpB,KAAK;wBACJ,IAAMU,OAAO,IAAI,CAAC,KAAK,CAACV,KAAK,IAAI;wBACjC,OAAOU,OAAO,IAAI,CAAC,KAAK,CAACV,KAAK,KAAK,IAAIU;oBAExC,KAAK;wBACJ,IAAMG,QAAO,IAAI,CAAC,KAAK,CAACb,KAAK,IAAI;wBACjC,OAAOa,QAAOA,QAAO,IAAI,CAAC,KAAK,CAACb,KAAK,KAAK;oBAE3C,KAAK;wBACJ,IAAMc,QAAO,IAAI,CAAC,KAAK,CAACd,KAAK,IAAI;wBACjC,OAAOc,QAAAA,QAAsCA,QAAO,IAAI,CAAC,KAAK,CAACd,KAAK,KAAK;oBAE1E;wBACC,MAAM,IAAIG,YAAa,iCAA8C,OAAdH,KAAK,QAAQ;gBAEtE;YACD;;;YAMAe,KAAAA;mBAAAA,SAAsBf,IAAI;gBACzB,OAAQA,KAAK,QAAQ;oBACpB,KAAK;wBACJ,OAAO,CAAC,IAAI,CAAC,KAAK,CAACA,KAAK,QAAQ;oBAEjC,KAAK;wBACJ,OAAO,CAAC,IAAI,CAAC,KAAK,CAACA,KAAK,QAAQ;oBAEjC,KAAK;wBACJ,OAAO,CAAC,IAAI,CAAC,KAAK,CAACA,KAAK,QAAQ;oBAEjC,KAAK;wBACJ,OAAO,CAAC,IAAI,CAAC,KAAK,CAACA,KAAK,QAAQ;oBAEjC,KAAK;wBACJ,OAAOgB,SAAO,IAAI,CAAC,KAAK,CAAChB,KAAK,QAAQ;oBAEvC,KAAK;wBACJ,OAAO,KAAK,IAAI,CAAC,KAAK,CAACA,KAAK,QAAQ;oBAErC,KAAK;wBACJ,MAAM,IAAIG,YAAYxC,mBAAmBD,eAAe,cAAc,EAAE;4BAAC;yBAAkB;oBAE5F;wBACC,MAAM,IAAIyC,YAAa,+BAA4C,OAAdH,KAAK,QAAQ;gBAEpE;YACD;;;YAMAiB,KAAAA;mBAAAA,SAAiBjB,IAAI;gBACpB,IAAMkB,OAAOlB,KAAK,IAAI;oBACjBlB,4BAAAA,MAAAA,oBAAAA,OAAAA,iBAAAA;;oBAAL,QAAKA,YAAe,IAAI,CAAC,MAAM,qBAA1BA,OAAAA,CAAAA,CAAAA,4BAAAA,AAAAA,CAAAA,QAAAA,UAAAA,IAAAA,EAAAA,EAAAA,IAAAA,AAAAA,GAAAA,4BAAAA,KAA4B;wBAA5BA,IAAMT,QAANS,MAAAA,KAAAA;wBACJ,IAAI5B,OAAO,MAAM,CAACmB,OAAO6C,OACxB,OAAO7C,KAAK,CAAC6C,KAAK;oBAEpB;;oBAJKpC,oBAAAA;oBAAAA,iBAAAA;;;6BAAAA,6BAAAA,AAAAA,QAAAA,UAAAA,MAAAA,EAAAA,UAAAA,MAAAA;;4BAAAA,mB,MAAAA;;;gBAML,MAAM,IAAIqC,eAAexD,mBAAmBD,eAAe,cAAc,EAAE;oBAACwD;iBAAK;YAClF;;;YAMAE,KAAAA;mBAAAA,SAAuBpB,IAAI;gBAC1B,IAAMf,SAAS,IAAI,CAAC,KAAK,CAACe,KAAK,MAAM;gBAGrC,IAAMqB,mBAAmBrB,AAAuB,iBAAvBA,KAAK,QAAQ,CAAC,IAAI,IAAqB,CAACA,KAAK,QAAQ;gBAC9E,IAAMsB,WAAWD,mBAAmBrB,KAAK,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAACA,KAAK,QAAQ;gBAGjF,IAAI,QAAOf,UAA6CA,MAAM,CAACqC,SAAS,KAAKrC,CAAAA,QAAAA,SAAAA,KAAAA,IAAAA,OAAQ,SAAS,AAAD,GAC5F,MAAM,IAAIgB,MAAMtC,mBAAmBD,eAAe,cAAc,EAAE;oBAAC;iBAAiC;gBAGrG,IAAIuB,QAAAA,QAAyC;oBAE5C,IAAIe,KAAK,QAAQ,EAChB;oBAED,MAAM,IAAIuB,UAAU5D,mBAAmBD,eAAe,qBAAqB,EAAE;wBAACuB;wBAAQqC;qBAAS;gBAChG;gBAEA,IAAMvB,SAASd,MAAM,CAACqC,SAAS;gBAQ/B,IAAIvB,WAAWyB,YAAYzB,WAAWyB,SAAS,SAAS,EACvD,MAAM,IAAIvB,MAAMtC,mBAAmBD,eAAe,cAAc,EAAE;oBAAC;iBAAuB;gBAG3F,OAAOqC;YACR;;;YAMA0B,KAAAA;mBAAAA,SAAsBzB,IAAI;gBACzB,IAAMD,SAAS,EAAE;gBAEjB,IAAK,IAAI2B,IAAI,GAAGA,IAAI1B,KAAK,QAAQ,CAAC,MAAM,EAAE0B,IAAK;oBAC9C,IAAMC,UAAU3B,KAAK,QAAQ,CAAC,EAAE,CAAC0B;oBACjC,IAAME,QAAQ,IAAI,CAAC,KAAK,CAACD;oBAEzB,IAAIA,AAAiB,oBAAjBA,QAAQ,IAAI,EAAsB;4BACrCE;wBAAAA,CAAAA,UAAAA,MAAK,EAAE,IAAI,OAAXA,SAAY,8BAAGD;oBAChB,OACC7B,OAAO,IAAI,CAAC6B;gBAEd;gBAEA,OAAO7B;YACR;;;YAMA+B,KAAAA;mBAAAA,SAAuB9B,IAAI;gBAC1B,IAAM7C,MAAM,CAAC;oBACR2B,4BAAAA,MAAAA,oBAAAA,OAAAA,iBAAAA;;oBAAL,QAAKA,YAAckB,KAAK,UAAU,qBAA7BlB,OAAAA,CAAAA,CAAAA,4BAAAA,AAAAA,CAAAA,QAAAA,UAAAA,IAAAA,EAAAA,EAAAA,IAAAA,AAAAA,GAAAA,4BAAAA,KAA+B;wBAA/BA,IAAM1B,OAAN0B,MAAAA,KAAAA;wBACJ,IAAI1B,AAAc,oBAAdA,KAAK,IAAI,EAAsB;4BAClCF,OAAO,MAAM,CAACC,KAAK,IAAI,CAAC,KAAK,CAACC,KAAK,QAAQ;4BAC3C;wBACD;wBACA,IAAMH,MAAMG,KAAK,GAAG,CAAC,IAAI,IAAIA,KAAK,GAAG,CAAC,KAAK;wBAC3C,IAAMwE,QAAQ,IAAI,CAAC,KAAK,CAACxE,KAAK,KAAK;wBACnCD,GAAG,CAACF,IAAI,GAAG2E;oBACZ;;oBARK9C,oBAAAA;oBAAAA,iBAAAA;;;6BAAAA,6BAAAA,AAAAA,QAAAA,UAAAA,MAAAA,EAAAA,UAAAA,MAAAA;;4BAAAA,mB,MAAAA;;;gBASL,OAAO3B;YACR;;;YAEA4E,KAAAA;mBAAAA,SAAoB/B,IAAI;gBACvB,OAAO,IAAI,CAAC,KAAK,CAACA,KAAK,QAAQ;YAChC;;;YAQAgC,KAAAA;mBAAAA,SAA8BhC,IAAI;;gBACjC,OAAO;qDAAIK,OAAAA,IAAAA,MAAAA,OAAAA,OAAAA,GAAAA,OAAAA,MAAAA,OAAAA,IAAI,CAAJA,KAAAA,GAAAA,SAAAA,CAAAA,KAAAA;oBAEV,IAAM4B,WAAW,CAAC;oBAClB,IAAMC,aAAalC,KAAK,MAAM,CAAC,MAAM;oBACrC,IAAK,IAAI0B,IAAI,GAAGA,IAAIQ,YAAYR,IAC/BO,QAAQ,CAACjC,KAAK,MAAM,CAAC0B,EAAE,CAAC,IAAI,CAAC,GAAGrB,IAAI,CAACqB,EAAE;oBAIxC,MAAK,MAAM,CAAC,OAAO,CAACO;oBACpB,IAAMlC,SAAS,MAAK,KAAK,CAACC,KAAK,IAAI;oBACnC,MAAK,MAAM,CAAC,KAAK;oBACjB,OAAOD;gBACR;YACD;;;YAMAoC,KAAAA;mBAAAA,SAAqBnC,IAAI;;gBACxB,IAAMoC,OAAO,IAAI,CAAC,KAAK,CAACpC,KAAK,MAAM;gBAEnC,IAAMqC,aAAarC,KAAK,QAAQ,IAAIA,KAAK,MAAM,CAAC,QAAQ;gBACxD,IAAKoC,QAAAA,QAAwCC,YAC5C;gBAGD,IAAID,SAASZ,UACZ,MAAM,IAAIvB,MAAMtC,mBAAmBD,eAAe,cAAc,EAAE;oBAAC;iBAAuB;gBAG3F,IAAIgB,oBAAoB,GAAG,CAAC0D,OAAO;oBAClC,IAAMrD,OAAOL,oBAAoB,GAAG,CAAC0D;oBACrC,MAAM,IAAInC,MAAMtC,mBAAmBD,eAAe,cAAc,EAAE;wBAACqB;qBAAK;gBACzE;gBAGA,IAAMsB,OAAQ;oBACb,IAAIL,AAA0B,MAA1BA,KAAK,SAAS,CAAC,MAAM,EACxB,OAAO,EAAE;oBAGV,IAAID,SAAS,EAAE;oBAEf,IAAK,IAAI2B,IAAI,GAAGA,IAAI1B,KAAK,SAAS,CAAC,MAAM,EAAE0B,IAAK;wBAC/C,IAAMC,UAAU3B,KAAK,SAAS,CAAC,EAAE,CAAC0B;wBAClC,IAAME,QAAQ,MAAK,KAAK,CAACD;wBAEzB,IAAIA,AAAiB,oBAAjBA,QAAQ,IAAI,EAAsB;gCACrCE;4BAAAA,CAAAA,UAAAA,MAAK,EAAE,IAAI,OAAXA,SAAY,8BAAGD;wBAChB,OACC7B,OAAO,IAAI,CAAC6B;oBAEd;oBAEA,OAAO7B;gBACR;gBAEA,IAAMuC,SAAStC,AAAqB,uBAArBA,KAAK,MAAM,CAAC,IAAI,GAA0B,IAAI,CAAC,KAAK,CAACA,KAAK,MAAM,CAAC,MAAM,IAAI;gBAM1F,IAAIK,KAAK,IAAI,CAAC,SAACC,GAAG;2BAAKA,QAAQkB;oBAC9B,MAAM,IAAIvB,MAAMtC,mBAAmBD,eAAe,cAAc,EAAE;oBAAC;iBAAuB;gBAG3F,IAAI,AAAgB,cAAhB,OAAO0E,MAAqB;oBAC/B,IAAMG,eAAeC,cAAcxC,KAAK,MAAM;oBAC9C,MAAM,IAAIuB,UAAU5D,mBAAmBD,eAAe,eAAe,EAAE;wBAAC6E;qBAAa;gBACtF;gBAEA,OAAOH,KAAK,KAAK,CAACE,QAAQjC;YAC3B;;;YAOAoC,KAAAA;mBAAAA,SAAsBzC,IAAI;gBACzB,IAAID,SAAS;gBACb,IAAM2C,kBAAkB1C,KAAK,WAAW,CAAC,MAAM;gBAE/C,IAAK,IAAI0B,IAAI,GAAGA,IAAI1B,KAAK,MAAM,CAAC,MAAM,EAAE0B,IAAK;oBAC5C3B,UAAUC,KAAK,MAAM,CAAC0B,EAAE,CAAC,KAAK,CAAC,GAAG;oBAClC,IAAIA,IAAIgB,iBACP3C,UAAU,IAAI,CAAC,KAAK,CAACC,KAAK,WAAW,CAAC0B,EAAE;gBAE1C;gBAEA,OAAO3B;YACR;;;;YAzZON,KAAAA;mBAAP,SAAgBC,UAAU,EAAE7B,OAAO;gBAClC,IAAM8E,YAAY,IAlBPtD,UAkBqBxB;gBAChC,OAAO8E,UAAU,QAAQ,CAACjD;YAC3B;;;WApBYL;;AAkbN,SAASmD,cAAcxC,IAAI;IACjC,OAAQA,KAAK,IAAI;QAChB,KAAK;YACJ,OAAOA,KAAK,IAAI;QAEjB,KAAK;YACJ,OAAOA,KAAK,GAAG;QAEhB,KAAK;YACJ,OAAQ,IAAgE,OAA7DA,KAAK,QAAQ,CAAC,GAAG,CAAC,SAAC4C,KAAK;uBAAKJ,cAAcI;eAAQ,IAAI,CAAC,MAAK;QAEzE,KAAK;YAEJ,IAAI5C,AAA2B,MAA3BA,KAAK,UAAU,CAAC,MAAM,EACzB,OAAO;YAGR,OAAO;QAER,KAAK;YACJ,IAAM6C,YAAYL,cAAcxC,KAAK,MAAM;YAC3C,IAAM8C,cAAcN,cAAcxC,KAAK,QAAQ;YAE/C,IAAIA,KAAK,QAAQ,EAChB,OAAQ,GAAe8C,MAAAA,CAAbD,WAAU,KAAe,OAAZC,aAAY;YAEpC,OAAQ,GAAeA,MAAAA,CAAbD,WAAU,KAAe,OAAZC;QAExB;YACC,OAAO;IAET;AACD;ACvkBC;;;;;;;;;;;;;;;;;AACD,IAAMC,gCAAcA,WAAAA,GAApB;;aAAMA;YAQOC,UAAAA,UAAAA,MAAAA,GAAAA,KAAAA,AAAAA,KAAAA,MAAAA,SAAAA,CAAAA,EAAAA,GAAAA,SAAAA,CAAAA,EAAAA,GAAU,CAAC;8CARlBD;QAUJ,IAAI,CAAC,SAAS,GAAGC,QAAQ,eAAe,IAAI;QAC5C,IAAI,CAAC,OAAO,GAAGA,QAAQ,aAAa,IAAI;QAGxC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM;QACrC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;QAGjC,IAAI,CAAC,kBAAkB,GAAGA,AAA+B,SAA/BA,QAAQ,kBAAkB;;gCAlBhDD,gBAAAA;;YA0BLE,KAAAA;mBAAAA,SAAMrF,QAAQ;gBAEb,IAAI,AAAoB,YAApB,OAAOA,UACV,MAAM,IAAI2D,UAAU;gBAGrB,IAAM2B,SAAS,EAAE;gBACjB,IAAMC,SAASvF,SAAS,MAAM;gBAG9B,IAAIwF,QAAQ;gBACZ,IAAIC,SAAS;gBACb,IAAIC,eAAe;gBACnB,IAAIC,MAAM;gBAGV,MAAOA,MAAMJ,OAAQ;oBACpB,IAAMK,OAAO5F,QAAQ,CAAC2F,IAAI;oBAC1B,IAAME,WAAW7F,QAAQ,CAAC2F,MAAM,EAAE;oBAGlC,OAAQH;wBAEP,KAAK;4BAEJ,IAAI,IAAI,CAAC,QAAQ,CAACG,KAAK3F,UAAU,IAAI,CAAC,SAAS,GAAG;gCAEjD,IAAIyF,OAAO,MAAM,GAAG,GAAG;oCACtBH,OAAO,IAAI,CAAC;wCAAE,MAAM;wCAAQ,OAAOG;wCAAQ,OAAOE,MAAMF,OAAO,MAAM;wCAAE,KAAKE;oCAAI;oCAChFF,SAAS;gCACV;gCAEAD,QAAQ;gCACRE,eAAeC;gCACfA,OAAO,IAAI,CAAC,QAAQ;gCACpB;4BACD;4BAEAF,UAAUG;4BACV;wBAGD,KAAK;4BAEJ,IAAIA,AAAS,QAATA,MAEHJ,QAAQ;iCACF,IAAII,AAAS,QAATA,MAEVJ,QAAQ;iCACF,IAAII,AAAS,QAATA,MAEVJ,QAAQ;iCACF,IAAII,AAAS,SAATA,MAEYJ,QAAlBK,AAAa,QAAbA,WAA0B,cACrBA,AAAa,QAAbA,WAA0B,cAC1BA,AAAa,QAAbA,WAA0B,oBACtB;iCACP,IAAI,IAAI,CAAC,QAAQ,CAACF,KAAK3F,UAAU,IAAI,CAAC,OAAO,GAAG;gCAEtD,IAAM8F,YAAY,IAAI,CAAC,kBAAkB,GAAGL,SAASA,OAAO,IAAI;gCAChE,IAAIK,UAAU,MAAM,GAAG,GACtBR,OAAO,IAAI,CAAC;oCACX,MAAM;oCACN,OAAOQ;oCACP,OAAOJ;oCACP,KAAKC,MAAM,IAAI,CAAC,MAAM;oCACtB,cAAcD,eAAe,IAAI,CAAC,QAAQ;oCAC1C,YAAYC;gCACb;gCAGDF,SAAS;gCACTD,QAAQ;gCACRG,OAAO,IAAI,CAAC,MAAM;gCAClB;4BACD;4BAEAF,UAAUG;4BACV;wBAGD,KAAK;4BACJ,IAAIA,AAAS,SAATA,MACHJ,QAAQ;iCACF,IAAII,AAAS,QAATA,MACVJ,QAAQ;4BAETC,UAAUG;4BACV;wBAED,KAAK;4BACJ,IAAIA,AAAS,SAATA,MACHJ,QAAQ;iCACF,IAAII,AAAS,QAATA,MACVJ,QAAQ;4BAETC,UAAUG;4BACV;wBAED,KAAK;4BACJ,IAAIA,AAAS,SAATA,MACHJ,QAAQ;iCACF,IAAII,AAAS,QAATA,MACVJ,QAAQ;4BAETC,UAAUG;4BACV;wBAID,KAAK;4BACJH,UAAUG;4BACVJ,QAAQ;4BACR;wBAED,KAAK;4BACJC,UAAUG;4BACVJ,QAAQ;4BACR;wBAED,KAAK;4BACJC,UAAUG;4BACVJ,QAAQ;4BACR;wBAED,KAAK;4BACJC,UAAUG;4BACVJ,QAAQ;4BACR;oBACF;oBAGAG;gBACD;gBAIA,IAAIF,OAAO,MAAM,GAAG,GACnB,IAAID,AAAU,WAAVA,OAEHF,OAAO,IAAI,CAAC;oBAAE,MAAM;oBAAQ,OAAOG;oBAAQ,OAAOE,MAAMF,OAAO,MAAM;oBAAE,KAAKE;gBAAI;qBAC1E;oBAMN,IAAMI,iBAAiB,IAAI,CAAC,SAAS,GAAGN;oBACxCH,OAAO,IAAI,CAAC;wBAAE,MAAM;wBAAQ,OAAOS;wBAAgB,OAAOL;wBAAc,KAAKC;oBAAI;oBAGjFK,QAAQ,IAAI,CAAE,UAAsB,OAAbN,cAAa;gBACrC;gBAGD,OAAOJ;YACR;;;YAUAW,KAAAA;mBAAAA,SAASN,GAAG,EAAE3F,QAAQ,EAAEkG,QAAQ;gBAE/B,IAAIP,MAAMO,SAAS,MAAM,GAAGlG,SAAS,MAAM,EAC1C,OAAO;gBAIR,IAAK,IAAI8D,IAAI,GAAGA,IAAIoC,SAAS,MAAM,EAAEpC,IACpC,IAAI9D,QAAQ,CAAC2F,MAAM7B,EAAE,KAAKoC,QAAQ,CAACpC,EAAE,EACpC,OAAO;gBAIT,OAAO;YACR;;;;YAQOuB,KAAAA;mBAAP,SAAarF,QAAQ,EAAEoF,OAAO;gBAC7B,IAAMe,SAAS,IAzNXhB,eAyN8BC;gBAClC,OAAOe,OAAO,KAAK,CAACnG;YACrB;;;WA3NKmF;;;;;;ACQC,SAASiB,eAAetE,UAAU,EAAE7B,OAAO;IACjD,OAAOwB,oBAAAA,QAAkB,CAACK,YAAY7B;AACvC;AAYO,SAASoG,aAAarG,QAAQ,EAAEC,OAAO,EAAEqG,qBAAqB;IACpE,IAAInE,SAAS;IAEb,IAAMoE,cAAc;QACnB,MAAM,SAACC,KAAK;mBAAKA,MAAM,KAAK;;QAC5B,YAAY,SAACA,KAAK;YACjB,IAAI;gBACH,OAAO/E,oBAAAA,QAAkB,CAAC+E,MAAM,KAAK,EAAEvG;YACxC,EAAE,OAAOwG,OAAO;gBAEf,IAASlG,eAALkG,OAAiBlD,mBAAkBkD,MAAM,OAAO,CAAC,QAAQ,CAAC,mBAC7D,OAAO;gBAEP,MAAMA;YAER;QACD;IACD;QAEKvF,4BAAAA,MAAAA,oBAAAA,OAAAA,iBAAAA;;QAAL,QAAKA,YAAeiE,8BAAAA,KAAoB,CAACnF,UAAUsG,sBAAsB,CAAtBA,OAAAA,QAAAA,CAAAA,IAA9CpF,OAAAA,CAAAA,CAAAA,4BAAAA,AAAAA,CAAAA,QAAAA,UAAAA,IAAAA,EAAAA,EAAAA,IAAAA,AAAAA,GAAAA,4BAAAA,KAAsE;YAAtEA,IAAMsF,QAANtF,MAAAA,KAAAA;gBAEYwF;YAAhB,IAAMC,UAAUD,QAAAA,CAAAA,0BAAAA,WAAW,CAACF,MAAM,IAAI,CAAC,AAAD,IAAtBE,0BAA2BH,WAAW,CAAC,OAAO;YAE9DpE,UAAUwE,QAAQH;QACnB;;QALKtF,oBAAAA;QAAAA,iBAAAA;;;iBAAAA,6BAAAA,AAAAA,QAAAA,UAAAA,MAAAA,EAAAA,UAAAA,MAAAA;;gBAAAA,mB,MAAAA;;;IAOL,OAAOiB;AACR"}
@@ -319,9 +319,9 @@ function _is_native_reflect_construct() {
319
319
  }
320
320
  var ERROR_MESSAGES = {
321
321
  CAN_NOT_READ_PROPERTY: "Cannot read property of {0} (reading '{1}')",
322
+ IS_INVALID_SYNTAX: "{0} is not a valid syntax",
322
323
  IS_NOT_FUNCTION: "{0} is not a function",
323
324
  IS_NOT_DEFINED: "{0} is not defined",
324
- IS_NOT_VALID_SYNTAX: "{0} is not a valid syntax",
325
325
  IS_NOT_ALLOWED: "{0} is not allowed"
326
326
  };
327
327
  var renderErrorMessage = function(template) {
@@ -468,12 +468,14 @@ var getBlockedMethods = function() {
468
468
  var Evaluator_Evaluator = /*#__PURE__*/ function() {
469
469
  "use strict";
470
470
  function Evaluator() {
471
- var variables = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
471
+ var variables = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : Object.create(null);
472
472
  _class_call_check(this, Evaluator);
473
473
  this.scopes = [
474
- variables,
474
+ structuredClone(variables),
475
475
  createGlobalScope()
476
- ];
476
+ ].filter(function(scope) {
477
+ return null != scope;
478
+ });
477
479
  this.source = void 0;
478
480
  }
479
481
  _create_class(Evaluator, [
@@ -511,6 +513,9 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
511
513
  if (_didIteratorError) throw _iteratorError;
512
514
  }
513
515
  }
516
+ if ("function" == typeof result) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
517
+ "Returning functions from expressions"
518
+ ]));
514
519
  return result;
515
520
  }
516
521
  },
@@ -574,7 +579,7 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
574
579
  default:
575
580
  var content = this.source.slice(node.start, node.end);
576
581
  if (content.length > 20) content = content.slice(0, 17) + "...";
577
- throw new SyntaxError("'".concat(content, "'") + " " + renderErrorMessage(ERROR_MESSAGES.IS_NOT_VALID_SYNTAX, [
582
+ throw new SyntaxError("'".concat(content, "'") + " " + renderErrorMessage(ERROR_MESSAGES.IS_INVALID_SYNTAX, [
578
583
  content
579
584
  ]));
580
585
  }
@@ -674,7 +679,11 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
674
679
  property
675
680
  ]));
676
681
  }
677
- return object[property];
682
+ var result = object[property];
683
+ if (result === Function || result === Function.prototype) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
684
+ "Function constructor"
685
+ ]));
686
+ return result;
678
687
  }
679
688
  },
680
689
  {
@@ -773,6 +782,11 @@ var Evaluator_Evaluator = /*#__PURE__*/ function() {
773
782
  return result;
774
783
  }();
775
784
  var target = "MemberExpression" === node.callee.type ? this.visit(node.callee.object) : null;
785
+ if (args.some(function(arg) {
786
+ return arg === Function;
787
+ })) throw new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [
788
+ "Function constructor"
789
+ ]));
776
790
  if ("function" != typeof func) {
777
791
  var calledString = getNodeString(node.callee);
778
792
  throw new TypeError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_FUNCTION, [
@@ -991,17 +1005,26 @@ function evalExpression(expression, context) {
991
1005
  }
992
1006
  function evalTemplate(template, context, templateParserOptions) {
993
1007
  var result = "";
1008
+ var typeHandler = {
1009
+ text: function(token) {
1010
+ return token.value;
1011
+ },
1012
+ expression: function(token) {
1013
+ try {
1014
+ return Evaluator_Evaluator.evaluate(token.value, context);
1015
+ } catch (error) {
1016
+ if (src_instanceof(error, ReferenceError) && error.message.endsWith("is not defined")) return "undefined";
1017
+ throw error;
1018
+ }
1019
+ }
1020
+ };
994
1021
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
995
1022
  try {
996
1023
  for(var _iterator = TemplateParser_TemplateParser.parse(template, templateParserOptions)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
997
1024
  var token = _step.value;
998
- if ("text" === token.type) result += token.value;
999
- else if ("expression" === token.type) try {
1000
- result += Evaluator_Evaluator.evaluate(token.value, context);
1001
- } catch (error) {
1002
- if (src_instanceof(error, ReferenceError) && error.message.endsWith("is not defined")) result += "undefined";
1003
- else throw error;
1004
- }
1025
+ var _typeHandler_token_type;
1026
+ var handler = null != (_typeHandler_token_type = typeHandler[token.type]) ? _typeHandler_token_type : typeHandler["text"];
1027
+ result += handler(token);
1005
1028
  }
1006
1029
  } catch (err) {
1007
1030
  _didIteratorError = true;
@@ -1 +1 @@
1
- {"version":3,"file":"esm/index.mjs","sources":["../../src/block.js","../../src/Evaluator.js","../../src/TemplateParser.js","../../src/index.js"],"sourcesContent":["const mutableMethods = [\n\t\"Array.prototype.push\",\n\t\"Array.prototype.pop\",\n\t\"Array.prototype.shift\",\n\t\"Array.prototype.unshift\",\n\t\"Array.prototype.splice\",\n\t\"Array.prototype.reverse\",\n\t\"Array.prototype.sort\",\n\t\"Array.prototype.fill\",\n\t\"Array.prototype.copyWithin\",\n\n\t\"Object.defineProperty\",\n\t\"Object.defineProperties\",\n\t\"Object.preventExtensions\",\n\t\"Object.seal\",\n\t\"Object.freeze\",\n\t\"Object.setPrototypeOf\",\n\t\"Object.assign\",\n\t\"Object.prototype.__defineGetter__\",\n\t\"Object.prototype.__defineSetter__\",\n\n\t\"Reflect.set\",\n\t\"Reflect.defineProperty\",\n\t\"Reflect.deleteProperty\",\n\t\"Reflect.setPrototypeOf\",\n\t\"Reflect.preventExtensions\",\n\n\t\"Set.prototype.add\",\n\t\"Set.prototype.delete\",\n\t\"Set.prototype.clear\",\n\t\"WeakSet.prototype.add\",\n\t\"WeakSet.prototype.delete\",\n\n\t\"Map.prototype.set\",\n\t\"Map.prototype.delete\",\n\t\"Map.prototype.clear\",\n\t\"WeakMap.prototype.set\",\n\t\"WeakMap.prototype.delete\",\n\n\t\"Date.prototype.setTime\",\n\t\"Date.prototype.setMilliseconds\",\n\t\"Date.prototype.setUTCSeconds\",\n\t\"Date.prototype.setSeconds\",\n\t\"Date.prototype.setMinutes\",\n\t\"Date.prototype.setHours\",\n\t\"Date.prototype.setDate\",\n\t\"Date.prototype.setMonth\",\n\t\"Date.prototype.setFullYear\",\n\t\"Date.prototype.setYear\",\n\t\"Date.prototype.setUTCMilliseconds\",\n\t\"Date.prototype.setUTCMinutes\",\n\t\"Date.prototype.setUTCHours\",\n\t\"Date.prototype.setUTCDate\",\n\t\"Date.prototype.setUTCMonth\",\n\t\"Date.prototype.setUTCFullYear\",\n\n\t\"RegExp.prototype.compile\",\n\n\t\"Int8Array.prototype.set\",\n\t\"Uint8Array.prototype.set\",\n\t\"Uint8ClampedArray.prototype.set\",\n\t\"Int16Array.prototype.set\",\n\t\"Uint16Array.prototype.set\",\n\t\"Int32Array.prototype.set\",\n\t\"Uint32Array.prototype.set\",\n\t\"Float32Array.prototype.set\",\n\t\"Float64Array.prototype.set\",\n\t\"BigInt64Array.prototype.set\",\n\t\"BigUint64Array.prototype.set\",\n\n\t\"Int8Array.prototype.fill\",\n\t\"Uint8Array.prototype.fill\",\n\t\"Uint8ClampedArray.prototype.fill\",\n\t\"Int16Array.prototype.fill\",\n\t\"Uint16Array.prototype.fill\",\n\t\"Int32Array.prototype.fill\",\n\t\"Uint32Array.prototype.fill\",\n\t\"Float32Array.prototype.fill\",\n\t\"Float64Array.prototype.fill\",\n\t\"BigInt64Array.prototype.fill\",\n\t\"BigUint64Array.prototype.fill\",\n\n\t\"Int8Array.prototype.reverse\",\n\t\"Uint8Array.prototype.reverse\",\n\t\"Uint8ClampedArray.prototype.reverse\",\n\t\"Int16Array.prototype.reverse\",\n\t\"Uint16Array.prototype.reverse\",\n\t\"Int32Array.prototype.reverse\",\n\t\"Uint32Array.prototype.reverse\",\n\t\"Float32Array.prototype.reverse\",\n\t\"Float64Array.prototype.reverse\",\n\t\"BigInt64Array.prototype.reverse\",\n\t\"BigUint64Array.prototype.reverse\",\n\n\t\"Int8Array.prototype.sort\",\n\t\"Uint8Array.prototype.sort\",\n\t\"Uint8ClampedArray.prototype.sort\",\n\t\"Int16Array.prototype.sort\",\n\t\"Uint16Array.prototype.sort\",\n\t\"Int32Array.prototype.sort\",\n\t\"Uint32Array.prototype.sort\",\n\t\"Float32Array.prototype.sort\",\n\t\"Float64Array.prototype.sort\",\n\t\"BigInt64Array.prototype.sort\",\n\t\"BigUint64Array.prototype.sort\",\n\n\t\"Int8Array.prototype.copyWithin\",\n\t\"Uint8Array.prototype.copyWithin\",\n\t\"Uint8ClampedArray.prototype.copyWithin\",\n\t\"Int16Array.prototype.copyWithin\",\n\t\"Uint16Array.prototype.copyWithin\",\n\t\"Int32Array.prototype.copyWithin\",\n\t\"Uint32Array.prototype.copyWithin\",\n\t\"Float32Array.prototype.copyWithin\",\n\t\"Float64Array.prototype.copyWithin\",\n\t\"BigInt64Array.prototype.copyWithin\",\n\t\"BigUint64Array.prototype.copyWithin\",\n\n\t\"ArrayBuffer.prototype.transfer\",\n\t\"ArrayBuffer.prototype.transferToFixedLength\",\n\n\t\"SharedArrayBuffer.prototype.grow\",\n\n\t\"DataView.prototype.setInt8\",\n\t\"DataView.prototype.setUint8\",\n\t\"DataView.prototype.setInt16\",\n\t\"DataView.prototype.setUint16\",\n\t\"DataView.prototype.setInt32\",\n\t\"DataView.prototype.setUint32\",\n\t\"DataView.prototype.setFloat32\",\n\t\"DataView.prototype.setFloat64\",\n\t\"DataView.prototype.setBigInt64\",\n\t\"DataView.prototype.setBigUint64\",\n\n\t\"Promise.prototype.catch\",\n\t\"Promise.prototype.finally\",\n\n\t\"Generator.prototype.next\",\n\t\"Generator.prototype.return\",\n\t\"Generator.prototype.throw\",\n\n\t\"AsyncGenerator.prototype.next\",\n\t\"AsyncGenerator.prototype.return\",\n\t\"AsyncGenerator.prototype.throw\",\n\n\t\"Iterator.prototype.next\",\n\n\t\"WeakRef.prototype.deref\",\n\n\t\"FinalizationRegistry.prototype.register\",\n\t\"FinalizationRegistry.prototype.unregister\",\n\n\t\"URLSearchParams.prototype.append\",\n\t\"URLSearchParams.prototype.delete\",\n\t\"URLSearchParams.prototype.set\",\n\t\"URLSearchParams.prototype.sort\",\n\n\t\"FormData.prototype.append\",\n\t\"FormData.prototype.delete\",\n\t\"FormData.prototype.set\",\n\n\t\"Headers.prototype.append\",\n\t\"Headers.prototype.delete\",\n\t\"Headers.prototype.set\",\n\n\t// Function call/apply/bind can be used to invoke with arbitrary `this`\n\t\"Function.prototype.call\",\n\t\"Function.prototype.apply\",\n\t\"Function.prototype.bind\",\n\t\"Function.prototype.constructor\",\n\n\t// Legacy lookup helpers\n\t\"Object.prototype.__lookupGetter__\",\n\t\"Object.prototype.__lookupSetter__\",\n\n\t// Constructor property can be abused to retrieve the Function constructor\n\t\"Object.prototype.constructor\",\n];\n\nconst dangerousMethods = [\n\t\"Object.getPrototypeOf\",\n\t// Various reflective/object-inspection APIs that may expose internals\n\t\"Object.getOwnPropertyDescriptor\",\n\t\"Object.getOwnPropertyDescriptors\",\n\t\"Object.getOwnPropertyNames\",\n\t\"Object.getOwnPropertySymbols\",\n\t\"Object.getOwnPropertyDescriptors\",\n];\n\n// Some prototype-style aliases/properties that can be used to break sandboxes\nmutableMethods.push(\"Object.prototype.__proto__\");\n\n/**\n * List of methods to block due to mutability or dangerousness\n */\nexport const blockedMethods = [...mutableMethods, ...dangerousMethods];\n\n/**\n * List of global built-ins to block entirely\n */\nexport const blockedGlobalBuiltIns = [\n\t\"Function\",\n\t\"GeneratorFunction\",\n\t\"AsyncFunction\",\n\t\"AsyncGeneratorFunction\",\n\t\"eval\",\n\t\"setTimeout\",\n\t\"setInterval\",\n\t\"clearTimeout\",\n\t\"clearInterval\",\n\t\"setImmediate\",\n\t\"XMLHttpRequest\",\n\t\"fetch\",\n\t\"WebSocket\",\n\t\"globalThis\",\n\n\t// Node / runtime globals\n\t\"process\",\n\t\"require\",\n\t\"module\",\n\t\"exports\",\n\t\"global\",\n\t\"Buffer\",\n\t\"setImmediate\",\n\t\"clearImmediate\",\n\n\t// Worker / threading / messaging\n\t\"importScripts\",\n\t\"Worker\",\n\t\"SharedWorker\",\n\t\"ServiceWorker\",\n\t\"BroadcastChannel\",\n\t\"MessageChannel\",\n\t\"MessagePort\",\n\t\"postMessage\",\n\n\t// Host environment globals (browser)\n\t\"window\",\n\t\"document\",\n\t\"navigator\",\n\t\"location\",\n\t\"localStorage\",\n\t\"sessionStorage\",\n\t\"indexedDB\",\n\t\"performance\",\n\n\t// Low-level / concurrent / binary APIs\n\t\"Proxy\",\n\t\"Reflect\",\n\t\"Atomics\",\n\t\"WebAssembly\",\n\n\t// Console and internationalization\n\t\"console\",\n\t\"Intl\",\n\n\t// Other runtimes\n\t\"Deno\",\n];\n","import * as acorn from \"acorn\";\nimport globals from \"globals\";\nimport { blockedGlobalBuiltIns, blockedMethods } from \"./block.js\";\n\n// Error message constants for better maintainability\nconst ERROR_MESSAGES = {\n\tCAN_NOT_READ_PROPERTY: \"Cannot read property of {0} (reading '{1}')\",\n\tIS_NOT_FUNCTION: \"{0} is not a function\",\n\tIS_NOT_DEFINED: \"{0} is not defined\",\n\tIS_NOT_VALID_SYNTAX: \"{0} is not a valid syntax\",\n\tIS_NOT_ALLOWED: \"{0} is not allowed\",\n};\n\n/**\n * Renders an error message by replacing placeholders with context values.\n * @param {string} template\n * @param {Record<string, any>} context\n * @example\n * ```js\n * const msg = renderErrorMessage(\"Cannot call mutable prototype method: {method}\", { method: \"push\" });\n * ```\n */\nconst renderErrorMessage = (template, context = {}) => template.replace(/{(\\w+)}/g, (_, key) => String(context[key]));\n\nconst BINARY_OPERATION_MAP = {\n\t\"+\": (a, b) => a + b,\n\t\"-\": (a, b) => a - b,\n\t\"*\": (a, b) => a * b,\n\t\"**\": (a, b) => a ** b,\n\t\"==\": (a, b) => a == b,\n\t\"===\": (a, b) => a === b,\n\t\"!=\": (a, b) => a != b,\n\t\"!==\": (a, b) => a !== b,\n\t\">\": (a, b) => a > b,\n\t\">=\": (a, b) => a >= b,\n\t\"<\": (a, b) => a < b,\n\t\"<=\": (a, b) => a <= b,\n\t\"%\": (a, b) => a % b,\n\t\"/\": (a, b) => a / b,\n\t\"|\": (a, b) => a | b,\n\t\"&\": (a, b) => a & b,\n\t\"^\": (a, b) => a ^ b,\n\t\"<<\": (a, b) => a << b,\n\t\">>\": (a, b) => a >> b,\n\t\">>>\": (a, b) => a >>> b,\n\tin: (a, b) => a in b,\n\tinstanceof: (a, b) => a instanceof b,\n};\n\nfunction createGlobalScope() {\n\tconst scope = Object.create(null);\n\tconst { builtin } = globals;\n\n\tfor (const key in builtin) {\n\t\tif (blockedGlobalBuiltIns.includes(key)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t/** @type {boolean} */\n\t\tconst isWritable = builtin[key];\n\n\t\tObject.defineProperty(scope, key, {\n\t\t\tvalue: globalThis[key],\n\t\t\twritable: isWritable,\n\t\t\tenumerable: false,\n\t\t\tconfigurable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(scope, \"globalThis\", {\n\t\tvalue: scope,\n\t\twritable: false,\n\t\tenumerable: false,\n\t\tconfigurable: false,\n\t});\n\n\treturn scope;\n}\n\nconst getBlockedMethods = (() => {\n\t/**\n\t * @type {Map<Function, string>}\n\t */\n\tlet BLOCKED_METHODS = null;\n\n\treturn () => {\n\t\tif (BLOCKED_METHODS) return BLOCKED_METHODS;\n\n\t\tconst map = new Map();\n\t\tfor (const path of blockedMethods) {\n\t\t\tconst [object, ...properties] = path.split(\".\");\n\t\t\tlet current = globalThis[object];\n\t\t\tfor (const prop of properties) {\n\t\t\t\tif (current && Object.hasOwn(current, prop)) {\n\t\t\t\t\tcurrent = current[prop];\n\t\t\t\t} else {\n\t\t\t\t\tcurrent = null;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof current === \"function\") map.set(current, path);\n\t\t}\n\t\tBLOCKED_METHODS = map;\n\n\t\treturn BLOCKED_METHODS;\n\t};\n})();\n\n/**\n * A JavaScript expression evaluator that safely evaluates expressions within a sandboxed environment.\n * Supports various JavaScript features including arithmetic, logical operations, functions, and more.\n *\n * Security features:\n * - Blocks mutable methods to prevent side effects\n * - No access to eval() or Function() constructor\n * - Sandboxed scope with limited global objects\n *\n * @example\n * const evaluator = new Evaluator({ x: 10, y: 20 });\n * evaluator.evaluate('x + y') // returns 30\n */\nexport class Evaluator {\n\t/**\n\t * Creates a new Evaluator instance with a custom variable context.\n\t * The scope hierarchy is: user variables -> global scope\n\t * @param {Object} [variables={}] - An optional object containing variables to make available in the evaluation context\n\t */\n\tconstructor(variables = {}) {\n\t\tthis.scopes = [variables, createGlobalScope()];\n\t\tthis.source = undefined;\n\t}\n\n\t/**\n\t * Evaluates a JavaScript expression with an optional context.\n\t * @param {string} expression\n\t * @param {unknown} [context]\n\t * @returns\n\t */\n\tstatic evaluate(expression, context) {\n\t\tconst evaluator = new Evaluator(context);\n\t\treturn evaluator.evaluate(expression);\n\t}\n\n\t/**\n\t * Parses and evaluates a JavaScript expression using acorn parser.\n\t * @param {string} expression - The JavaScript expression to evaluate\n\t * @returns {*} The result of the evaluation\n\t * @throws {SyntaxError} If the expression has invalid syntax\n\t * @throws {ReferenceError} If referencing undefined variables\n\t * @throws {TypeError} If performing invalid operations\n\t */\n\tevaluate(expression) {\n\t\tthis.source = expression;\n\n\t\tconst ast = acorn.parse(expression, { ecmaVersion: \"latest\" });\n\n\t\t// Start recursive evaluation from the root node\n\t\ttry {\n\t\t\treturn this.execute(ast.body);\n\t\t} finally {\n\t\t\tthis.source = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Executes an array of AST body nodes sequentially.\n\t * @private\n\t * @param {Array} body - Array of AST nodes to execute\n\t * @returns {*} The result of the last executed node\n\t */\n\texecute(body) {\n\t\tlet result;\n\t\tfor (const node of body) {\n\t\t\tresult = this.visit(node);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Visits an AST node and delegates to the appropriate handler based on node type.\n\t * @private\n\t * @param {import(\"acorn\").Node} node - The AST node to visit\n\t * @returns {*} The result of visiting the node\n\t */\n\tvisit(node) {\n\t\tswitch (node.type) {\n\t\t\tcase \"ExpressionStatement\": {\n\t\t\t\treturn this.visit(node.expression);\n\t\t\t}\n\t\t\tcase \"BinaryExpression\": {\n\t\t\t\treturn this.handleBinaryExpression(node);\n\t\t\t}\n\t\t\tcase \"LogicalExpression\": {\n\t\t\t\treturn this.handleLogicalExpression(node);\n\t\t\t}\n\t\t\tcase \"UnaryExpression\": {\n\t\t\t\treturn this.handleUnaryExpression(node);\n\t\t\t}\n\t\t\tcase \"Identifier\": {\n\t\t\t\treturn this.handleIdentifier(node);\n\t\t\t}\n\t\t\tcase \"Literal\": {\n\t\t\t\treturn node.value;\n\t\t\t}\n\t\t\tcase \"MemberExpression\": {\n\t\t\t\treturn this.handleMemberExpression(node);\n\t\t\t}\n\t\t\tcase \"ArrayExpression\": {\n\t\t\t\treturn this.handleArrayExpression(node);\n\t\t\t}\n\t\t\tcase \"SpreadElement\": {\n\t\t\t\treturn this.handleSpreadElement(node);\n\t\t\t}\n\t\t\tcase \"ObjectExpression\": {\n\t\t\t\treturn this.handleObjectExpression(node);\n\t\t\t}\n\t\t\tcase \"FunctionExpression\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Function expression\"]));\n\t\t\t}\n\t\t\tcase \"ArrowFunctionExpression\": {\n\t\t\t\treturn this.handleArrowFunctionExpression(node);\n\t\t\t}\n\t\t\tcase \"CallExpression\": {\n\t\t\t\treturn this.handleCallExpression(node);\n\t\t\t}\n\t\t\tcase \"ConditionalExpression\": {\n\t\t\t\treturn this.visit(node.test) ? this.visit(node.consequent) : this.visit(node.alternate);\n\t\t\t}\n\t\t\tcase \"NewExpression\": {\n\t\t\t\tif (node.callee.type !== \"Identifier\") {\n\t\t\t\t\tthrow new Error(`Unsupported callee type '${node.callee.type}' in new expression`);\n\t\t\t\t}\n\n\t\t\t\tif (node.callee.name === \"Function\") {\n\t\t\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"new Function() constructor\"]));\n\t\t\t\t}\n\n\t\t\t\tconst Constructor = this.visit(node.callee);\n\n\t\t\t\t// 仅在存在参数时构建数组\n\t\t\t\tconst args = node.arguments.length ? node.arguments.map((arg) => this.visit(arg)) : [];\n\n\t\t\t\treturn new Constructor(...args);\n\t\t\t}\n\t\t\tcase \"ChainExpression\": {\n\t\t\t\treturn this.visit(node.expression);\n\t\t\t}\n\t\t\tcase \"TemplateLiteral\": {\n\t\t\t\treturn this.handleTemplateLiteral(node);\n\t\t\t}\n\t\t\tcase \"ThisExpression\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"'this' expression\"]));\n\t\t\t}\n\t\t\tcase \"WithStatement\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"'with' statement\"]));\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tlet content = this.source.slice(node.start, node.end);\n\n\t\t\t\tif (content.length > 20) {\n\t\t\t\t\tcontent = content.slice(0, 17) + \"...\";\n\t\t\t\t}\n\n\t\t\t\tthrow new SyntaxError(`'${content}'` + \" \" + renderErrorMessage(ERROR_MESSAGES.IS_NOT_VALID_SYNTAX, [content]));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles binary expressions (arithmetic and comparison operations).\n\t * @param {import('acorn').BinaryExpression} node\n\t * @private\n\t */\n\thandleBinaryExpression(node) {\n\t\tconst op = node.operator;\n\t\tconst left = this.visit(node.left);\n\t\tconst right = this.visit(node.right);\n\n\t\tif (BINARY_OPERATION_MAP.hasOwnProperty(op)) {\n\t\t\treturn BINARY_OPERATION_MAP[op](left, right);\n\t\t}\n\n\t\tthrow new SyntaxError(`Unsupported operator: ${node.operator}`);\n\t}\n\n\t/**\n\t * Handles logical expressions (&&, ||, ??).\n\t * Implements proper short-circuit evaluation for performance.\n\t * @private\n\t */\n\thandleLogicalExpression(node) {\n\t\tswitch (node.operator) {\n\t\t\tcase \"&&\": {\n\t\t\t\tconst left = this.visit(node.left);\n\t\t\t\treturn left ? this.visit(node.right) : left;\n\t\t\t}\n\t\t\tcase \"||\": {\n\t\t\t\tconst left = this.visit(node.left);\n\t\t\t\treturn left ? left : this.visit(node.right);\n\t\t\t}\n\t\t\tcase \"??\": {\n\t\t\t\tconst left = this.visit(node.left);\n\t\t\t\treturn left !== null && left !== undefined ? left : this.visit(node.right);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new SyntaxError(`Unsupported logical operator: ${node.operator}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles unary expressions (-, +, !, ~, typeof, void).\n\t * @private\n\t */\n\thandleUnaryExpression(node) {\n\t\tswitch (node.operator) {\n\t\t\tcase \"-\": {\n\t\t\t\treturn -this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"+\": {\n\t\t\t\treturn +this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"!\": {\n\t\t\t\treturn !this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"~\": {\n\t\t\t\treturn ~this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"typeof\": {\n\t\t\t\treturn typeof this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"void\": {\n\t\t\t\treturn void this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"delete\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Delete operator\"]));\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new SyntaxError(`Unsupported unary operator: ${node.operator}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles identifier (variable) lookups in the scope chain.\n\t * @private\n\t */\n\thandleIdentifier(node) {\n\t\tconst name = node.name;\n\t\tfor (const scope of this.scopes) {\n\t\t\tif (Object.hasOwn(scope, name)) {\n\t\t\t\treturn scope[name];\n\t\t\t}\n\t\t}\n\n\t\tthrow new ReferenceError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_DEFINED, [name]));\n\t}\n\n\t/**\n\t * Handles member expressions (property access like obj.prop or obj[prop]).\n\t * @private\n\t */\n\thandleMemberExpression(node) {\n\t\tconst object = this.visit(node.object);\n\n\t\t// Determine property name: either identifier name or computed value\n\t\tconst isStaticProperty = node.property.type === \"Identifier\" && !node.computed;\n\t\tconst property = isStaticProperty ? node.property.name : this.visit(node.property);\n\n\t\t// Prevent access to prototype properties\n\t\tif (typeof object !== \"undefined\" && object !== null && object[property] === object?.__proto__) {\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Accessing prototype properties\"]));\n\t\t}\n\n\t\tif (object === null || object === undefined) {\n\t\t\t// optional chaining\n\t\t\tif (node.optional) {\n\t\t\t\treturn void 0;\n\t\t\t}\n\t\t\tthrow new TypeError(renderErrorMessage(ERROR_MESSAGES.CAN_NOT_READ_PROPERTY, [object, property]));\n\t\t}\n\n\t\treturn object[property];\n\t}\n\n\t/**\n\t * Handles array literal expressions.\n\t * @private\n\t */\n\thandleArrayExpression(node) {\n\t\tconst result = [];\n\n\t\tfor (let i = 0; i < node.elements.length; i++) {\n\t\t\tconst element = node.elements.at(i);\n\t\t\tconst value = this.visit(element);\n\n\t\t\tif (element.type === \"SpreadElement\") {\n\t\t\t\tresult.push(...value);\n\t\t\t} else {\n\t\t\t\tresult.push(value);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Handles object literal expressions.\n\t * @returns\n\t */\n\thandleObjectExpression(node) {\n\t\tconst obj = {};\n\t\tfor (const prop of node.properties) {\n\t\t\tif (prop.type === \"SpreadElement\") {\n\t\t\t\tObject.assign(obj, this.visit(prop.argument));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst key = prop.key.name || prop.key.value;\n\t\t\tconst value = this.visit(prop.value);\n\t\t\tobj[key] = value;\n\t\t}\n\t\treturn obj;\n\t}\n\n\thandleSpreadElement(node) {\n\t\treturn this.visit(node.argument);\n\t}\n\n\t/**\n\t * Handles arrow function expressions.\n\t * Creates a closure that captures the current scope and executes the function body\n\t * with parameters bound to a new scope.\n\t * @private\n\t */\n\thandleArrowFunctionExpression(node) {\n\t\treturn (...args) => {\n\t\t\t// Create new scope with parameters bound to arguments\n\t\t\tconst newScope = {};\n\t\t\tconst paramCount = node.params.length;\n\t\t\tfor (let i = 0; i < paramCount; i++) {\n\t\t\t\tnewScope[node.params[i].name] = args[i];\n\t\t\t}\n\n\t\t\t// Push new scope, evaluate body, then pop scope\n\t\t\tthis.scopes.unshift(newScope);\n\t\t\tconst result = this.visit(node.body);\n\t\t\tthis.scopes.shift();\n\t\t\treturn result;\n\t\t};\n\t}\n\n\t/**\n\t * Handles function call expressions, including optional chaining.\n\t * @private\n\t */\n\thandleCallExpression(node) {\n\t\tconst func = this.visit(node.callee);\n\n\t\tconst isOptional = node.optional || node.callee.optional;\n\t\tif ((func === undefined || func === null) && isOptional) {\n\t\t\treturn void 0;\n\t\t}\n\n\t\tif (func === Function) {\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Function constructor\"]));\n\t\t}\n\n\t\tif (getBlockedMethods().has(func)) {\n\t\t\tconst path = getBlockedMethods().get(func);\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [path]));\n\t\t}\n\n\t\t// 仅在存在参数时构建数组\n\t\tconst args = (() => {\n\t\t\tif (node.arguments.length === 0) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tlet result = [];\n\n\t\t\tfor (let i = 0; i < node.arguments.length; i++) {\n\t\t\t\tconst element = node.arguments.at(i);\n\t\t\t\tconst value = this.visit(element);\n\n\t\t\t\tif (element.type === \"SpreadElement\") {\n\t\t\t\t\tresult.push(...value);\n\t\t\t\t} else {\n\t\t\t\t\tresult.push(value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t})();\n\n\t\tconst target = node.callee.type === \"MemberExpression\" ? this.visit(node.callee.object) : null;\n\n\t\tif (typeof func !== \"function\") {\n\t\t\tconst calledString = getNodeString(node.callee);\n\t\t\tthrow new TypeError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_FUNCTION, [calledString]));\n\t\t}\n\n\t\treturn func.apply(target, args);\n\t}\n\n\t/**\n\t * Handles template literal expressions.\n\t * More efficient implementation that interleaves quasis and expressions without sorting.\n\t * @private\n\t */\n\thandleTemplateLiteral(node) {\n\t\tlet result = \"\";\n\t\tconst expressionCount = node.expressions.length;\n\n\t\tfor (let i = 0; i < node.quasis.length; i++) {\n\t\t\tresult += node.quasis[i].value.raw;\n\t\t\tif (i < expressionCount) {\n\t\t\t\tresult += this.visit(node.expressions[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n}\n\n/**\n *\n * @param {import('acorn').Node} node\n * @returns\n */\nexport function getNodeString(node) {\n\tswitch (node.type) {\n\t\tcase \"Identifier\": {\n\t\t\treturn node.name;\n\t\t}\n\t\tcase \"Literal\": {\n\t\t\treturn node.raw;\n\t\t}\n\t\tcase \"ArrayExpression\": {\n\t\t\treturn `[${node.elements.map((child) => getNodeString(child)).join(\",\")}]`;\n\t\t}\n\t\tcase \"ObjectExpression\": {\n\t\t\t// if keys is empty\n\t\t\tif (node.properties.length === 0) {\n\t\t\t\treturn \"{}\";\n\t\t\t}\n\n\t\t\treturn \"{(intermediate value)}\";\n\t\t}\n\t\tcase \"MemberExpression\": {\n\t\t\tconst objectStr = getNodeString(node.object);\n\t\t\tconst propertyStr = getNodeString(node.property);\n\n\t\t\tif (node.computed) {\n\t\t\t\treturn `${objectStr}[${propertyStr}]`;\n\t\t\t}\n\t\t\treturn `${objectStr}.${propertyStr}`;\n\t\t}\n\t\tdefault: {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n","/**\n * 简单状态机模板解析器\n * 能够正确处理表达式中包含字符串、转义字符和结束标记的情况\n * @class SimpleStateTemplateParser\n */\nclass TemplateParser {\n\t/**\n\t * 创建解析器实例\n\t * @param {Object} [options] - 配置选项\n\t * @param {string} [options.expressionStart='{{'] - 表达式开始标记\n\t * @param {string} [options.expressionEnd='}}'] - 表达式结束标记\n\t * @param {boolean} [options.preserveWhitespace=true] - 是否保留表达式周围的空白字符\n\t */\n\tconstructor(options = {}) {\n\t\t// 表达式标记配置\n\t\tthis.exprStart = options.expressionStart || \"{{\";\n\t\tthis.exprEnd = options.expressionEnd || \"}}\";\n\n\t\t// 标记长度缓存,避免重复计算\n\t\tthis.startLen = this.exprStart.length;\n\t\tthis.endLen = this.exprEnd.length;\n\n\t\t// 其他配置\n\t\tthis.preserveWhitespace = options.preserveWhitespace === true;\n\t}\n\n\t/**\n\t * 解析模板字符串,将其转换为 token 数组\n\t * @param {string} template - 要解析的模板字符串\n\t * @returns {Array<{type: string, value: string}>} token 数组\n\t */\n\tparse(template) {\n\t\t// 输入验证\n\t\tif (typeof template !== \"string\") {\n\t\t\tthrow new TypeError(\"模板必须是字符串\");\n\t\t}\n\n\t\tconst tokens = []; // 存储解析结果的 token 数组\n\t\tconst length = template.length;\n\n\t\t// 状态机变量\n\t\tlet state = \"TEXT\"; // 当前状态:TEXT | EXPR | STRING_SQ | STRING_DQ | TEMPLATE | ESCAPE_*\n\t\tlet buffer = \"\"; // 当前状态的字符缓冲区\n\t\tlet exprStartPos = 0; // 当前表达式的开始位置(用于错误恢复)\n\t\tlet pos = 0; // 当前扫描位置\n\n\t\t// 主解析循环:逐个字符扫描模板\n\t\twhile (pos < length) {\n\t\t\tconst char = template[pos];\n\t\t\tconst nextChar = template[pos + 1];\n\n\t\t\t// 状态机核心逻辑\n\t\t\tswitch (state) {\n\t\t\t\t// ==================== 文本状态 ====================\n\t\t\t\tcase \"TEXT\":\n\t\t\t\t\t// 检查是否遇到表达式开始标记\n\t\t\t\t\tif (this._isMatch(pos, template, this.exprStart)) {\n\t\t\t\t\t\t// 将缓冲区中的文本保存为 token\n\t\t\t\t\t\tif (buffer.length > 0) {\n\t\t\t\t\t\t\ttokens.push({ type: \"text\", value: buffer, start: pos - buffer.length, end: pos });\n\t\t\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// 切换到表达式状态\n\t\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\t\texprStartPos = pos; // 记录表达式开始位置\n\t\t\t\t\t\tpos += this.startLen; // 跳过开始标记\n\t\t\t\t\t\tcontinue; // 继续处理下一个字符(跳过本次循环的剩余部分)\n\t\t\t\t\t}\n\t\t\t\t\t// 普通文本字符,添加到缓冲区\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// ==================== 表达式状态 ====================\n\t\t\t\tcase \"EXPR\":\n\t\t\t\t\t// 在表达式中,需要处理各种字符串和转义字符\n\t\t\t\t\tif (char === \"'\") {\n\t\t\t\t\t\t// 进入单引号字符串状态\n\t\t\t\t\t\tstate = \"STRING_SQ\";\n\t\t\t\t\t} else if (char === '\"') {\n\t\t\t\t\t\t// 进入双引号字符串状态\n\t\t\t\t\t\tstate = \"STRING_DQ\";\n\t\t\t\t\t} else if (char === \"`\") {\n\t\t\t\t\t\t// 进入模板字符串状态\n\t\t\t\t\t\tstate = \"TEMPLATE\";\n\t\t\t\t\t} else if (char === \"\\\\\") {\n\t\t\t\t\t\t// 遇到转义字符,根据当前上下文进入相应的转义状态\n\t\t\t\t\t\tif (nextChar === \"'\") state = \"ESCAPE_SQ\";\n\t\t\t\t\t\telse if (nextChar === '\"') state = \"ESCAPE_DQ\";\n\t\t\t\t\t\telse if (nextChar === \"`\") state = \"ESCAPE_TEMPLATE\";\n\t\t\t\t\t\telse state = \"ESCAPE_EXPR\";\n\t\t\t\t\t} else if (this._isMatch(pos, template, this.exprEnd)) {\n\t\t\t\t\t\t// 找到表达式结束标记,且不在字符串中\n\t\t\t\t\t\tconst exprValue = this.preserveWhitespace ? buffer : buffer.trim();\n\t\t\t\t\t\tif (exprValue.length > 0) {\n\t\t\t\t\t\t\ttokens.push({\n\t\t\t\t\t\t\t\ttype: \"expression\",\n\t\t\t\t\t\t\t\tvalue: exprValue,\n\t\t\t\t\t\t\t\tstart: exprStartPos,\n\t\t\t\t\t\t\t\tend: pos + this.endLen,\n\t\t\t\t\t\t\t\tcontentStart: exprStartPos + this.startLen,\n\t\t\t\t\t\t\t\tcontentEnd: pos,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// 重置状态,准备处理后续文本\n\t\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\t\tstate = \"TEXT\";\n\t\t\t\t\t\tpos += this.endLen; // 跳过结束标记\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t// 将当前字符添加到表达式缓冲区\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// ==================== 字符串状态 ====================\n\t\t\t\tcase \"STRING_SQ\": // 单引号字符串\n\t\t\t\t\tif (char === \"\\\\\") {\n\t\t\t\t\t\tstate = \"ESCAPE_SQ\"; // 遇到转义字符\n\t\t\t\t\t} else if (char === \"'\") {\n\t\t\t\t\t\tstate = \"EXPR\"; // 字符串结束,回到表达式状态\n\t\t\t\t\t}\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"STRING_DQ\": // 双引号字符串\n\t\t\t\t\tif (char === \"\\\\\") {\n\t\t\t\t\t\tstate = \"ESCAPE_DQ\";\n\t\t\t\t\t} else if (char === '\"') {\n\t\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\t}\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"TEMPLATE\": // 模板字符串\n\t\t\t\t\tif (char === \"\\\\\") {\n\t\t\t\t\t\tstate = \"ESCAPE_TEMPLATE\";\n\t\t\t\t\t} else if (char === \"`\") {\n\t\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\t}\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// ==================== 转义状态 ====================\n\t\t\t\t// 转义状态:处理转义字符,然后返回到之前的状态\n\t\t\t\tcase \"ESCAPE_SQ\":\n\t\t\t\t\tbuffer += char; // 添加转义后的字符\n\t\t\t\t\tstate = \"STRING_SQ\"; // 回到单引号字符串状态\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ESCAPE_DQ\":\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tstate = \"STRING_DQ\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ESCAPE_TEMPLATE\":\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tstate = \"TEMPLATE\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ESCAPE_EXPR\":\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// 移动到下一个字符\n\t\t\tpos++;\n\t\t}\n\n\t\t// ==================== 后处理 ====================\n\t\t// 处理扫描结束后缓冲区中剩余的内容\n\t\tif (buffer.length > 0) {\n\t\t\tif (state === \"TEXT\") {\n\t\t\t\t// 剩余的文本内容\n\t\t\t\ttokens.push({ type: \"text\", value: buffer, start: pos - buffer.length, end: pos });\n\t\t\t} else {\n\t\t\t\t// 未完成的表达式,将其作为普通文本处理\n\t\t\t\t// 这里可以根据需要选择不同的错误处理策略:\n\t\t\t\t// 1. 抛出错误\n\t\t\t\t// 2. 忽略未完成的表达式\n\t\t\t\t// 3. 将其作为文本处理(当前实现)\n\t\t\t\tconst incompleteExpr = this.exprStart + buffer;\n\t\t\t\ttokens.push({ type: \"text\", value: incompleteExpr, start: exprStartPos, end: pos });\n\n\t\t\t\t// 可选:输出警告\n\t\t\t\tconsole.warn(`警告:在位置 ${exprStartPos} 开始的表达式未正确结束`);\n\t\t\t}\n\t\t}\n\n\t\treturn tokens;\n\t}\n\n\t/**\n\t * 检查指定位置是否匹配给定的字符序列\n\t * @param {number} pos - 开始检查的位置\n\t * @param {string} template - 模板字符串\n\t * @param {string} sequence - 要匹配的字符序列\n\t * @returns {boolean} 是否匹配\n\t * @private\n\t */\n\t_isMatch(pos, template, sequence) {\n\t\t// 检查剩余长度是否足够\n\t\tif (pos + sequence.length > template.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// 逐个字符比较\n\t\tfor (let i = 0; i < sequence.length; i++) {\n\t\t\tif (template[pos + i] !== sequence[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * 静态方法:快速解析模板\n\t * @param {string} template - 模板字符串\n\t * @param {Object} [options] - 配置选项\n\t * @returns {Array} token 数组\n\t */\n\tstatic parse(template, options) {\n\t\tconst parser = new TemplateParser(options);\n\t\treturn parser.parse(template);\n\t}\n}\n\nexport { TemplateParser };\n","import { Evaluator } from \"./Evaluator.js\";\nimport { TemplateParser } from \"./TemplateParser.js\";\n\nexport { Evaluator, TemplateParser };\n\n/**\n * Evaluates a JavaScript expression with an optional context.\n * @param {string} expression - The JavaScript expression to evaluate\n * @param {unknown} [context] - Optional context object with variables to use in the expression\n * @returns {*} The result of evaluating the expression\n * @example\n * evalExpression('a + b', { a: 1, b: 2 }) // returns 3\n */\nexport function evalExpression(expression, context) {\n\treturn Evaluator.evaluate(expression, context);\n}\n\n/**\n * Evaluates a template string by replacing {{ expression }} patterns with their evaluated values.\n * Undefined variables in expressions are replaced with empty strings instead of throwing errors.\n * @param {string} template - The template string containing {{ expression }} patterns\n * @param {Object} [context] - Optional context object with variables to use in expressions\n * @param {Object} [templateParserOptions] - Optional options for the template parser\n * @returns {string} The template with all expressions evaluated and replaced\n * @example\n * evalTemplate('Hello {{ name }}!', { name: 'World' }) // returns 'Hello World!'\n */\nexport function evalTemplate(template, context, templateParserOptions) {\n\tlet result = \"\";\n\n\tfor (const token of TemplateParser.parse(template, templateParserOptions)) {\n\t\tif (token.type === \"text\") {\n\t\t\tresult += token.value;\n\t\t} else if (token.type === \"expression\") {\n\t\t\ttry {\n\t\t\t\tresult += Evaluator.evaluate(token.value, context);\n\t\t\t} catch (error) {\n\t\t\t\t// Replace undefined variables with empty string for graceful degradation\n\t\t\t\tif (error instanceof ReferenceError && error.message.endsWith(\"is not defined\")) {\n\t\t\t\t\tresult += \"undefined\";\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n"],"names":["mutableMethods","dangerousMethods","blockedMethods","blockedGlobalBuiltIns","ERROR_MESSAGES","renderErrorMessage","template","context","_","key","String","BINARY_OPERATION_MAP","a","b","_instanceof","createGlobalScope","scope","Object","builtin","globals","isWritable","globalThis","getBlockedMethods","BLOCKED_METHODS","map","Map","_iteratorError","path","_path_split","object","properties","current","_iteratorError1","prop","Evaluator","variables","undefined","evaluate","expression","ast","acorn","execute","body","result","node","visit","SyntaxError","Error","Constructor","args","arg","content","handleBinaryExpression","op","left","right","handleLogicalExpression","left1","left2","handleUnaryExpression","_type_of","handleIdentifier","name","ReferenceError","handleMemberExpression","isStaticProperty","property","TypeError","handleArrayExpression","i","element","value","_result","handleObjectExpression","obj","handleSpreadElement","handleArrowFunctionExpression","newScope","paramCount","handleCallExpression","func","isOptional","Function","target","calledString","getNodeString","handleTemplateLiteral","expressionCount","evaluator","child","objectStr","propertyStr","TemplateParser","options","parse","tokens","length","state","buffer","exprStartPos","pos","char","nextChar","exprValue","incompleteExpr","console","_isMatch","sequence","parser","evalExpression","evalTemplate","templateParserOptions","token","error"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAMA,iBAAiB;IACtB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IAEA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IAEA;IACA;IACA;IAEA;IACA;IACA;IAEA;IAEA;IAEA;IACA;IAEA;IACA;IACA;IACA;IAEA;IACA;IACA;IAEA;IACA;IACA;IAGA;IACA;IACA;IACA;IAGA;IACA;IAGA;CACA;AAED,IAAMC,mBAAmB;IACxB;IAEA;IACA;IACA;IACA;IACA;CACA;AAGDD,eAAe,IAAI,CAAC;AAKb,IAAME,iBAAkB,qBAAGF,gBAAAA,MAAAA,CAAgB,qBAAGC;AAK9C,IAAME,wBAAwB;IACpC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAGA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAGA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAGA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAGA;IACA;IACA;IACA;IAGA;IACA;IAGA;CACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"esm/index.mjs","sources":["../../src/block.js","../../src/Evaluator.js","../../src/TemplateParser.js","../../src/index.js"],"sourcesContent":["const mutableMethods = [\n\t\"Array.prototype.push\",\n\t\"Array.prototype.pop\",\n\t\"Array.prototype.shift\",\n\t\"Array.prototype.unshift\",\n\t\"Array.prototype.splice\",\n\t\"Array.prototype.reverse\",\n\t\"Array.prototype.sort\",\n\t\"Array.prototype.fill\",\n\t\"Array.prototype.copyWithin\",\n\n\t\"Object.defineProperty\",\n\t\"Object.defineProperties\",\n\t\"Object.preventExtensions\",\n\t\"Object.seal\",\n\t\"Object.freeze\",\n\t\"Object.setPrototypeOf\",\n\t\"Object.assign\",\n\t\"Object.prototype.__defineGetter__\",\n\t\"Object.prototype.__defineSetter__\",\n\n\t\"Reflect.set\",\n\t\"Reflect.defineProperty\",\n\t\"Reflect.deleteProperty\",\n\t\"Reflect.setPrototypeOf\",\n\t\"Reflect.preventExtensions\",\n\n\t\"Set.prototype.add\",\n\t\"Set.prototype.delete\",\n\t\"Set.prototype.clear\",\n\t\"WeakSet.prototype.add\",\n\t\"WeakSet.prototype.delete\",\n\n\t\"Map.prototype.set\",\n\t\"Map.prototype.delete\",\n\t\"Map.prototype.clear\",\n\t\"WeakMap.prototype.set\",\n\t\"WeakMap.prototype.delete\",\n\n\t\"Date.prototype.setTime\",\n\t\"Date.prototype.setMilliseconds\",\n\t\"Date.prototype.setUTCSeconds\",\n\t\"Date.prototype.setSeconds\",\n\t\"Date.prototype.setMinutes\",\n\t\"Date.prototype.setHours\",\n\t\"Date.prototype.setDate\",\n\t\"Date.prototype.setMonth\",\n\t\"Date.prototype.setFullYear\",\n\t\"Date.prototype.setYear\",\n\t\"Date.prototype.setUTCMilliseconds\",\n\t\"Date.prototype.setUTCMinutes\",\n\t\"Date.prototype.setUTCHours\",\n\t\"Date.prototype.setUTCDate\",\n\t\"Date.prototype.setUTCMonth\",\n\t\"Date.prototype.setUTCFullYear\",\n\n\t\"RegExp.prototype.compile\",\n\n\t\"Int8Array.prototype.set\",\n\t\"Uint8Array.prototype.set\",\n\t\"Uint8ClampedArray.prototype.set\",\n\t\"Int16Array.prototype.set\",\n\t\"Uint16Array.prototype.set\",\n\t\"Int32Array.prototype.set\",\n\t\"Uint32Array.prototype.set\",\n\t\"Float32Array.prototype.set\",\n\t\"Float64Array.prototype.set\",\n\t\"BigInt64Array.prototype.set\",\n\t\"BigUint64Array.prototype.set\",\n\n\t\"Int8Array.prototype.fill\",\n\t\"Uint8Array.prototype.fill\",\n\t\"Uint8ClampedArray.prototype.fill\",\n\t\"Int16Array.prototype.fill\",\n\t\"Uint16Array.prototype.fill\",\n\t\"Int32Array.prototype.fill\",\n\t\"Uint32Array.prototype.fill\",\n\t\"Float32Array.prototype.fill\",\n\t\"Float64Array.prototype.fill\",\n\t\"BigInt64Array.prototype.fill\",\n\t\"BigUint64Array.prototype.fill\",\n\n\t\"Int8Array.prototype.reverse\",\n\t\"Uint8Array.prototype.reverse\",\n\t\"Uint8ClampedArray.prototype.reverse\",\n\t\"Int16Array.prototype.reverse\",\n\t\"Uint16Array.prototype.reverse\",\n\t\"Int32Array.prototype.reverse\",\n\t\"Uint32Array.prototype.reverse\",\n\t\"Float32Array.prototype.reverse\",\n\t\"Float64Array.prototype.reverse\",\n\t\"BigInt64Array.prototype.reverse\",\n\t\"BigUint64Array.prototype.reverse\",\n\n\t\"Int8Array.prototype.sort\",\n\t\"Uint8Array.prototype.sort\",\n\t\"Uint8ClampedArray.prototype.sort\",\n\t\"Int16Array.prototype.sort\",\n\t\"Uint16Array.prototype.sort\",\n\t\"Int32Array.prototype.sort\",\n\t\"Uint32Array.prototype.sort\",\n\t\"Float32Array.prototype.sort\",\n\t\"Float64Array.prototype.sort\",\n\t\"BigInt64Array.prototype.sort\",\n\t\"BigUint64Array.prototype.sort\",\n\n\t\"Int8Array.prototype.copyWithin\",\n\t\"Uint8Array.prototype.copyWithin\",\n\t\"Uint8ClampedArray.prototype.copyWithin\",\n\t\"Int16Array.prototype.copyWithin\",\n\t\"Uint16Array.prototype.copyWithin\",\n\t\"Int32Array.prototype.copyWithin\",\n\t\"Uint32Array.prototype.copyWithin\",\n\t\"Float32Array.prototype.copyWithin\",\n\t\"Float64Array.prototype.copyWithin\",\n\t\"BigInt64Array.prototype.copyWithin\",\n\t\"BigUint64Array.prototype.copyWithin\",\n\n\t\"ArrayBuffer.prototype.transfer\",\n\t\"ArrayBuffer.prototype.transferToFixedLength\",\n\n\t\"SharedArrayBuffer.prototype.grow\",\n\n\t\"DataView.prototype.setInt8\",\n\t\"DataView.prototype.setUint8\",\n\t\"DataView.prototype.setInt16\",\n\t\"DataView.prototype.setUint16\",\n\t\"DataView.prototype.setInt32\",\n\t\"DataView.prototype.setUint32\",\n\t\"DataView.prototype.setFloat32\",\n\t\"DataView.prototype.setFloat64\",\n\t\"DataView.prototype.setBigInt64\",\n\t\"DataView.prototype.setBigUint64\",\n\n\t\"Promise.prototype.catch\",\n\t\"Promise.prototype.finally\",\n\n\t\"Generator.prototype.next\",\n\t\"Generator.prototype.return\",\n\t\"Generator.prototype.throw\",\n\n\t\"AsyncGenerator.prototype.next\",\n\t\"AsyncGenerator.prototype.return\",\n\t\"AsyncGenerator.prototype.throw\",\n\n\t\"Iterator.prototype.next\",\n\n\t\"WeakRef.prototype.deref\",\n\n\t\"FinalizationRegistry.prototype.register\",\n\t\"FinalizationRegistry.prototype.unregister\",\n\n\t\"URLSearchParams.prototype.append\",\n\t\"URLSearchParams.prototype.delete\",\n\t\"URLSearchParams.prototype.set\",\n\t\"URLSearchParams.prototype.sort\",\n\n\t\"FormData.prototype.append\",\n\t\"FormData.prototype.delete\",\n\t\"FormData.prototype.set\",\n\n\t\"Headers.prototype.append\",\n\t\"Headers.prototype.delete\",\n\t\"Headers.prototype.set\",\n\n\t// Function call/apply/bind can be used to invoke with arbitrary `this`\n\t\"Function.prototype.call\",\n\t\"Function.prototype.apply\",\n\t\"Function.prototype.bind\",\n\t\"Function.prototype.constructor\",\n\n\t// Legacy lookup helpers\n\t\"Object.prototype.__lookupGetter__\",\n\t\"Object.prototype.__lookupSetter__\",\n\n\t// Constructor property can be abused to retrieve the Function constructor\n\t\"Object.prototype.constructor\",\n];\n\nconst dangerousMethods = [\n\t\"Object.getPrototypeOf\",\n\t// Various reflective/object-inspection APIs that may expose internals\n\t\"Object.getOwnPropertyDescriptor\",\n\t\"Object.getOwnPropertyDescriptors\",\n\t\"Object.getOwnPropertyNames\",\n\t\"Object.getOwnPropertySymbols\",\n\t\"Object.getOwnPropertyDescriptors\",\n];\n\n// Some prototype-style aliases/properties that can be used to break sandboxes\nmutableMethods.push(\"Object.prototype.__proto__\");\n\n/**\n * List of methods to block due to mutability or dangerousness\n */\nexport const blockedMethods = [...mutableMethods, ...dangerousMethods];\n\n/**\n * List of global built-ins to block entirely\n */\nexport const blockedGlobalBuiltIns = [\n\t\"Function\",\n\t\"GeneratorFunction\",\n\t\"AsyncFunction\",\n\t\"AsyncGeneratorFunction\",\n\t\"eval\",\n\t\"setTimeout\",\n\t\"setInterval\",\n\t\"clearTimeout\",\n\t\"clearInterval\",\n\t\"setImmediate\",\n\t\"XMLHttpRequest\",\n\t\"fetch\",\n\t\"WebSocket\",\n\t\"globalThis\",\n\n\t// Node / runtime globals\n\t\"process\",\n\t\"require\",\n\t\"module\",\n\t\"exports\",\n\t\"global\",\n\t\"Buffer\",\n\t\"setImmediate\",\n\t\"clearImmediate\",\n\n\t// Worker / threading / messaging\n\t\"importScripts\",\n\t\"Worker\",\n\t\"SharedWorker\",\n\t\"ServiceWorker\",\n\t\"BroadcastChannel\",\n\t\"MessageChannel\",\n\t\"MessagePort\",\n\t\"postMessage\",\n\n\t// Host environment globals (browser)\n\t\"window\",\n\t\"document\",\n\t\"navigator\",\n\t\"location\",\n\t\"localStorage\",\n\t\"sessionStorage\",\n\t\"indexedDB\",\n\t\"performance\",\n\n\t// Low-level / concurrent / binary APIs\n\t\"Proxy\",\n\t\"Reflect\",\n\t\"Atomics\",\n\t\"WebAssembly\",\n\n\t// Console and internationalization\n\t\"console\",\n\t\"Intl\",\n\n\t// Other runtimes\n\t\"Deno\",\n];\n","import * as acorn from \"acorn\";\nimport globals from \"globals\";\nimport { blockedGlobalBuiltIns, blockedMethods } from \"./block.js\";\n\n// Error message constants for better maintainability\nconst ERROR_MESSAGES = {\n\tCAN_NOT_READ_PROPERTY: \"Cannot read property of {0} (reading '{1}')\",\n\tIS_INVALID_SYNTAX: \"{0} is not a valid syntax\",\n\tIS_NOT_FUNCTION: \"{0} is not a function\",\n\tIS_NOT_DEFINED: \"{0} is not defined\",\n\tIS_NOT_ALLOWED: \"{0} is not allowed\",\n};\n\n/**\n * Renders an error message by replacing placeholders with context values.\n * @param {string} template\n * @param {Record<string, any>} context\n * @example\n * ```js\n * const msg = renderErrorMessage(\"Cannot call mutable prototype method: {method}\", { method: \"push\" });\n * ```\n */\nconst renderErrorMessage = (template, context = {}) => template.replace(/{(\\w+)}/g, (_, key) => String(context[key]));\n\nconst BINARY_OPERATION_MAP = {\n\t\"+\": (a, b) => a + b,\n\t\"-\": (a, b) => a - b,\n\t\"*\": (a, b) => a * b,\n\t\"**\": (a, b) => a ** b,\n\t\"==\": (a, b) => a == b,\n\t\"===\": (a, b) => a === b,\n\t\"!=\": (a, b) => a != b,\n\t\"!==\": (a, b) => a !== b,\n\t\">\": (a, b) => a > b,\n\t\">=\": (a, b) => a >= b,\n\t\"<\": (a, b) => a < b,\n\t\"<=\": (a, b) => a <= b,\n\t\"%\": (a, b) => a % b,\n\t\"/\": (a, b) => a / b,\n\t\"|\": (a, b) => a | b,\n\t\"&\": (a, b) => a & b,\n\t\"^\": (a, b) => a ^ b,\n\t\"<<\": (a, b) => a << b,\n\t\">>\": (a, b) => a >> b,\n\t\">>>\": (a, b) => a >>> b,\n\tin: (a, b) => a in b,\n\tinstanceof: (a, b) => a instanceof b,\n};\n\nfunction createGlobalScope() {\n\tconst scope = Object.create(null);\n\tconst { builtin } = globals;\n\n\tfor (const key in builtin) {\n\t\tif (blockedGlobalBuiltIns.includes(key)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t/** @type {boolean} */\n\t\tconst isWritable = builtin[key];\n\n\t\tObject.defineProperty(scope, key, {\n\t\t\tvalue: globalThis[key],\n\t\t\twritable: isWritable,\n\t\t\tenumerable: false,\n\t\t\tconfigurable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(scope, \"globalThis\", {\n\t\tvalue: scope,\n\t\twritable: false,\n\t\tenumerable: false,\n\t\tconfigurable: false,\n\t});\n\n\treturn scope;\n}\n\nconst getBlockedMethods = (() => {\n\t/**\n\t * @type {Map<Function, string>}\n\t */\n\tlet BLOCKED_METHODS = null;\n\n\treturn () => {\n\t\tif (BLOCKED_METHODS) return BLOCKED_METHODS;\n\n\t\tconst map = new Map();\n\t\tfor (const path of blockedMethods) {\n\t\t\tconst [object, ...properties] = path.split(\".\");\n\t\t\tlet current = globalThis[object];\n\t\t\tfor (const prop of properties) {\n\t\t\t\tif (current && Object.hasOwn(current, prop)) {\n\t\t\t\t\tcurrent = current[prop];\n\t\t\t\t} else {\n\t\t\t\t\tcurrent = null;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof current === \"function\") map.set(current, path);\n\t\t}\n\t\tBLOCKED_METHODS = map;\n\n\t\treturn BLOCKED_METHODS;\n\t};\n})();\n\n/**\n * A JavaScript expression evaluator that safely evaluates expressions within a sandboxed environment.\n * Supports various JavaScript features including arithmetic, logical operations, functions, and more.\n *\n * Security features:\n * - Blocks mutable methods to prevent side effects\n * - No access to eval() or Function() constructor\n * - Sandboxed scope with limited global objects\n *\n * @example\n * const evaluator = new Evaluator({ x: 10, y: 20 });\n * evaluator.evaluate('x + y') // returns 30\n */\nexport class Evaluator {\n\t/**\n\t * Creates a new Evaluator instance with a custom variable context.\n\t * The scope hierarchy is: user variables -> global scope\n\t * @param {Object} [variables={}] - An optional object containing variables to make available in the evaluation context\n\t */\n\tconstructor(variables = Object.create(null)) {\n\t\tthis.scopes = [structuredClone(variables), createGlobalScope()].filter((scope) => scope !== null && scope !== undefined);\n\t\tthis.source = undefined;\n\t}\n\n\t/**\n\t * Evaluates a JavaScript expression with an optional context.\n\t * @param {string} expression\n\t * @param {unknown} [context]\n\t * @returns\n\t */\n\tstatic evaluate(expression, context) {\n\t\tconst evaluator = new Evaluator(context);\n\t\treturn evaluator.evaluate(expression);\n\t}\n\n\t/**\n\t * Parses and evaluates a JavaScript expression using acorn parser.\n\t * @param {string} expression - The JavaScript expression to evaluate\n\t * @returns {*} The result of the evaluation\n\t * @throws {SyntaxError} If the expression has invalid syntax\n\t * @throws {ReferenceError} If referencing undefined variables\n\t * @throws {TypeError} If performing invalid operations\n\t */\n\tevaluate(expression) {\n\t\tthis.source = expression;\n\n\t\tconst ast = acorn.parse(expression, { ecmaVersion: \"latest\" });\n\n\t\t// Start recursive evaluation from the root node\n\t\ttry {\n\t\t\treturn this.execute(ast.body);\n\t\t} finally {\n\t\t\tthis.source = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Executes an array of AST body nodes sequentially.\n\t * @private\n\t * @param {Array} body - Array of AST nodes to execute\n\t * @returns {*} The result of the last executed node\n\t */\n\texecute(body) {\n\t\tlet result;\n\n\t\tfor (const node of body) {\n\t\t\tresult = this.visit(node);\n\t\t}\n\n\t\tif (typeof result === \"function\") {\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Returning functions from expressions\"]));\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Visits an AST node and delegates to the appropriate handler based on node type.\n\t * @private\n\t * @param {import(\"acorn\").Node} node - The AST node to visit\n\t * @returns {*} The result of visiting the node\n\t */\n\tvisit(node) {\n\t\tswitch (node.type) {\n\t\t\tcase \"ExpressionStatement\": {\n\t\t\t\treturn this.visit(node.expression);\n\t\t\t}\n\t\t\tcase \"BinaryExpression\": {\n\t\t\t\treturn this.handleBinaryExpression(node);\n\t\t\t}\n\t\t\tcase \"LogicalExpression\": {\n\t\t\t\treturn this.handleLogicalExpression(node);\n\t\t\t}\n\t\t\tcase \"UnaryExpression\": {\n\t\t\t\treturn this.handleUnaryExpression(node);\n\t\t\t}\n\t\t\tcase \"Identifier\": {\n\t\t\t\treturn this.handleIdentifier(node);\n\t\t\t}\n\t\t\tcase \"Literal\": {\n\t\t\t\treturn node.value;\n\t\t\t}\n\t\t\tcase \"MemberExpression\": {\n\t\t\t\treturn this.handleMemberExpression(node);\n\t\t\t}\n\t\t\tcase \"ArrayExpression\": {\n\t\t\t\treturn this.handleArrayExpression(node);\n\t\t\t}\n\t\t\tcase \"SpreadElement\": {\n\t\t\t\treturn this.handleSpreadElement(node);\n\t\t\t}\n\t\t\tcase \"ObjectExpression\": {\n\t\t\t\treturn this.handleObjectExpression(node);\n\t\t\t}\n\t\t\tcase \"FunctionExpression\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Function expression\"]));\n\t\t\t}\n\t\t\tcase \"ArrowFunctionExpression\": {\n\t\t\t\treturn this.handleArrowFunctionExpression(node);\n\t\t\t}\n\t\t\tcase \"CallExpression\": {\n\t\t\t\treturn this.handleCallExpression(node);\n\t\t\t}\n\t\t\tcase \"ConditionalExpression\": {\n\t\t\t\treturn this.visit(node.test) ? this.visit(node.consequent) : this.visit(node.alternate);\n\t\t\t}\n\t\t\tcase \"NewExpression\": {\n\t\t\t\tif (node.callee.type !== \"Identifier\") {\n\t\t\t\t\tthrow new Error(`Unsupported callee type '${node.callee.type}' in new expression`);\n\t\t\t\t}\n\n\t\t\t\tif (node.callee.name === \"Function\") {\n\t\t\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"new Function() constructor\"]));\n\t\t\t\t}\n\n\t\t\t\tconst Constructor = this.visit(node.callee);\n\n\t\t\t\t// 仅在存在参数时构建数组\n\t\t\t\tconst args = node.arguments.length ? node.arguments.map((arg) => this.visit(arg)) : [];\n\n\t\t\t\treturn new Constructor(...args);\n\t\t\t}\n\t\t\tcase \"ChainExpression\": {\n\t\t\t\treturn this.visit(node.expression);\n\t\t\t}\n\t\t\tcase \"TemplateLiteral\": {\n\t\t\t\treturn this.handleTemplateLiteral(node);\n\t\t\t}\n\t\t\tcase \"ThisExpression\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"'this' expression\"]));\n\t\t\t}\n\t\t\tcase \"WithStatement\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"'with' statement\"]));\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tlet content = this.source.slice(node.start, node.end);\n\n\t\t\t\tif (content.length > 20) {\n\t\t\t\t\tcontent = content.slice(0, 17) + \"...\";\n\t\t\t\t}\n\n\t\t\t\tthrow new SyntaxError(`'${content}'` + \" \" + renderErrorMessage(ERROR_MESSAGES.IS_INVALID_SYNTAX, [content]));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles binary expressions (arithmetic and comparison operations).\n\t * @param {import('acorn').BinaryExpression} node\n\t * @private\n\t */\n\thandleBinaryExpression(node) {\n\t\tconst op = node.operator;\n\t\tconst left = this.visit(node.left);\n\t\tconst right = this.visit(node.right);\n\n\t\tif (BINARY_OPERATION_MAP.hasOwnProperty(op)) {\n\t\t\treturn BINARY_OPERATION_MAP[op](left, right);\n\t\t}\n\n\t\tthrow new SyntaxError(`Unsupported operator: ${node.operator}`);\n\t}\n\n\t/**\n\t * Handles logical expressions (&&, ||, ??).\n\t * Implements proper short-circuit evaluation for performance.\n\t * @private\n\t */\n\thandleLogicalExpression(node) {\n\t\tswitch (node.operator) {\n\t\t\tcase \"&&\": {\n\t\t\t\tconst left = this.visit(node.left);\n\t\t\t\treturn left ? this.visit(node.right) : left;\n\t\t\t}\n\t\t\tcase \"||\": {\n\t\t\t\tconst left = this.visit(node.left);\n\t\t\t\treturn left ? left : this.visit(node.right);\n\t\t\t}\n\t\t\tcase \"??\": {\n\t\t\t\tconst left = this.visit(node.left);\n\t\t\t\treturn left !== null && left !== undefined ? left : this.visit(node.right);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new SyntaxError(`Unsupported logical operator: ${node.operator}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles unary expressions (-, +, !, ~, typeof, void).\n\t * @private\n\t */\n\thandleUnaryExpression(node) {\n\t\tswitch (node.operator) {\n\t\t\tcase \"-\": {\n\t\t\t\treturn -this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"+\": {\n\t\t\t\treturn +this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"!\": {\n\t\t\t\treturn !this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"~\": {\n\t\t\t\treturn ~this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"typeof\": {\n\t\t\t\treturn typeof this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"void\": {\n\t\t\t\treturn void this.visit(node.argument);\n\t\t\t}\n\t\t\tcase \"delete\": {\n\t\t\t\tthrow new SyntaxError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Delete operator\"]));\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new SyntaxError(`Unsupported unary operator: ${node.operator}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles identifier (variable) lookups in the scope chain.\n\t * @private\n\t */\n\thandleIdentifier(node) {\n\t\tconst name = node.name;\n\t\tfor (const scope of this.scopes) {\n\t\t\tif (Object.hasOwn(scope, name)) {\n\t\t\t\treturn scope[name];\n\t\t\t}\n\t\t}\n\n\t\tthrow new ReferenceError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_DEFINED, [name]));\n\t}\n\n\t/**\n\t * Handles member expressions (property access like obj.prop or obj[prop]).\n\t * @private\n\t */\n\thandleMemberExpression(node) {\n\t\tconst object = this.visit(node.object);\n\n\t\t// Determine property name: either identifier name or computed value\n\t\tconst isStaticProperty = node.property.type === \"Identifier\" && !node.computed;\n\t\tconst property = isStaticProperty ? node.property.name : this.visit(node.property);\n\n\t\t// Prevent access to prototype properties\n\t\tif (typeof object !== \"undefined\" && object !== null && object[property] === object?.__proto__) {\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Accessing prototype properties\"]));\n\t\t}\n\n\t\tif (object === null || object === undefined) {\n\t\t\t// optional chaining\n\t\t\tif (node.optional) {\n\t\t\t\treturn void 0;\n\t\t\t}\n\t\t\tthrow new TypeError(renderErrorMessage(ERROR_MESSAGES.CAN_NOT_READ_PROPERTY, [object, property]));\n\t\t}\n\n\t\tconst result = object[property];\n\n\t\t// The Function constructor must never be reachable from an expression.\n\t\t// If it escapes as a value, native callbacks (e.g. Promise.then,\n\t\t// Array.prototype.map) invoke it outside the interpreter's call path,\n\t\t// enabling arbitrary host code execution. This is a structural guard:\n\t\t// no matter how many `.constructor` hops an expression takes, the\n\t\t// final value can never be `Function` (or its prototype).\n\t\tif (result === Function || result === Function.prototype) {\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Function constructor\"]));\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Handles array literal expressions.\n\t * @private\n\t */\n\thandleArrayExpression(node) {\n\t\tconst result = [];\n\n\t\tfor (let i = 0; i < node.elements.length; i++) {\n\t\t\tconst element = node.elements.at(i);\n\t\t\tconst value = this.visit(element);\n\n\t\t\tif (element.type === \"SpreadElement\") {\n\t\t\t\tresult.push(...value);\n\t\t\t} else {\n\t\t\t\tresult.push(value);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Handles object literal expressions.\n\t * @returns\n\t */\n\thandleObjectExpression(node) {\n\t\tconst obj = {};\n\t\tfor (const prop of node.properties) {\n\t\t\tif (prop.type === \"SpreadElement\") {\n\t\t\t\tObject.assign(obj, this.visit(prop.argument));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst key = prop.key.name || prop.key.value;\n\t\t\tconst value = this.visit(prop.value);\n\t\t\tobj[key] = value;\n\t\t}\n\t\treturn obj;\n\t}\n\n\thandleSpreadElement(node) {\n\t\treturn this.visit(node.argument);\n\t}\n\n\t/**\n\t * Handles arrow function expressions.\n\t * Creates a closure that captures the current scope and executes the function body\n\t * with parameters bound to a new scope.\n\t * @private\n\t */\n\thandleArrowFunctionExpression(node) {\n\t\treturn (...args) => {\n\t\t\t// Create new scope with parameters bound to arguments\n\t\t\tconst newScope = {};\n\t\t\tconst paramCount = node.params.length;\n\t\t\tfor (let i = 0; i < paramCount; i++) {\n\t\t\t\tnewScope[node.params[i].name] = args[i];\n\t\t\t}\n\n\t\t\t// Push new scope, evaluate body, then pop scope\n\t\t\tthis.scopes.unshift(newScope);\n\t\t\tconst result = this.visit(node.body);\n\t\t\tthis.scopes.shift();\n\t\t\treturn result;\n\t\t};\n\t}\n\n\t/**\n\t * Handles function call expressions, including optional chaining.\n\t * @private\n\t */\n\thandleCallExpression(node) {\n\t\tconst func = this.visit(node.callee);\n\n\t\tconst isOptional = node.optional || node.callee.optional;\n\t\tif ((func === undefined || func === null) && isOptional) {\n\t\t\treturn void 0;\n\t\t}\n\n\t\tif (func === Function) {\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Function constructor\"]));\n\t\t}\n\n\t\tif (getBlockedMethods().has(func)) {\n\t\t\tconst path = getBlockedMethods().get(func);\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [path]));\n\t\t}\n\n\t\t// 仅在存在参数时构建数组\n\t\tconst args = (() => {\n\t\t\tif (node.arguments.length === 0) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tlet result = [];\n\n\t\t\tfor (let i = 0; i < node.arguments.length; i++) {\n\t\t\t\tconst element = node.arguments.at(i);\n\t\t\t\tconst value = this.visit(element);\n\n\t\t\t\tif (element.type === \"SpreadElement\") {\n\t\t\t\t\tresult.push(...value);\n\t\t\t\t} else {\n\t\t\t\t\tresult.push(value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t})();\n\n\t\tconst target = node.callee.type === \"MemberExpression\" ? this.visit(node.callee.object) : null;\n\n\t\t// Defense in depth: even if a `Function` reference were somehow\n\t\t// produced by an expression, it must not be passed as an argument.\n\t\t// Native methods (Promise.then, Array.prototype.map, ...) would\n\t\t// invoke it in the host runtime, outside this interpreter's checks.\n\t\tif (args.some((arg) => arg === Function)) {\n\t\t\tthrow new Error(renderErrorMessage(ERROR_MESSAGES.IS_NOT_ALLOWED, [\"Function constructor\"]));\n\t\t}\n\n\t\tif (typeof func !== \"function\") {\n\t\t\tconst calledString = getNodeString(node.callee);\n\t\t\tthrow new TypeError(renderErrorMessage(ERROR_MESSAGES.IS_NOT_FUNCTION, [calledString]));\n\t\t}\n\n\t\treturn func.apply(target, args);\n\t}\n\n\t/**\n\t * Handles template literal expressions.\n\t * More efficient implementation that interleaves quasis and expressions without sorting.\n\t * @private\n\t */\n\thandleTemplateLiteral(node) {\n\t\tlet result = \"\";\n\t\tconst expressionCount = node.expressions.length;\n\n\t\tfor (let i = 0; i < node.quasis.length; i++) {\n\t\t\tresult += node.quasis[i].value.raw;\n\t\t\tif (i < expressionCount) {\n\t\t\t\tresult += this.visit(node.expressions[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n}\n\n/**\n *\n * @param {import('acorn').Node} node\n * @returns\n */\nexport function getNodeString(node) {\n\tswitch (node.type) {\n\t\tcase \"Identifier\": {\n\t\t\treturn node.name;\n\t\t}\n\t\tcase \"Literal\": {\n\t\t\treturn node.raw;\n\t\t}\n\t\tcase \"ArrayExpression\": {\n\t\t\treturn `[${node.elements.map((child) => getNodeString(child)).join(\",\")}]`;\n\t\t}\n\t\tcase \"ObjectExpression\": {\n\t\t\t// if keys is empty\n\t\t\tif (node.properties.length === 0) {\n\t\t\t\treturn \"{}\";\n\t\t\t}\n\n\t\t\treturn \"{(intermediate value)}\";\n\t\t}\n\t\tcase \"MemberExpression\": {\n\t\t\tconst objectStr = getNodeString(node.object);\n\t\t\tconst propertyStr = getNodeString(node.property);\n\n\t\t\tif (node.computed) {\n\t\t\t\treturn `${objectStr}[${propertyStr}]`;\n\t\t\t}\n\t\t\treturn `${objectStr}.${propertyStr}`;\n\t\t}\n\t\tdefault: {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n","/**\n * 简单状态机模板解析器\n * 能够正确处理表达式中包含字符串、转义字符和结束标记的情况\n * @class SimpleStateTemplateParser\n */\nclass TemplateParser {\n\t/**\n\t * 创建解析器实例\n\t * @param {Object} [options] - 配置选项\n\t * @param {string} [options.expressionStart='{{'] - 表达式开始标记\n\t * @param {string} [options.expressionEnd='}}'] - 表达式结束标记\n\t * @param {boolean} [options.preserveWhitespace=true] - 是否保留表达式周围的空白字符\n\t */\n\tconstructor(options = {}) {\n\t\t// 表达式标记配置\n\t\tthis.exprStart = options.expressionStart || \"{{\";\n\t\tthis.exprEnd = options.expressionEnd || \"}}\";\n\n\t\t// 标记长度缓存,避免重复计算\n\t\tthis.startLen = this.exprStart.length;\n\t\tthis.endLen = this.exprEnd.length;\n\n\t\t// 其他配置\n\t\tthis.preserveWhitespace = options.preserveWhitespace === true;\n\t}\n\n\t/**\n\t * 解析模板字符串,将其转换为 token 数组\n\t * @param {string} template - 要解析的模板字符串\n\t * @returns {Array<{type: string, value: string}>} token 数组\n\t */\n\tparse(template) {\n\t\t// 输入验证\n\t\tif (typeof template !== \"string\") {\n\t\t\tthrow new TypeError(\"模板必须是字符串\");\n\t\t}\n\n\t\tconst tokens = []; // 存储解析结果的 token 数组\n\t\tconst length = template.length;\n\n\t\t// 状态机变量\n\t\tlet state = \"TEXT\"; // 当前状态:TEXT | EXPR | STRING_SQ | STRING_DQ | TEMPLATE | ESCAPE_*\n\t\tlet buffer = \"\"; // 当前状态的字符缓冲区\n\t\tlet exprStartPos = 0; // 当前表达式的开始位置(用于错误恢复)\n\t\tlet pos = 0; // 当前扫描位置\n\n\t\t// 主解析循环:逐个字符扫描模板\n\t\twhile (pos < length) {\n\t\t\tconst char = template[pos];\n\t\t\tconst nextChar = template[pos + 1];\n\n\t\t\t// 状态机核心逻辑\n\t\t\tswitch (state) {\n\t\t\t\t// ==================== 文本状态 ====================\n\t\t\t\tcase \"TEXT\":\n\t\t\t\t\t// 检查是否遇到表达式开始标记\n\t\t\t\t\tif (this._isMatch(pos, template, this.exprStart)) {\n\t\t\t\t\t\t// 将缓冲区中的文本保存为 token\n\t\t\t\t\t\tif (buffer.length > 0) {\n\t\t\t\t\t\t\ttokens.push({ type: \"text\", value: buffer, start: pos - buffer.length, end: pos });\n\t\t\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// 切换到表达式状态\n\t\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\t\texprStartPos = pos; // 记录表达式开始位置\n\t\t\t\t\t\tpos += this.startLen; // 跳过开始标记\n\t\t\t\t\t\tcontinue; // 继续处理下一个字符(跳过本次循环的剩余部分)\n\t\t\t\t\t}\n\t\t\t\t\t// 普通文本字符,添加到缓冲区\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// ==================== 表达式状态 ====================\n\t\t\t\tcase \"EXPR\":\n\t\t\t\t\t// 在表达式中,需要处理各种字符串和转义字符\n\t\t\t\t\tif (char === \"'\") {\n\t\t\t\t\t\t// 进入单引号字符串状态\n\t\t\t\t\t\tstate = \"STRING_SQ\";\n\t\t\t\t\t} else if (char === '\"') {\n\t\t\t\t\t\t// 进入双引号字符串状态\n\t\t\t\t\t\tstate = \"STRING_DQ\";\n\t\t\t\t\t} else if (char === \"`\") {\n\t\t\t\t\t\t// 进入模板字符串状态\n\t\t\t\t\t\tstate = \"TEMPLATE\";\n\t\t\t\t\t} else if (char === \"\\\\\") {\n\t\t\t\t\t\t// 遇到转义字符,根据当前上下文进入相应的转义状态\n\t\t\t\t\t\tif (nextChar === \"'\") state = \"ESCAPE_SQ\";\n\t\t\t\t\t\telse if (nextChar === '\"') state = \"ESCAPE_DQ\";\n\t\t\t\t\t\telse if (nextChar === \"`\") state = \"ESCAPE_TEMPLATE\";\n\t\t\t\t\t\telse state = \"ESCAPE_EXPR\";\n\t\t\t\t\t} else if (this._isMatch(pos, template, this.exprEnd)) {\n\t\t\t\t\t\t// 找到表达式结束标记,且不在字符串中\n\t\t\t\t\t\tconst exprValue = this.preserveWhitespace ? buffer : buffer.trim();\n\t\t\t\t\t\tif (exprValue.length > 0) {\n\t\t\t\t\t\t\ttokens.push({\n\t\t\t\t\t\t\t\ttype: \"expression\",\n\t\t\t\t\t\t\t\tvalue: exprValue,\n\t\t\t\t\t\t\t\tstart: exprStartPos,\n\t\t\t\t\t\t\t\tend: pos + this.endLen,\n\t\t\t\t\t\t\t\tcontentStart: exprStartPos + this.startLen,\n\t\t\t\t\t\t\t\tcontentEnd: pos,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// 重置状态,准备处理后续文本\n\t\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\t\tstate = \"TEXT\";\n\t\t\t\t\t\tpos += this.endLen; // 跳过结束标记\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t// 将当前字符添加到表达式缓冲区\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// ==================== 字符串状态 ====================\n\t\t\t\tcase \"STRING_SQ\": // 单引号字符串\n\t\t\t\t\tif (char === \"\\\\\") {\n\t\t\t\t\t\tstate = \"ESCAPE_SQ\"; // 遇到转义字符\n\t\t\t\t\t} else if (char === \"'\") {\n\t\t\t\t\t\tstate = \"EXPR\"; // 字符串结束,回到表达式状态\n\t\t\t\t\t}\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"STRING_DQ\": // 双引号字符串\n\t\t\t\t\tif (char === \"\\\\\") {\n\t\t\t\t\t\tstate = \"ESCAPE_DQ\";\n\t\t\t\t\t} else if (char === '\"') {\n\t\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\t}\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"TEMPLATE\": // 模板字符串\n\t\t\t\t\tif (char === \"\\\\\") {\n\t\t\t\t\t\tstate = \"ESCAPE_TEMPLATE\";\n\t\t\t\t\t} else if (char === \"`\") {\n\t\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\t}\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// ==================== 转义状态 ====================\n\t\t\t\t// 转义状态:处理转义字符,然后返回到之前的状态\n\t\t\t\tcase \"ESCAPE_SQ\":\n\t\t\t\t\tbuffer += char; // 添加转义后的字符\n\t\t\t\t\tstate = \"STRING_SQ\"; // 回到单引号字符串状态\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ESCAPE_DQ\":\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tstate = \"STRING_DQ\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ESCAPE_TEMPLATE\":\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tstate = \"TEMPLATE\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ESCAPE_EXPR\":\n\t\t\t\t\tbuffer += char;\n\t\t\t\t\tstate = \"EXPR\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// 移动到下一个字符\n\t\t\tpos++;\n\t\t}\n\n\t\t// ==================== 后处理 ====================\n\t\t// 处理扫描结束后缓冲区中剩余的内容\n\t\tif (buffer.length > 0) {\n\t\t\tif (state === \"TEXT\") {\n\t\t\t\t// 剩余的文本内容\n\t\t\t\ttokens.push({ type: \"text\", value: buffer, start: pos - buffer.length, end: pos });\n\t\t\t} else {\n\t\t\t\t// 未完成的表达式,将其作为普通文本处理\n\t\t\t\t// 这里可以根据需要选择不同的错误处理策略:\n\t\t\t\t// 1. 抛出错误\n\t\t\t\t// 2. 忽略未完成的表达式\n\t\t\t\t// 3. 将其作为文本处理(当前实现)\n\t\t\t\tconst incompleteExpr = this.exprStart + buffer;\n\t\t\t\ttokens.push({ type: \"text\", value: incompleteExpr, start: exprStartPos, end: pos });\n\n\t\t\t\t// 可选:输出警告\n\t\t\t\tconsole.warn(`警告:在位置 ${exprStartPos} 开始的表达式未正确结束`);\n\t\t\t}\n\t\t}\n\n\t\treturn tokens;\n\t}\n\n\t/**\n\t * 检查指定位置是否匹配给定的字符序列\n\t * @param {number} pos - 开始检查的位置\n\t * @param {string} template - 模板字符串\n\t * @param {string} sequence - 要匹配的字符序列\n\t * @returns {boolean} 是否匹配\n\t * @private\n\t */\n\t_isMatch(pos, template, sequence) {\n\t\t// 检查剩余长度是否足够\n\t\tif (pos + sequence.length > template.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// 逐个字符比较\n\t\tfor (let i = 0; i < sequence.length; i++) {\n\t\t\tif (template[pos + i] !== sequence[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * 静态方法:快速解析模板\n\t * @param {string} template - 模板字符串\n\t * @param {Object} [options] - 配置选项\n\t * @returns {Array} token 数组\n\t */\n\tstatic parse(template, options) {\n\t\tconst parser = new TemplateParser(options);\n\t\treturn parser.parse(template);\n\t}\n}\n\nexport { TemplateParser };\n","import { Evaluator } from \"./Evaluator.js\";\nimport { TemplateParser } from \"./TemplateParser.js\";\n\nexport { Evaluator, TemplateParser };\n\n/**\n * Evaluates a JavaScript expression with an optional context.\n * @param {string} expression - The JavaScript expression to evaluate\n * @param {unknown} [context] - Optional context object with variables to use in the expression\n * @returns {*} The result of evaluating the expression\n * @example\n * evalExpression('a + b', { a: 1, b: 2 }) // returns 3\n */\nexport function evalExpression(expression, context) {\n\treturn Evaluator.evaluate(expression, context);\n}\n\n/**\n * Evaluates a template string by replacing {{ expression }} patterns with their evaluated values.\n * Undefined variables in expressions are replaced with empty strings instead of throwing errors.\n * @param {string} template - The template string containing {{ expression }} patterns\n * @param {Object} [context] - Optional context object with variables to use in expressions\n * @param {Object} [templateParserOptions] - Optional options for the template parser\n * @returns {string} The template with all expressions evaluated and replaced\n * @example\n * evalTemplate('Hello {{ name }}!', { name: 'World' }) // returns 'Hello World!'\n */\nexport function evalTemplate(template, context, templateParserOptions) {\n\tlet result = \"\";\n\n\tconst typeHandler = {\n\t\ttext: (token) => token.value,\n\t\texpression: (token) => {\n\t\t\ttry {\n\t\t\t\treturn Evaluator.evaluate(token.value, context);\n\t\t\t} catch (error) {\n\t\t\t\t// Replace undefined variables with empty string for graceful degradation\n\t\t\t\tif (error instanceof ReferenceError && error.message.endsWith(\"is not defined\")) {\n\t\t\t\t\treturn \"undefined\";\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n\n\tfor (const token of TemplateParser.parse(template, templateParserOptions)) {\n\t\t// Unknown token type, treat as text\n\t\tconst handler = typeHandler[token.type] ?? typeHandler[\"text\"];\n\n\t\tresult += handler(token);\n\t}\n\n\treturn result;\n}\n"],"names":["mutableMethods","dangerousMethods","blockedMethods","blockedGlobalBuiltIns","ERROR_MESSAGES","renderErrorMessage","template","context","_","key","String","BINARY_OPERATION_MAP","a","b","_instanceof","createGlobalScope","scope","Object","builtin","globals","isWritable","globalThis","getBlockedMethods","BLOCKED_METHODS","map","Map","_iteratorError","path","_path_split","object","properties","current","_iteratorError1","prop","Evaluator","variables","structuredClone","undefined","evaluate","expression","ast","acorn","execute","body","result","node","Error","visit","SyntaxError","Constructor","args","arg","content","handleBinaryExpression","op","left","right","handleLogicalExpression","left1","left2","handleUnaryExpression","_type_of","handleIdentifier","name","ReferenceError","handleMemberExpression","isStaticProperty","property","TypeError","Function","handleArrayExpression","i","element","value","_result","handleObjectExpression","obj","handleSpreadElement","handleArrowFunctionExpression","newScope","paramCount","handleCallExpression","func","isOptional","target","calledString","getNodeString","handleTemplateLiteral","expressionCount","evaluator","child","objectStr","propertyStr","TemplateParser","options","parse","tokens","length","state","buffer","exprStartPos","pos","char","nextChar","exprValue","incompleteExpr","console","_isMatch","sequence","parser","evalExpression","evalTemplate","templateParserOptions","typeHandler","token","error","_typeHandler_token_type","handler"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAMA,iBAAiB;IACtB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IAEA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IAEA;IACA;IACA;IAEA;IACA;IACA;IAEA;IAEA;IAEA;IACA;IAEA;IACA;IACA;IACA;IAEA;IACA;IACA;IAEA;IACA;IACA;IAGA;IACA;IACA;IACA;IAGA;IACA;IAGA;CACA;AAED,IAAMC,mBAAmB;IACxB;IAEA;IACA;IACA;IACA;IACA;CACA;AAGDD,eAAe,IAAI,CAAC;AAKb,IAAME,iBAAkB,qBAAGF,gBAAAA,MAAAA,CAAgB,qBAAGC;AAK9C,IAAME,wBAAwB;IACpC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAGA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAGA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAGA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAGA;IACA;IACA;IACA;IAGA;IACA;IAGA;CACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ecma-evaluator",
3
- "version": "2.0.7",
3
+ "version": "2.0.9",
4
4
  "private": false,
5
5
  "description": "A tiny and fast JavaScript expression evaluator.",
6
6
  "sideEffects": false,