@variojs/core 0.1.1 → 0.1.3
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/dist/index.d.ts +103 -289
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/package.json +10 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/proxy.ts","../src/errors.ts","../src/expression/parser.ts","../src/expression/whitelist.ts","../src/runtime/sandbox.ts","../src/expression/evaluator.ts","../src/expression/dependencies.ts","../src/expression/compiler.ts","../src/runtime/path.ts","../src/expression/cache.ts","../src/expression/evaluate.ts","../src/vm/handlers/set.ts","../src/vm/handlers/emit.ts","../src/expression/utils.ts","../src/vm/executor.ts","../src/vm/handlers/if.ts","../src/runtime/loop-context-pool.ts","../src/vm/handlers/loop.ts","../src/vm/handlers/call.ts","../src/vm/handlers/batch.ts","../src/vm/handlers/navigate.ts","../src/vm/handlers/log.ts","../src/vm/handlers/array/utils.ts","../src/vm/handlers/array/push.ts","../src/vm/handlers/array/pop.ts","../src/vm/handlers/array/shift.ts","../src/vm/handlers/array/unshift.ts","../src/vm/handlers/array/splice.ts","../src/vm/handlers/index.ts","../src/runtime/create-context.ts","../src/runtime/traversal.ts","../src/schema/analyzer.ts","../src/schema/query-engine.ts"],"names":["createProxy","ctx","allowedSpecialVars","target","prop","value","propName","VarioError","_VarioError","message","code","context","parts","ActionError","action","ExpressionError","expression","ServiceError","service","originalError","BatchError","failedActions","ErrorCodes","parseExpression","expr","statement","parse","error","errorMessage","WHITELISTED_GLOBALS","WHITELISTED_FUNCTIONS","isGlobalObjectName","name","ALLOWED_NODE_TYPES","FORBIDDEN_NODE_TYPES","DEFAULT_MAX_NESTING_DEPTH","validateAST","ast","options","allowGlobals","maxNestingDepth","errors","getFunctionName","callee","member","traverse","node","path","depth","call","funcName","isGlobalFunction","isObjectMethod","objName","key","child","index","createExpressionSandbox","isSafePropertyAccess","SAFE_ARRAY_METHODS","DANGEROUS_PROPERTIES","isDangerousProperty","RUNTIME_HELPERS","str","length","len","date","_format","evaluateExpression","mergedOptions","maxSteps","timeout","stepCount","startTime","getGlobalValueByName","checkLimits","evaluate","literal","globalValue","object","binary","left","right","operator","logical","unary","argument","conditional","test","funcObj","callContext","obj","methodName","isWhitelisted","args","arg","el","result","template","i","extractDependencies","dependencies","id","basePath","compiledCache","containsDangerousProperty","segment","extractStaticPath","compileSimpleExpression","globalObjectNames","firstSegment","getCompiledExpression","compiled","pathCache","parsePath","segments","current","char","parseSegment","closeIndex","indexStr","parsePathCached","cached","clearPathCache","stringifyPath","getPathValue","setPathValue","createIntermediate","createObject","createArray","lastSegment","parentSegments","nextIsArrayIndex","targetObj","matchPath","pattern","parentPath","getParentPath","getLastSegment","cacheMap","CACHE_CONFIG","getCache","cache","isCacheValid","entry","dep","evictOldest","oldestKey","oldestTime","getCachedExpression","setCachedExpression","invalidateCache","changedPath","toDelete","clearCache","getCacheStats","handleSet","finalValue","handleEmit","event","data","finalData","extractExpression","execute","actions","abortController","timeoutId","cleanup","executeActions","signal","_maxSteps","handler","handleIf","cond","then","elseBranch","condExpr","LoopContextPool","maxSize","keysToDelete","globalPool","getLoopContextPool","createLoopContext","parentCtx","item","baseCtx","loopCtx","releaseLoopContext","handleLoop","varName","inExpr","body","iterable","entries","handleCall","method","rawParams","resultTo","finalParams","evaluatedParams","handleBatch","act","handleNavigate","to","finalTo","navigateHandler","handleLog","level","finalMessage","logLevel","messageStr","evaluateExpressionsRecursively","val","handlePush","items","array","inputValue","handlePop","handleShift","handleUnshift","handleSplice","start","deleteCount","finalStart","finalDeleteCount","finalItems","evaluated","BUILTIN_METHODS","registerBuiltinMethods","createRuntimeContext","initialState","validateStateKeys","onEmit","methods","onStateChange","exprOptions","proxiedRef","proxied","state","traverseSchema","root","callback","separator","walk","parent","childPath","analyzeSchema","schema","stats","idMap","pathMap","nodeWithId","findNodes","predicate","results","findNode","findPathById","createQueryEngine","currentPath","lastDot"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Proxy 沙箱实现\n * \n * 功能:\n * - 防止覆盖系统 API($ 和 _ 前缀保护)\n * - 拦截属性设置操作\n */\n\nimport type { RuntimeContext } from '../types.js'\n\n/**\n * 创建受保护的 Proxy 上下文\n * 禁止设置以 $ 或 _ 开头的属性\n * \n * @template T 上下文类型,必须是 RuntimeContext 的子类型\n * @param ctx 运行时上下文对象\n * @returns 受保护的 Proxy 包装的上下文\n */\nexport function createProxy<T extends RuntimeContext>(ctx: T): T {\n // 允许设置和删除的特殊变量(循环/事件上下文变量;vario-vue 节点关系扩展)\n // 注意:$methods 不在此列表中,不允许被整体覆盖\n const allowedSpecialVars = [\n '$event',\n '$item',\n '$index',\n '$self',\n '$parent',\n '$siblings',\n '$children'\n ]\n \n return new Proxy(ctx, {\n set(target, prop, value) {\n const propName = String(prop)\n \n // 禁止覆盖系统 API\n if (propName.startsWith('$') || propName.startsWith('_')) {\n // 允许设置特殊变量\n if (allowedSpecialVars.includes(propName)) {\n return Reflect.set(target, prop, value)\n }\n \n throw new Error(\n `Cannot override system API: ${propName}. ` +\n `Properties starting with \"$\" or \"_\" are protected.`\n )\n }\n \n return Reflect.set(target, prop, value)\n },\n \n get(target, prop) {\n return Reflect.get(target, prop)\n },\n \n has(target, prop) {\n return Reflect.has(target, prop)\n },\n \n deleteProperty(target, prop) {\n const propName = String(prop)\n \n // 禁止删除系统 API\n if (propName.startsWith('$') || propName.startsWith('_')) {\n // 允许删除特殊变量\n if (allowedSpecialVars.includes(propName)) {\n return Reflect.deleteProperty(target, prop)\n }\n throw new Error(`Cannot delete system API: ${propName}`)\n }\n \n return Reflect.deleteProperty(target, prop)\n }\n })\n}\n","/**\n * Vario 错误处理体系\n * \n * 统一的错误基类和错误码系统\n */\n\nimport type { Action } from './types.js'\n\n/**\n * 错误上下文信息\n */\nexport interface ErrorContext {\n /** Schema 路径(如 \"events.click[0]\") */\n schemaPath?: string\n /** 表达式字符串 */\n expression?: string\n /** 动作对象 */\n action?: Action\n /** 调用栈(简化版) */\n stack?: string[]\n /** 额外上下文信息 */\n metadata?: Record<string, unknown>\n}\n\n/**\n * Vario 错误基类\n * \n * 所有 Vario 相关错误都应继承此类\n */\nexport class VarioError extends Error {\n /** 错误码 */\n public readonly code: string\n /** 错误上下文 */\n public readonly context: ErrorContext\n\n constructor(\n message: string,\n code: string,\n context: ErrorContext = {}\n ) {\n super(message)\n this.name = 'VarioError'\n this.code = code\n this.context = context\n \n // 确保 stack 属性存在\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, VarioError)\n }\n }\n\n /**\n * 获取友好的错误消息\n */\n getFriendlyMessage(): string {\n const parts: string[] = [this.message]\n \n if (this.context.schemaPath) {\n parts.push(`\\n Schema 路径: ${this.context.schemaPath}`)\n }\n \n if (this.context.expression) {\n parts.push(`\\n 表达式: ${this.context.expression}`)\n }\n \n if (this.context.action) {\n parts.push(`\\n 动作类型: ${this.context.action.type}`)\n }\n \n return parts.join('')\n }\n\n /**\n * 转换为 JSON(用于序列化)\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n context: this.context,\n stack: this.stack\n }\n }\n}\n\n/**\n * 动作执行错误\n */\nexport class ActionError extends VarioError {\n constructor(\n action: Action,\n message: string,\n code: string = 'ACTION_ERROR',\n context: Omit<ErrorContext, 'action'> = {}\n ) {\n super(message, code, {\n ...context,\n action\n })\n this.name = 'ActionError'\n }\n}\n\n/**\n * 表达式求值错误\n */\nexport class ExpressionError extends VarioError {\n constructor(\n expression: string,\n message: string,\n code: string = 'EXPRESSION_ERROR',\n context: Omit<ErrorContext, 'expression'> = {}\n ) {\n super(message, code, {\n ...context,\n expression\n })\n this.name = 'ExpressionError'\n }\n}\n\n/**\n * 服务调用错误\n */\nexport class ServiceError extends VarioError {\n public readonly service: string\n public readonly originalError?: Error\n\n constructor(\n service: string,\n message: string,\n originalError?: Error,\n context: ErrorContext = {}\n ) {\n super(message, 'SERVICE_ERROR', context)\n this.name = 'ServiceError'\n this.service = service\n this.originalError = originalError\n }\n}\n\n/**\n * 批量执行错误\n */\nexport class BatchError extends VarioError {\n public readonly failedActions: Array<{ action: Action; error: Error }>\n\n constructor(\n failedActions: Array<{ action: Action; error: Error }>,\n message: string,\n context: ErrorContext = {}\n ) {\n super(message, 'BATCH_ERROR', context)\n this.name = 'BatchError'\n this.failedActions = failedActions\n }\n}\n\n/**\n * 错误码定义\n */\nexport const ErrorCodes = {\n // 动作相关错误\n ACTION_UNKNOWN_TYPE: 'ACTION_UNKNOWN_TYPE',\n ACTION_EXECUTION_ERROR: 'ACTION_EXECUTION_ERROR',\n ACTION_ABORTED: 'ACTION_ABORTED',\n ACTION_TIMEOUT: 'ACTION_TIMEOUT',\n ACTION_MAX_STEPS_EXCEEDED: 'ACTION_MAX_STEPS_EXCEEDED',\n ACTION_MISSING_PARAM: 'ACTION_MISSING_PARAM',\n ACTION_INVALID_PARAM: 'ACTION_INVALID_PARAM',\n \n // 表达式相关错误\n EXPRESSION_PARSE_ERROR: 'EXPRESSION_PARSE_ERROR',\n EXPRESSION_VALIDATION_ERROR: 'EXPRESSION_VALIDATION_ERROR',\n EXPRESSION_EVALUATION_ERROR: 'EXPRESSION_EVALUATION_ERROR',\n EXPRESSION_TIMEOUT: 'EXPRESSION_TIMEOUT',\n EXPRESSION_MAX_STEPS_EXCEEDED: 'EXPRESSION_MAX_STEPS_EXCEEDED',\n EXPRESSION_UNSAFE_ACCESS: 'EXPRESSION_UNSAFE_ACCESS',\n EXPRESSION_FUNCTION_NOT_WHITELISTED: 'EXPRESSION_FUNCTION_NOT_WHITELISTED',\n \n // 服务相关错误\n SERVICE_NOT_FOUND: 'SERVICE_NOT_FOUND',\n SERVICE_CALL_ERROR: 'SERVICE_CALL_ERROR',\n \n // 批量执行错误\n BATCH_ERROR: 'BATCH_ERROR',\n \n // Schema 相关错误\n SCHEMA_VALIDATION_ERROR: 'SCHEMA_VALIDATION_ERROR',\n SCHEMA_INVALID_ACTION: 'SCHEMA_INVALID_ACTION',\n} as const\n\nexport type ErrorCode = typeof ErrorCodes[keyof typeof ErrorCodes]\n","/**\n * 表达式解析器\n * \n * 使用 @babel/parser 解析 JavaScript 表达式为 AST\n * 移除 models. 前缀支持\n */\n\nimport { parse } from '@babel/parser'\nimport type * as ESTree from '@babel/types'\nimport { ExpressionError, ErrorCodes } from '../errors.js'\n\n/**\n * 解析表达式为 AST\n * \n * @param expr 表达式字符串(如 \"user.name + 1\")\n * @returns ESTree.Node AST 节点\n */\nexport function parseExpression(expr: string): ESTree.Node {\n try {\n // 解析为表达式(ExpressionStatement)\n const ast = parse(`(${expr})`, {\n plugins: ['typescript'],\n sourceType: 'module',\n allowReturnOutsideFunction: true,\n })\n \n // 提取表达式部分\n const statement = ast.program.body[0]\n if (statement?.type === 'ExpressionStatement') {\n return statement.expression\n }\n \n throw new ExpressionError(\n expr,\n `Failed to parse expression: ${expr}`,\n ErrorCodes.EXPRESSION_PARSE_ERROR\n )\n } catch (error: unknown) {\n if (error instanceof ExpressionError) {\n throw error\n }\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new ExpressionError(\n expr,\n `Expression parse error: ${errorMessage}`,\n ErrorCodes.EXPRESSION_PARSE_ERROR,\n {\n metadata: {\n originalError: error instanceof Error ? error.name : 'Unknown'\n }\n }\n )\n }\n}\n","/**\n * AST 白名单验证器\n * \n * 功能:\n * - 深度遍历 AST,检查每个节点\n * - 只允许安全的语法节点\n * - 禁止危险的语法(赋值、函数、this 等)\n * - 检查函数调用中的函数名是否在白名单中\n */\n\nimport type * as ESTree from '@babel/types'\nimport { ExpressionError, ErrorCodes } from '../errors.js'\n\n/**\n * 白名单全局函数\n */\nconst WHITELISTED_GLOBALS = new Set([\n 'String', 'Number', 'Boolean', 'BigInt', 'Symbol',\n 'Array', 'Object', 'Math', 'Date',\n])\n\n/**\n * 白名单函数(带命名空间)\n */\nconst WHITELISTED_FUNCTIONS = new Set([\n 'Array.isArray',\n 'Object.is',\n 'Number.isFinite',\n 'Number.isInteger',\n 'Number.isNaN',\n 'Number.isSafeInteger',\n 'Math.abs',\n 'Math.round',\n 'Math.floor',\n 'Math.ceil',\n 'Math.random',\n 'Math.max',\n 'Math.min',\n 'Date.now',\n])\n\n/**\n * 检查名称是否为全局对象名称\n */\nfunction isGlobalObjectName(name: string): boolean {\n return ['window', 'document', 'global', 'globalThis', 'self'].includes(name)\n}\n\n/**\n * 允许的 AST 节点类型\n * \n * 注意:@babel/types 可能使用更具体的字面量类型(如 NumericLiteral, StringLiteral)\n * 这些都应该被允许,因为它们都是 Literal 的子类型\n */\nconst ALLOWED_NODE_TYPES = new Set([\n 'MemberExpression', // 成员访问:user.name\n 'OptionalMemberExpression', // 可选链:user?.name\n 'ArrayExpression', // 数组字面量:[1, 2, 3]\n 'ObjectExpression', // 对象字面量:{ a: 1 }\n 'ObjectProperty', // 对象属性:{ a: 1 } 中的 a: 1\n 'Literal', // 字面量:'string', 123, true\n 'NumericLiteral', // 数字字面量:123(@babel/types 的具体类型)\n 'StringLiteral', // 字符串字面量:'string'\n 'BooleanLiteral', // 布尔字面量:true, false\n 'NullLiteral', // null 字面量\n 'Identifier', // 标识符:user, name\n 'BinaryExpression', // 二元运算:a + b\n 'LogicalExpression', // 逻辑运算:a && b\n 'UnaryExpression', // 一元运算:!a, -b\n 'ConditionalExpression', // 三元表达式:a ? b : c\n 'CallExpression', // 函数调用:Math.max()\n 'TemplateLiteral', // 模板字符串:`${name}`\n 'SequenceExpression', // 序列表达式:(a, b)\n 'NullishCoalescingExpression', // 空值合并:a ?? b\n])\n\n/**\n * 禁止的 AST 节点类型\n */\nconst FORBIDDEN_NODE_TYPES = new Set([\n 'AssignmentExpression', // 赋值:a = b\n 'UpdateExpression', // 自增/自减:a++, --b\n 'FunctionExpression', // 函数表达式:function() {}\n 'ArrowFunctionExpression', // 箭头函数:() => {}\n 'ThisExpression', // this\n 'NewExpression', // new 运算符\n 'YieldExpression', // yield\n 'AwaitExpression', // await\n 'ImportExpression', // import()\n 'MetaProperty', // import.meta\n 'SpreadElement', // 展开运算符:...array(在函数调用中不安全)\n])\n\n/**\n * 默认最大嵌套深度(防止 DoS 攻击)\n */\nconst DEFAULT_MAX_NESTING_DEPTH = 50\n\n/**\n * 验证 AST 是否通过白名单检查\n * \n * @param ast AST 节点\n * @param options 验证选项\n * @param options.allowGlobals 是否允许全局函数调用(跳过白名单检查)\n * @param options.maxNestingDepth 最大嵌套深度(默认 50)\n * @throws ExpressionError 如果发现禁止的节点\n */\nexport function validateAST(ast: ESTree.Node, options?: { allowGlobals?: boolean; maxNestingDepth?: number }): void {\n const allowGlobals = options?.allowGlobals === true\n const maxNestingDepth = options?.maxNestingDepth ?? DEFAULT_MAX_NESTING_DEPTH\n const errors: string[] = []\n \n function getFunctionName(callee: ESTree.Node): string | null {\n if (callee.type === 'Identifier') {\n return callee.name\n }\n if (callee.type === 'MemberExpression') {\n const member = callee as ESTree.MemberExpression\n if (member.object.type === 'Identifier' && member.property.type === 'Identifier') {\n return `${member.object.name}.${member.property.name}`\n }\n }\n return null\n }\n\n function traverse(node: ESTree.Node, path: string = 'root', depth: number = 0): void {\n // 检查嵌套深度(防止 DoS 攻击)\n if (depth > maxNestingDepth) {\n errors.push(`Maximum nesting depth (${maxNestingDepth}) exceeded at ${path}`)\n return\n }\n \n // 检查节点类型\n if (FORBIDDEN_NODE_TYPES.has(node.type)) {\n errors.push(`Forbidden node type \"${node.type}\" at ${path}`)\n return\n }\n \n // 检查函数调用中的函数名\n if (node.type === 'CallExpression') {\n const call = node as ESTree.CallExpression\n const funcName = getFunctionName(call.callee)\n if (funcName) {\n // 检查是否为危险函数(eval, Function, etc.)- 即使 allowGlobals 也禁止\n const dangerousFunctions = ['eval', 'Function', 'setTimeout', 'setInterval', 'execScript']\n if (dangerousFunctions.includes(funcName) || funcName.startsWith('eval') || funcName.startsWith('Function')) {\n errors.push(`Dangerous function \"${funcName}\" is not allowed at ${path}`)\n return\n }\n \n // 如果 allowGlobals,跳过白名单检查\n if (!allowGlobals) {\n // 检查是否为全局函数调用(如 Array.isArray, Math.max)\n const isGlobalFunction = \n WHITELISTED_FUNCTIONS.has(funcName) ||\n WHITELISTED_GLOBALS.has(funcName.split('.')[0])\n \n // 检查是否为对象方法调用(如 array.slice, user.getName)\n // 如果 callee 是 MemberExpression 且 object 不是全局对象,则允许\n let isObjectMethod = false\n if (call.callee.type === 'MemberExpression') {\n const member = call.callee as ESTree.MemberExpression\n // 如果 object 是 Identifier(变量名),且不在全局对象白名单中,则认为是对象方法\n if (member.object.type === 'Identifier') {\n const objName = member.object.name\n // 不是全局对象名称,则认为是用户数据的对象方法\n if (!WHITELISTED_GLOBALS.has(objName) && !isGlobalObjectName(objName)) {\n isObjectMethod = true\n }\n }\n }\n \n if (!isGlobalFunction && !isObjectMethod && !funcName.startsWith('$')) {\n // 不在白名单中的函数,禁止调用\n errors.push(`Function \"${funcName}\" is not in whitelist at ${path}`)\n return\n }\n }\n }\n }\n \n if (!ALLOWED_NODE_TYPES.has(node.type) && node.type !== 'Program') {\n // 未知节点类型,保守策略:禁止\n errors.push(`Unknown node type \"${node.type}\" at ${path}`)\n return\n }\n \n // 递归遍历子节点\n for (const key in node) {\n const value = (node as unknown as Record<string, unknown>)[key]\n \n if (value == null) continue\n \n // 处理数组\n if (Array.isArray(value)) {\n value.forEach((child, index) => {\n if (child && typeof child === 'object' && 'type' in child) {\n traverse(child as ESTree.Node, `${path}[${index}]`, depth + 1)\n }\n })\n }\n // 处理对象节点\n else if (value && typeof value === 'object' && 'type' in value) {\n traverse(value as ESTree.Node, `${path}.${key}`, depth + 1)\n }\n }\n }\n \n traverse(ast, 'root', 0)\n \n if (errors.length > 0) {\n throw new ExpressionError(\n JSON.stringify(ast),\n `AST validation failed:\\n${errors.join('\\n')}`,\n ErrorCodes.EXPRESSION_VALIDATION_ERROR,\n {\n metadata: {\n errors,\n nodeType: ast.type\n }\n }\n )\n }\n}\n","/**\n * 沙箱边界控制\n * \n * 功能:\n * - 表达式层:严格沙箱,无法访问全局对象\n * - 方法层:白名单控制,可访问全局对象\n */\n\nimport type { RuntimeContext } from '../types.js'\n\n/**\n * 创建表达式沙箱上下文\n * 移除全局对象访问能力\n */\nexport function createExpressionSandbox(ctx: RuntimeContext): RuntimeContext {\n // 创建受限的上下文副本,移除全局对象\n const sandbox = { ...ctx }\n \n // 移除可能的全局对象引用\n // 表达式求值时,只能访问状态属性和白名单函数\n \n return sandbox\n}\n\n/**\n * 检查属性访问是否安全(用于表达式求值)\n */\nexport function isSafePropertyAccess(\n prop: string,\n ctx: RuntimeContext,\n options: { allowGlobals?: boolean } = {}\n): boolean {\n const allowGlobals = options.allowGlobals ?? ctx.$exprOptions?.allowGlobals ?? false\n\n // 禁止访问全局对象(可通过 allowGlobals 开关控制)\n const globalProps = ['window', 'document', 'global', 'globalThis', 'self']\n if (!allowGlobals && globalProps.includes(prop)) {\n return false\n }\n \n // 允许访问状态属性和系统 API\n return true\n}\n","/**\n * 表达式求值器\n * \n * 功能:\n * - 安全求值 AST\n * - 支持白名单函数调用\n * - 执行步数/时间限制\n */\n\nimport type * as ESTree from '@babel/types'\nimport type { RuntimeContext, ExpressionOptions } from '../types.js'\nimport { ExpressionError, ErrorCodes } from '../errors.js'\nimport { isSafePropertyAccess } from '../runtime/sandbox.js'\n\n/**\n * 白名单全局函数\n */\nconst WHITELISTED_GLOBALS = new Set([\n 'String', 'Number', 'Boolean', 'BigInt', 'Symbol',\n 'Array', 'Object', 'Math', 'Date',\n])\n\n/**\n * 白名单函数(带命名空间)\n */\nconst WHITELISTED_FUNCTIONS = new Set([\n 'Array.isArray',\n 'Object.is',\n 'Number.isFinite',\n 'Number.isInteger',\n 'Number.isNaN',\n 'Number.isSafeInteger',\n 'Math.abs',\n 'Math.round',\n 'Math.floor',\n 'Math.ceil',\n 'Math.random',\n 'Math.max',\n 'Math.min',\n 'Date.now',\n])\n\n/**\n * 安全的数组方法(只读或返回新数组,不修改原状态)\n */\nconst SAFE_ARRAY_METHODS = new Set([\n // 返回新数组\n 'slice',\n 'concat',\n 'filter',\n 'map',\n 'flat',\n 'flatMap',\n 'toReversed', // ES2023 不修改原数组的 reverse\n 'toSorted', // ES2023 不修改原数组的 sort\n 'toSpliced', // ES2023 不修改原数组的 splice\n 'with', // ES2023 不修改原数组的索引赋值\n // 只读方法\n 'indexOf',\n 'lastIndexOf',\n 'includes',\n 'find',\n 'findIndex',\n 'findLast',\n 'findLastIndex',\n 'every',\n 'some',\n 'at',\n // 返回字符串\n 'join',\n 'toString',\n 'toLocaleString',\n // 在链式调用中安全使用(如 slice().reverse())\n 'reverse',\n 'sort',\n])\n\n/**\n * 危险属性名称集合(用于阻止原型链污染攻击)\n * - constructor: 可用于访问 Function 构造函数\n * - prototype: 可用于修改原型链\n * - __proto__: 可用于修改对象原型\n */\nconst DANGEROUS_PROPERTIES = new Set([\n 'constructor',\n 'prototype',\n '__proto__',\n])\n\n/**\n * 检查属性名是否为危险属性\n */\nfunction isDangerousProperty(propName: string | number): boolean {\n return typeof propName === 'string' && DANGEROUS_PROPERTIES.has(propName)\n}\n\n/**\n * 运行时辅助函数\n */\n const RUNTIME_HELPERS: Record<string, (...args: unknown[]) => unknown> = {\n '$truncate': (str: unknown, length: unknown): unknown => {\n if (typeof str !== 'string') return str\n const len = typeof length === 'number' ? length : 0\n return str.length > len ? str.slice(0, len) + '...' : str\n },\n '$format': (date: unknown, _format?: unknown): unknown => {\n const d = typeof date === 'number' ? new Date(date) : (date as Date)\n // 简单格式化,可根据需要扩展\n // format 参数暂未实现,保留接口以便未来扩展\n return d.toISOString()\n },\n}\n\n/**\n * 安全求值 AST\n * \n * @param ast AST 节点\n * @param ctx 运行时上下文\n * @param options 求值选项\n * @returns 求值结果(类型无法静态推导)\n * \n * 注意:表达式求值结果类型无法在编译时确定,返回 unknown\n */\nexport function evaluateExpression(\n ast: ESTree.Node,\n ctx: RuntimeContext,\n options: ExpressionOptions = {}\n): unknown {\n const mergedOptions = {\n ...ctx.$exprOptions,\n ...options\n }\n const allowGlobals = mergedOptions.allowGlobals === true\n const maxSteps = mergedOptions.maxSteps ?? 1000\n const timeout = mergedOptions.timeout ?? 100\n let stepCount = 0\n const startTime = Date.now()\n \n function getGlobalValueByName(name: string): unknown {\n if (!allowGlobals) return undefined\n // 只有在 allowGlobals 为 true 时才返回全局对象\n if (name === 'globalThis') return globalThis\n if (name === 'window' && typeof window !== 'undefined') return window\n if (name === 'document' && typeof document !== 'undefined') return document\n if (name === 'global' && typeof global !== 'undefined') return global\n if (name === 'self' && typeof self !== 'undefined') return self\n // 只有在 allowGlobals 为 true 时才访问 globalThis 的属性\n return (globalThis as Record<string, unknown>)[name]\n }\n \n function isGlobalObjectName(name: string): boolean {\n return ['window', 'document', 'global', 'globalThis', 'self'].includes(name)\n }\n\n function checkLimits(): void {\n stepCount++\n if (stepCount > maxSteps) {\n throw new ExpressionError(\n JSON.stringify(ast),\n `Expression evaluation exceeded max steps (${maxSteps})`,\n ErrorCodes.EXPRESSION_MAX_STEPS_EXCEEDED,\n {\n metadata: {\n maxSteps,\n currentSteps: stepCount\n }\n }\n )\n }\n \n if (Date.now() - startTime > timeout) {\n throw new ExpressionError(\n JSON.stringify(ast),\n `Expression evaluation exceeded timeout (${timeout}ms)`,\n ErrorCodes.EXPRESSION_TIMEOUT,\n {\n metadata: {\n timeout,\n elapsedTime: Date.now() - startTime\n }\n }\n )\n }\n }\n \n function evaluate(node: ESTree.Node): unknown {\n checkLimits()\n \n // 使用类型断言处理 node.type,因为 @babel/types 的类型定义可能不完整\n // TypeScript 的严格类型检查可能不识别某些节点类型,使用类型断言绕过\n const nodeType = (node as { type: string }).type as string\n switch (nodeType) {\n case 'NumericLiteral':\n case 'StringLiteral':\n case 'BooleanLiteral':\n case 'BigIntLiteral':\n case 'DecimalLiteral':\n case 'RegExpLiteral': {\n // 这些字面量类型都有 value 属性\n return (node as any).value;\n }\n case 'NullLiteral': {\n return null;\n }\n \n case 'Literal': {\n const literal = node as ESTree.Literal\n // 处理不同类型的字面量\n // @babel/types 的 Literal 类型包含多种字面量类型\n // 使用类型守卫安全访问 value 属性\n if ('value' in literal && literal.value !== undefined) {\n return literal.value\n }\n // NullLiteral 或 BigIntLiteral 可能没有 value 属性,或 value 为 null\n // 检查类型名称\n const literalType = (literal as { type: string }).type\n if (literalType === 'NullLiteral') {\n return null\n }\n // 其他情况:尝试访问 value,如果不存在则返回 undefined\n return (literal as { value?: unknown }).value ?? undefined\n }\n \n case 'Identifier': {\n const name = (node as ESTree.Identifier).name\n \n // 检查是否为全局对象名称(无论是否存在,都应该被禁止,除非 allowGlobals)\n // 必须在检查 ctx 之前,防止 ctx 中有同名属性绕过检查\n if (isGlobalObjectName(name) && !allowGlobals) {\n throw new ExpressionError(\n name,\n `Access to global \"${name}\" is not allowed in expressions`,\n ErrorCodes.EXPRESSION_UNSAFE_ACCESS\n )\n }\n \n // 从上下文获取值(优先从 ctx,但全局对象名称已经被上面的检查拦截)\n // 注意:即使 ctx 中有 window/document 等属性,也不应该访问(安全考虑)\n if (name in ctx && !isGlobalObjectName(name)) {\n return ctx[name]\n }\n\n // 允许直接访问全局对象(由 allowGlobals 控制)\n if (allowGlobals) {\n const globalValue = getGlobalValueByName(name)\n if (globalValue !== undefined) {\n return globalValue\n }\n }\n \n // 如果是白名单全局函数,允许访问(但仅用于函数调用,这里返回 undefined)\n if (WHITELISTED_GLOBALS.has(name)) {\n return (globalThis as Record<string, unknown>)[name]\n }\n \n // 未定义的标识符返回 undefined(而不是抛出错误,允许可选链等场景)\n return undefined\n }\n \n case 'MemberExpression': {\n const member = node as ESTree.MemberExpression\n const object = evaluate(member.object)\n \n // null/undefined 检查\n if (object == null) {\n return undefined\n }\n \n // 禁止访问全局对象(检查对象是否为全局对象)\n if (!allowGlobals) {\n // 检查对象是否为全局对象\n const isGlobal = object === globalThis || \n (typeof window !== 'undefined' && object === window) ||\n (typeof global !== 'undefined' && object === global) ||\n (typeof self !== 'undefined' && object === self)\n if (isGlobal) {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Access to global object is not allowed in expressions',\n ErrorCodes.EXPRESSION_UNSAFE_ACCESS\n )\n }\n }\n \n // 获取属性名\n let propName: string | number\n if (member.computed) {\n // 计算属性:obj[key]\n propName = evaluate(member.property) as string | number\n } else {\n // 静态属性:obj.prop\n propName = (member.property as ESTree.Identifier).name\n }\n \n // 禁止访问危险属性(constructor, prototype, __proto__)\n if (!allowGlobals && isDangerousProperty(propName)) {\n throw new ExpressionError(\n String(propName),\n `Access to \"${propName}\" is not allowed in expressions`,\n ErrorCodes.EXPRESSION_UNSAFE_ACCESS\n )\n }\n \n return (object as Record<string | number, unknown>)[propName]\n }\n \n case 'OptionalMemberExpression': {\n const member = node as ESTree.OptionalMemberExpression\n const object = evaluate(member.object)\n \n // null/undefined 检查(可选链特性)\n if (object == null) {\n return undefined\n }\n \n // 禁止访问全局对象(检查对象是否为全局对象)\n if (!allowGlobals) {\n // 检查对象是否为全局对象\n const isGlobal = object === globalThis || \n (typeof window !== 'undefined' && object === window) ||\n (typeof global !== 'undefined' && object === global) ||\n (typeof self !== 'undefined' && object === self)\n if (isGlobal) {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Access to global object is not allowed in expressions',\n ErrorCodes.EXPRESSION_UNSAFE_ACCESS\n )\n }\n }\n \n // 获取属性名\n let propName: string | number\n if (member.computed) {\n // 计算属性:obj?.[key]\n propName = evaluate(member.property) as string | number\n } else {\n // 静态属性:obj?.prop\n propName = (member.property as ESTree.Identifier).name\n }\n \n // 禁止访问危险属性(constructor, prototype, __proto__)\n if (!allowGlobals && isDangerousProperty(propName)) {\n throw new ExpressionError(\n String(propName),\n `Access to \"${propName}\" is not allowed in expressions`,\n ErrorCodes.EXPRESSION_UNSAFE_ACCESS\n )\n }\n \n return (object as Record<string | number, unknown>)?.[propName]\n }\n \n case 'BinaryExpression': {\n const binary = node as ESTree.BinaryExpression\n const left = evaluate(binary.left)\n const right = evaluate(binary.right)\n const operator = binary.operator\n \n // 类型安全的二元运算\n switch (operator) {\n case '+': return (left as number) + (right as number)\n case '-': return (left as number) - (right as number)\n case '*': return (left as number) * (right as number)\n case '/': return (left as number) / (right as number)\n case '%': return (left as number) % (right as number)\n case '**': return (left as number) ** (right as number)\n case '==': return left == right\n case '!=': return left != right\n case '===': return left === right\n case '!==': return left !== right\n case '<': return (left as number) < (right as number)\n case '<=': return (left as number) <= (right as number)\n case '>': return (left as number) > (right as number)\n case '>=': return (left as number) >= (right as number)\n case '<<': return (left as number) << (right as number)\n case '>>': return (left as number) >> (right as number)\n case '>>>': return (left as number) >>> (right as number)\n case '&': return (left as number) & (right as number)\n case '|': return (left as number) | (right as number)\n case '^': return (left as number) ^ (right as number)\n case 'in': return (left as string | number) in (right as object)\n case 'instanceof': {\n // instanceof 需要检查 right 是否为构造函数\n if (typeof right !== 'function' && typeof right !== 'object') {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Right-hand side of instanceof must be a constructor',\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n return left instanceof (right as new (...args: unknown[]) => unknown)\n }\n default:\n throw new ExpressionError(\n JSON.stringify(node),\n `Unsupported binary operator: ${operator}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n }\n \n case 'LogicalExpression': {\n const logical = node as ESTree.LogicalExpression\n const left = evaluate(logical.left)\n const operator = logical.operator\n \n if (operator === '&&') {\n return left && evaluate(logical.right)\n } else if (operator === '||') {\n return left || evaluate(logical.right)\n } else if (operator === '??') {\n return left ?? evaluate(logical.right)\n }\n \n throw new ExpressionError(\n JSON.stringify(node),\n `Unsupported logical operator: ${operator}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n \n case 'UnaryExpression': {\n const unary = node as ESTree.UnaryExpression\n const argument = evaluate(unary.argument)\n const operator = unary.operator\n \n switch (operator) {\n case '+': return +(argument as number)\n case '-': return -(argument as number)\n case '!': return !argument\n case '~': return ~(argument as number)\n case 'typeof': return typeof argument\n case 'void': return void argument\n case 'delete': throw new ExpressionError(\n JSON.stringify(node),\n 'delete operator is not allowed',\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n default:\n throw new ExpressionError(\n JSON.stringify(node),\n `Unsupported unary operator: ${operator}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n }\n \n case 'ConditionalExpression': {\n const conditional = node as ESTree.ConditionalExpression\n const test = evaluate(conditional.test)\n return test ? evaluate(conditional.consequent) : evaluate(conditional.alternate)\n }\n \n // NullishCoalescingExpression 在 @babel/types 中可能不存在\n // 使用 LogicalExpression 处理 ?? 运算符(operator === '??')\n // 如果类型系统支持,可以添加此 case\n \n case 'CallExpression': {\n const call = node as ESTree.CallExpression\n const callee = call.callee\n \n // 获取函数名和对象\n let funcName: string\n let funcObj: unknown\n let callContext: unknown = null // 函数调用的上下文(this)\n \n if (callee.type === 'Identifier') {\n // 直接函数调用:String(), Math.max()\n funcName = callee.name\n \n // 检查是否为全局对象(禁止访问)\n if (!isSafePropertyAccess(funcName, ctx, { allowGlobals })) {\n throw new ExpressionError(\n funcName,\n `Access to global \"${funcName}\" is not allowed in expressions`,\n 'UNSAFE_ACCESS'\n )\n }\n \n // 从上下文或全局获取函数\n funcObj = ctx[funcName] ?? (globalThis as Record<string, unknown>)[funcName]\n callContext = null // 全局函数调用,this 为 null\n } else if (callee.type === 'MemberExpression') {\n // 成员函数调用:Math.max(), Array.isArray(), array.slice()\n const member = callee as ESTree.MemberExpression\n const obj = evaluate(member.object)\n \n // null/undefined 检查\n if (obj == null) {\n throw new ExpressionError(\n JSON.stringify(node),\n `Cannot call method on ${obj === null ? 'null' : 'undefined'}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n \n // 检查对象是否为全局对象(禁止访问)\n if (!allowGlobals) {\n // 检查对象是否为全局对象\n const isGlobal = obj === globalThis || \n (typeof window !== 'undefined' && obj === window) ||\n (typeof global !== 'undefined' && obj === global) ||\n (typeof self !== 'undefined' && obj === self)\n if (isGlobal) {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Access to global object is not allowed in expressions',\n ErrorCodes.EXPRESSION_UNSAFE_ACCESS\n )\n }\n }\n \n // 检查是否是数组实例方法调用(安全的只读方法)\n if (Array.isArray(obj) && !member.computed && member.property.type === 'Identifier') {\n const methodName = (member.property as ESTree.Identifier).name\n if (SAFE_ARRAY_METHODS.has(methodName)) {\n // 这是安全的数组方法,直接使用\n funcObj = (obj as any)[methodName]\n funcName = `Array.${methodName}` // 用于标识和错误信息\n callContext = obj // 数组方法调用,this 为数组本身\n } else {\n // 不是安全的数组方法,需要检查白名单\n const objName = member.object.type === 'Identifier' \n ? (member.object as ESTree.Identifier).name \n : String(obj)\n funcName = `${objName}.${methodName}`\n funcObj = (obj as unknown as Record<string, unknown>)?.[methodName]\n callContext = obj\n }\n } else {\n // 非数组对象,正常处理\n // 获取对象标识符名称(如果是 Identifier)\n let objName = '';\n if (member.object.type === 'Identifier') {\n objName = (member.object as ESTree.Identifier).name;\n } else {\n // 对于其他情况,使用字符串表示,但可能不在白名单内\n objName = String(obj);\n }\n \n if (member.computed) {\n const prop = evaluate(member.property)\n funcName = `${objName}[${String(prop)}]`\n funcObj = (obj as Record<string, unknown>)?.[prop as string]\n callContext = obj\n } else {\n const prop = (member.property as ESTree.Identifier).name\n funcName = `${objName}.${prop}`\n funcObj = (obj as Record<string, unknown>)?.[prop]\n callContext = obj\n }\n }\n } else {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Invalid function call: only Identifier and MemberExpression are allowed',\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n \n // 检查白名单\n // 如果是数组方法(funcName 以 Array. 开头且方法在安全列表中),则允许\n const isArrayMethod = funcName.startsWith('Array.') && SAFE_ARRAY_METHODS.has(funcName.split('.')[1])\n const isWhitelisted = isArrayMethod ||\n WHITELISTED_FUNCTIONS.has(funcName) || \n WHITELISTED_GLOBALS.has(funcName.split('.')[0]) ||\n RUNTIME_HELPERS[funcName] !== undefined\n \n if (!allowGlobals && !isWhitelisted) {\n throw new ExpressionError(\n funcName,\n `Function \"${funcName}\" is not in whitelist`,\n ErrorCodes.EXPRESSION_FUNCTION_NOT_WHITELISTED\n )\n }\n \n // 执行函数调用\n const args = call.arguments.map(arg => {\n if (arg.type === 'SpreadElement') {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Spread operator is not allowed',\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n return evaluate(arg)\n })\n \n // 调用运行时辅助函数\n if (RUNTIME_HELPERS[funcName]) {\n return RUNTIME_HELPERS[funcName](...args)\n }\n \n // 调用白名单全局函数或数组方法\n if (typeof funcObj === 'function') {\n try {\n // 如果有上下文(如数组方法),使用 apply;否则直接调用\n return callContext !== null \n ? funcObj.apply(callContext, args)\n : funcObj(...args)\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new ExpressionError(\n funcName,\n `Error calling \"${funcName}\": ${errorMessage}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n }\n \n throw new ExpressionError(\n funcName,\n `\"${funcName}\" is not a function${funcObj === undefined ? ' (undefined)' : funcObj === null ? ' (null)' : ''}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n \n case 'ArrayExpression': {\n const array = node as ESTree.ArrayExpression\n return array.elements.map(el => {\n if (el == null) return null\n if (el.type === 'SpreadElement') {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Spread operator is not allowed',\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n return evaluate(el)\n })\n }\n \n case 'ObjectExpression': {\n const object = node as ESTree.ObjectExpression\n const result: Record<string, any> = {}\n \n for (const prop of object.properties) {\n if (prop.type === 'ObjectMethod' || prop.type === 'SpreadElement') {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Object methods and spread are not allowed',\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n \n const key = prop.key.type === 'Identifier'\n ? prop.key.name\n : String(evaluate(prop.key))\n \n result[key] = evaluate(prop.value)\n }\n \n return result\n }\n \n case 'TemplateLiteral': {\n const template = node as ESTree.TemplateLiteral\n let result = ''\n \n for (let i = 0; i < template.quasis.length; i++) {\n result += template.quasis[i].value.cooked\n if (i < template.expressions.length) {\n result += String(evaluate(template.expressions[i]))\n }\n }\n \n return result\n }\n \n default:\n throw new ExpressionError(\n JSON.stringify(node),\n `Unsupported node type: ${node.type}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n }\n \n return evaluate(ast)\n}\n","/**\n * 依赖提取算法\n * \n * 功能:\n * - 从 AST 中提取状态依赖\n * - 支持通配符依赖(items.*)\n * - 保守策略:标记整个对象\n */\n\nimport type * as ESTree from '@babel/types'\n\n/**\n * 从 AST 中提取依赖的状态路径\n * \n * @param ast AST 节点\n * @returns 依赖路径数组(支持通配符)\n */\nexport function extractDependencies(ast: ESTree.Node): string[] {\n const dependencies = new Set<string>()\n \n function traverse(node: ESTree.Node, path: string = ''): void {\n switch (node.type) {\n case 'Identifier': {\n const id = node as ESTree.Identifier\n // 标识符可能是状态依赖(排除全局函数)\n if (!isGlobalFunction(id.name)) {\n dependencies.add(id.name)\n }\n break\n }\n \n case 'MemberExpression': {\n const member = node as ESTree.MemberExpression\n const object = member.object\n \n if (object.type === 'Identifier') {\n const basePath = object.name\n \n if (member.computed) {\n // 计算属性:items[0] -> 保守策略:标记 items.*\n dependencies.add(`${basePath}.*`)\n traverse(member.property, path)\n } else {\n // 静态属性:user.name\n const prop = (member.property as ESTree.Identifier).name\n dependencies.add(`${basePath}.${prop}`)\n // 同时添加通配符依赖(保守策略)\n dependencies.add(`${basePath}.*`)\n }\n } else {\n // 嵌套成员访问:user.profile.name\n traverse(object, path)\n }\n \n break\n }\n \n case 'OptionalMemberExpression': {\n const member = node as ESTree.OptionalMemberExpression\n const object = member.object\n \n if (object.type === 'Identifier') {\n const basePath = object.name\n \n if (member.computed) {\n dependencies.add(`${basePath}.*`)\n traverse(member.property, path)\n } else {\n const prop = (member.property as ESTree.Identifier).name\n dependencies.add(`${basePath}.${prop}`)\n dependencies.add(`${basePath}.*`)\n }\n } else {\n traverse(object, path)\n }\n \n break\n }\n \n default: {\n // 递归遍历所有子节点\n for (const key in node) {\n const value = (node as unknown as Record<string, unknown>)[key]\n \n if (value == null) continue\n \n if (Array.isArray(value)) {\n value.forEach(child => {\n if (child && typeof child === 'object' && 'type' in child) {\n traverse(child as ESTree.Node, path)\n }\n })\n } else if (value && typeof value === 'object' && 'type' in value) {\n traverse(value as ESTree.Node, path)\n }\n }\n }\n }\n }\n \n traverse(ast)\n return Array.from(dependencies)\n}\n\n/**\n * 检查是否为全局函数(不应作为依赖)\n */\nfunction isGlobalFunction(name: string): boolean {\n const globals = new Set([\n 'String', 'Number', 'Boolean', 'BigInt', 'Symbol',\n 'Array', 'Object', 'Math', 'Date',\n 'console', 'JSON', 'parseInt', 'parseFloat',\n 'isNaN', 'isFinite',\n ])\n return globals.has(name)\n}\n","/**\n * 表达式编译器\n * \n * 功能:\n * - 将简单表达式编译为直接访问函数\n * - 提升简单表达式的执行性能\n * - 复杂表达式回退到解释执行\n */\n\nimport type * as ESTree from '@babel/types'\nimport type { RuntimeContext } from '../types.js'\n\n/**\n * 编译后的表达式函数类型\n */\nexport type CompiledExpression = (ctx: RuntimeContext) => unknown\n\n/**\n * 编译缓存(全局,表达式字符串 → 编译函数)\n */\nconst compiledCache = new Map<string, CompiledExpression | null>()\n\n/**\n * 危险属性名称(不应被编译,需要回退到解释执行进行安全检查)\n * - constructor: 可用于访问 Function 构造函数\n * - prototype: 可用于修改原型链\n * - __proto__: 可用于修改对象原型\n */\nconst DANGEROUS_PROPERTIES = ['constructor', 'prototype', '__proto__']\n\n/**\n * 检查路径是否包含危险属性\n */\nfunction containsDangerousProperty(path: string): boolean {\n const segments = path.split('.')\n return segments.some(segment => DANGEROUS_PROPERTIES.includes(segment))\n}\n\n/**\n * 提取静态路径(从 MemberExpression)\n * \n * 例如:user.name → \"user.name\"\n * 例如:items.0.text → \"items.0.text\"\n */\nfunction extractStaticPath(node: ESTree.Node): string | null {\n if (node.type === 'Identifier') {\n return node.name\n }\n \n if (node.type === 'MemberExpression') {\n const object = extractStaticPath(node.object)\n if (!object) return null\n \n if (node.computed) {\n // 计算属性:obj[key],需要检查 key 是否为字面量\n if (node.property.type === 'NumericLiteral') {\n const prop = (node.property as ESTree.NumericLiteral).value\n return `${object}.${String(prop)}`\n }\n if (node.property.type === 'StringLiteral') {\n const prop = (node.property as ESTree.StringLiteral).value\n return `${object}.${String(prop)}`\n }\n // 处理其他字面量类型(已由上面的具体类型处理,这里不需要)\n return null\n } else {\n // 静态属性:obj.prop\n if (node.property.type === 'Identifier') {\n return `${object}.${node.property.name}`\n }\n return null\n }\n }\n \n return null\n}\n\n/**\n * 编译简单表达式为直接访问函数\n * \n * @param ast AST 节点\n * @returns 编译后的函数,如果无法编译则返回 null\n */\nexport function compileSimpleExpression(ast: ESTree.Node): CompiledExpression | null {\n // 字面量:{{ 42 }} → () => 42\n if (ast.type === 'NumericLiteral') {\n const value = (ast as ESTree.NumericLiteral).value\n return () => value\n }\n if (ast.type === 'StringLiteral') {\n const value = (ast as ESTree.StringLiteral).value\n return () => value\n }\n if (ast.type === 'BooleanLiteral') {\n const value = (ast as ESTree.BooleanLiteral).value\n return () => value\n }\n if (ast.type === 'NullLiteral') {\n return () => null\n }\n // 注意:Literal 类型已被更具体的类型(NumericLiteral, StringLiteral等)替代\n // 如果遇到其他字面量类型,回退到解释执行\n \n // 标识符:{{ user }} → (ctx) => ctx._get('user')\n // 注意:全局对象名称(window, document等)不应该被编译,应该回退到解释执行以进行安全检查\n if (ast.type === 'Identifier') {\n const name = ast.name\n // 全局对象名称不应该被编译(需要安全检查)\n const globalObjectNames = ['window', 'document', 'global', 'globalThis', 'self']\n if (globalObjectNames.includes(name)) {\n return null // 回退到解释执行\n }\n return (ctx: RuntimeContext) => ctx._get(name)\n }\n \n // 静态成员访问:{{ user.name }} → (ctx) => ctx._get('user.name')\n // 注意:如果路径以全局对象名称开头或包含危险属性,不应该被编译\n const path = extractStaticPath(ast)\n if (path) {\n // 检查路径是否以全局对象名称开头\n const globalObjectNames = ['window', 'document', 'global', 'globalThis', 'self']\n const firstSegment = path.split('.')[0]\n if (globalObjectNames.includes(firstSegment)) {\n return null // 回退到解释执行以进行安全检查\n }\n // 检查路径是否包含危险属性(constructor, prototype, __proto__)\n if (containsDangerousProperty(path)) {\n return null // 回退到解释执行以进行安全检查\n }\n return (ctx: RuntimeContext) => ctx._get(path)\n }\n \n return null // 复杂表达式,无法编译\n}\n\n/**\n * 获取或编译表达式\n * \n * @param expr 表达式字符串\n * @param ast AST 节点(已解析)\n * @returns 编译后的函数,如果无法编译则返回 null\n */\nexport function getCompiledExpression(\n expr: string,\n ast: ESTree.Node\n): CompiledExpression | null {\n // 检查缓存\n if (compiledCache.has(expr)) {\n return compiledCache.get(expr) || null\n }\n \n // 尝试编译\n const compiled = compileSimpleExpression(ast)\n compiledCache.set(expr, compiled)\n \n return compiled\n}\n\n/**\n * 清除编译缓存\n */\nexport function clearCompiledCache(): void {\n compiledCache.clear()\n}\n","/**\n * 路径解析工具模块\n * \n * 统一的路径解析逻辑,供 vario-core 和框架集成层使用\n * \n * 设计原则:\n * - 单一职责:只处理路径解析,不涉及响应式\n * - 可组合:提供原子操作,框架集成层可自由组合\n * - 类型安全:尽可能提供类型推导\n */\n\n/**\n * 路径段类型\n */\nexport type PathSegment = string | number\n\ntype PathCache = {\n parsed: Map<string, PathSegment[]>\n}\n\nconst pathCache: PathCache = {\n parsed: new Map()\n}\n\n/**\n * 解析路径字符串为段数组\n * \n * 支持两种语法:\n * - 点语法:`user.name` → ['user', 'name']\n * - 括号语法:`users[0].name` → ['users', 0, 'name']\n * - 混合语法:`data.users[0].profile.tags[1]` → ['data', 'users', 0, 'profile', 'tags', 1]\n * - 空括号:`users[].name` → ['users', -1, 'name'](-1 表示动态索引,由循环上下文填充)\n * \n * @param path 路径字符串\n * @returns 路径段数组\n * \n * @example\n * parsePath('user.name') // ['user', 'name']\n * parsePath('items.0.text') // ['items', 0, 'text']\n * parsePath('users[0].name') // ['users', 0, 'name']\n * parsePath('users[].name') // ['users', -1, 'name']\n */\nexport function parsePath(path: string): PathSegment[] {\n if (!path || path.length === 0) {\n return []\n }\n \n const segments: PathSegment[] = []\n let current = ''\n let i = 0\n \n while (i < path.length) {\n const char = path[i]\n \n if (char === '.') {\n // 点分隔符:保存当前段\n if (current) {\n segments.push(parseSegment(current))\n current = ''\n }\n i++\n } else if (char === '[') {\n // 括号开始:保存当前段(如果有),然后解析括号内容\n if (current) {\n segments.push(parseSegment(current))\n current = ''\n }\n \n // 找到匹配的 ]\n const closeIndex = path.indexOf(']', i)\n if (closeIndex === -1) {\n // 没有匹配的 ],当作普通字符处理\n current += char\n i++\n } else {\n const indexStr = path.slice(i + 1, closeIndex)\n if (indexStr === '') {\n // 空括号 [] 表示动态索引\n segments.push(-1)\n } else if (/^\\d+$/.test(indexStr)) {\n // 数字索引\n segments.push(parseInt(indexStr, 10))\n } else {\n // 非数字,当作字符串键\n segments.push(indexStr)\n }\n i = closeIndex + 1\n \n // 跳过紧跟的点\n if (path[i] === '.') {\n i++\n }\n }\n } else {\n current += char\n i++\n }\n }\n \n // 处理最后一段\n if (current) {\n segments.push(parseSegment(current))\n }\n \n return segments\n}\n\n/**\n * 解析单个路径段\n */\nfunction parseSegment(segment: string): PathSegment {\n // 纯数字视为数组索引(保持向后兼容 items.0.text 语法)\n if (/^\\d+$/.test(segment)) {\n return parseInt(segment, 10)\n }\n return segment\n}\n\n/**\n * 解析路径(带缓存)\n *\n * @param path 点分隔的路径字符串\n * @returns 路径段数组\n */\nexport function parsePathCached(path: string): PathSegment[] {\n if (!path || path.length === 0) {\n return []\n }\n\n const cached = pathCache.parsed.get(path)\n if (cached) {\n return cached\n }\n\n const segments = parsePath(path)\n pathCache.parsed.set(path, segments)\n return segments\n}\n\n/**\n * 清理路径缓存\n */\nexport function clearPathCache(): void {\n pathCache.parsed.clear()\n}\n\n/**\n * 将路径段数组转换为路径字符串\n * \n * @param segments 路径段数组\n * @returns 点分隔的路径字符串\n */\nexport function stringifyPath(segments: PathSegment[]): string {\n return segments.map(String).join('.')\n}\n\n/**\n * 获取嵌套路径的值\n * \n * @param obj 目标对象\n * @param path 路径字符串或路径段数组\n * @returns 路径对应的值,不存在返回 undefined\n */\nexport function getPathValue(\n obj: Record<string, unknown>,\n path: string | PathSegment[]\n): unknown {\n const segments = typeof path === 'string' ? parsePathCached(path) : path\n \n if (segments.length === 0) {\n return obj\n }\n \n let value: unknown = obj\n \n for (const segment of segments) {\n if (value == null) {\n return undefined\n }\n \n if (typeof segment === 'number') {\n // 数组索引\n if (!Array.isArray(value)) {\n return undefined\n }\n value = value[segment]\n } else {\n // 对象属性\n if (typeof value !== 'object') {\n return undefined\n }\n value = (value as Record<string, unknown>)[segment]\n }\n }\n \n return value\n}\n\n/**\n * 设置嵌套路径的值\n * \n * @param obj 目标对象\n * @param path 路径字符串或路径段数组\n * @param value 要设置的值\n * @param options 配置选项\n * @returns 是否设置成功\n */\nexport function setPathValue(\n obj: Record<string, unknown>,\n path: string | PathSegment[],\n value: unknown,\n options: {\n /**\n * 自动创建中间路径\n * @default true\n */\n createIntermediate?: boolean\n \n /**\n * 创建对象的工厂函数\n * 用于框架集成层创建响应式对象\n */\n createObject?: () => Record<string, unknown>\n \n /**\n * 创建数组的工厂函数\n * 用于框架集成层创建响应式数组\n */\n createArray?: () => unknown[]\n } = {}\n): boolean {\n const {\n createIntermediate = true,\n createObject = () => ({}),\n createArray = () => []\n } = options\n \n const segments = typeof path === 'string' ? parsePathCached(path) : path\n \n if (segments.length === 0) {\n return false\n }\n \n const lastSegment = segments[segments.length - 1]\n const parentSegments = segments.slice(0, -1)\n \n // 找到或创建父对象\n let target: unknown = obj\n \n for (let i = 0; i < parentSegments.length; i++) {\n const segment = parentSegments[i]\n const nextSegment = parentSegments[i + 1] ?? lastSegment\n const nextIsArrayIndex = typeof nextSegment === 'number'\n \n if (typeof segment === 'number') {\n // 当前段是数组索引\n if (!Array.isArray(target)) {\n if (!createIntermediate) return false\n // 无法将非数组转换为数组\n return false\n }\n \n // 确保数组足够长\n while (target.length <= segment) {\n target.push(undefined)\n }\n \n // 确保目标位置是对象或数组\n if (target[segment] == null || typeof target[segment] !== 'object') {\n if (!createIntermediate) return false\n target[segment] = nextIsArrayIndex ? createArray() : createObject()\n }\n \n target = target[segment]\n } else {\n // 当前段是对象属性\n if (typeof target !== 'object' || target === null) {\n return false\n }\n \n const targetObj = target as Record<string, unknown>\n \n if (targetObj[segment] == null || typeof targetObj[segment] !== 'object') {\n if (!createIntermediate) return false\n targetObj[segment] = nextIsArrayIndex ? createArray() : createObject()\n }\n \n target = targetObj[segment]\n }\n }\n \n // 设置最终值\n if (typeof lastSegment === 'number') {\n if (!Array.isArray(target)) {\n return false\n }\n while (target.length <= lastSegment) {\n target.push(undefined)\n }\n target[lastSegment] = value\n } else {\n if (typeof target !== 'object' || target === null) {\n return false\n }\n (target as Record<string, unknown>)[lastSegment] = value\n }\n \n return true\n}\n\n/**\n * 检查路径是否匹配(支持通配符)\n * \n * @param pattern 模式路径(支持 * 通配符)\n * @param path 目标路径\n * @returns 是否匹配\n * \n * @example\n * matchPath('items.*', 'items.0') // true\n * matchPath('items.*.name', 'items.0.name') // true\n * matchPath('user.name', 'user.name') // true\n * matchPath('user.name', 'user.age') // false\n */\nexport function matchPath(pattern: string, path: string): boolean {\n // 精确匹配\n if (pattern === path) {\n return true\n }\n \n // 检查是否为父路径\n if (path.startsWith(pattern + '.')) {\n return true\n }\n \n // 通配符匹配\n if (pattern.includes('*')) {\n const parentPath = pattern.split('.*')[0]\n return path.startsWith(parentPath + '.') || path === parentPath\n }\n \n // 检查是否路径影响模式\n if (pattern.startsWith(path + '.')) {\n return true\n }\n \n return false\n}\n\n/**\n * 提取路径的父路径\n * \n * @param path 路径字符串\n * @returns 父路径,顶层路径返回空字符串\n */\nexport function getParentPath(path: string): string {\n const segments = parsePathCached(path)\n if (segments.length <= 1) {\n return ''\n }\n return stringifyPath(segments.slice(0, -1))\n}\n\n/**\n * 获取路径的最后一段\n * \n * @param path 路径字符串\n * @returns 最后一段\n */\nexport function getLastSegment(path: string): PathSegment | undefined {\n const segments = parsePathCached(path)\n return segments[segments.length - 1]\n}\n","/**\n * 表达式缓存系统\n * \n * 功能:\n * - 每个 RuntimeContext 独立缓存(WeakMap 关联)\n * - LRU 淘汰策略\n * - 通配符依赖匹配\n * - 缓存失效机制\n * \n * 设计原则:\n * - 惰性求值:只在需要时计算\n * - 依赖追踪:精确的缓存失效\n * - 内存友好:WeakMap + LRU 淘汰\n */\n\nimport type { RuntimeContext, ExpressionCache } from '../types.js'\nimport { matchPath } from '../runtime/path.js'\n\n/**\n * 每个上下文独立缓存\n * 使用 RuntimeContext 作为键(WeakMap 自动回收)\n */\nconst cacheMap = new WeakMap<RuntimeContext<Record<string, unknown>>, Map<string, ExpressionCache>>()\n\n/**\n * 缓存配置\n */\nconst CACHE_CONFIG = {\n /** 最大缓存条目数 */\n maxSize: 100,\n /** 缓存有效期(毫秒),0 表示不过期 */\n ttl: 0\n} as const\n\n/**\n * 获取上下文的缓存 Map\n */\nfunction getCache(ctx: RuntimeContext): Map<string, ExpressionCache> {\n let cache = cacheMap.get(ctx as RuntimeContext<Record<string, unknown>>)\n if (!cache) {\n cache = new Map()\n cacheMap.set(ctx as RuntimeContext<Record<string, unknown>>, cache)\n }\n return cache\n}\n\n/**\n * 检查缓存条目是否有效\n */\nfunction isCacheValid(\n entry: ExpressionCache,\n ctx: RuntimeContext\n): boolean {\n // TTL 检查\n if (CACHE_CONFIG.ttl > 0 && Date.now() - entry.timestamp > CACHE_CONFIG.ttl) {\n return false\n }\n \n // 依赖检查:所有依赖的值必须存在\n return entry.dependencies.every(dep => {\n if (dep.includes('*')) {\n // 通配符依赖:检查父路径是否存在\n const parentPath = dep.split('.*')[0]\n return ctx._get(parentPath) != null\n }\n // 具体路径:检查值是否存在\n return ctx._get(dep) !== undefined\n })\n}\n\n/**\n * LRU 淘汰:删除最旧的缓存条目\n */\nfunction evictOldest(cache: Map<string, ExpressionCache>): void {\n let oldestKey: string | null = null\n let oldestTime = Infinity\n \n for (const [key, entry] of cache.entries()) {\n if (entry.timestamp < oldestTime) {\n oldestTime = entry.timestamp\n oldestKey = key\n }\n }\n \n if (oldestKey) {\n cache.delete(oldestKey)\n }\n}\n\n/**\n * 获取缓存的表达式结果\n * \n * @param expr 表达式字符串\n * @param ctx 运行时上下文\n * @returns 缓存的结果,无缓存或已失效返回 null\n */\nexport function getCachedExpression(\n expr: string,\n ctx: RuntimeContext\n): unknown | null {\n const cache = getCache(ctx)\n const entry = cache.get(expr)\n \n if (!entry) {\n return null\n }\n \n if (!isCacheValid(entry, ctx)) {\n cache.delete(expr)\n return null\n }\n \n // 更新时间戳(LRU)\n entry.timestamp = Date.now()\n return entry.result\n}\n\n/**\n * 设置表达式缓存\n * \n * @param expr 表达式字符串\n * @param result 求值结果\n * @param dependencies 依赖的状态路径\n * @param ctx 运行时上下文\n */\nexport function setCachedExpression(\n expr: string,\n result: unknown,\n dependencies: string[],\n ctx: RuntimeContext\n): void {\n const cache = getCache(ctx)\n \n // LRU 淘汰\n if (cache.size >= CACHE_CONFIG.maxSize) {\n evictOldest(cache)\n }\n \n cache.set(expr, {\n expr,\n result,\n dependencies,\n timestamp: Date.now()\n })\n}\n\n/**\n * 使缓存失效\n * \n * 当状态变化时调用,精确删除依赖该状态的缓存\n * \n * @param changedPath 变化的状态路径\n * @param ctx 运行时上下文\n */\nexport function invalidateCache(\n changedPath: string,\n ctx: RuntimeContext\n): void {\n const cache = getCache(ctx)\n const toDelete: string[] = []\n \n for (const [expr, entry] of cache.entries()) {\n // 检查是否有依赖被影响\n const isAffected = entry.dependencies.some(dep => \n matchPath(dep, changedPath) || matchPath(changedPath, dep)\n )\n \n if (isAffected) {\n toDelete.push(expr)\n }\n }\n \n // 批量删除\n for (const expr of toDelete) {\n cache.delete(expr)\n }\n}\n\n/**\n * 清除指定上下文的所有缓存\n */\nexport function clearCache(ctx: RuntimeContext): void {\n const cache = getCache(ctx)\n cache.clear()\n}\n\n/**\n * 获取缓存统计信息(调试用)\n */\nexport function getCacheStats(ctx: RuntimeContext): {\n size: number\n expressions: string[]\n} {\n const cache = getCache(ctx)\n return {\n size: cache.size,\n expressions: Array.from(cache.keys())\n }\n}\n","/**\n * 表达式求值入口函数\n * \n * 整合解析、验证、缓存、求值流程\n */\n\nimport type { RuntimeContext, ExpressionOptions } from '../types.js'\nimport { ExpressionError, ErrorCodes } from '../errors.js'\nimport { parseExpression } from './parser.js'\nimport { validateAST } from './whitelist.js'\nimport { evaluateExpression } from './evaluator.js'\nimport { extractDependencies } from './dependencies.js'\nimport { getCompiledExpression } from './compiler.js'\nimport {\n getCachedExpression,\n setCachedExpression,\n} from './cache.js'\n\n/**\n * 求值表达式(完整流程)\n * \n * @param expr 表达式字符串\n * @param ctx 运行时上下文\n * @returns 求值结果(类型无法静态推导,返回 unknown)\n * \n * 注意:表达式求值结果类型无法在编译时确定,因为:\n * 1. 表达式是运行时字符串\n * 2. 状态类型是动态的\n * 3. 表达式可能返回任意类型\n * \n * 如果需要类型安全,应在使用结果时进行类型守卫或类型断言\n */\nexport function evaluate(\n expr: string,\n ctx: RuntimeContext,\n options: ExpressionOptions = {}\n): unknown {\n try {\n // 合并选项:ctx.$exprOptions 优先级低于直接传入的 options\n const mergedOptions = {\n ...ctx.$exprOptions,\n ...options\n }\n \n // 1. 检查结果缓存\n const cached = getCachedExpression(expr, ctx)\n if (cached !== null) {\n return cached\n }\n \n // 2. 解析为 AST\n const ast = parseExpression(expr)\n \n // 3. AST 白名单校验(传递 allowGlobals 和 maxNestingDepth 选项)\n validateAST(ast, { \n allowGlobals: mergedOptions.allowGlobals,\n maxNestingDepth: mergedOptions.maxNestingDepth\n })\n \n // 4. 尝试使用编译缓存(简单表达式)\n const compiled = getCompiledExpression(expr, ast)\n if (compiled) {\n const result = compiled(ctx)\n // 提取依赖并缓存结果\n const dependencies = extractDependencies(ast)\n setCachedExpression(expr, result, dependencies, ctx)\n return result\n }\n \n // 5. 复杂表达式,使用解释执行\n const result = evaluateExpression(ast, ctx, mergedOptions)\n \n // 6. 提取依赖并缓存\n const dependencies = extractDependencies(ast)\n setCachedExpression(expr, result, dependencies, ctx)\n \n return result\n } catch (error: unknown) {\n if (error instanceof ExpressionError) {\n throw error\n }\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new ExpressionError(\n expr,\n `Expression evaluation failed: ${errorMessage}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR,\n {\n metadata: {\n originalError: error instanceof Error ? error.name : 'Unknown',\n stack: error instanceof Error ? error.stack?.split('\\n').slice(0, 5) : undefined\n }\n }\n )\n }\n}\n","/**\n * set 动作处理器\n * \n * 功能:修改状态\n * 示例:{ \"type\": \"set\", \"path\": \"user.name\", \"value\": \"张三\" }\n * \n * 注意:缓存失效通过 RuntimeContext 的 onStateChange 钩子处理\n * 框架集成层应在创建上下文时注册该钩子\n */\n\nimport type { RuntimeContext, Action } from '@/types.js'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { evaluate } from '@/expression/evaluate.js'\n\n/**\n * 处理 set 动作\n */\nexport async function handleSet(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n const { path, value } = action\n \n if (!path || typeof path !== 'string') {\n throw new ActionError(\n action,\n 'set action requires \"path\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'path' } }\n )\n }\n \n // 求值 value(支持表达式)\n let finalValue = value\n if (typeof value === 'string' && value.startsWith('{{') && value.endsWith('}}')) {\n // 表达式插值:{{ user.age + 1 }}\n const expr = value.slice(2, -2).trim()\n finalValue = evaluate(expr, ctx)\n }\n \n // 设置状态(缓存失效通过 onStateChange 钩子自动处理)\n ctx._set(path, finalValue)\n}\n","/**\n * emit 动作处理器\n * \n * 功能:触发事件\n * 示例:{ \"type\": \"emit\", \"event\": \"submit\", \"data\": { \"userId\": 123 } }\n */\n\nimport type { RuntimeContext, Action } from '@/types.js'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { evaluate } from '@/expression/evaluate.js'\n\n/**\n * 处理 emit 动作\n */\nexport async function handleEmit(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n const { event, data } = action\n \n if (!event || typeof event !== 'string') {\n throw new ActionError(\n action,\n 'emit action requires \"event\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'event' } }\n )\n }\n \n // 求值 data(支持表达式)\n let finalData = data\n if (typeof data === 'string' && data.startsWith('{{') && data.endsWith('}}')) {\n const expr = data.slice(2, -2).trim()\n finalData = evaluate(expr, ctx)\n }\n \n // 触发事件\n ctx.$emit(event, finalData)\n}\n","/**\n * 表达式工具函数\n * \n * 提供表达式解析、格式化的通用工具\n * 支持 {{ }} 格式的表达式提取和规范化\n */\n\n/**\n * 提取表达式字符串\n * 支持 {{ expression }} 格式,自动去掉包装\n * \n * @param expr 表达式字符串,可能是 \"{{ showContent }}\" 或 \"showContent\"\n * @returns 去掉 {{ }} 包装后的表达式字符串\n * \n * @example\n * ```typescript\n * extractExpression(\"{{ showContent }}\") // => \"showContent\"\n * extractExpression(\"showContent\") // => \"showContent\"\n * extractExpression(\"{{ userRole === 'admin' }}\") // => \"userRole === 'admin'\"\n * ```\n */\nexport function extractExpression(expr: string): string {\n if (typeof expr !== 'string') {\n return String(expr)\n }\n \n // 如果表达式是 {{ }} 格式,去掉包装\n if (expr.startsWith('{{') && expr.endsWith('}}')) {\n return expr.slice(2, -2).trim()\n }\n \n return expr.trim()\n}\n\n/**\n * 规范化表达式字符串\n * 确保表达式格式统一,便于后续处理\n * \n * @param expr 表达式字符串\n * @returns 规范化后的表达式字符串(去掉 {{ }} 包装)\n */\nexport function normalizeExpression(expr: string): string {\n return extractExpression(expr)\n}\n\n/**\n * 检查是否为表达式格式\n * \n * @param value 要检查的值\n * @returns 如果是 {{ }} 格式返回 true\n */\nexport function isExpressionFormat(value: any): boolean {\n return typeof value === 'string' && value.startsWith('{{') && value.endsWith('}}')\n}\n\n/**\n * 批量提取表达式\n * 从对象或数组中提取所有表达式字符串\n * \n * @param value 要处理的值(对象、数组或字符串)\n * @param extractor 提取函数,默认使用 extractExpression\n * @returns 处理后的值\n */\nexport function extractExpressionsRecursively(\n value: any,\n extractor: (expr: string) => string = extractExpression\n): any {\n // 字符串:检查是否为表达式\n if (typeof value === 'string') {\n return extractor(value)\n }\n \n // 数组:递归处理每个元素\n if (Array.isArray(value)) {\n return value.map(item => extractExpressionsRecursively(item, extractor))\n }\n \n // 对象:递归处理每个属性值\n if (value && typeof value === 'object') {\n const result: Record<string, any> = {}\n for (const [key, val] of Object.entries(value)) {\n result[key] = extractExpressionsRecursively(val, extractor)\n }\n return result\n }\n \n // 其他类型:直接返回\n return value\n}\n","/**\n * Action VM 执行器\n * \n * 功能:\n * - 执行动作序列\n * - 通过 $methods 查找动作处理器\n * - 错误处理和堆栈跟踪\n * - 超时保护(防止无限循环)\n * \n * 参考架构图:vario-core/vm - Action VM\n */\n\nimport type { RuntimeContext, Action } from '../types.js'\nimport { ActionError, ServiceError, ErrorCodes } from '../errors.js'\n\n/**\n * 执行动作序列的选项\n */\nexport interface ExecuteOptions {\n /**\n * 超时时间(毫秒),默认 5000ms\n */\n timeout?: number\n /**\n * 最大执行步数,默认 10000\n * 每执行一个动作计为一步\n */\n maxSteps?: number\n}\n\n/**\n * 执行动作序列\n * \n * @param actions 动作数组\n * @param ctx 运行时上下文\n * @param options 执行选项\n */\nexport async function execute(\n actions: Action[],\n ctx: RuntimeContext,\n options: ExecuteOptions = {}\n): Promise<void> {\n const timeout = options.timeout ?? 5000\n const maxSteps = options.maxSteps ?? 10000\n const startTime = Date.now()\n let stepCount = 0\n \n // 创建 AbortController 用于超时中断(如果支持)\n let abortController: AbortController | null = null\n if (typeof AbortController !== 'undefined') {\n abortController = new AbortController()\n \n // 设置超时定时器\n const timeoutId = setTimeout(() => {\n abortController?.abort()\n }, timeout)\n \n // 清理定时器(如果执行完成)\n const cleanup = () => clearTimeout(timeoutId)\n \n try {\n await executeActions(actions, ctx, abortController.signal, maxSteps, () => {\n stepCount++\n if (stepCount > maxSteps) {\n throw new ActionError(\n actions[actions.length - 1] || { type: 'unknown' } as Action,\n `Action execution exceeded max steps (${maxSteps})`,\n ErrorCodes.ACTION_MAX_STEPS_EXCEEDED,\n {\n metadata: {\n maxSteps,\n currentSteps: stepCount\n }\n }\n )\n }\n // 检查超时\n if (Date.now() - startTime > timeout) {\n throw new ActionError(\n actions[actions.length - 1] || { type: 'unknown' } as Action,\n `Action execution exceeded timeout (${timeout}ms)`,\n ErrorCodes.ACTION_TIMEOUT,\n {\n metadata: {\n timeout,\n elapsedTime: Date.now() - startTime\n }\n }\n )\n }\n })\n cleanup()\n } catch (error) {\n cleanup()\n throw error\n }\n } else {\n // 不支持 AbortController 的环境,使用时间检查\n await executeActions(actions, ctx, null, maxSteps, () => {\n stepCount++\n if (stepCount > maxSteps) {\n throw new ActionError(\n actions[actions.length - 1] || { type: 'unknown' } as Action,\n `Action execution exceeded max steps (${maxSteps})`,\n ErrorCodes.ACTION_MAX_STEPS_EXCEEDED,\n {\n metadata: {\n maxSteps,\n currentSteps: stepCount\n }\n }\n )\n }\n // 检查超时\n if (Date.now() - startTime > timeout) {\n throw new ActionError(\n actions[actions.length - 1] || { type: 'unknown' } as Action,\n `Action execution exceeded timeout (${timeout}ms)`,\n ErrorCodes.ACTION_TIMEOUT,\n {\n metadata: {\n timeout,\n elapsedTime: Date.now() - startTime\n }\n }\n )\n }\n })\n }\n \n // 最终检查超时(即使有 AbortController,也做双重检查)\n if (Date.now() - startTime > timeout) {\n throw new ActionError(\n actions[actions.length - 1] || { type: 'unknown' } as Action,\n `Action execution exceeded timeout (${timeout}ms)`,\n ErrorCodes.ACTION_TIMEOUT,\n {\n metadata: {\n timeout,\n elapsedTime: Date.now() - startTime,\n actionCount: actions.length\n }\n }\n )\n }\n}\n\n/**\n * 执行动作序列(内部实现)\n */\nasync function executeActions(\n actions: Action[],\n ctx: RuntimeContext,\n signal: AbortSignal | null,\n _maxSteps: number, // 用于类型,实际限制在 checkLimits 中检查\n checkLimits: () => void\n): Promise<void> {\n for (const action of actions) {\n // 检查中断信号\n if (signal?.aborted) {\n throw new ActionError(\n action,\n 'Action execution was aborted',\n ErrorCodes.ACTION_ABORTED\n )\n }\n \n // 检查步数和超时限制\n checkLimits()\n \n // 所有动作(包括内置动作)统一通过 $methods 注册\n const handler = ctx.$methods[action.type]\n \n if (!handler) {\n throw new ActionError(\n action,\n `Unknown action type: ${action.type}. Make sure the action is registered in $methods`,\n ErrorCodes.ACTION_UNKNOWN_TYPE\n )\n }\n \n try {\n await handler(ctx, action)\n } catch (error: unknown) {\n // 如果已经是 ActionError,直接抛出\n if (error instanceof ActionError) {\n throw error\n }\n \n // 如果已经是 ServiceError,直接抛出\n if (error instanceof ServiceError) {\n throw error\n }\n \n // 包装为 ActionError,收集上下文信息\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new ActionError(\n action,\n `Action execution failed: ${errorMessage}`,\n ErrorCodes.ACTION_EXECUTION_ERROR,\n {\n metadata: {\n originalError: error instanceof Error ? error.name : 'Unknown',\n stack: error instanceof Error ? error.stack?.split('\\n').slice(0, 5) : undefined\n }\n }\n )\n }\n }\n}\n","/**\n * if 动作处理器\n * \n * 功能:条件分支\n * 示例:{ \"type\": \"if\", \"cond\": \"user.age > 18\", \"then\": [...], \"else\": [...] }\n * 示例:{ \"type\": \"if\", \"cond\": \"{{ counter < 10 }}\", \"then\": [...], \"else\": [...] }\n */\n\nimport type { RuntimeContext, Action } from '@/types.js'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { evaluate, extractExpression } from '@/expression/index.js'\nimport { execute } from '../executor.js'\n\n/**\n * 处理 if 动作\n */\nexport async function handleIf(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n const { cond, then, else: elseBranch } = action\n \n if (!cond || typeof cond !== 'string') {\n throw new ActionError(\n action,\n 'if action requires \"cond\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'cond' } }\n )\n }\n \n // 提取表达式(支持 {{ }} 格式)\n const condExpr = extractExpression(cond)\n \n // 求值条件表达式\n const condition = evaluate(condExpr, ctx)\n \n // 执行对应的分支\n if (condition) {\n if (then && Array.isArray(then)) {\n await execute(then, ctx)\n }\n } else {\n if (elseBranch && Array.isArray(elseBranch)) {\n await execute(elseBranch, ctx)\n }\n }\n}\n","/**\n * 循环上下文对象池\n * \n * 功能:\n * - 复用循环上下文对象,减少内存分配\n * - 提升循环性能\n * - 自动清理和重置\n */\n\nimport type { RuntimeContext } from '../types.js'\n\n/**\n * 循环上下文对象池\n */\nclass LoopContextPool {\n private pool: Array<Partial<RuntimeContext>> = []\n private maxSize: number\n\n constructor(maxSize: number = 10) {\n this.maxSize = maxSize\n }\n\n /**\n * 获取一个循环上下文对象\n */\n acquire(): Partial<RuntimeContext> {\n if (this.pool.length > 0) {\n return this.pool.pop()!\n }\n return {}\n }\n\n /**\n * 释放循环上下文对象回池中\n */\n release(ctx: Partial<RuntimeContext>): void {\n // 清理循环相关属性\n if ('$item' in ctx) delete ctx.$item\n if ('$index' in ctx) delete ctx.$index\n \n // 清理动态添加的循环变量(保留系统 API)\n const keysToDelete: string[] = []\n for (const key in ctx) {\n if (!key.startsWith('$') && !key.startsWith('_')) {\n keysToDelete.push(key)\n }\n }\n for (const key of keysToDelete) {\n delete ctx[key]\n }\n \n // 如果池未满,回收对象\n if (this.pool.length < this.maxSize) {\n this.pool.push(ctx)\n }\n }\n\n /**\n * 清空对象池\n */\n clear(): void {\n this.pool.length = 0\n }\n\n /**\n * 获取池大小\n */\n get size(): number {\n return this.pool.length\n }\n}\n\n/**\n * 全局循环上下文对象池实例\n */\nlet globalPool: LoopContextPool | null = null\n\n/**\n * 获取全局循环上下文对象池\n */\nexport function getLoopContextPool(): LoopContextPool {\n if (!globalPool) {\n globalPool = new LoopContextPool()\n }\n return globalPool\n}\n\n/**\n * 创建循环上下文(使用对象池)\n * \n * @param parentCtx 父上下文\n * @param item 循环项\n * @param index 循环索引\n * @returns 循环上下文\n */\nexport function createLoopContext(\n parentCtx: RuntimeContext,\n item: unknown,\n index: number\n): RuntimeContext {\n const pool = getLoopContextPool()\n const baseCtx = pool.acquire()\n \n // 创建循环上下文(浅拷贝父上下文 + 循环属性)\n const loopCtx = Object.create(parentCtx) as RuntimeContext\n \n // 复制基础对象池中的属性(如果有)\n Object.assign(loopCtx, baseCtx)\n \n // 设置循环相关属性\n loopCtx.$item = item\n loopCtx.$index = index\n \n return loopCtx\n}\n\n/**\n * 释放循环上下文(回收到对象池)\n * \n * @param loopCtx 循环上下文\n */\nexport function releaseLoopContext(loopCtx: Partial<RuntimeContext>): void {\n const pool = getLoopContextPool()\n pool.release(loopCtx)\n}\n\n/**\n * 清空对象池(用于测试或重置)\n */\nexport function clearLoopContextPool(): void {\n if (globalPool) {\n globalPool.clear()\n }\n}\n","/**\n * loop 动作处理器\n * \n * 功能:循环执行\n * 示例:{ \"type\": \"loop\", \"var\": \"item\", \"in\": \"items\", \"body\": [...] }\n */\n\nimport type { RuntimeContext, Action } from '@/types.js'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { evaluate } from '@/expression/evaluate.js'\nimport { invalidateCache } from '@/expression/cache.js'\nimport { execute } from '../executor.js'\nimport { createLoopContext, releaseLoopContext } from '@/runtime/loop-context-pool.js'\n\n/**\n * 处理 loop 动作\n */\nexport async function handleLoop(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n const { var: varName, in: inExpr, body } = action\n \n if (!varName || typeof varName !== 'string') {\n throw new ActionError(\n action,\n 'loop action requires \"var\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'var' } }\n )\n }\n \n if (!inExpr || typeof inExpr !== 'string') {\n throw new ActionError(\n action,\n 'loop action requires \"in\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'in' } }\n )\n }\n \n if (!body || !Array.isArray(body)) {\n throw new ActionError(\n action,\n 'loop action requires \"body\" parameter (array of actions)',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'body' } }\n )\n }\n \n // 求值 in 表达式,获取要遍历的数组或对象\n const iterable = evaluate(inExpr, ctx)\n \n if (iterable == null) {\n return\n }\n \n // 遍历数组\n if (Array.isArray(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n // 使用对象池创建循环上下文\n const loopCtx = createLoopContext(ctx, iterable[i], i)\n loopCtx[varName] = iterable[i]\n \n try {\n // 触发缓存失效,确保表达式重新求值\n invalidateCache(varName, loopCtx)\n await execute(body, loopCtx)\n } finally {\n // 释放循环上下文回对象池\n releaseLoopContext(loopCtx)\n }\n }\n }\n // 遍历对象\n else if (typeof iterable === 'object' && iterable !== null) {\n const entries = Object.entries(iterable)\n for (let i = 0; i < entries.length; i++) {\n const [, value] = entries[i]\n // 使用对象池创建循环上下文\n const loopCtx = createLoopContext(ctx, value, i)\n loopCtx[varName] = value\n \n try {\n // 触发缓存失效,确保表达式重新求值\n invalidateCache(varName, loopCtx)\n await execute(body, loopCtx)\n } finally {\n // 释放循环上下文回对象池\n releaseLoopContext(loopCtx)\n }\n }\n }\n else {\n throw new ActionError(\n action,\n `loop \"in\" expression must evaluate to an array or object, got ${typeof iterable}`,\n ErrorCodes.ACTION_INVALID_PARAM,\n { metadata: { param: 'in', actualType: typeof iterable } }\n )\n }\n}\n","/**\n * call 动作处理器\n * \n * 功能:调用 method(通过 $methods)\n * 示例:{ \"type\": \"call\", \"method\": \"services.fetchUser\", \"params\": {...}, \"resultTo\": \"user\" }\n * \n * 参考文档:action-reference.md - call 动作\n */\n\nimport type { RuntimeContext, Action } from '@/types.js'\nimport { ActionError, ServiceError, ErrorCodes } from '@/errors.js'\nimport { evaluate } from '@/expression/evaluate.js'\nimport { invalidateCache } from '@/expression/cache.js'\n\n/**\n * 处理 call 动作\n */\nexport async function handleCall(\n ctx: RuntimeContext,\n action: Action\n): Promise<unknown> {\n const method = action.method as string | undefined\n const rawParams = action.params\n const resultTo = action.resultTo as string | undefined\n \n if (!method || typeof method !== 'string') {\n throw new ActionError(\n action,\n 'call action requires \"method\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'method' } }\n )\n }\n \n // 查找方法(通过 $methods)\n const handler = ctx.$methods[method]\n if (!handler) {\n throw new ServiceError(\n method,\n `Method \"${method}\" not found in $methods`,\n undefined,\n {\n metadata: { method }\n }\n )\n }\n \n // 求值参数(支持表达式)\n // rawParams 可能是:\n // 1. undefined/null(默认为空对象)\n // 2. 对象(需要遍历求值每个属性)\n // 3. 已经求值过的值(直接使用)\n // 4. 字符串表达式(需要求值)\n let finalParams: unknown = rawParams ?? {}\n \n try {\n // 如果 params 是字符串表达式,先求值\n if (typeof rawParams === 'string' && rawParams.startsWith('{{') && rawParams.endsWith('}}')) {\n const expr = rawParams.slice(2, -2).trim()\n finalParams = evaluate(expr, ctx)\n } else if (rawParams != null && typeof rawParams === 'object' && !Array.isArray(rawParams)) {\n // params 是对象,遍历其属性求值\n const evaluatedParams: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(rawParams as Record<string, unknown>)) {\n if (typeof value === 'string' && value.startsWith('{{') && value.endsWith('}}')) {\n const expr = value.slice(2, -2).trim()\n evaluatedParams[key] = evaluate(expr, ctx)\n } else {\n evaluatedParams[key] = value\n }\n }\n finalParams = evaluatedParams\n }\n \n // 调用 method\n const result = await handler(ctx, finalParams)\n \n // 如果指定了 resultTo,保存结果到状态\n if (resultTo) {\n ctx._set(resultTo, result)\n invalidateCache(resultTo, ctx)\n }\n \n return result\n } catch (error: unknown) {\n // 如果错误已经是 ServiceError,直接抛出\n if (error instanceof ServiceError) {\n throw error\n }\n \n const errorMessage = error instanceof Error ? error.message : String(error)\n const originalError = error instanceof Error ? error : undefined\n \n throw new ServiceError(\n method,\n `Service call failed: ${errorMessage}`,\n originalError,\n {\n metadata: {\n method,\n params: finalParams\n }\n }\n )\n }\n}\n","/**\n * batch 动作处理器\n * \n * 功能:批量执行动作(保证原子性)\n * 示例:{ \"type\": \"batch\", \"actions\": [...] }\n */\n\nimport type { RuntimeContext, Action } from '@/types.js'\nimport { ActionError, BatchError, ErrorCodes } from '@/errors.js'\nimport { execute } from '../executor.js'\n\n/**\n * 处理 batch 动作\n */\nexport async function handleBatch(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n const { actions } = action\n \n if (!actions || !Array.isArray(actions)) {\n throw new ActionError(\n action,\n 'batch action requires \"actions\" parameter (array)',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'actions' } }\n )\n }\n \n const errors: Array<{ action: Action; error: Error }> = []\n \n // 批量执行,收集错误\n for (const act of actions) {\n try {\n await execute([act], ctx)\n } catch (error: unknown) {\n errors.push({\n action: act,\n error: error instanceof Error ? error : new Error(String(error))\n })\n }\n }\n \n // 如果有错误,抛出 BatchError\n if (errors.length > 0) {\n throw new BatchError(\n errors,\n `${errors.length} actions failed in batch`,\n {\n metadata: {\n failedCount: errors.length,\n totalCount: actions.length\n }\n }\n )\n }\n}\n","/**\n * navigate 动作处理器\n * \n * 功能:路由导航\n * 示例:{ \"type\": \"navigate\", \"to\": \"/users/123\" }\n */\n\nimport type { RuntimeContext, Action } from '@/types.js'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { evaluate } from '@/expression/evaluate.js'\n\n/**\n * 处理 navigate 动作\n */\nexport async function handleNavigate(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n const { to } = action\n \n if (!to || typeof to !== 'string') {\n throw new ActionError(\n action,\n 'navigate action requires \"to\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'to' } }\n )\n }\n \n // 求值 to(支持表达式)\n let finalTo: string = to\n if (to.startsWith('{{') && to.endsWith('}}')) {\n const expr = to.slice(2, -2).trim()\n const result = evaluate(expr, ctx)\n if (typeof result !== 'string') {\n throw new ActionError(\n action,\n `navigate \"to\" expression must evaluate to a string, got ${typeof result}`,\n ErrorCodes.ACTION_INVALID_PARAM,\n { metadata: { param: 'to', actualType: typeof result } }\n )\n }\n finalTo = result\n }\n \n // 调用路由导航方法(如果已注册)\n const navigateHandler = ctx.$methods['navigate'] || ctx.$methods['$navigate']\n if (navigateHandler) {\n await navigateHandler(ctx, { to: finalTo })\n } else {\n // 如果没有注册导航方法,使用默认行为(浏览器导航)\n // 使用类型安全的 window 访问\n if (typeof window !== 'undefined' && (window as { location?: { href: string } }).location) {\n ((window as unknown) as { location: { href: string } }).location.href = finalTo\n } else {\n throw new ActionError(\n action,\n 'navigate method not registered and window.location is not available',\n ErrorCodes.ACTION_EXECUTION_ERROR,\n { metadata: { reason: 'navigate_not_available' } }\n )\n }\n }\n}\n","/**\n * log 动作处理器\n * \n * 功能:调试输出\n * 示例:{ \"type\": \"log\", \"level\": \"info\", \"message\": \"User logged in\" }\n */\n\nimport type { RuntimeContext, Action } from '@/types.js'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { evaluate } from '@/expression/evaluate.js'\n\n/**\n * 处理 log 动作\n */\nexport async function handleLog(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n const { level = 'info', message } = action\n \n if (!message) {\n throw new ActionError(\n action,\n 'log action requires \"message\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'message' } }\n )\n }\n \n // 求值 message(支持表达式)\n let finalMessage: unknown = message\n if (typeof message === 'string' && message.startsWith('{{') && message.endsWith('}}')) {\n const expr = message.slice(2, -2).trim()\n finalMessage = evaluate(expr, ctx)\n }\n \n // 输出日志(将 finalMessage 转换为字符串)\n const logLevel = String(level).toLowerCase()\n const messageStr = String(finalMessage)\n if (typeof console !== 'undefined') {\n switch (logLevel) {\n case 'error':\n console.error('[Vario]', messageStr)\n break\n case 'warn':\n console.warn('[Vario]', messageStr)\n break\n case 'info':\n default:\n console.log('[Vario]', messageStr)\n break\n }\n }\n}\n","/**\n * 数组指令工具函数\n */\n\nimport type { RuntimeContext } from '@/types.js'\nimport { evaluate } from '@/expression/evaluate.js'\n\n/**\n * 递归求值对象/数组中的表达式\n * 支持在对象属性和数组元素中使用 {{ expression }} 格式\n */\nexport function evaluateExpressionsRecursively(\n value: any,\n ctx: RuntimeContext\n): any {\n // 字符串:检查是否为表达式\n if (typeof value === 'string') {\n if (value.startsWith('{{') && value.endsWith('}}')) {\n const expr = value.slice(2, -2).trim()\n return evaluate(expr, ctx)\n }\n return value\n }\n \n // 数组:递归处理每个元素\n if (Array.isArray(value)) {\n return value.map(item => evaluateExpressionsRecursively(item, ctx))\n }\n \n // 对象:递归处理每个属性值\n if (value && typeof value === 'object') {\n const result: Record<string, any> = {}\n for (const [key, val] of Object.entries(value)) {\n result[key] = evaluateExpressionsRecursively(val, ctx)\n }\n return result\n }\n \n // 其他类型:直接返回\n return value\n}\n","/**\n * push 动作处理器\n * \n * 功能:添加元素到数组末尾\n * 示例:{ \"type\": \"push\", \"path\": \"items\", \"value\": \"{{ newItem }}\" }\n * 示例:{ \"type\": \"push\", \"path\": \"todos\", \"items\": [{ text: \"{{ newTodo }}\", done: false }] }\n */\n\nimport type { RuntimeContext, Action } from '@/types.js'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { invalidateCache } from '@/expression/cache.js'\nimport { evaluateExpressionsRecursively } from './utils.js'\n\n/**\n * 处理 push 动作\n */\nexport async function handlePush(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n const { path, value, items } = action\n \n if (!path || typeof path !== 'string') {\n throw new ActionError(\n action,\n 'push action requires \"path\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'path' } }\n )\n }\n \n // 获取数组\n const array = ctx._get(path)\n if (!Array.isArray(array)) {\n throw new ActionError(\n action,\n `Path \"${path}\" does not point to an array`,\n ErrorCodes.ACTION_INVALID_PARAM,\n { metadata: { param: 'path', path, actualType: typeof array } }\n )\n }\n \n // 支持 items 作为 value 的别名\n const inputValue = items !== undefined ? items : value\n \n if (inputValue === undefined) {\n throw new ActionError(\n action,\n 'push action requires \"value\" or \"items\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'value|items' } }\n )\n }\n \n // 递归求值表达式(支持对象/数组中的表达式)\n const finalValue = evaluateExpressionsRecursively(inputValue, ctx)\n \n // 如果是数组,展开添加\n if (Array.isArray(finalValue)) {\n array.push(...finalValue)\n } else {\n array.push(finalValue)\n }\n \n // 使相关缓存失效\n invalidateCache(path, ctx)\n invalidateCache(`${path}.*`, ctx)\n}\n","/**\n * pop 动作处理器\n * \n * 功能:删除数组末尾元素\n * 示例:{ \"type\": \"pop\", \"path\": \"items\" }\n */\n\nimport type { RuntimeContext, Action } from '@/types.js'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { invalidateCache } from '@/expression/cache.js'\n\n/**\n * 处理 pop 动作\n */\nexport async function handlePop(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n const { path } = action\n \n if (!path || typeof path !== 'string') {\n throw new ActionError(\n action,\n 'pop action requires \"path\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'path' } }\n )\n }\n \n // 获取数组\n const array = ctx._get(path)\n if (!Array.isArray(array)) {\n throw new ActionError(\n action,\n `Path \"${path}\" does not point to an array`,\n ErrorCodes.ACTION_INVALID_PARAM,\n { metadata: { param: 'path', path, actualType: typeof array } }\n )\n }\n \n // 删除末尾元素\n array.pop()\n \n // 使相关缓存失效\n invalidateCache(path, ctx)\n invalidateCache(`${path}.*`, ctx)\n}\n","/**\n * shift 动作处理器\n * \n * 功能:删除数组首元素\n * 示例:{ \"type\": \"shift\", \"path\": \"items\" }\n */\n\nimport type { RuntimeContext, Action } from '@/types.js'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { invalidateCache } from '@/expression/cache.js'\n\n/**\n * 处理 shift 动作\n */\nexport async function handleShift(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n const { path } = action\n \n if (!path || typeof path !== 'string') {\n throw new ActionError(\n action,\n 'shift action requires \"path\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'path' } }\n )\n }\n \n // 获取数组\n const array = ctx._get(path)\n if (!Array.isArray(array)) {\n throw new ActionError(\n action,\n `Path \"${path}\" does not point to an array`,\n ErrorCodes.ACTION_INVALID_PARAM,\n { metadata: { param: 'path', path, actualType: typeof array } }\n )\n }\n \n // 删除首元素\n array.shift()\n \n // 使相关缓存失效\n invalidateCache(path, ctx)\n invalidateCache(`${path}.*`, ctx)\n}\n","/**\n * unshift 动作处理器\n * \n * 功能:添加元素到数组开头\n * 示例:{ \"type\": \"unshift\", \"path\": \"items\", \"value\": \"{{ firstItem }}\" }\n * 示例:{ \"type\": \"unshift\", \"path\": \"todos\", \"items\": [{ text: \"{{ newTodo }}\", done: false }] }\n */\n\nimport type { RuntimeContext, Action } from '@/types.js'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { invalidateCache } from '@/expression/cache.js'\nimport { evaluateExpressionsRecursively } from './utils.js'\n\n/**\n * 处理 unshift 动作\n */\nexport async function handleUnshift(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n const { path, value, items } = action\n \n if (!path || typeof path !== 'string') {\n throw new ActionError(\n action,\n 'unshift action requires \"path\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'path' } }\n )\n }\n \n // 获取数组\n const array = ctx._get(path)\n if (!Array.isArray(array)) {\n throw new ActionError(\n action,\n `Path \"${path}\" does not point to an array`,\n ErrorCodes.ACTION_INVALID_PARAM,\n { metadata: { param: 'path', path, actualType: typeof array } }\n )\n }\n \n // 支持 items 作为 value 的别名\n const inputValue = items !== undefined ? items : value\n \n if (inputValue === undefined) {\n throw new ActionError(\n action,\n 'unshift action requires \"value\" or \"items\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'value|items' } }\n )\n }\n \n // 递归求值表达式(支持对象/数组中的表达式)\n const finalValue = evaluateExpressionsRecursively(inputValue, ctx)\n \n // 如果是数组,展开添加\n if (Array.isArray(finalValue)) {\n array.unshift(...finalValue)\n } else {\n array.unshift(finalValue)\n }\n \n // 使相关缓存失效\n invalidateCache(path, ctx)\n invalidateCache(`${path}.*`, ctx)\n}\n","/**\n * splice 动作处理器\n * \n * 功能:删除或替换数组元素\n * 示例:{ \"type\": \"splice\", \"path\": \"items\", \"start\": 0, \"deleteCount\": 1, \"items\": \"{{ newItem }}\" }\n */\n\nimport type { RuntimeContext, Action } from '@/types.js'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { evaluate } from '@/expression/evaluate.js'\nimport { invalidateCache } from '@/expression/cache.js'\nimport { evaluateExpressionsRecursively } from './utils.js'\n\n/**\n * 处理 splice 动作\n */\nexport async function handleSplice(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n const { path, start, deleteCount = 0, items } = action\n \n if (!path || typeof path !== 'string') {\n throw new ActionError(\n action,\n 'splice action requires \"path\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'path' } }\n )\n }\n \n // 获取数组\n const array = ctx._get(path)\n if (!Array.isArray(array)) {\n throw new ActionError(\n action,\n `Path \"${path}\" does not point to an array`,\n ErrorCodes.ACTION_INVALID_PARAM,\n { metadata: { param: 'path', path, actualType: typeof array } }\n )\n }\n \n // 求值 start(支持表达式)\n let finalStart: number\n if (typeof start === 'string' && start.startsWith('{{') && start.endsWith('}}')) {\n const expr = start.slice(2, -2).trim()\n finalStart = Number(evaluate(expr, ctx) as number)\n } else {\n finalStart = Number(start as number)\n }\n\n // 求值 deleteCount(支持表达式)\n let finalDeleteCount: number\n if (typeof deleteCount === 'string' && deleteCount.startsWith('{{') && deleteCount.endsWith('}}')) {\n const expr = deleteCount.slice(2, -2).trim()\n finalDeleteCount = Number(evaluate(expr, ctx) as number)\n } else {\n finalDeleteCount = Number(deleteCount as number)\n }\n \n // 求值 items(支持递归表达式)\n let finalItems: unknown[] = []\n if (items != null) {\n const evaluated = evaluateExpressionsRecursively(items, ctx)\n if (Array.isArray(evaluated)) {\n finalItems = evaluated\n } else {\n finalItems = [evaluated]\n }\n }\n \n // 执行 splice\n array.splice(finalStart, finalDeleteCount, ...finalItems)\n \n // 使相关缓存失效\n invalidateCache(path, ctx)\n invalidateCache(`${path}.*`, ctx)\n}\n","/**\n * 内置动作处理器\n * \n * 所有内置动作统一注册到 ctx.$methods\n */\n\nimport type { RuntimeContext, MethodHandler } from '@/types.js'\nimport { handleSet } from './set.js'\nimport { handleEmit } from './emit.js'\nimport { handleIf } from './if.js'\nimport { handleLoop } from './loop.js'\nimport { handleCall } from './call.js'\nimport { handleBatch } from './batch.js'\nimport { handleNavigate } from './navigate.js'\nimport { handleLog } from './log.js'\nimport { handlePush } from './array/push.js'\nimport { handlePop } from './array/pop.js'\nimport { handleShift } from './array/shift.js'\nimport { handleUnshift } from './array/unshift.js'\nimport { handleSplice } from './array/splice.js'\n\n/**\n * 内置动作处理器映射\n */\nconst BUILTIN_METHODS: Record<string, MethodHandler> = {\n // 原子动作\n 'set': handleSet as MethodHandler,\n 'emit': handleEmit as MethodHandler,\n 'navigate': handleNavigate as MethodHandler,\n 'log': handleLog as MethodHandler,\n \n // 控制流动作\n 'if': handleIf as MethodHandler,\n 'loop': handleLoop as MethodHandler,\n \n // 复合动作\n 'call': handleCall as MethodHandler,\n 'batch': handleBatch as MethodHandler,\n \n // 数组操作动作\n 'push': handlePush as MethodHandler,\n 'pop': handlePop as MethodHandler,\n 'shift': handleShift as MethodHandler,\n 'unshift': handleUnshift as MethodHandler,\n 'splice': handleSplice as MethodHandler,\n}\n\n/**\n * 注册所有内置动作到 $methods\n * \n * 注意:此函数通过向现有 $methods 对象添加属性来注册方法,\n * 而不是整体覆盖 $methods,以确保在 Proxy 保护下也能正常工作。\n */\nexport function registerBuiltinMethods(ctx: RuntimeContext): void {\n // 向现有 $methods 对象添加内置方法,不覆盖已有的同名方法\n for (const [name, handler] of Object.entries(BUILTIN_METHODS)) {\n if (!(name in ctx.$methods)) {\n ctx.$methods[name] = handler\n }\n }\n}\n","/**\n * RuntimeContext 创建工厂\n *\n * 实现要点:扁平化状态存储、系统 API 保护、命名冲突检测、Proxy 保护。\n * 复杂类型见 ../types.ts(CreateContextOptions、OnStateChangeCallback 等)。\n */\n\nimport type {\n RuntimeContext,\n CreateContextOptions,\n OnStateChangeCallback,\n MethodsRegistry,\n GetPathValue,\n SetPathValue,\n} from '../types.js'\nimport { createProxy } from './proxy.js'\nimport { registerBuiltinMethods } from '../vm/handlers/index.js'\nimport { getPathValue as getPath, setPathValue as setPath } from './path.js'\nimport { invalidateCache } from '../expression/cache.js'\n\n/**\n * 创建运行时上下文(传入具体 initialState 时,TState 从实参自动推导)\n */\nexport function createRuntimeContext<TState extends Record<string, unknown>>(\n initialState: TState,\n options?: CreateContextOptions<TState>\n): RuntimeContext<TState>\n/**\n * 创建运行时上下文(显式指定 TState 时可传空或部分初始状态,如 createRuntimeContext<MyState>({}, options))\n */\nexport function createRuntimeContext<TState extends Record<string, unknown>>(\n initialState: Partial<TState> & Record<string, unknown>,\n options?: CreateContextOptions<TState>\n): RuntimeContext<TState>\n/**\n * 创建运行时上下文(不传或传空且未指定 TState 时,退回 Record<string, unknown>)\n */\nexport function createRuntimeContext(\n initialState?: Record<string, unknown>,\n options?: CreateContextOptions<Record<string, unknown>>\n): RuntimeContext<Record<string, unknown>>\nexport function createRuntimeContext<TState extends Record<string, unknown>>(\n initialState: Partial<TState> & Record<string, unknown> = {} as Partial<TState> & Record<string, unknown>,\n options: CreateContextOptions<TState> | CreateContextOptions<Record<string, unknown>> = {}\n): RuntimeContext<TState> {\n // 1. 验证命名冲突\n validateStateKeys(initialState)\n\n const {\n onEmit,\n methods = {},\n onStateChange,\n createObject = () => ({}),\n createArray = () => [],\n exprOptions\n } = options\n\n // 用于存储 proxied 引用,以便 _set 中的 onStateChange 能使用正确的引用\n let proxiedRef: RuntimeContext<TState> | null = null\n\n // 2. 创建基础上下文对象\n const ctx = {\n ...initialState,\n $emit: (event: string, data?: unknown) => {\n if (onEmit) {\n onEmit(event, data)\n }\n },\n $methods: methods as MethodsRegistry,\n $exprOptions: exprOptions,\n _get: <TPath extends string>(path: TPath): GetPathValue<TState, TPath> => {\n return getPath(ctx as Record<string, unknown>, path) as GetPathValue<TState, TPath>\n },\n _set: <TPath extends string>(path: TPath, value: SetPathValue<TState, TPath>, options?: { skipCallback?: boolean }): void => {\n setPath(ctx as Record<string, unknown>, path, value, {\n createObject,\n createArray\n })\n // 使缓存失效(使用 proxied 引用以确保缓存键一致)\n invalidateCache(path, (proxiedRef || ctx) as RuntimeContext)\n if (onStateChange && !options?.skipCallback) {\n ;(onStateChange as OnStateChangeCallback<TState>)(path, value, proxiedRef || ctx)\n }\n },\n } as RuntimeContext<TState>\n\n // 3. 自动注册内置指令到 $methods(RuntimeContext<TState> 与 RuntimeContext 在 _set 值域上逆变,需通过 unknown 转接)\n registerBuiltinMethods(ctx as unknown as RuntimeContext)\n\n // 4. 使用 Proxy 保护系统 API\n const proxied = createProxy(ctx as unknown as RuntimeContext) as RuntimeContext<TState>\n \n // 5. 保存 proxied 引用供 _set 使用\n proxiedRef = proxied\n \n return proxied\n}\n\n/**\n * 验证状态键名,防止与系统 API 冲突\n */\nfunction validateStateKeys(state: Record<string, unknown>): void {\n for (const key in state) {\n if (key.startsWith('$') || key.startsWith('_')) {\n throw new Error(\n `Property name \"${key}\" conflicts with system API. ` +\n `Properties starting with \"$\" or \"_\" are reserved. Use a different name.`\n )\n }\n }\n}\n","\nimport type { SchemaNode } from '@variojs/schema'\n\nexport type TraversalCallback = (\n node: SchemaNode,\n path: string,\n depth: number,\n parent: SchemaNode | null\n) => boolean | void // return false to stop\n\n/**\n * 通用 Schema 遍历工具 (UI Component Tree 风格)\n * 采用深度优先遍历 (DFS)\n * \n * @param root 根节点\n * @param callback 回调函数\n * @param separator 路径分隔符,默认为 '.'\n */\nexport function traverseSchema(\n root: SchemaNode,\n callback: TraversalCallback,\n separator: string = '.'\n): void {\n \n function walk(\n node: SchemaNode,\n path: string,\n depth: number,\n parent: SchemaNode | null\n ) {\n if (!node || typeof node !== 'object') return\n\n // 执行回调,如果返回 false 则停止遍历当前分支的子节点\n const shouldContinue = callback(node, path, depth, parent)\n if (shouldContinue === false) return\n\n // 处理 children (Schema 树结构)\n // 根据 Vario Schema 定义,主要是 children 属性\n if (node.children) {\n if (Array.isArray(node.children)) {\n node.children.forEach((child: any, index: number) => {\n if (child && typeof child === 'object') {\n const childPath = path ? `${path}${separator}children${separator}${index}` : `children${separator}${index}`\n walk(child as SchemaNode, childPath, depth + 1, node)\n } \n // ignore string children as they are text content\n })\n } else if (typeof node.children === 'object') {\n // 虽然类型定义说 children 是 array | string,但防御性处理单对象情况\n const childPath = path ? `${path}${separator}children` : `children`\n walk(node.children as unknown as SchemaNode, childPath, depth + 1, node)\n }\n }\n }\n\n // 从根开始\n walk(root, '', 0, null)\n}\n","/**\n * Schema 分析器 - 框架无关的纯函数实现\n * \n * 提供 Schema 统计和索引构建能力,不依赖任何前端框架\n */\n\nimport type { SchemaNode } from '@variojs/schema'\nimport { traverseSchema } from '../runtime/traversal.js'\n\n/**\n * Schema 统计信息\n */\nexport interface SchemaStats {\n /** 节点总数 */\n nodeCount: number\n /** 最大深度 */\n maxDepth: number\n}\n\n/**\n * Schema 索引映射\n */\nexport interface SchemaIndex {\n /** ID -> 路径的映射 */\n idMap: Map<string, string>\n /** 路径 -> 节点的映射(可选,用于快速访问) */\n pathMap?: Map<string, SchemaNode>\n}\n\n/**\n * 分析结果\n */\nexport interface AnalysisResult {\n stats: SchemaStats\n index: SchemaIndex\n}\n\n/**\n * 分析 Schema 结构\n * \n * 遍历整个 Schema 树,收集统计信息和构建索引\n * \n * @param schema 要分析的 Schema 根节点\n * @param options 分析选项\n * @returns 分析结果\n */\nexport function analyzeSchema(\n schema: SchemaNode,\n options: {\n /** 是否构建路径映射(会增加内存开销) */\n buildPathMap?: boolean\n /** 自定义回调,在遍历每个节点时调用 */\n onNode?: (node: SchemaNode, path: string, depth: number) => void\n } = {}\n): AnalysisResult {\n const stats: SchemaStats = {\n nodeCount: 0,\n maxDepth: 0\n }\n\n const idMap = new Map<string, string>()\n const pathMap = options.buildPathMap ? new Map<string, SchemaNode>() : undefined\n\n traverseSchema(schema, (node: SchemaNode, path: string, depth: number) => {\n // 统计\n stats.nodeCount++\n if (depth > stats.maxDepth) {\n stats.maxDepth = depth\n }\n\n // 构建 ID 索引\n const nodeWithId = node as any\n if (nodeWithId.id && typeof nodeWithId.id === 'string') {\n idMap.set(nodeWithId.id, path)\n }\n\n // 构建路径映射(可选)\n if (pathMap) {\n pathMap.set(path, node)\n }\n\n // 用户自定义回调\n options.onNode?.(node, path, depth)\n })\n\n return {\n stats,\n index: { idMap, pathMap }\n }\n}\n\n/**\n * 在 Schema 中查找节点\n * \n * @param schema Schema 根节点\n * @param predicate 判断条件\n * @returns 匹配的节点路径数组\n */\nexport function findNodes(\n schema: SchemaNode,\n predicate: (node: SchemaNode) => boolean\n): Array<{ node: SchemaNode; path: string }> {\n const results: Array<{ node: SchemaNode; path: string }> = []\n\n traverseSchema(schema, (node: SchemaNode, path: string) => {\n if (predicate(node)) {\n results.push({ node, path })\n }\n })\n\n return results\n}\n\n/**\n * 在 Schema 中查找第一个匹配的节点\n * \n * @param schema Schema 根节点\n * @param predicate 判断条件\n * @returns 匹配的节点和路径,如果未找到返回 null\n */\nexport function findNode(\n schema: SchemaNode,\n predicate: (node: SchemaNode) => boolean\n): { node: SchemaNode; path: string } | null {\n let result: { node: SchemaNode; path: string } | null = null\n\n traverseSchema(schema, (node: SchemaNode, path: string) => {\n if (predicate(node)) {\n result = { node, path }\n return false // 停止遍历\n }\n return undefined // 继续遍历\n })\n\n return result\n}\n\n/**\n * 通过 ID 查找节点路径\n * \n * @param schema Schema 根节点\n * @param id 节点 ID\n * @returns 节点路径,如果未找到返回 null\n */\nexport function findPathById(schema: SchemaNode, id: string): string | null {\n const result = findNode(schema, (node) => (node as any).id === id)\n return result?.path || null\n}\n","/**\n * Schema 查询引擎 - 框架无关的查询 API\n */\n\nimport type { SchemaNode } from '@variojs/schema'\nimport { getPathValue } from '../runtime/path.js'\nimport type { SchemaIndex } from './analyzer.js'\n\n/**\n * 查询引擎配置\n */\nexport interface QueryEngineOptions {\n /** Schema 根节点 */\n schema: SchemaNode\n /** 索引(可选,用于加速 ID 查询) */\n index?: SchemaIndex\n}\n\n/**\n * 节点查询结果\n */\nexport interface NodeResult {\n /** 节点对象 */\n node: SchemaNode\n /** 节点路径 */\n path: string\n}\n\n/**\n * 创建查询引擎\n * \n * 提供高性能的 Schema 查询能力\n */\nexport function createQueryEngine(options: QueryEngineOptions) {\n const { schema, index } = options\n\n /**\n * 通过 ID 查找节点\n */\n const findById = (id: string): NodeResult | null => {\n // 如果有索引,使用索引查找(O(1))\n if (index?.idMap) {\n const path = index.idMap.get(id)\n if (!path) return null\n\n // 如果有 pathMap,直接返回\n if (index.pathMap) {\n const node = index.pathMap.get(path)\n return node ? { node, path } : null\n }\n\n // 否则通过路径获取节点\n const node = getPathValue(schema, path) as SchemaNode\n return node ? { node, path } : null\n }\n\n // 没有索引,需要遍历查找(回退方案)\n return null\n }\n\n /**\n * 获取节点的父节点\n */\n const getParent = (path: string): NodeResult | null => {\n if (!path) {\n return null // Root has no parent\n }\n\n // 如果路径不包含 . (顶层节点),返回根节点\n if (!path.includes('.')) {\n return null // Invalid path for top-level\n }\n\n let currentPath = path\n \n while (true) {\n const lastDot = currentPath.lastIndexOf('.')\n if (lastDot === -1) {\n // 已经到达根级别,返回根节点\n return { node: schema, path: '' }\n }\n \n currentPath = currentPath.substring(0, lastDot)\n \n const lastSegment = currentPath.split('.').pop()\n \n // 跳过容器属性 (根据 Vario Schema 主要是 children)\n if (lastSegment && ['children', 'definitions', 'items'].includes(lastSegment)) {\n continue\n }\n \n const node = getPathValue(schema, currentPath) as any\n \n // 跳过数组容器和字符串\n if (Array.isArray(node) || typeof node === 'string') {\n continue\n }\n \n if (node && typeof node === 'object') {\n return { node, path: currentPath }\n }\n }\n }\n\n return {\n findById,\n getParent\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/runtime/proxy.ts","../src/errors.ts","../src/expression/parser.ts","../src/expression/whitelist.ts","../src/runtime/sandbox.ts","../src/expression/evaluator.ts","../src/expression/dependencies.ts","../src/expression/compiler.ts","../src/runtime/path.ts","../src/expression/cache.ts","../src/expression/evaluate.ts","../src/vm/handlers/set.ts","../src/vm/handlers/emit.ts","../src/expression/utils.ts","../src/vm/executor.ts","../src/vm/handlers/if.ts","../src/runtime/loop-context-pool.ts","../src/vm/handlers/loop.ts","../src/vm/handlers/call.ts","../src/vm/handlers/batch.ts","../src/vm/handlers/navigate.ts","../src/vm/handlers/log.ts","../src/vm/handlers/array/utils.ts","../src/vm/handlers/array/push.ts","../src/vm/handlers/array/pop.ts","../src/vm/handlers/array/shift.ts","../src/vm/handlers/array/unshift.ts","../src/vm/handlers/array/splice.ts","../src/vm/handlers/index.ts","../src/runtime/create-context.ts","../src/runtime/traversal.ts","../src/schema/analyzer.ts","../src/schema/query-engine.ts"],"names":["createProxy","ctx","allowedSpecialVars","target","prop","value","propName","VarioError","_VarioError","message","code","context","parts","ActionError","action","ExpressionError","expression","ServiceError","service","originalError","BatchError","failedActions","ErrorCodes","parseExpression","expr","statement","parse","error","errorMessage","WHITELISTED_GLOBALS","WHITELISTED_FUNCTIONS","isGlobalObjectName","name","ALLOWED_NODE_TYPES","FORBIDDEN_NODE_TYPES","DEFAULT_MAX_NESTING_DEPTH","validateAST","ast","options","allowGlobals","maxNestingDepth","errors","getFunctionName","callee","member","traverse","node","path","depth","call","funcName","isGlobalFunction","isObjectMethod","objName","key","child","index","createExpressionSandbox","isSafePropertyAccess","SAFE_ARRAY_METHODS","DANGEROUS_PROPERTIES","isDangerousProperty","RUNTIME_HELPERS","str","length","len","date","_format","evaluateExpression","mergedOptions","maxSteps","timeout","stepCount","startTime","getGlobalValueByName","checkLimits","evaluate","literal","globalValue","object","binary","left","right","operator","logical","unary","argument","conditional","test","funcObj","callContext","obj","methodName","isWhitelisted","args","arg","el","result","template","i","extractDependencies","dependencies","id","basePath","compiledCache","containsDangerousProperty","segment","extractStaticPath","compileSimpleExpression","globalObjectNames","firstSegment","getCompiledExpression","compiled","pathCache","parsePath","segments","current","char","parseSegment","closeIndex","indexStr","parsePathCached","cached","clearPathCache","stringifyPath","getPathValue","setPathValue","createIntermediate","createObject","createArray","lastSegment","parentSegments","nextIsArrayIndex","targetObj","matchPath","pattern","parentPath","getParentPath","getLastSegment","cacheMap","CACHE_CONFIG","getCache","cache","isCacheValid","entry","dep","evictOldest","oldestKey","oldestTime","getCachedExpression","setCachedExpression","invalidateCache","changedPath","toDelete","clearCache","getCacheStats","handleSet","finalValue","handleEmit","event","data","finalData","extractExpression","execute","actions","abortController","timeoutId","cleanup","executeActions","signal","_maxSteps","handler","handleIf","cond","then","elseBranch","condExpr","LoopContextPool","maxSize","keysToDelete","globalPool","getLoopContextPool","createLoopContext","parentCtx","item","baseCtx","loopCtx","releaseLoopContext","handleLoop","varName","inExpr","body","iterable","entries","handleCall","method","rawParams","resultTo","finalParams","evaluatedParams","param","handleBatch","act","handleNavigate","to","finalTo","navigateHandler","handleLog","level","finalMessage","logLevel","messageStr","evaluateExpressionsRecursively","val","handlePush","items","array","inputValue","handlePop","handleShift","handleUnshift","handleSplice","start","deleteCount","finalStart","finalDeleteCount","finalItems","evaluated","BUILTIN_METHODS","registerBuiltinMethods","createRuntimeContext","initialState","validateStateKeys","onEmit","methods","onStateChange","exprOptions","proxiedRef","proxied","state","traverseSchema","root","callback","separator","walk","parent","childPath","analyzeSchema","schema","stats","idMap","pathMap","nodeWithId","findNodes","predicate","results","findNode","findPathById","createQueryEngine","currentPath","lastDot"],"mappings":"kCAkBO,SAASA,EAAsCC,CAAAA,CAAW,CAG/D,IAAMC,CAAAA,CAAqB,CACzB,SACA,OAAA,CACA,QAAA,CACA,QACA,SAAA,CACA,WAAA,CACA,WACF,CAAA,CAEA,OAAO,IAAI,KAAA,CAAMD,CAAAA,CAAK,CACpB,GAAA,CAAIE,CAAAA,CAAQC,EAAMC,CAAAA,CAAO,CACvB,IAAMC,CAAAA,CAAW,MAAA,CAAOF,CAAI,CAAA,CAG5B,GAAIE,EAAS,UAAA,CAAW,GAAG,GAAKA,CAAAA,CAAS,UAAA,CAAW,GAAG,CAAA,CAAG,CAExD,GAAIJ,CAAAA,CAAmB,QAAA,CAASI,CAAQ,CAAA,CACtC,OAAO,OAAA,CAAQ,GAAA,CAAIH,EAAQC,CAAAA,CAAMC,CAAK,EAGxC,MAAM,IAAI,MACR,CAAA,4BAAA,EAA+BC,CAAQ,sDAEzC,CACF,CAEA,OAAO,OAAA,CAAQ,GAAA,CAAIH,EAAQC,CAAAA,CAAMC,CAAK,CACxC,CAAA,CAEA,GAAA,CAAIF,EAAQC,CAAAA,CAAM,CAChB,OAAO,OAAA,CAAQ,GAAA,CAAID,EAAQC,CAAI,CACjC,EAEA,GAAA,CAAID,CAAAA,CAAQC,EAAM,CAChB,OAAO,QAAQ,GAAA,CAAID,CAAAA,CAAQC,CAAI,CACjC,CAAA,CAEA,eAAeD,CAAAA,CAAQC,CAAAA,CAAM,CAC3B,IAAME,EAAW,MAAA,CAAOF,CAAI,EAG5B,GAAIE,CAAAA,CAAS,WAAW,GAAG,CAAA,EAAKA,EAAS,UAAA,CAAW,GAAG,EAAG,CAExD,GAAIJ,EAAmB,QAAA,CAASI,CAAQ,EACtC,OAAO,OAAA,CAAQ,eAAeH,CAAAA,CAAQC,CAAI,EAE5C,MAAM,IAAI,MAAM,CAAA,0BAAA,EAA6BE,CAAQ,EAAE,CACzD,CAEA,OAAO,OAAA,CAAQ,cAAA,CAAeH,EAAQC,CAAI,CAC5C,CACF,CAAC,CACH,CC7CO,IAAMG,CAAAA,CAAN,MAAMC,CAAAA,SAAmB,KAAM,CAEpB,IAAA,CAEA,OAAA,CAEhB,YACEC,CAAAA,CACAC,CAAAA,CACAC,EAAwB,EAAC,CACzB,CACA,KAAA,CAAMF,CAAO,EACb,IAAA,CAAK,IAAA,CAAO,aACZ,IAAA,CAAK,IAAA,CAAOC,EACZ,IAAA,CAAK,OAAA,CAAUC,EAGX,KAAA,CAAM,iBAAA,EACR,MAAM,iBAAA,CAAkB,IAAA,CAAMH,CAAU,EAE5C,CAKA,oBAA6B,CAC3B,IAAMI,EAAkB,CAAC,IAAA,CAAK,OAAO,CAAA,CAErC,OAAI,KAAK,OAAA,CAAQ,UAAA,EACfA,EAAM,IAAA,CAAK;AAAA,uBAAA,EAAkB,IAAA,CAAK,QAAQ,UAAU,CAAA,CAAE,EAGpD,IAAA,CAAK,OAAA,CAAQ,UAAA,EACfA,CAAAA,CAAM,IAAA,CAAK;AAAA,sBAAA,EAAY,IAAA,CAAK,QAAQ,UAAU,CAAA,CAAE,EAG9C,IAAA,CAAK,OAAA,CAAQ,MAAA,EACfA,CAAAA,CAAM,IAAA,CAAK;AAAA,4BAAA,EAAa,KAAK,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,EAG7CA,CAAAA,CAAM,IAAA,CAAK,EAAE,CACtB,CAKA,MAAA,EAAkC,CAChC,OAAO,CACL,IAAA,CAAM,KAAK,IAAA,CACX,OAAA,CAAS,IAAA,CAAK,OAAA,CACd,KAAM,IAAA,CAAK,IAAA,CACX,QAAS,IAAA,CAAK,OAAA,CACd,MAAO,IAAA,CAAK,KACd,CACF,CACF,EAKaC,CAAAA,CAAN,cAA0BN,CAAW,CAC1C,WAAA,CACEO,EACAL,CAAAA,CACAC,CAAAA,CAAe,cAAA,CACfC,CAAAA,CAAwC,EAAC,CACzC,CACA,KAAA,CAAMF,CAAAA,CAASC,EAAM,CACnB,GAAGC,CAAAA,CACH,MAAA,CAAAG,CACF,CAAC,CAAA,CACD,KAAK,IAAA,CAAO,cACd,CACF,CAAA,CAKaC,CAAAA,CAAN,cAA8BR,CAAW,CAC9C,WAAA,CACES,CAAAA,CACAP,EACAC,CAAAA,CAAe,kBAAA,CACfC,EAA4C,EAAC,CAC7C,CACA,KAAA,CAAMF,EAASC,CAAAA,CAAM,CACnB,GAAGC,CAAAA,CACH,UAAA,CAAAK,CACF,CAAC,CAAA,CACD,IAAA,CAAK,IAAA,CAAO,kBACd,CACF,CAAA,CAKaC,CAAAA,CAAN,cAA2BV,CAAW,CAC3B,OAAA,CACA,aAAA,CAEhB,WAAA,CACEW,EACAT,CAAAA,CACAU,CAAAA,CACAR,EAAwB,EAAC,CACzB,CACA,KAAA,CAAMF,CAAAA,CAAS,eAAA,CAAiBE,CAAO,EACvC,IAAA,CAAK,IAAA,CAAO,eACZ,IAAA,CAAK,OAAA,CAAUO,EACf,IAAA,CAAK,aAAA,CAAgBC,EACvB,CACF,EAKaC,CAAAA,CAAN,cAAyBb,CAAW,CACzB,aAAA,CAEhB,YACEc,CAAAA,CACAZ,CAAAA,CACAE,CAAAA,CAAwB,GACxB,CACA,KAAA,CAAMF,EAAS,aAAA,CAAeE,CAAO,EACrC,IAAA,CAAK,IAAA,CAAO,YAAA,CACZ,IAAA,CAAK,cAAgBU,EACvB,CACF,EAKaC,CAAAA,CAAa,CAExB,oBAAqB,qBAAA,CACrB,sBAAA,CAAwB,wBAAA,CACxB,cAAA,CAAgB,iBAChB,cAAA,CAAgB,gBAAA,CAChB,0BAA2B,2BAAA,CAC3B,oBAAA,CAAsB,uBACtB,oBAAA,CAAsB,sBAAA,CAGtB,sBAAA,CAAwB,wBAAA,CACxB,4BAA6B,6BAAA,CAC7B,2BAAA,CAA6B,8BAC7B,kBAAA,CAAoB,oBAAA,CACpB,8BAA+B,+BAAA,CAC/B,wBAAA,CAA0B,0BAAA,CAC1B,mCAAA,CAAqC,sCAGrC,iBAAA,CAAmB,mBAAA,CACnB,kBAAA,CAAoB,oBAAA,CAGpB,YAAa,aAAA,CAGb,uBAAA,CAAyB,yBAAA,CACzB,qBAAA,CAAuB,uBACzB,EC9KO,SAASC,CAAAA,CAAgBC,CAAAA,CAA2B,CACzD,GAAI,CASF,IAAMC,CAAAA,CAPMC,MAAM,CAAA,CAAA,EAAIF,CAAI,IAAK,CAC7B,OAAA,CAAS,CAAC,YAAY,EACtB,UAAA,CAAY,QAAA,CACZ,2BAA4B,CAAA,CAC9B,CAAC,EAGqB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CACpC,GAAIC,CAAAA,EAAW,IAAA,GAAS,qBAAA,CACtB,OAAOA,EAAU,UAAA,CAGnB,MAAM,IAAIV,CAAAA,CACRS,EACA,CAAA,4BAAA,EAA+BA,CAAI,GACnCF,CAAAA,CAAW,sBACb,CACF,CAAA,MAASK,CAAAA,CAAgB,CACvB,GAAIA,aAAiBZ,CAAAA,CACnB,MAAMY,EAER,IAAMC,CAAAA,CAAeD,aAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,MAAA,CAAOA,CAAK,CAAA,CAC1E,MAAM,IAAIZ,CAAAA,CACRS,CAAAA,CACA,2BAA2BI,CAAY,CAAA,CAAA,CACvCN,CAAAA,CAAW,sBAAA,CACX,CACE,QAAA,CAAU,CACR,aAAA,CAAeK,CAAAA,YAAiB,MAAQA,CAAAA,CAAM,IAAA,CAAO,SACvD,CACF,CACF,CACF,CACF,CCrCA,IAAME,EAAAA,CAAsB,IAAI,GAAA,CAAI,CAClC,QAAA,CAAU,QAAA,CAAU,UAAW,QAAA,CAAU,QAAA,CACzC,QAAS,QAAA,CAAU,MAAA,CAAQ,MAC7B,CAAC,CAAA,CAKKC,EAAAA,CAAwB,IAAI,IAAI,CACpC,eAAA,CACA,YACA,iBAAA,CACA,kBAAA,CACA,eACA,sBAAA,CACA,UAAA,CACA,YAAA,CACA,YAAA,CACA,YACA,aAAA,CACA,UAAA,CACA,WACA,UACF,CAAC,EAKD,SAASC,EAAAA,CAAmBC,CAAAA,CAAuB,CACjD,OAAO,CAAC,QAAA,CAAU,WAAY,QAAA,CAAU,YAAA,CAAc,MAAM,CAAA,CAAE,QAAA,CAASA,CAAI,CAC7E,CAQA,IAAMC,EAAAA,CAAqB,IAAI,GAAA,CAAI,CACjC,mBACA,0BAAA,CACA,iBAAA,CACA,kBAAA,CACA,gBAAA,CACA,UACA,gBAAA,CACA,eAAA,CACA,iBACA,aAAA,CACA,YAAA,CACA,mBACA,mBAAA,CACA,iBAAA,CACA,uBAAA,CACA,gBAAA,CACA,kBACA,oBAAA,CACA,6BACF,CAAC,CAAA,CAKKC,GAAuB,IAAI,GAAA,CAAI,CACnC,sBAAA,CACA,mBACA,oBAAA,CACA,yBAAA,CACA,iBACA,eAAA,CACA,iBAAA,CACA,kBACA,kBAAA,CACA,cAAA,CACA,eACF,CAAC,EAKKC,EAAAA,CAA4B,EAAA,CAW3B,SAASC,CAAAA,CAAYC,CAAAA,CAAkBC,EAAsE,CAClH,IAAMC,CAAAA,CAAeD,CAAAA,EAAS,eAAiB,IAAA,CACzCE,CAAAA,CAAkBF,GAAS,eAAA,EAAmBH,EAAAA,CAC9CM,EAAmB,EAAC,CAE1B,SAASC,CAAAA,CAAgBC,EAAoC,CAC3D,GAAIA,CAAAA,CAAO,IAAA,GAAS,aAClB,OAAOA,CAAAA,CAAO,IAAA,CAEhB,GAAIA,EAAO,IAAA,GAAS,kBAAA,CAAoB,CACtC,IAAMC,CAAAA,CAASD,EACf,GAAIC,CAAAA,CAAO,MAAA,CAAO,IAAA,GAAS,cAAgBA,CAAAA,CAAO,QAAA,CAAS,OAAS,YAAA,CAClE,OAAO,GAAGA,CAAAA,CAAO,MAAA,CAAO,IAAI,CAAA,CAAA,EAAIA,EAAO,QAAA,CAAS,IAAI,EAExD,CACA,OAAO,IACT,CAEA,SAASC,CAAAA,CAASC,CAAAA,CAAmBC,EAAe,MAAA,CAAQC,CAAAA,CAAgB,CAAA,CAAS,CAEnF,GAAIA,CAAAA,CAAQR,CAAAA,CAAiB,CAC3BC,CAAAA,CAAO,KAAK,CAAA,uBAAA,EAA0BD,CAAe,iBAAiBO,CAAI,CAAA,CAAE,EAC5E,MACF,CAGA,GAAIb,EAAAA,CAAqB,IAAIY,CAAAA,CAAK,IAAI,EAAG,CACvCL,CAAAA,CAAO,KAAK,CAAA,qBAAA,EAAwBK,CAAAA,CAAK,IAAI,CAAA,KAAA,EAAQC,CAAI,CAAA,CAAE,CAAA,CAC3D,MACF,CAGA,GAAID,EAAK,IAAA,GAAS,gBAAA,CAAkB,CAClC,IAAMG,EAAOH,CAAAA,CACPI,CAAAA,CAAWR,EAAgBO,CAAAA,CAAK,MAAM,EAC5C,GAAIC,CAAAA,CAAU,CAGZ,GAD2B,CAAC,MAAA,CAAQ,UAAA,CAAY,aAAc,aAAA,CAAe,YAAY,EAClE,QAAA,CAASA,CAAQ,CAAA,EAAKA,CAAAA,CAAS,WAAW,MAAM,CAAA,EAAKA,EAAS,UAAA,CAAW,UAAU,EAAG,CAC3GT,CAAAA,CAAO,IAAA,CAAK,CAAA,oBAAA,EAAuBS,CAAQ,CAAA,oBAAA,EAAuBH,CAAI,EAAE,CAAA,CACxE,MACF,CAGA,GAAI,CAACR,CAAAA,CAAc,CAEjB,IAAMY,CAAAA,CACJrB,EAAAA,CAAsB,GAAA,CAAIoB,CAAQ,GAClCrB,EAAAA,CAAoB,GAAA,CAAIqB,CAAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAI5CE,CAAAA,CAAiB,MACrB,GAAIH,CAAAA,CAAK,MAAA,CAAO,IAAA,GAAS,mBAAoB,CAC3C,IAAML,EAASK,CAAAA,CAAK,MAAA,CAEpB,GAAIL,CAAAA,CAAO,MAAA,CAAO,IAAA,GAAS,YAAA,CAAc,CACvC,IAAMS,CAAAA,CAAUT,EAAO,MAAA,CAAO,IAAA,CAE1B,CAACf,EAAAA,CAAoB,GAAA,CAAIwB,CAAO,CAAA,EAAK,CAACtB,EAAAA,CAAmBsB,CAAO,CAAA,GAClED,CAAAA,CAAiB,MAErB,CACF,CAEA,GAAI,CAACD,GAAoB,CAACC,CAAAA,EAAkB,CAACF,CAAAA,CAAS,UAAA,CAAW,GAAG,CAAA,CAAG,CAErET,CAAAA,CAAO,IAAA,CAAK,aAAaS,CAAQ,CAAA,yBAAA,EAA4BH,CAAI,CAAA,CAAE,CAAA,CACnE,MACF,CACF,CACF,CACF,CAEA,GAAI,CAACd,EAAAA,CAAmB,IAAIa,CAAAA,CAAK,IAAI,GAAKA,CAAAA,CAAK,IAAA,GAAS,SAAA,CAAW,CAEjEL,EAAO,IAAA,CAAK,CAAA,mBAAA,EAAsBK,CAAAA,CAAK,IAAI,QAAQC,CAAI,CAAA,CAAE,CAAA,CACzD,MACF,CAGA,IAAA,IAAWO,CAAAA,IAAOR,EAAM,CACtB,IAAMzC,EAASyC,CAAAA,CAA4CQ,CAAG,CAAA,CAE1DjD,CAAAA,EAAS,OAGT,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CACrBA,CAAAA,CAAM,QAAQ,CAACkD,CAAAA,CAAOC,CAAAA,GAAU,CAC1BD,GAAS,OAAOA,CAAAA,EAAU,UAAY,MAAA,GAAUA,CAAAA,EAClDV,EAASU,CAAAA,CAAsB,CAAA,EAAGR,CAAI,CAAA,CAAA,EAAIS,CAAK,CAAA,CAAA,CAAA,CAAKR,CAAAA,CAAQ,CAAC,EAEjE,CAAC,EAGM3C,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,EAAY,SAAUA,CAAAA,EACvDwC,CAAAA,CAASxC,EAAsB,CAAA,EAAG0C,CAAI,IAAIO,CAAG,CAAA,CAAA,CAAIN,CAAAA,CAAQ,CAAC,GAE9D,CACF,CAIA,GAFAH,CAAAA,CAASR,CAAAA,CAAK,OAAQ,CAAC,CAAA,CAEnBI,CAAAA,CAAO,MAAA,CAAS,EAClB,MAAM,IAAI1B,EACR,IAAA,CAAK,SAAA,CAAUsB,CAAG,CAAA,CAClB,CAAA;AAAA,EAA2BI,EAAO,IAAA,CAAK;AAAA,CAAI,CAAC,CAAA,CAAA,CAC5CnB,CAAAA,CAAW,4BACX,CACE,QAAA,CAAU,CACR,MAAA,CAAAmB,CAAAA,CACA,QAAA,CAAUJ,CAAAA,CAAI,IAChB,CACF,CACF,CAEJ,CCjNO,SAASoB,GAAwBxD,CAAAA,CAAqC,CAO3E,OALgB,CAAE,GAAGA,CAAI,CAM3B,CAKO,SAASyD,CAAAA,CACdtD,EACAH,CAAAA,CACAqC,CAAAA,CAAsC,EAAC,CAC9B,CAKT,OAAI,EAAA,EAJiBA,CAAAA,CAAQ,cAAgBrC,CAAAA,CAAI,YAAA,EAAc,cAAgB,KAAA,CAAA,EAG3D,CAAC,QAAA,CAAU,UAAA,CAAY,SAAU,YAAA,CAAc,MAAM,EACxC,QAAA,CAASG,CAAI,EAMhD,CCzBA,IAAMyB,GAAsB,IAAI,GAAA,CAAI,CAClC,QAAA,CAAU,QAAA,CAAU,UAAW,QAAA,CAAU,QAAA,CACzC,QAAS,QAAA,CAAU,MAAA,CAAQ,MAC7B,CAAC,EAKKC,EAAAA,CAAwB,IAAI,IAAI,CACpC,eAAA,CACA,YACA,iBAAA,CACA,kBAAA,CACA,eACA,sBAAA,CACA,UAAA,CACA,aACA,YAAA,CACA,WAAA,CACA,cACA,UAAA,CACA,UAAA,CACA,UACF,CAAC,CAAA,CAKK6B,EAAAA,CAAqB,IAAI,IAAI,CAEjC,OAAA,CACA,SACA,QAAA,CACA,KAAA,CACA,OACA,SAAA,CACA,YAAA,CACA,WACA,WAAA,CACA,MAAA,CAEA,UACA,aAAA,CACA,UAAA,CACA,OACA,WAAA,CACA,UAAA,CACA,gBACA,OAAA,CACA,MAAA,CACA,IAAA,CAEA,MAAA,CACA,WACA,gBAAA,CAEA,SAAA,CACA,MACF,CAAC,CAAA,CAQKC,GAAuB,IAAI,GAAA,CAAI,CACnC,aAAA,CACA,WAAA,CACA,WACF,CAAC,CAAA,CAKD,SAASC,EAAAA,CAAoBvD,CAAAA,CAAoC,CAC/D,OAAO,OAAOA,CAAAA,EAAa,QAAA,EAAYsD,GAAqB,GAAA,CAAItD,CAAQ,CAC1E,CAKE,IAAMwD,EAAmE,CACzE,SAAA,CAAa,CAACC,CAAAA,CAAcC,CAAAA,GAA6B,CACvD,GAAI,OAAOD,GAAQ,QAAA,CAAU,OAAOA,EACpC,IAAME,CAAAA,CAAM,OAAOD,CAAAA,EAAW,SAAWA,CAAAA,CAAS,CAAA,CAClD,OAAOD,CAAAA,CAAI,MAAA,CAASE,EAAMF,CAAAA,CAAI,KAAA,CAAM,EAAGE,CAAG,CAAA,CAAI,MAAQF,CACxD,CAAA,CACA,QAAW,CAACG,CAAAA,CAAeC,KACf,OAAOD,CAAAA,EAAS,QAAA,CAAW,IAAI,KAAKA,CAAI,CAAA,CAAKA,GAG9C,WAAA,EAEb,EAYO,SAASE,CAAAA,CACd/B,EACApC,CAAAA,CACAqC,CAAAA,CAA6B,EAAC,CACrB,CACT,IAAM+B,CAAAA,CAAgB,CACpB,GAAGpE,CAAAA,CAAI,YAAA,CACP,GAAGqC,CACL,EACMC,CAAAA,CAAe8B,CAAAA,CAAc,eAAiB,IAAA,CAC9CC,CAAAA,CAAWD,EAAc,QAAA,EAAY,GAAA,CACrCE,EAAUF,CAAAA,CAAc,OAAA,EAAW,IACrCG,CAAAA,CAAY,CAAA,CACVC,EAAY,IAAA,CAAK,GAAA,GAEvB,SAASC,CAAAA,CAAqB1C,CAAAA,CAAuB,CACnD,GAAKO,CAAAA,CAEL,OAAIP,IAAS,YAAA,CAAqB,UAAA,CAC9BA,IAAS,QAAA,EAAY,OAAO,OAAW,GAAA,CAAoB,MAAA,CAC3DA,IAAS,UAAA,EAAc,OAAO,SAAa,GAAA,CAAoB,QAAA,CAC/DA,IAAS,QAAA,EAAY,OAAO,MAAA,CAAW,GAAA,CAAoB,OAC3DA,CAAAA,GAAS,MAAA,EAAU,OAAO,IAAA,CAAS,GAAA,CAAoB,KAEnD,UAAA,CAAuCA,CAAI,CACrD,CAEA,SAASD,EAAmBC,CAAAA,CAAuB,CACjD,OAAO,CAAC,QAAA,CAAU,WAAY,QAAA,CAAU,YAAA,CAAc,MAAM,CAAA,CAAE,SAASA,CAAI,CAC7E,CAEA,SAAS2C,CAAAA,EAAoB,CAE3B,GADAH,CAAAA,EAAAA,CACIA,EAAYF,CAAAA,CACd,MAAM,IAAIvD,CAAAA,CACR,IAAA,CAAK,UAAUsB,CAAG,CAAA,CAClB,6CAA6CiC,CAAQ,CAAA,CAAA,CAAA,CACrDhD,CAAAA,CAAW,6BAAA,CACX,CACE,QAAA,CAAU,CACR,SAAAgD,CAAAA,CACA,YAAA,CAAcE,CAChB,CACF,CACF,EAGF,GAAI,IAAA,CAAK,KAAI,CAAIC,CAAAA,CAAYF,EAC3B,MAAM,IAAIxD,EACR,IAAA,CAAK,SAAA,CAAUsB,CAAG,CAAA,CAClB,2CAA2CkC,CAAO,CAAA,GAAA,CAAA,CAClDjD,EAAW,kBAAA,CACX,CACE,SAAU,CACR,OAAA,CAAAiD,EACA,WAAA,CAAa,IAAA,CAAK,KAAI,CAAIE,CAC5B,CACF,CACF,CAEJ,CAEA,SAASG,CAAAA,CAAS9B,CAAAA,CAA4B,CAM5C,OALA6B,CAAAA,EAAY,CAIM7B,EAA0B,IAAA,EAE1C,KAAK,gBAAA,CACL,KAAK,gBACL,KAAK,gBAAA,CACL,KAAK,eAAA,CACL,KAAK,iBACL,KAAK,eAAA,CAEH,OAAQA,CAAAA,CAAa,KAAA,CAEvB,KAAK,aAAA,CACH,OAAO,IAAA,CAGT,KAAK,UAAW,CACd,IAAM+B,EAAU/B,CAAAA,CAIhB,OAAI,OAAA,GAAW+B,CAAAA,EAAWA,EAAQ,KAAA,GAAU,MAAA,CACnCA,EAAQ,KAAA,CAIIA,CAAAA,CAA6B,OAC9B,aAAA,CACX,IAAA,CAGDA,CAAAA,CAAgC,KAAA,EAAS,MACnD,CAEA,KAAK,aAAc,CACjB,IAAM7C,EAAQc,CAAAA,CAA2B,IAAA,CAIzC,GAAIf,CAAAA,CAAmBC,CAAI,GAAK,CAACO,CAAAA,CAC/B,MAAM,IAAIxB,CAAAA,CACRiB,EACA,CAAA,kBAAA,EAAqBA,CAAI,CAAA,+BAAA,CAAA,CACzBV,CAAAA,CAAW,wBACb,CAAA,CAKF,GAAIU,KAAQ/B,CAAAA,EAAO,CAAC8B,EAAmBC,CAAI,CAAA,CACzC,OAAO/B,CAAAA,CAAI+B,CAAI,EAIjB,GAAIO,CAAAA,CAAc,CAChB,IAAMuC,CAAAA,CAAcJ,EAAqB1C,CAAI,CAAA,CAC7C,GAAI8C,CAAAA,GAAgB,OAClB,OAAOA,CAEX,CAGA,OAAIjD,EAAAA,CAAoB,IAAIG,CAAI,CAAA,CACtB,WAAuCA,CAAI,CAAA,CAIrD,MACF,CAEA,KAAK,mBAAoB,CACvB,IAAMY,EAASE,CAAAA,CACTiC,CAAAA,CAASH,CAAAA,CAAShC,CAAAA,CAAO,MAAM,CAAA,CAGrC,GAAImC,GAAU,IAAA,CACZ,OAIF,GAAI,CAACxC,CAAAA,GAEcwC,IAAW,UAAA,EACX,OAAO,OAAW,GAAA,EAAeA,CAAAA,GAAW,QAC5C,OAAO,MAAA,CAAW,KAAeA,CAAAA,GAAW,MAAA,EAC5C,OAAO,IAAA,CAAS,KAAeA,CAAAA,GAAW,IAAA,CAAA,CAEzD,MAAM,IAAIhE,CAAAA,CACR,KAAK,SAAA,CAAU+B,CAAI,EACnB,uDAAA,CACAxB,CAAAA,CAAW,wBACb,CAAA,CAKJ,IAAIhB,EAUJ,GATIsC,CAAAA,CAAO,SAETtC,CAAAA,CAAWsE,CAAAA,CAAShC,CAAAA,CAAO,QAAQ,EAGnCtC,CAAAA,CAAYsC,CAAAA,CAAO,SAA+B,IAAA,CAIhD,CAACL,GAAgBsB,EAAAA,CAAoBvD,CAAQ,EAC/C,MAAM,IAAIS,EACR,MAAA,CAAOT,CAAQ,EACf,CAAA,WAAA,EAAcA,CAAQ,kCACtBgB,CAAAA,CAAW,wBACb,CAAA,CAGF,OAAQyD,EAA4CzE,CAAQ,CAC9D,CAEA,KAAK,0BAAA,CAA4B,CAC/B,IAAMsC,CAAAA,CAASE,EACTiC,CAAAA,CAASH,CAAAA,CAAShC,EAAO,MAAM,CAAA,CAGrC,GAAImC,CAAAA,EAAU,IAAA,CACZ,OAIF,GAAI,CAACxC,CAAAA,GAEcwC,CAAAA,GAAW,YACX,OAAO,MAAA,CAAW,KAAeA,CAAAA,GAAW,MAAA,EAC5C,OAAO,MAAA,CAAW,GAAA,EAAeA,IAAW,MAAA,EAC5C,OAAO,KAAS,GAAA,EAAeA,CAAAA,GAAW,MAEzD,MAAM,IAAIhE,EACR,IAAA,CAAK,SAAA,CAAU+B,CAAI,CAAA,CACnB,wDACAxB,CAAAA,CAAW,wBACb,EAKJ,IAAIhB,CAAAA,CAUJ,GATIsC,CAAAA,CAAO,QAAA,CAETtC,EAAWsE,CAAAA,CAAShC,CAAAA,CAAO,QAAQ,CAAA,CAGnCtC,CAAAA,CAAYsC,EAAO,QAAA,CAA+B,IAAA,CAIhD,CAACL,CAAAA,EAAgBsB,EAAAA,CAAoBvD,CAAQ,CAAA,CAC/C,MAAM,IAAIS,CAAAA,CACR,OAAOT,CAAQ,CAAA,CACf,cAAcA,CAAQ,CAAA,+BAAA,CAAA,CACtBgB,EAAW,wBACb,CAAA,CAGF,OAAQyD,CAAAA,GAA8CzE,CAAQ,CAChE,CAEA,KAAK,mBAAoB,CACvB,IAAM0E,CAAAA,CAASlC,CAAAA,CACTmC,EAAOL,CAAAA,CAASI,CAAAA,CAAO,IAAI,CAAA,CAC3BE,CAAAA,CAAQN,EAASI,CAAAA,CAAO,KAAK,EAC7BG,CAAAA,CAAWH,CAAAA,CAAO,SAGxB,OAAQG,CAAAA,EACN,KAAK,GAAA,CAAK,OAAQF,CAAAA,CAAmBC,CAAAA,CACrC,KAAK,GAAA,CAAK,OAAQD,CAAAA,CAAmBC,CAAAA,CACrC,KAAK,GAAA,CAAK,OAAQD,EAAmBC,CAAAA,CACrC,KAAK,IAAK,OAAQD,CAAAA,CAAmBC,EACrC,KAAK,GAAA,CAAK,OAAQD,CAAAA,CAAmBC,CAAAA,CACrC,KAAK,IAAA,CAAM,OAAQD,CAAAA,EAAoBC,CAAAA,CACvC,KAAK,IAAA,CAAM,OAAOD,GAAQC,CAAAA,CAC1B,KAAK,KAAM,OAAOD,CAAAA,EAAQC,EAC1B,KAAK,KAAA,CAAO,OAAOD,CAAAA,GAASC,CAAAA,CAC5B,KAAK,KAAA,CAAO,OAAOD,IAASC,CAAAA,CAC5B,KAAK,GAAA,CAAK,OAAQD,EAAmBC,CAAAA,CACrC,KAAK,KAAM,OAAQD,CAAAA,EAAoBC,EACvC,KAAK,GAAA,CAAK,OAAQD,CAAAA,CAAmBC,CAAAA,CACrC,KAAK,IAAA,CAAM,OAAQD,GAAoBC,CAAAA,CACvC,KAAK,KAAM,OAAQD,CAAAA,EAAoBC,CAAAA,CACvC,KAAK,KAAM,OAAQD,CAAAA,EAAoBC,EACvC,KAAK,KAAA,CAAO,OAAQD,CAAAA,GAAqBC,CAAAA,CACzC,KAAK,GAAA,CAAK,OAAQD,EAAmBC,CAAAA,CACrC,KAAK,IAAK,OAAQD,CAAAA,CAAmBC,EACrC,KAAK,GAAA,CAAK,OAAQD,CAAAA,CAAmBC,EACrC,KAAK,IAAA,CAAM,OAAQD,CAAAA,IAA6BC,CAAAA,CAChD,KAAK,YAAA,CAAc,CAEjB,GAAI,OAAOA,GAAU,UAAA,EAAc,OAAOA,GAAU,QAAA,CAClD,MAAM,IAAInE,CAAAA,CACR,IAAA,CAAK,SAAA,CAAU+B,CAAI,EACnB,qDAAA,CACAxB,CAAAA,CAAW,2BACb,CAAA,CAEF,OAAO2D,aAAiBC,CAC1B,CACA,QACE,MAAM,IAAInE,EACR,IAAA,CAAK,SAAA,CAAU+B,CAAI,CAAA,CACnB,CAAA,6BAAA,EAAgCqC,CAAQ,CAAA,CAAA,CACxC7D,CAAAA,CAAW,2BACb,CACJ,CACF,CAEA,KAAK,oBAAqB,CACxB,IAAM8D,EAAUtC,CAAAA,CACVmC,CAAAA,CAAOL,EAASQ,CAAAA,CAAQ,IAAI,EAC5BD,CAAAA,CAAWC,CAAAA,CAAQ,SAEzB,GAAID,CAAAA,GAAa,KACf,OAAOF,CAAAA,EAAQL,CAAAA,CAASQ,CAAAA,CAAQ,KAAK,CAAA,CAChC,GAAID,IAAa,IAAA,CACtB,OAAOF,GAAQL,CAAAA,CAASQ,CAAAA,CAAQ,KAAK,CAAA,CAChC,GAAID,IAAa,IAAA,CACtB,OAAOF,GAAQL,CAAAA,CAASQ,CAAAA,CAAQ,KAAK,CAAA,CAGvC,MAAM,IAAIrE,CAAAA,CACR,KAAK,SAAA,CAAU+B,CAAI,EACnB,CAAA,8BAAA,EAAiCqC,CAAQ,GACzC7D,CAAAA,CAAW,2BACb,CACF,CAEA,KAAK,kBAAmB,CACtB,IAAM+D,EAAQvC,CAAAA,CACRwC,CAAAA,CAAWV,EAASS,CAAAA,CAAM,QAAQ,CAAA,CAClCF,CAAAA,CAAWE,EAAM,QAAA,CAEvB,OAAQF,GACN,KAAK,IAAK,OAAO,CAAEG,EACnB,KAAK,GAAA,CAAK,OAAO,CAAEA,CAAAA,CACnB,KAAK,GAAA,CAAK,OAAO,CAACA,CAAAA,CAClB,KAAK,GAAA,CAAK,OAAO,CAAEA,CAAAA,CACnB,KAAK,SAAU,OAAO,OAAOA,EAC7B,KAAK,MAAA,CAAQ,OACb,KAAK,QAAA,CAAU,MAAM,IAAIvE,CAAAA,CACvB,KAAK,SAAA,CAAU+B,CAAI,EACnB,gCAAA,CACAxB,CAAAA,CAAW,2BACb,CAAA,CACA,QACE,MAAM,IAAIP,EACR,IAAA,CAAK,SAAA,CAAU+B,CAAI,CAAA,CACnB,CAAA,4BAAA,EAA+BqC,CAAQ,CAAA,CAAA,CACvC7D,CAAAA,CAAW,2BACb,CACJ,CACF,CAEA,KAAK,uBAAA,CAAyB,CAC5B,IAAMiE,CAAAA,CAAczC,CAAAA,CACd0C,CAAAA,CAAOZ,EAASW,CAAAA,CAAY,IAAI,EACtC,OAAcX,CAAAA,CAAPY,EAAgBD,CAAAA,CAAY,UAAA,CAAuBA,EAAY,SAAzB,CAC/C,CAMA,KAAK,gBAAA,CAAkB,CACrB,IAAMtC,CAAAA,CAAOH,EACPH,CAAAA,CAASM,CAAAA,CAAK,MAAA,CAGhBC,CAAAA,CACAuC,EACAC,CAAAA,CAAuB,IAAA,CAE3B,GAAI/C,CAAAA,CAAO,IAAA,GAAS,aAAc,CAKhC,GAHAO,EAAWP,CAAAA,CAAO,IAAA,CAGd,CAACe,CAAAA,CAAqBR,CAAAA,CAAUjD,EAAK,CAAE,YAAA,CAAAsC,CAAa,CAAC,CAAA,CACvD,MAAM,IAAIxB,EACRmC,CAAAA,CACA,CAAA,kBAAA,EAAqBA,CAAQ,CAAA,+BAAA,CAAA,CAC7B,eACF,EAIFuC,CAAAA,CAAUxF,CAAAA,CAAIiD,CAAQ,CAAA,EAAM,UAAA,CAAuCA,CAAQ,CAAA,CAC3EwC,CAAAA,CAAc,KAChB,CAAA,KAAA,GAAW/C,CAAAA,CAAO,OAAS,kBAAA,CAAoB,CAE7C,IAAMC,CAAAA,CAASD,EACTgD,CAAAA,CAAMf,CAAAA,CAAShC,EAAO,MAAM,CAAA,CAGlC,GAAI+C,CAAAA,EAAO,IAAA,CACT,MAAM,IAAI5E,CAAAA,CACR,KAAK,SAAA,CAAU+B,CAAI,EACnB,CAAA,sBAAA,EAAyB6C,CAAAA,GAAQ,KAAO,MAAA,CAAS,WAAW,CAAA,CAAA,CAC5DrE,CAAAA,CAAW,2BACb,CAAA,CAIF,GAAI,CAACiB,CAAAA,GAEcoD,CAAAA,GAAQ,YACR,OAAO,MAAA,CAAW,KAAeA,CAAAA,GAAQ,MAAA,EACzC,OAAO,MAAA,CAAW,GAAA,EAAeA,IAAQ,MAAA,EACzC,OAAO,KAAS,GAAA,EAAeA,CAAAA,GAAQ,IAAA,CAAA,CAEtD,MAAM,IAAI5E,CAAAA,CACR,IAAA,CAAK,UAAU+B,CAAI,CAAA,CACnB,wDACAxB,CAAAA,CAAW,wBACb,EAKJ,GAAI,KAAA,CAAM,QAAQqE,CAAG,CAAA,EAAK,CAAC/C,CAAAA,CAAO,QAAA,EAAYA,EAAO,QAAA,CAAS,IAAA,GAAS,YAAA,CAAc,CACnF,IAAMgD,CAAAA,CAAchD,CAAAA,CAAO,SAA+B,IAAA,CACtDe,EAAAA,CAAmB,IAAIiC,CAAU,CAAA,EAEnCH,EAAWE,CAAAA,CAAYC,CAAU,EACjC1C,CAAAA,CAAW,CAAA,MAAA,EAAS0C,CAAU,CAAA,CAAA,CAC9BF,CAAAA,CAAcC,IAMdzC,CAAAA,CAAW,CAAA,EAHKN,CAAAA,CAAO,MAAA,CAAO,OAAS,YAAA,CAClCA,CAAAA,CAAO,OAA6B,IAAA,CACrC,MAAA,CAAO+C,CAAG,CACO,CAAA,CAAA,EAAIC,CAAU,CAAA,CAAA,CACnCH,CAAAA,CAAWE,IAA6CC,CAAU,CAAA,CAClEF,EAAcC,CAAAA,EAElB,CAAA,KAAO,CAGL,IAAItC,CAAAA,CAAU,EAAA,CAQd,GAPIT,EAAO,MAAA,CAAO,IAAA,GAAS,aACzBS,CAAAA,CAAWT,CAAAA,CAAO,OAA6B,IAAA,CAG/CS,CAAAA,CAAU,OAAOsC,CAAG,CAAA,CAGlB/C,EAAO,QAAA,CAAU,CACnB,IAAMxC,CAAAA,CAAOwE,CAAAA,CAAShC,EAAO,QAAQ,CAAA,CACrCM,CAAAA,CAAW,CAAA,EAAGG,CAAO,CAAA,CAAA,EAAI,MAAA,CAAOjD,CAAI,CAAC,CAAA,CAAA,CAAA,CACrCqF,EAAWE,CAAAA,GAAkCvF,CAAc,EAC3DsF,CAAAA,CAAcC,EAChB,MAAO,CACL,IAAMvF,EAAQwC,CAAAA,CAAO,QAAA,CAA+B,KACpDM,CAAAA,CAAW,CAAA,EAAGG,CAAO,CAAA,CAAA,EAAIjD,CAAI,CAAA,CAAA,CAC7BqF,CAAAA,CAAWE,IAAkCvF,CAAI,CAAA,CACjDsF,EAAcC,EAChB,CACF,CACF,CAAA,KACE,MAAM,IAAI5E,CAAAA,CACR,IAAA,CAAK,UAAU+B,CAAI,CAAA,CACnB,0EACAxB,CAAAA,CAAW,2BACb,CAAA,CAMF,IAAMuE,GADgB3C,CAAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,EAAKS,EAAAA,CAAmB,IAAIT,CAAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,EAE/EpB,EAAAA,CAAsB,IAAIoB,CAAQ,CAAA,EAClCrB,GAAoB,GAAA,CAAIqB,CAAAA,CAAS,KAAA,CAAM,GAAG,EAAE,CAAC,CAAC,GAC9CY,CAAAA,CAAgBZ,CAAQ,IAAM,MAAA,CAEnD,GAAI,CAACX,CAAAA,EAAgB,CAACsD,GACpB,MAAM,IAAI9E,EACRmC,CAAAA,CACA,CAAA,UAAA,EAAaA,CAAQ,CAAA,qBAAA,CAAA,CACrB5B,CAAAA,CAAW,mCACb,CAAA,CAIF,IAAMwE,CAAAA,CAAO7C,CAAAA,CAAK,UAAU,GAAA,CAAI8C,CAAAA,EAAO,CACrC,GAAIA,CAAAA,CAAI,OAAS,eAAA,CACf,MAAM,IAAIhF,CAAAA,CACR,IAAA,CAAK,UAAU+B,CAAI,CAAA,CACnB,iCACAxB,CAAAA,CAAW,2BACb,CAAA,CAEF,OAAOsD,EAASmB,CAAG,CACrB,CAAC,CAAA,CAGD,GAAIjC,EAAgBZ,CAAQ,CAAA,CAC1B,OAAOY,CAAAA,CAAgBZ,CAAQ,EAAE,GAAG4C,CAAI,EAI1C,GAAI,OAAOL,GAAY,UAAA,CACrB,GAAI,CAEF,OAAOC,IAAgB,IAAA,CACnBD,CAAAA,CAAQ,MAAMC,CAAAA,CAAaI,CAAI,EAC/BL,CAAAA,CAAQ,GAAGK,CAAI,CACrB,CAAA,MAASnE,EAAgB,CACvB,IAAMC,EAAeD,CAAAA,YAAiB,KAAA,CAAQA,EAAM,OAAA,CAAU,MAAA,CAAOA,CAAK,CAAA,CAC1E,MAAM,IAAIZ,CAAAA,CACRmC,EACA,CAAA,eAAA,EAAkBA,CAAQ,MAAMtB,CAAY,CAAA,CAAA,CAC5CN,EAAW,2BACb,CACF,CAGF,MAAM,IAAIP,EACRmC,CAAAA,CACA,CAAA,CAAA,EAAIA,CAAQ,CAAA,mBAAA,EAAsBuC,CAAAA,GAAY,MAAA,CAAY,cAAA,CAAiBA,IAAY,IAAA,CAAO,SAAA,CAAY,EAAE,CAAA,CAAA,CAC5GnE,CAAAA,CAAW,2BACb,CACF,CAEA,KAAK,iBAAA,CAEH,OADcwB,EACD,QAAA,CAAS,GAAA,CAAIkD,GAAM,CAC9B,GAAIA,GAAM,IAAA,CAAM,OAAO,IAAA,CACvB,GAAIA,EAAG,IAAA,GAAS,eAAA,CACd,MAAM,IAAIjF,CAAAA,CACR,KAAK,SAAA,CAAU+B,CAAI,EACnB,gCAAA,CACAxB,CAAAA,CAAW,2BACb,CAAA,CAEF,OAAOsD,EAASoB,CAAE,CACpB,CAAC,CAAA,CAGH,KAAK,kBAAA,CAAoB,CACvB,IAAMjB,CAAAA,CAASjC,CAAAA,CACTmD,EAA8B,EAAC,CAErC,QAAW7F,CAAAA,IAAQ2E,CAAAA,CAAO,WAAY,CACpC,GAAI3E,EAAK,IAAA,GAAS,cAAA,EAAkBA,EAAK,IAAA,GAAS,eAAA,CAChD,MAAM,IAAIW,CAAAA,CACR,IAAA,CAAK,SAAA,CAAU+B,CAAI,CAAA,CACnB,2CAAA,CACAxB,EAAW,2BACb,CAAA,CAGF,IAAMgC,CAAAA,CAAMlD,CAAAA,CAAK,IAAI,IAAA,GAAS,YAAA,CAC1BA,EAAK,GAAA,CAAI,IAAA,CACT,OAAOwE,CAAAA,CAASxE,CAAAA,CAAK,GAAG,CAAC,CAAA,CAE7B6F,CAAAA,CAAO3C,CAAG,EAAIsB,CAAAA,CAASxE,CAAAA,CAAK,KAAK,EACnC,CAEA,OAAO6F,CACT,CAEA,KAAK,iBAAA,CAAmB,CACtB,IAAMC,CAAAA,CAAWpD,CAAAA,CACbmD,EAAS,EAAA,CAEb,IAAA,IAASE,EAAI,CAAA,CAAGA,CAAAA,CAAID,CAAAA,CAAS,MAAA,CAAO,OAAQC,CAAAA,EAAAA,CAC1CF,CAAAA,EAAUC,EAAS,MAAA,CAAOC,CAAC,EAAE,KAAA,CAAM,MAAA,CAC/BA,EAAID,CAAAA,CAAS,WAAA,CAAY,SAC3BD,CAAAA,EAAU,MAAA,CAAOrB,EAASsB,CAAAA,CAAS,WAAA,CAAYC,CAAC,CAAC,CAAC,CAAA,CAAA,CAItD,OAAOF,CACT,CAEA,QACE,MAAM,IAAIlF,CAAAA,CACR,KAAK,SAAA,CAAU+B,CAAI,EACnB,CAAA,uBAAA,EAA0BA,CAAAA,CAAK,IAAI,CAAA,CAAA,CACnCxB,CAAAA,CAAW,2BACb,CACJ,CACF,CAEA,OAAOsD,CAAAA,CAASvC,CAAG,CACrB,CCvpBO,SAAS+D,CAAAA,CAAoB/D,EAA4B,CAC9D,IAAMgE,EAAe,IAAI,GAAA,CAEzB,SAASxD,CAAAA,CAASC,EAAmBC,CAAAA,CAAe,EAAA,CAAU,CAC5D,OAAQD,CAAAA,CAAK,MACX,KAAK,YAAA,CAAc,CACjB,IAAMwD,CAAAA,CAAKxD,CAAAA,CAENK,GAAiBmD,CAAAA,CAAG,IAAI,GAC3BD,CAAAA,CAAa,GAAA,CAAIC,EAAG,IAAI,CAAA,CAE1B,KACF,CAEA,KAAK,mBAAoB,CACvB,IAAM1D,EAASE,CAAAA,CACTiC,CAAAA,CAASnC,CAAAA,CAAO,MAAA,CAEtB,GAAImC,CAAAA,CAAO,IAAA,GAAS,aAAc,CAChC,IAAMwB,EAAWxB,CAAAA,CAAO,IAAA,CAExB,GAAInC,CAAAA,CAAO,QAAA,CAETyD,EAAa,GAAA,CAAI,CAAA,EAAGE,CAAQ,CAAA,EAAA,CAAI,CAAA,CAChC1D,EAASD,CAAAA,CAAO,QAAA,CAAUG,CAAI,CAAA,CAAA,KACzB,CAEL,IAAM3C,CAAAA,CAAQwC,EAAO,QAAA,CAA+B,IAAA,CACpDyD,EAAa,GAAA,CAAI,CAAA,EAAGE,CAAQ,CAAA,CAAA,EAAInG,CAAI,EAAE,CAAA,CAEtCiG,CAAAA,CAAa,IAAI,CAAA,EAAGE,CAAQ,IAAI,EAClC,CACF,CAAA,KAEE1D,CAAAA,CAASkC,EAAQhC,CAAI,CAAA,CAGvB,KACF,CAEA,KAAK,2BAA4B,CAC/B,IAAMH,EAASE,CAAAA,CACTiC,CAAAA,CAASnC,EAAO,MAAA,CAEtB,GAAImC,EAAO,IAAA,GAAS,YAAA,CAAc,CAChC,IAAMwB,CAAAA,CAAWxB,CAAAA,CAAO,IAAA,CAExB,GAAInC,CAAAA,CAAO,QAAA,CACTyD,EAAa,GAAA,CAAI,CAAA,EAAGE,CAAQ,CAAA,EAAA,CAAI,CAAA,CAChC1D,EAASD,CAAAA,CAAO,QAAA,CAAUG,CAAI,CAAA,CAAA,KACzB,CACL,IAAM3C,CAAAA,CAAQwC,CAAAA,CAAO,SAA+B,IAAA,CACpDyD,CAAAA,CAAa,GAAA,CAAI,CAAA,EAAGE,CAAQ,CAAA,CAAA,EAAInG,CAAI,EAAE,CAAA,CACtCiG,CAAAA,CAAa,IAAI,CAAA,EAAGE,CAAQ,IAAI,EAClC,CACF,MACE1D,CAAAA,CAASkC,CAAAA,CAAQhC,CAAI,CAAA,CAGvB,KACF,CAEA,QAEE,IAAA,IAAWO,CAAAA,IAAOR,CAAAA,CAAM,CACtB,IAAMzC,CAAAA,CAASyC,EAA4CQ,CAAG,CAAA,CAE1DjD,GAAS,IAAA,GAET,KAAA,CAAM,QAAQA,CAAK,CAAA,CACrBA,EAAM,OAAA,CAAQkD,CAAAA,EAAS,CACjBA,CAAAA,EAAS,OAAOA,GAAU,QAAA,EAAY,MAAA,GAAUA,CAAAA,EAClDV,CAAAA,CAASU,EAAsBR,CAAI,EAEvC,CAAC,CAAA,CACQ1C,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,EAAY,SAAUA,CAAAA,EACzDwC,CAAAA,CAASxC,EAAsB0C,CAAI,CAAA,EAEvC,CAEJ,CACF,CAEA,OAAAF,CAAAA,CAASR,CAAG,CAAA,CACL,KAAA,CAAM,KAAKgE,CAAY,CAChC,CAKA,SAASlD,EAAAA,CAAiBnB,EAAuB,CAO/C,OANgB,IAAI,GAAA,CAAI,CACtB,SAAU,QAAA,CAAU,SAAA,CAAW,SAAU,QAAA,CACzC,OAAA,CAAS,SAAU,MAAA,CAAQ,MAAA,CAC3B,SAAA,CAAW,MAAA,CAAQ,WAAY,YAAA,CAC/B,OAAA,CAAS,UACX,CAAC,CAAA,CACc,IAAIA,CAAI,CACzB,CC/FA,IAAMwE,EAAAA,CAAgB,IAAI,GAAA,CAQpB5C,EAAAA,CAAuB,CAAC,aAAA,CAAe,WAAA,CAAa,WAAW,CAAA,CAKrE,SAAS6C,EAAAA,CAA0B1D,CAAAA,CAAuB,CAExD,OADiBA,CAAAA,CAAK,MAAM,GAAG,CAAA,CACf,KAAK2D,CAAAA,EAAW9C,EAAAA,CAAqB,SAAS8C,CAAO,CAAC,CACxE,CAQA,SAASC,GAAkB7D,CAAAA,CAAkC,CAC3D,GAAIA,CAAAA,CAAK,IAAA,GAAS,YAAA,CAChB,OAAOA,EAAK,IAAA,CAGd,GAAIA,EAAK,IAAA,GAAS,kBAAA,CAAoB,CACpC,IAAMiC,CAAAA,CAAS4B,GAAkB7D,CAAAA,CAAK,MAAM,EAC5C,GAAI,CAACiC,EAAQ,OAAO,IAAA,CAEpB,GAAIjC,CAAAA,CAAK,QAAA,CAAU,CAEjB,GAAIA,EAAK,QAAA,CAAS,IAAA,GAAS,iBAAkB,CAC3C,IAAM1C,EAAQ0C,CAAAA,CAAK,QAAA,CAAmC,MACtD,OAAO,CAAA,EAAGiC,CAAM,CAAA,CAAA,EAAI,MAAA,CAAO3E,CAAI,CAAC,CAAA,CAClC,CACA,GAAI0C,CAAAA,CAAK,QAAA,CAAS,IAAA,GAAS,gBAAiB,CAC1C,IAAM1C,EAAQ0C,CAAAA,CAAK,QAAA,CAAkC,MACrD,OAAO,CAAA,EAAGiC,CAAM,CAAA,CAAA,EAAI,MAAA,CAAO3E,CAAI,CAAC,CAAA,CAClC,CAEA,OAAO,IACT,MAEE,OAAI0C,CAAAA,CAAK,QAAA,CAAS,IAAA,GAAS,aAClB,CAAA,EAAGiC,CAAM,IAAIjC,CAAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAA,CAEjC,IAEX,CAEA,OAAO,IACT,CAQO,SAAS8D,EAAAA,CAAwBvE,EAA6C,CAEnF,GAAIA,EAAI,IAAA,GAAS,gBAAA,CAAkB,CACjC,IAAMhC,EAASgC,CAAAA,CAA8B,KAAA,CAC7C,OAAO,IAAMhC,CACf,CACA,GAAIgC,CAAAA,CAAI,OAAS,eAAA,CAAiB,CAChC,IAAMhC,CAAAA,CAASgC,CAAAA,CAA6B,MAC5C,OAAO,IAAMhC,CACf,CACA,GAAIgC,CAAAA,CAAI,IAAA,GAAS,iBAAkB,CACjC,IAAMhC,EAASgC,CAAAA,CAA8B,KAAA,CAC7C,OAAO,IAAMhC,CACf,CACA,GAAIgC,CAAAA,CAAI,OAAS,aAAA,CACf,OAAO,IAAM,IAAA,CAOf,GAAIA,EAAI,IAAA,GAAS,YAAA,CAAc,CAC7B,IAAML,EAAOK,CAAAA,CAAI,IAAA,CAGjB,OAD0B,CAAC,QAAA,CAAU,WAAY,QAAA,CAAU,YAAA,CAAc,MAAM,CAAA,CACzD,QAAA,CAASL,CAAI,CAAA,CAC1B,IAAA,CAED/B,GAAwBA,CAAAA,CAAI,IAAA,CAAK+B,CAAI,CAC/C,CAIA,IAAMe,CAAAA,CAAO4D,GAAkBtE,CAAG,CAAA,CAClC,GAAIU,CAAAA,CAAM,CAER,IAAM8D,CAAAA,CAAoB,CAAC,SAAU,UAAA,CAAY,QAAA,CAAU,aAAc,MAAM,CAAA,CACzEC,EAAe/D,CAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAKtC,OAJI8D,EAAkB,QAAA,CAASC,CAAY,GAIvCL,EAAAA,CAA0B1D,CAAI,EACzB,IAAA,CAED9C,CAAAA,EAAwBA,EAAI,IAAA,CAAK8C,CAAI,CAC/C,CAEA,OAAO,IACT,CASO,SAASgE,GACdvF,CAAAA,CACAa,CAAAA,CAC2B,CAE3B,GAAImE,GAAc,GAAA,CAAIhF,CAAI,EACxB,OAAOgF,EAAAA,CAAc,IAAIhF,CAAI,CAAA,EAAK,KAIpC,IAAMwF,CAAAA,CAAWJ,GAAwBvE,CAAG,CAAA,CAC5C,OAAAmE,EAAAA,CAAc,GAAA,CAAIhF,EAAMwF,CAAQ,CAAA,CAEzBA,CACT,CCxIA,IAAMC,EAAAA,CAAuB,CAC3B,OAAQ,IAAI,GACd,EAoBO,SAASC,EAAAA,CAAUnE,EAA6B,CACrD,GAAI,CAACA,CAAAA,EAAQA,CAAAA,CAAK,SAAW,CAAA,CAC3B,OAAO,EAAC,CAGV,IAAMoE,CAAAA,CAA0B,GAC5BC,CAAAA,CAAU,EAAA,CACVjB,EAAI,CAAA,CAER,KAAOA,EAAIpD,CAAAA,CAAK,MAAA,EAAQ,CACtB,IAAMsE,CAAAA,CAAOtE,EAAKoD,CAAC,CAAA,CAEnB,GAAIkB,CAAAA,GAAS,GAAA,CAEPD,IACFD,CAAAA,CAAS,IAAA,CAAKG,EAAAA,CAAaF,CAAO,CAAC,CAAA,CACnCA,CAAAA,CAAU,IAEZjB,CAAAA,EAAAA,CAAAA,KAAAA,GACSkB,CAAAA,GAAS,IAAK,CAEnBD,CAAAA,GACFD,EAAS,IAAA,CAAKG,EAAAA,CAAaF,CAAO,CAAC,CAAA,CACnCA,EAAU,EAAA,CAAA,CAIZ,IAAMG,EAAaxE,CAAAA,CAAK,OAAA,CAAQ,GAAA,CAAKoD,CAAC,EACtC,GAAIoB,CAAAA,GAAe,GAEjBH,CAAAA,EAAWC,CAAAA,CACXlB,SACK,CACL,IAAMqB,EAAWzE,CAAAA,CAAK,KAAA,CAAMoD,EAAI,CAAA,CAAGoB,CAAU,EACzCC,CAAAA,GAAa,EAAA,CAEfL,EAAS,IAAA,CAAK,EAAE,CAAA,CACP,OAAA,CAAQ,KAAKK,CAAQ,CAAA,CAE9BL,EAAS,IAAA,CAAK,QAAA,CAASK,EAAU,EAAE,CAAC,EAGpCL,CAAAA,CAAS,IAAA,CAAKK,CAAQ,CAAA,CAExBrB,CAAAA,CAAIoB,EAAa,CAAA,CAGbxE,CAAAA,CAAKoD,CAAC,CAAA,GAAM,GAAA,EACdA,CAAAA,GAEJ,CACF,MACEiB,CAAAA,EAAWC,CAAAA,CACXlB,IAEJ,CAGA,OAAIiB,GACFD,CAAAA,CAAS,IAAA,CAAKG,GAAaF,CAAO,CAAC,EAG9BD,CACT,CAKA,SAASG,EAAAA,CAAaZ,CAAAA,CAA8B,CAElD,OAAI,OAAA,CAAQ,IAAA,CAAKA,CAAO,EACf,QAAA,CAASA,CAAAA,CAAS,EAAE,CAAA,CAEtBA,CACT,CAQO,SAASe,CAAAA,CAAgB1E,EAA6B,CAC3D,GAAI,CAACA,CAAAA,EAAQA,CAAAA,CAAK,SAAW,CAAA,CAC3B,OAAO,EAAC,CAGV,IAAM2E,CAAAA,CAAST,EAAAA,CAAU,OAAO,GAAA,CAAIlE,CAAI,EACxC,GAAI2E,CAAAA,CACF,OAAOA,CAAAA,CAGT,IAAMP,EAAWD,EAAAA,CAAUnE,CAAI,EAC/B,OAAAkE,EAAAA,CAAU,OAAO,GAAA,CAAIlE,CAAAA,CAAMoE,CAAQ,CAAA,CAC5BA,CACT,CAKO,SAASQ,IAAuB,CACrCV,EAAAA,CAAU,OAAO,KAAA,GACnB,CAQO,SAASW,EAAAA,CAAcT,EAAiC,CAC7D,OAAOA,EAAS,GAAA,CAAI,MAAM,EAAE,IAAA,CAAK,GAAG,CACtC,CASO,SAASU,CAAAA,CACdlC,CAAAA,CACA5C,EACS,CACT,IAAMoE,EAAW,OAAOpE,CAAAA,EAAS,SAAW0E,CAAAA,CAAgB1E,CAAI,EAAIA,CAAAA,CAEpE,GAAIoE,EAAS,MAAA,GAAW,CAAA,CACtB,OAAOxB,CAAAA,CAGT,IAAItF,EAAiBsF,CAAAA,CAErB,IAAA,IAAWe,CAAAA,IAAWS,CAAAA,CAAU,CAC9B,GAAI9G,CAAAA,EAAS,KACX,OAGF,GAAI,OAAOqG,CAAAA,EAAY,QAAA,CAAU,CAE/B,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQrG,CAAK,CAAA,CACtB,OAEFA,EAAQA,CAAAA,CAAMqG,CAAO,EACvB,CAAA,KAAO,CAEL,GAAI,OAAOrG,GAAU,QAAA,CACnB,OAEFA,EAASA,CAAAA,CAAkCqG,CAAO,EACpD,CACF,CAEA,OAAOrG,CACT,CAWO,SAASyH,CAAAA,CACdnC,CAAAA,CACA5C,EACA1C,CAAAA,CACAiC,CAAAA,CAkBI,EAAC,CACI,CACT,GAAM,CACJ,mBAAAyF,CAAAA,CAAqB,IAAA,CACrB,aAAAC,CAAAA,CAAe,KAAO,EAAC,CAAA,CACvB,WAAA,CAAAC,EAAc,IAAM,EACtB,CAAA,CAAI3F,CAAAA,CAEE6E,EAAW,OAAOpE,CAAAA,EAAS,QAAA,CAAW0E,CAAAA,CAAgB1E,CAAI,CAAA,CAAIA,CAAAA,CAEpE,GAAIoE,CAAAA,CAAS,MAAA,GAAW,EACtB,OAAO,MAAA,CAGT,IAAMe,CAAAA,CAAcf,CAAAA,CAASA,EAAS,MAAA,CAAS,CAAC,EAC1CgB,CAAAA,CAAiBhB,CAAAA,CAAS,MAAM,CAAA,CAAG,EAAE,CAAA,CAGvChH,CAAAA,CAAkBwF,EAEtB,IAAA,IAASQ,CAAAA,CAAI,EAAGA,CAAAA,CAAIgC,CAAAA,CAAe,OAAQhC,CAAAA,EAAAA,CAAK,CAC9C,IAAMO,CAAAA,CAAUyB,CAAAA,CAAehC,CAAC,CAAA,CAE1BiC,CAAAA,CAAmB,OADLD,CAAAA,CAAehC,CAAAA,CAAI,CAAC,CAAA,EAAK+B,CAAAA,CAAAA,EACG,QAAA,CAEhD,GAAI,OAAOxB,CAAAA,EAAY,QAAA,CAAU,CAE/B,GAAI,CAAC,MAAM,OAAA,CAAQvG,CAAM,EACvB,OAEO,MAAA,CAIT,KAAOA,CAAAA,CAAO,MAAA,EAAUuG,GACtBvG,CAAAA,CAAO,IAAA,CAAK,MAAS,CAAA,CAIvB,GAAIA,CAAAA,CAAOuG,CAAO,GAAK,IAAA,EAAQ,OAAOvG,EAAOuG,CAAO,CAAA,EAAM,SAAU,CAClE,GAAI,CAACqB,CAAAA,CAAoB,OAAO,OAChC5H,CAAAA,CAAOuG,CAAO,EAAI0B,CAAAA,CAAmBH,CAAAA,GAAgBD,CAAAA,GACvD,CAEA7H,CAAAA,CAASA,EAAOuG,CAAO,EACzB,MAAO,CAEL,GAAI,OAAOvG,CAAAA,EAAW,QAAA,EAAYA,IAAW,IAAA,CAC3C,OAAO,OAGT,IAAMkI,CAAAA,CAAYlI,EAElB,GAAIkI,CAAAA,CAAU3B,CAAO,CAAA,EAAK,IAAA,EAAQ,OAAO2B,CAAAA,CAAU3B,CAAO,CAAA,EAAM,QAAA,CAAU,CACxE,GAAI,CAACqB,EAAoB,OAAO,MAAA,CAChCM,EAAU3B,CAAO,CAAA,CAAI0B,EAAmBH,CAAAA,EAAY,CAAID,IAC1D,CAEA7H,EAASkI,CAAAA,CAAU3B,CAAO,EAC5B,CACF,CAGA,GAAI,OAAOwB,GAAgB,QAAA,CAAU,CACnC,GAAI,CAAC,KAAA,CAAM,QAAQ/H,CAAM,CAAA,CACvB,OAAO,MAAA,CAET,KAAOA,EAAO,MAAA,EAAU+H,CAAAA,EACtB/H,EAAO,IAAA,CAAK,MAAS,CAAA,CAEvBA,CAAAA,CAAO+H,CAAW,CAAA,CAAI7H,EACxB,MAAO,CACL,GAAI,OAAOF,CAAAA,EAAW,QAAA,EAAYA,IAAW,IAAA,CAC3C,OAAO,OAERA,CAAAA,CAAmC+H,CAAW,EAAI7H,EACrD,CAEA,OAAO,KACT,CAeO,SAASiI,CAAAA,CAAUC,EAAiBxF,CAAAA,CAAuB,CAOhE,GALIwF,CAAAA,GAAYxF,CAAAA,EAKZA,EAAK,UAAA,CAAWwF,CAAAA,CAAU,GAAG,CAAA,CAC/B,OAAO,MAIT,GAAIA,CAAAA,CAAQ,SAAS,GAAG,CAAA,CAAG,CACzB,IAAMC,CAAAA,CAAaD,CAAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,EACxC,OAAOxF,CAAAA,CAAK,WAAWyF,CAAAA,CAAa,GAAG,GAAKzF,CAAAA,GAASyF,CACvD,CAGA,OAAI,CAAA,CAAAD,EAAQ,UAAA,CAAWxF,CAAAA,CAAO,GAAG,CAKnC,CAQO,SAAS0F,EAAAA,CAAc1F,EAAsB,CAClD,IAAMoE,EAAWM,CAAAA,CAAgB1E,CAAI,EACrC,OAAIoE,CAAAA,CAAS,QAAU,CAAA,CACd,EAAA,CAEFS,GAAcT,CAAAA,CAAS,KAAA,CAAM,EAAG,EAAE,CAAC,CAC5C,CAQO,SAASuB,EAAAA,CAAe3F,CAAAA,CAAuC,CACpE,IAAMoE,CAAAA,CAAWM,EAAgB1E,CAAI,CAAA,CACrC,OAAOoE,CAAAA,CAASA,CAAAA,CAAS,OAAS,CAAC,CACrC,CC7VA,IAAMwB,EAAAA,CAAW,IAAI,OAAA,CAKfC,EAAAA,CAAe,CAEnB,OAAA,CAAS,GAGX,EAKA,SAASC,CAAAA,CAAS5I,EAAmD,CACnE,IAAI6I,EAAQH,EAAAA,CAAS,GAAA,CAAI1I,CAA8C,CAAA,CACvE,OAAK6I,IACHA,CAAAA,CAAQ,IAAI,IACZH,EAAAA,CAAS,GAAA,CAAI1I,EAAgD6I,CAAK,CAAA,CAAA,CAE7DA,CACT,CAKA,SAASC,EAAAA,CACPC,CAAAA,CACA/I,EACS,CAET,OAKO+I,CAAAA,CAAM,aAAa,KAAA,CAAMC,CAAAA,EAAO,CACrC,GAAIA,EAAI,QAAA,CAAS,GAAG,EAAG,CAErB,IAAMT,EAAaS,CAAAA,CAAI,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,EACpC,OAAOhJ,CAAAA,CAAI,KAAKuI,CAAU,CAAA,EAAK,IACjC,CAEA,OAAOvI,CAAAA,CAAI,IAAA,CAAKgJ,CAAG,CAAA,GAAM,MAC3B,CAAC,CACH,CAKA,SAASC,EAAAA,CAAYJ,CAAAA,CAA2C,CAC9D,IAAIK,CAAAA,CAA2B,KAC3BC,CAAAA,CAAa,CAAA,CAAA,CAAA,CAEjB,OAAW,CAAC9F,CAAAA,CAAK0F,CAAK,CAAA,GAAKF,CAAAA,CAAM,OAAA,EAAQ,CACnCE,EAAM,SAAA,CAAYI,CAAAA,GACpBA,EAAaJ,CAAAA,CAAM,SAAA,CACnBG,EAAY7F,CAAAA,CAAAA,CAIZ6F,CAAAA,EACFL,EAAM,MAAA,CAAOK,CAAS,EAE1B,CASO,SAASE,EACd7H,CAAAA,CACAvB,CAAAA,CACgB,CAChB,IAAM6I,CAAAA,CAAQD,CAAAA,CAAS5I,CAAG,EACpB+I,CAAAA,CAAQF,CAAAA,CAAM,IAAItH,CAAI,CAAA,CAE5B,OAAKwH,CAAAA,CAIAD,EAAAA,CAAaC,EAAO/I,CAAG,CAAA,EAM5B+I,EAAM,SAAA,CAAY,IAAA,CAAK,KAAI,CACpBA,CAAAA,CAAM,SANXF,CAAAA,CAAM,MAAA,CAAOtH,CAAI,CAAA,CACV,MALA,IAWX,CAUO,SAAS8H,CAAAA,CACd9H,CAAAA,CACAyE,EACAI,CAAAA,CACApG,CAAAA,CACM,CACN,IAAM6I,CAAAA,CAAQD,EAAS5I,CAAG,CAAA,CAGtB6I,EAAM,IAAA,EAAQF,EAAAA,CAAa,SAC7BM,EAAAA,CAAYJ,CAAK,CAAA,CAGnBA,CAAAA,CAAM,IAAItH,CAAAA,CAAM,CACd,KAAAA,CAAAA,CACA,MAAA,CAAAyE,EACA,YAAA,CAAAI,CAAAA,CACA,UAAW,IAAA,CAAK,GAAA,EAClB,CAAC,EACH,CAUO,SAASkD,CAAAA,CACdC,EACAvJ,CAAAA,CACM,CACN,IAAM6I,CAAAA,CAAQD,EAAS5I,CAAG,CAAA,CACpBwJ,EAAqB,EAAC,CAE5B,OAAW,CAACjI,CAAAA,CAAMwH,CAAK,CAAA,GAAKF,CAAAA,CAAM,SAAQ,CAErBE,CAAAA,CAAM,aAAa,IAAA,CAAKC,CAAAA,EACzCX,EAAUW,CAAAA,CAAKO,CAAW,CAAA,EAAKlB,CAAAA,CAAUkB,EAAaP,CAAG,CAC3D,GAGEQ,CAAAA,CAAS,IAAA,CAAKjI,CAAI,CAAA,CAKtB,IAAA,IAAWA,KAAQiI,CAAAA,CACjBX,CAAAA,CAAM,OAAOtH,CAAI,EAErB,CAKO,SAASkI,EAAAA,CAAWzJ,EAA2B,CACtC4I,CAAAA,CAAS5I,CAAG,CAAA,CACpB,QACR,CAKO,SAAS0J,EAAAA,CAAc1J,CAAAA,CAG5B,CACA,IAAM6I,CAAAA,CAAQD,EAAS5I,CAAG,CAAA,CAC1B,OAAO,CACL,IAAA,CAAM6I,EAAM,IAAA,CACZ,WAAA,CAAa,MAAM,IAAA,CAAKA,CAAAA,CAAM,IAAA,EAAM,CACtC,CACF,CCtKO,SAASlE,CAAAA,CACdpD,CAAAA,CACAvB,EACAqC,CAAAA,CAA6B,GACpB,CACT,GAAI,CAEF,IAAM+B,CAAAA,CAAgB,CACpB,GAAGpE,CAAAA,CAAI,aACP,GAAGqC,CACL,CAAA,CAGMoF,CAAAA,CAAS2B,EAAoB7H,CAAAA,CAAMvB,CAAG,EAC5C,GAAIyH,CAAAA,GAAW,KACb,OAAOA,CAAAA,CAIT,IAAMrF,CAAAA,CAAMd,CAAAA,CAAgBC,CAAI,CAAA,CAGhCY,CAAAA,CAAYC,EAAK,CACf,YAAA,CAAcgC,EAAc,YAAA,CAC5B,eAAA,CAAiBA,CAAAA,CAAc,eACjC,CAAC,CAAA,CAGD,IAAM2C,EAAWD,EAAAA,CAAsBvF,CAAAA,CAAMa,CAAG,CAAA,CAChD,GAAI2E,EAAU,CACZ,IAAMf,EAASe,CAAAA,CAAS/G,CAAG,EAErBoG,CAAAA,CAAeD,CAAAA,CAAoB/D,CAAG,CAAA,CAC5C,OAAAiH,CAAAA,CAAoB9H,CAAAA,CAAMyE,EAAQI,CAAAA,CAAcpG,CAAG,EAC5CgG,CACT,CAGA,IAAMA,CAAAA,CAAS7B,CAAAA,CAAmB/B,EAAKpC,CAAAA,CAAKoE,CAAa,EAGnDgC,CAAAA,CAAeD,CAAAA,CAAoB/D,CAAG,CAAA,CAC5C,OAAAiH,EAAoB9H,CAAAA,CAAMyE,CAAAA,CAAQI,CAAAA,CAAcpG,CAAG,EAE5CgG,CACT,CAAA,MAAStE,EAAgB,CACvB,GAAIA,aAAiBZ,CAAAA,CACnB,MAAMY,EAER,IAAMC,CAAAA,CAAeD,aAAiB,KAAA,CAAQA,CAAAA,CAAM,QAAU,MAAA,CAAOA,CAAK,EAC1E,MAAM,IAAIZ,CAAAA,CACRS,CAAAA,CACA,iCAAiCI,CAAY,CAAA,CAAA,CAC7CN,EAAW,2BAAA,CACX,CACE,SAAU,CACR,aAAA,CAAeK,aAAiB,KAAA,CAAQA,CAAAA,CAAM,KAAO,SAAA,CACrD,KAAA,CAAOA,aAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAO,KAAA,CAAM;AAAA,CAAI,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CAAI,MACzE,CACF,CACF,CACF,CACF,CC7EA,eAAsBiI,EAAAA,CACpB3J,CAAAA,CACAa,CAAAA,CACe,CAEf,GAAM,CAAE,IAAA,CAAAiC,CAAAA,CAAM,KAAA,CAAA1C,CAAM,CAAA,CAAIS,CAAAA,CAExB,GAAI,CAACiC,CAAAA,EAAQ,OAAOA,GAAS,QAAA,CAC3B,MAAM,IAAIlC,CAAAA,CACRC,CAAAA,CACA,sCAAA,CACAQ,CAAAA,CAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,MAAO,CAAE,CAChC,CAAA,CAIF,IAAIuI,CAAAA,CAAaxJ,CAAAA,CACjB,GAAI,OAAOA,CAAAA,EAAU,QAAA,EAAYA,CAAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAKA,CAAAA,CAAM,QAAA,CAAS,IAAI,CAAA,CAAG,CAE/E,IAAMmB,EAAOnB,CAAAA,CAAM,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAAE,IAAA,EAAK,CACrCwJ,CAAAA,CAAajF,CAAAA,CAASpD,CAAAA,CAAMvB,CAAG,EACjC,CAGAA,CAAAA,CAAI,IAAA,CAAK8C,CAAAA,CAAM8G,CAAU,EAC3B,CC7BA,eAAsBC,EAAAA,CACpB7J,CAAAA,CACAa,CAAAA,CACe,CAEf,GAAM,CAAE,KAAA,CAAAiJ,CAAAA,CAAO,IAAA,CAAAC,CAAK,CAAA,CAAIlJ,CAAAA,CAExB,GAAI,CAACiJ,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,CAC7B,MAAM,IAAIlJ,CAAAA,CACRC,CAAAA,CACA,wCAAA,CACAQ,CAAAA,CAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,OAAQ,CAAE,CACjC,CAAA,CAIF,IAAI2I,CAAAA,CAAYD,CAAAA,CAChB,GAAI,OAAOA,CAAAA,EAAS,QAAA,EAAYA,CAAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAKA,CAAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAG,CAC5E,IAAMxI,CAAAA,CAAOwI,CAAAA,CAAK,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAAE,IAAA,EAAK,CACpCC,CAAAA,CAAYrF,CAAAA,CAASpD,CAAAA,CAAMvB,CAAG,EAChC,CAGAA,CAAAA,CAAI,KAAA,CAAM8J,CAAAA,CAAOE,CAAS,EAC5B,CClBO,SAASC,CAAAA,CAAkB1I,CAAAA,CAAsB,CACtD,OAAI,OAAOA,CAAAA,EAAS,QAAA,CACX,MAAA,CAAOA,CAAI,CAAA,CAIhBA,CAAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAKA,CAAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CACtCA,CAAAA,CAAK,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAAE,IAAA,EAAK,CAGzBA,EAAK,IAAA,EACd,CCKA,eAAsB2I,CAAAA,CACpBC,CAAAA,CACAnK,CAAAA,CACAqC,CAAAA,CAA0B,EAAC,CACZ,CACf,IAAMiC,CAAAA,CAAUjC,CAAAA,CAAQ,OAAA,EAAW,GAAA,CAC7BgC,EAAWhC,CAAAA,CAAQ,QAAA,EAAY,GAAA,CAC/BmC,CAAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CACvBD,CAAAA,CAAY,CAAA,CAGZ6F,CAAAA,CAA0C,IAAA,CAC9C,GAAI,OAAO,eAAA,CAAoB,GAAA,CAAa,CAC1CA,EAAkB,IAAI,eAAA,CAGtB,IAAMC,CAAAA,CAAY,UAAA,CAAW,IAAM,CACjCD,CAAAA,EAAiB,KAAA,GACnB,CAAA,CAAG9F,CAAO,CAAA,CAGJgG,CAAAA,CAAU,IAAM,YAAA,CAAaD,CAAS,CAAA,CAE5C,GAAI,CACF,MAAME,EAAAA,CAAeJ,CAAAA,CAASnK,CAAAA,CAAKoK,CAAAA,CAAgB,MAAA,CAAQ/F,CAAAA,CAAU,IAAM,CAEzE,GADAE,CAAAA,EAAAA,CACIA,CAAAA,CAAYF,CAAAA,CACd,MAAM,IAAIzD,CAAAA,CACRuJ,CAAAA,CAAQA,CAAAA,CAAQ,MAAA,CAAS,CAAC,CAAA,EAAK,CAAE,IAAA,CAAM,SAAU,CAAA,CACjD,CAAA,qCAAA,EAAwC9F,CAAQ,CAAA,CAAA,CAAA,CAChDhD,CAAAA,CAAW,yBAAA,CACX,CACE,QAAA,CAAU,CACR,QAAA,CAAAgD,CAAAA,CACA,YAAA,CAAcE,CAChB,CACF,CACF,CAAA,CAGF,GAAI,IAAA,CAAK,GAAA,EAAI,CAAIC,CAAAA,CAAYF,CAAAA,CAC3B,MAAM,IAAI1D,CAAAA,CACRuJ,CAAAA,CAAQA,CAAAA,CAAQ,MAAA,CAAS,CAAC,CAAA,EAAK,CAAE,IAAA,CAAM,SAAU,CAAA,CACjD,CAAA,mCAAA,EAAsC7F,CAAO,CAAA,GAAA,CAAA,CAC7CjD,CAAAA,CAAW,cAAA,CACX,CACE,QAAA,CAAU,CACR,OAAA,CAAAiD,CAAAA,CACA,WAAA,CAAa,IAAA,CAAK,GAAA,EAAI,CAAIE,CAC5B,CACF,CACF,CAEJ,CAAC,CAAA,CACD8F,CAAAA,GACF,OAAS5I,CAAAA,CAAO,CACd,MAAA4I,CAAAA,EAAQ,CACF5I,CACR,CACF,CAAA,KAEE,MAAM6I,EAAAA,CAAeJ,CAAAA,CAASnK,CAAAA,CAAK,IAAA,CAAMqE,CAAAA,CAAU,IAAM,CAEvD,GADAE,CAAAA,EAAAA,CACIA,CAAAA,CAAYF,CAAAA,CACd,MAAM,IAAIzD,CAAAA,CACRuJ,CAAAA,CAAQA,CAAAA,CAAQ,MAAA,CAAS,CAAC,CAAA,EAAK,CAAE,IAAA,CAAM,SAAU,CAAA,CACjD,CAAA,qCAAA,EAAwC9F,CAAQ,CAAA,CAAA,CAAA,CAChDhD,CAAAA,CAAW,yBAAA,CACX,CACE,QAAA,CAAU,CACR,QAAA,CAAAgD,CAAAA,CACA,YAAA,CAAcE,CAChB,CACF,CACF,CAAA,CAGF,GAAI,IAAA,CAAK,GAAA,GAAQC,CAAAA,CAAYF,CAAAA,CAC3B,MAAM,IAAI1D,CAAAA,CACRuJ,CAAAA,CAAQA,CAAAA,CAAQ,MAAA,CAAS,CAAC,CAAA,EAAK,CAAE,IAAA,CAAM,SAAU,CAAA,CACjD,CAAA,mCAAA,EAAsC7F,CAAO,MAC7CjD,CAAAA,CAAW,cAAA,CACX,CACE,QAAA,CAAU,CACR,OAAA,CAAAiD,CAAAA,CACA,WAAA,CAAa,IAAA,CAAK,GAAA,EAAI,CAAIE,CAC5B,CACF,CACF,CAEJ,CAAC,EAIH,GAAI,IAAA,CAAK,GAAA,EAAI,CAAIA,CAAAA,CAAYF,CAAAA,CAC3B,MAAM,IAAI1D,CAAAA,CACRuJ,CAAAA,CAAQA,CAAAA,CAAQ,MAAA,CAAS,CAAC,CAAA,EAAK,CAAE,IAAA,CAAM,SAAU,CAAA,CACjD,CAAA,mCAAA,EAAsC7F,CAAO,CAAA,GAAA,CAAA,CAC7CjD,CAAAA,CAAW,cAAA,CACX,CACE,QAAA,CAAU,CACR,OAAA,CAAAiD,CAAAA,CACA,WAAA,CAAa,IAAA,CAAK,GAAA,EAAI,CAAIE,EAC1B,WAAA,CAAa2F,CAAAA,CAAQ,MACvB,CACF,CACF,CAEJ,CAKA,eAAeI,EAAAA,CACbJ,CAAAA,CACAnK,CAAAA,CACAwK,CAAAA,CACAC,CAAAA,CACA/F,CAAAA,CACe,CACf,IAAA,IAAW7D,KAAUsJ,CAAAA,CAAS,CAE5B,GAAIK,CAAAA,EAAQ,OAAA,CACV,MAAM,IAAI5J,CAAAA,CACRC,CAAAA,CACA,8BAAA,CACAQ,CAAAA,CAAW,cACb,CAAA,CAIFqD,CAAAA,EAAY,CAGZ,IAAMgG,EAAU1K,CAAAA,CAAI,QAAA,CAASa,CAAAA,CAAO,IAAI,CAAA,CAExC,GAAI,CAAC6J,CAAAA,CACH,MAAM,IAAI9J,CAAAA,CACRC,CAAAA,CACA,CAAA,qBAAA,EAAwBA,CAAAA,CAAO,IAAI,CAAA,gDAAA,CAAA,CACnCQ,EAAW,mBACb,CAAA,CAGF,GAAI,CACF,MAAMqJ,CAAAA,CAAQ1K,CAAAA,CAAKa,CAAM,EAC3B,CAAA,MAASa,CAAAA,CAAgB,CAOvB,GALIA,CAAAA,YAAiBd,CAAAA,EAKjBc,CAAAA,YAAiBV,EACnB,MAAMU,CAAAA,CAIR,IAAMC,CAAAA,CAAeD,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,MAAA,CAAOA,CAAK,CAAA,CAC1E,MAAM,IAAId,CAAAA,CACRC,CAAAA,CACA,CAAA,yBAAA,EAA4Bc,CAAY,CAAA,CAAA,CACxCN,CAAAA,CAAW,sBAAA,CACX,CACE,QAAA,CAAU,CACR,aAAA,CAAeK,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAM,IAAA,CAAO,SAAA,CACrD,KAAA,CAAOA,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAO,KAAA,CAAM;AAAA,CAAI,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,CAAC,EAAI,MACzE,CACF,CACF,CACF,CACF,CACF,CCjMA,eAAsBiJ,GACpB3K,CAAAA,CACAa,CAAAA,CACe,CAEf,GAAM,CAAE,IAAA,CAAA+J,CAAAA,CAAM,IAAA,CAAAC,EAAM,IAAA,CAAMC,CAAW,CAAA,CAAIjK,CAAAA,CAMzC,GAAI,CAAC+J,CAAAA,EAAQ,OAAOA,GAAS,QAAA,CAC3B,MAAM,IAAIhK,CAAAA,CACRC,CAAAA,CACA,qCAAA,CACAQ,CAAAA,CAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,MAAO,CAAE,CAChC,CAAA,CAIF,IAAM0J,EAAWd,CAAAA,CAAkBW,CAAI,CAAA,CAGrBjG,CAAAA,CAASoG,CAAAA,CAAU/K,CAAG,CAAA,CAIlC6K,CAAAA,EAAQ,MAAM,OAAA,CAAQA,CAAI,CAAA,EAC5B,MAAMX,CAAAA,CAAQW,CAAAA,CAAM7K,CAAG,CAAA,CAGrB8K,GAAc,KAAA,CAAM,OAAA,CAAQA,CAAU,CAAA,EACxC,MAAMZ,CAAAA,CAAQY,CAAAA,CAAY9K,CAAG,EAGnC,CCtCA,IAAMgL,EAAAA,CAAN,KAAsB,CACZ,IAAA,CAAuC,EAAC,CACxC,QAER,WAAA,CAAYC,CAAAA,CAAkB,EAAA,CAAI,CAChC,IAAA,CAAK,OAAA,CAAUA,EACjB,CAKA,SAAmC,CACjC,OAAI,IAAA,CAAK,IAAA,CAAK,MAAA,CAAS,CAAA,CACd,IAAA,CAAK,IAAA,CAAK,KAAI,CAEhB,EACT,CAKA,OAAA,CAAQjL,CAAAA,CAAoC,CAEtC,OAAA,GAAWA,GAAK,OAAOA,CAAAA,CAAI,KAAA,CAC3B,QAAA,GAAYA,CAAAA,EAAK,OAAOA,CAAAA,CAAI,MAAA,CAGhC,IAAMkL,CAAAA,CAAyB,EAAC,CAChC,IAAA,IAAW7H,CAAAA,IAAOrD,CAAAA,CACZ,CAACqD,CAAAA,CAAI,WAAW,GAAG,CAAA,EAAK,CAACA,CAAAA,CAAI,WAAW,GAAG,CAAA,EAC7C6H,CAAAA,CAAa,IAAA,CAAK7H,CAAG,CAAA,CAGzB,IAAA,IAAWA,CAAAA,IAAO6H,CAAAA,CAChB,OAAOlL,CAAAA,CAAIqD,CAAG,CAAA,CAIZ,KAAK,IAAA,CAAK,MAAA,CAAS,IAAA,CAAK,OAAA,EAC1B,IAAA,CAAK,IAAA,CAAK,IAAA,CAAKrD,CAAG,EAEtB,CAKA,KAAA,EAAc,CACZ,IAAA,CAAK,IAAA,CAAK,MAAA,CAAS,EACrB,CAKA,IAAI,IAAA,EAAe,CACjB,OAAO,IAAA,CAAK,IAAA,CAAK,MACnB,CACF,CAAA,CAKImL,GAAqC,IAAA,CAKlC,SAASC,EAAAA,EAAsC,CACpD,OAAKD,EAAAA,GACHA,EAAAA,CAAa,IAAIH,IAEZG,EACT,CAUO,SAASE,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACAhI,CAAAA,CACgB,CAEhB,IAAMiI,CAAAA,CADOJ,EAAAA,EAAmB,CACX,OAAA,EAAQ,CAGvBK,CAAAA,CAAU,MAAA,CAAO,MAAA,CAAOH,CAAS,CAAA,CAGvC,OAAA,MAAA,CAAO,MAAA,CAAOG,CAAAA,CAASD,CAAO,CAAA,CAG9BC,CAAAA,CAAQ,KAAA,CAAQF,CAAAA,CAChBE,EAAQ,MAAA,CAASlI,CAAAA,CAEVkI,CACT,CAOO,SAASC,CAAAA,CAAmBD,CAAAA,CAAwC,CAC5DL,IAAmB,CAC3B,OAAA,CAAQK,CAAO,EACtB,CC3GA,eAAsBE,EAAAA,CACpB3L,CAAAA,CACAa,EACe,CAEf,GAAM,CAAE,GAAA,CAAK+K,CAAAA,CAAS,EAAA,CAAIC,CAAAA,CAAQ,IAAA,CAAAC,CAAK,CAAA,CAAIjL,CAAAA,CAE3C,GAAI,CAAC+K,CAAAA,EAAW,OAAOA,CAAAA,EAAY,QAAA,CACjC,MAAM,IAAIhL,CAAAA,CACRC,CAAAA,CACA,sCAAA,CACAQ,CAAAA,CAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,KAAM,CAAE,CAC/B,CAAA,CAGF,GAAI,CAACwK,CAAAA,EAAU,OAAOA,CAAAA,EAAW,QAAA,CAC/B,MAAM,IAAIjL,CAAAA,CACRC,CAAAA,CACA,qCAAA,CACAQ,CAAAA,CAAW,qBACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,IAAK,CAAE,CAC9B,CAAA,CAGF,GAAI,CAACyK,CAAAA,EAAQ,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAI,CAAA,CAC9B,MAAM,IAAIlL,EACRC,CAAAA,CACA,0DAAA,CACAQ,CAAAA,CAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,MAAO,CAAE,CAChC,CAAA,CAIF,IAAM0K,CAAAA,CAAWpH,CAAAA,CAASkH,CAAAA,CAAQ7L,CAAG,EAErC,GAAI+L,CAAAA,EAAY,IAAA,CAKhB,GAAI,KAAA,CAAM,OAAA,CAAQA,CAAQ,CAAA,CACxB,QAAS7F,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI6F,CAAAA,CAAS,MAAA,CAAQ7F,CAAAA,EAAAA,CAAK,CAExC,IAAMuF,EAAUJ,CAAAA,CAAkBrL,CAAAA,CAAK+L,CAAAA,CAAS7F,CAAC,CAAA,CAAGA,CAAC,CAAA,CACrDuF,CAAAA,CAAQG,CAAO,CAAA,CAAIG,CAAAA,CAAS7F,CAAC,CAAA,CAE7B,GAAI,CAEFoD,CAAAA,CAAgBsC,CAAAA,CAASH,CAAO,CAAA,CAChC,MAAMvB,CAAAA,CAAQ4B,CAAAA,CAAML,CAAO,EAC7B,CAAA,OAAE,CAEAC,CAAAA,CAAmBD,CAAO,EAC5B,CACF,CAAA,KAAA,GAGO,OAAOM,CAAAA,EAAa,QAAA,EAAYA,CAAAA,GAAa,IAAA,CAAM,CAC1D,IAAMC,CAAAA,CAAU,MAAA,CAAO,OAAA,CAAQD,CAAQ,CAAA,CACvC,IAAA,IAAS7F,CAAAA,CAAI,EAAGA,CAAAA,CAAI8F,CAAAA,CAAQ,MAAA,CAAQ9F,CAAAA,EAAAA,CAAK,CACvC,GAAM,EAAG9F,CAAK,CAAA,CAAI4L,CAAAA,CAAQ9F,CAAC,CAAA,CAErBuF,CAAAA,CAAUJ,CAAAA,CAAkBrL,CAAAA,CAAKI,CAAAA,CAAO8F,CAAC,CAAA,CAC/CuF,CAAAA,CAAQG,CAAO,CAAA,CAAIxL,CAAAA,CAEnB,GAAI,CAEFkJ,CAAAA,CAAgBsC,EAASH,CAAO,CAAA,CAChC,MAAMvB,CAAAA,CAAQ4B,CAAAA,CAAML,CAAO,EAC7B,CAAA,OAAE,CAEAC,CAAAA,CAAmBD,CAAO,EAC5B,CACF,CACF,CAAA,KAEE,MAAM,IAAI7K,EACRC,CAAAA,CACA,CAAA,8DAAA,EAAiE,OAAOkL,CAAQ,GAChF1K,CAAAA,CAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,IAAA,CAAM,UAAA,CAAY,OAAO0K,CAAS,CAAE,CAC3D,CAEJ,CC/EA,eAAsBE,EAAAA,CACpBjM,CAAAA,CACAa,CAAAA,CACkB,CAElB,GAAM,CAAE,MAAA,CAAAqL,EAAQ,MAAA,CAAQC,CAAAA,CAAW,QAAA,CAAAC,CAAS,CAAA,CAAIvL,CAAAA,CAMhD,GAAI,CAACqL,GAAU,OAAOA,CAAAA,EAAW,QAAA,CAC/B,MAAM,IAAItL,CAAAA,CACRC,CAAAA,CACA,yCAAA,CACAQ,EAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,QAAS,CAAE,CAClC,EAIF,IAAMqJ,CAAAA,CAAU1K,CAAAA,CAAI,QAAA,CAASkM,CAAM,CAAA,CACnC,GAAI,CAACxB,EACH,MAAM,IAAI1J,CAAAA,CACRkL,CAAAA,CACA,CAAA,QAAA,EAAWA,CAAM,CAAA,uBAAA,CAAA,CACjB,MAAA,CACA,CACE,QAAA,CAAU,CAAE,MAAA,CAAAA,CAAO,CACrB,CACF,CAAA,CAIF,IAAIG,CAAAA,CAEJ,GAAI,CACF,GAAIF,CAAAA,EAAa,IAAA,CAEfE,CAAAA,CAAc,EAAC,CAAA,KAAA,GACN,OAAOF,GAAc,QAAA,EAAYA,CAAAA,CAAU,UAAA,CAAW,IAAI,CAAA,EAAKA,CAAAA,CAAU,QAAA,CAAS,IAAI,EAAG,CAElG,IAAM5K,CAAAA,CAAO4K,CAAAA,CAAU,KAAA,CAAM,CAAA,CAAG,CAAA,CAAE,CAAA,CAAE,MAAK,CACzCE,CAAAA,CAAc1H,CAAAA,CAASpD,CAAAA,CAAMvB,CAAG,EAClC,CAAA,KAAA,GAAW,KAAA,CAAM,QAAQmM,CAAS,CAAA,CAAG,CAEnC,IAAMG,CAAAA,CAA6B,EAAC,CACpC,IAAA,IAAWC,KAASJ,CAAAA,CAClB,GAAI,OAAOI,CAAAA,EAAU,QAAA,EAAYA,CAAAA,CAAM,UAAA,CAAW,IAAI,GAAKA,CAAAA,CAAM,QAAA,CAAS,IAAI,CAAA,CAAG,CAC/E,IAAMhL,CAAAA,CAAOgL,CAAAA,CAAM,MAAM,CAAA,CAAG,CAAA,CAAE,CAAA,CAAE,IAAA,GAChCD,CAAAA,CAAgB,IAAA,CAAK3H,CAAAA,CAASpD,CAAAA,CAAMvB,CAAG,CAAC,EAC1C,CAAA,KACEsM,CAAAA,CAAgB,IAAA,CAAKC,CAAK,CAAA,CAG9BF,CAAAA,CAAcC,EAChB,CAAA,KAAA,GAAW,OAAOH,CAAAA,EAAc,QAAA,CAAU,CAExC,IAAMG,CAAAA,CAA2C,GACjD,IAAA,GAAW,CAACjJ,CAAAA,CAAKjD,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQ+L,CAAoC,EAC5E,GAAI,OAAO/L,CAAAA,EAAU,QAAA,EAAYA,CAAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAKA,EAAM,QAAA,CAAS,IAAI,CAAA,CAAG,CAC/E,IAAMmB,CAAAA,CAAOnB,CAAAA,CAAM,KAAA,CAAM,EAAG,CAAA,CAAE,CAAA,CAAE,IAAA,EAAK,CACrCkM,CAAAA,CAAgBjJ,CAAG,CAAA,CAAIsB,CAAAA,CAASpD,EAAMvB,CAAG,EAC3C,CAAA,KACEsM,CAAAA,CAAgBjJ,CAAG,CAAA,CAAIjD,CAAAA,CAG3BiM,CAAAA,CAAcC,EAChB,CAAA,KAEED,CAAAA,CAAcF,CAAAA,CAIhB,IAAMnG,EAAS,MAAM0E,CAAAA,CAAQ1K,CAAAA,CAAKqM,CAAW,EAG7C,OAAID,CAAAA,GACFpM,CAAAA,CAAI,IAAA,CAAKoM,CAAAA,CAAUpG,CAAM,CAAA,CACzBsD,CAAAA,CAAgB8C,EAAUpM,CAAG,CAAA,CAAA,CAGxBgG,CACT,CAAA,MAAStE,CAAAA,CAAgB,CAEvB,GAAIA,CAAAA,YAAiBV,EACnB,MAAMU,CAAAA,CAGR,IAAMC,CAAAA,CAAeD,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,OAAOA,CAAK,CAAA,CACpER,CAAAA,CAAgBQ,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAQ,MAAA,CAEvD,MAAM,IAAIV,CAAAA,CACRkL,CAAAA,CACA,CAAA,qBAAA,EAAwBvK,CAAY,CAAA,CAAA,CACpCT,CAAAA,CACA,CACE,QAAA,CAAU,CACR,MAAA,CAAAgL,CAAAA,CACA,MAAA,CAAQG,CACV,CACF,CACF,CACF,CACF,CCjHA,eAAsBG,EAAAA,CACpBxM,CAAAA,CACAa,CAAAA,CACe,CAEf,GAAM,CAAE,OAAA,CAAAsJ,CAAQ,CAAA,CAAItJ,CAAAA,CAEpB,GAAI,CAACsJ,GAAW,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAO,EACpC,MAAM,IAAIvJ,CAAAA,CACRC,CAAAA,CACA,mDAAA,CACAQ,CAAAA,CAAW,oBAAA,CACX,CAAE,SAAU,CAAE,KAAA,CAAO,SAAU,CAAE,CACnC,CAAA,CAGF,IAAMmB,CAAAA,CAAkD,EAAC,CAGzD,IAAA,IAAWiK,CAAAA,IAAOtC,CAAAA,CAChB,GAAI,CACF,MAAMD,CAAAA,CAAQ,CAACuC,CAAG,CAAA,CAAGzM,CAAG,EAC1B,CAAA,MAAS0B,CAAAA,CAAgB,CACvBc,CAAAA,CAAO,KAAK,CACV,MAAA,CAAQiK,CAAAA,CACR,KAAA,CAAO/K,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,MAAM,MAAA,CAAOA,CAAK,CAAC,CACjE,CAAC,EACH,CAIF,GAAIc,EAAO,MAAA,CAAS,CAAA,CAClB,MAAM,IAAIrB,CAAAA,CACRqB,CAAAA,CACA,CAAA,EAAGA,CAAAA,CAAO,MAAM,CAAA,wBAAA,CAAA,CAChB,CACE,QAAA,CAAU,CACR,YAAaA,CAAAA,CAAO,MAAA,CACpB,UAAA,CAAY2H,CAAAA,CAAQ,MACtB,CACF,CACF,CAEJ,CC3CA,eAAsBuC,EAAAA,CACpB1M,CAAAA,CACAa,CAAAA,CACe,CAEf,GAAM,CAAE,EAAA,CAAA8L,CAAG,CAAA,CAAI9L,CAAAA,CAEf,GAAI,CAAC8L,GAAM,OAAOA,CAAAA,EAAO,QAAA,CACvB,MAAM,IAAI/L,CAAAA,CACRC,CAAAA,CACA,yCAAA,CACAQ,EAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,IAAK,CAAE,CAC9B,EAIF,IAAIuL,CAAAA,CAAkBD,CAAAA,CACtB,GAAIA,CAAAA,CAAG,UAAA,CAAW,IAAI,CAAA,EAAKA,EAAG,QAAA,CAAS,IAAI,CAAA,CAAG,CAC5C,IAAMpL,CAAAA,CAAOoL,CAAAA,CAAG,KAAA,CAAM,EAAG,EAAE,CAAA,CAAE,IAAA,EAAK,CAC5B3G,CAAAA,CAASrB,CAAAA,CAASpD,CAAAA,CAAMvB,CAAG,EACjC,GAAI,OAAOgG,CAAAA,EAAW,QAAA,CACpB,MAAM,IAAIpF,CAAAA,CACRC,CAAAA,CACA,CAAA,wDAAA,EAA2D,OAAOmF,CAAM,CAAA,CAAA,CACxE3E,CAAAA,CAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,KAAM,UAAA,CAAY,OAAO2E,CAAO,CAAE,CACzD,CAAA,CAEF4G,CAAAA,CAAU5G,EACZ,CAGA,IAAM6G,CAAAA,CAAkB7M,CAAAA,CAAI,QAAA,CAAS,QAAA,EAAeA,CAAAA,CAAI,QAAA,CAAS,SAAA,CACjE,GAAI6M,CAAAA,CACF,MAAMA,CAAAA,CAAgB7M,CAAAA,CAAK,CAAE,EAAA,CAAI4M,CAAQ,CAAC,UAItC,OAAO,MAAA,CAAW,GAAA,EAAgB,MAAA,CAA2C,QAAA,CAC7E,MAAA,CAAsD,QAAA,CAAS,IAAA,CAAOA,OAExE,MAAM,IAAIhM,CAAAA,CACRC,CAAAA,CACA,qEAAA,CACAQ,CAAAA,CAAW,sBAAA,CACX,CAAE,SAAU,CAAE,MAAA,CAAQ,wBAAyB,CAAE,CACnD,CAGN,CClDA,eAAsByL,GACpB9M,CAAAA,CACAa,CAAAA,CACe,CAEf,GAAM,CAAE,KAAA,CAAAkM,CAAAA,CAAQ,MAAA,CAAQ,OAAA,CAAAvM,CAAQ,CAAA,CAAIK,CAAAA,CAEpC,GAAI,CAACL,CAAAA,CACH,MAAM,IAAII,CAAAA,CACRC,EACA,yCAAA,CACAQ,CAAAA,CAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,SAAU,CAAE,CACnC,CAAA,CAIF,IAAI2L,CAAAA,CAAwBxM,CAAAA,CAC5B,GAAI,OAAOA,CAAAA,EAAY,UAAYA,CAAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAKA,CAAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,CAAG,CACrF,IAAMe,CAAAA,CAAOf,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAAE,IAAA,GAClCwM,CAAAA,CAAerI,CAAAA,CAASpD,CAAAA,CAAMvB,CAAG,EACnC,CAGA,IAAMiN,CAAAA,CAAW,OAAOF,CAAK,CAAA,CAAE,WAAA,EAAY,CACrCG,CAAAA,CAAa,MAAA,CAAOF,CAAY,CAAA,CACtC,GAAI,OAAO,OAAA,CAAY,GAAA,CACrB,OAAQC,GACN,KAAK,OAAA,CACH,OAAA,CAAQ,MAAM,SAAA,CAAWC,CAAU,CAAA,CACnC,MACF,KAAK,MAAA,CACH,OAAA,CAAQ,IAAA,CAAK,UAAWA,CAAU,CAAA,CAClC,MAEF,QACE,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAWA,CAAU,EACjC,KACJ,CAEJ,CC3CO,SAASC,CAAAA,CACd/M,CAAAA,CACAJ,CAAAA,CACK,CAEL,GAAI,OAAOI,CAAAA,EAAU,QAAA,CAAU,CAC7B,GAAIA,CAAAA,CAAM,UAAA,CAAW,IAAI,GAAKA,CAAAA,CAAM,QAAA,CAAS,IAAI,CAAA,CAAG,CAClD,IAAMmB,CAAAA,CAAOnB,CAAAA,CAAM,MAAM,CAAA,CAAG,EAAE,CAAA,CAAE,IAAA,EAAK,CACrC,OAAOuE,CAAAA,CAASpD,CAAAA,CAAMvB,CAAG,CAC3B,CACA,OAAOI,CACT,CAGA,GAAI,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CACrB,OAAOA,CAAAA,CAAM,GAAA,CAAImL,GAAQ4B,CAAAA,CAA+B5B,CAAAA,CAAMvL,CAAG,CAAC,EAIpE,GAAII,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,CAAU,CACtC,IAAM4F,CAAAA,CAA8B,EAAC,CACrC,IAAA,GAAW,CAAC3C,CAAAA,CAAK+J,CAAG,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQhN,CAAK,CAAA,CAC3C4F,CAAAA,CAAO3C,CAAG,CAAA,CAAI8J,CAAAA,CAA+BC,CAAAA,CAAKpN,CAAG,CAAA,CAEvD,OAAOgG,CACT,CAGA,OAAO5F,CACT,CCxBA,eAAsBiN,EAAAA,CACpBrN,CAAAA,CACAa,EACe,CAEf,GAAM,CAAE,IAAA,CAAAiC,CAAAA,CAAM,KAAA,CAAA1C,CAAAA,CAAO,KAAA,CAAAkN,CAAM,CAAA,CAAIzM,CAAAA,CAE/B,GAAI,CAACiC,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,CAC3B,MAAM,IAAIlC,CAAAA,CACRC,CAAAA,CACA,uCAAA,CACAQ,CAAAA,CAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,MAAO,CAAE,CAChC,EAIF,IAAMkM,CAAAA,CAAQvN,CAAAA,CAAI,IAAA,CAAK8C,CAAI,CAAA,CAC3B,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQyK,CAAK,CAAA,CACtB,MAAM,IAAI3M,CAAAA,CACRC,CAAAA,CACA,CAAA,MAAA,EAASiC,CAAI,CAAA,4BAAA,CAAA,CACbzB,CAAAA,CAAW,oBAAA,CACX,CAAE,SAAU,CAAE,KAAA,CAAO,MAAA,CAAQ,IAAA,CAAAyB,CAAAA,CAAM,UAAA,CAAY,OAAOyK,CAAM,CAAE,CAChE,CAAA,CAIF,IAAMC,CAAAA,CAAaF,CAAAA,GAAU,MAAA,CAAYA,CAAAA,CAAQlN,CAAAA,CAEjD,GAAIoN,CAAAA,GAAe,MAAA,CACjB,MAAM,IAAI5M,CAAAA,CACRC,CAAAA,CACA,mDAAA,CACAQ,CAAAA,CAAW,qBACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,aAAc,CAAE,CACvC,CAAA,CAIF,IAAMuI,CAAAA,CAAauD,CAAAA,CAA+BK,CAAAA,CAAYxN,CAAG,CAAA,CAG7D,KAAA,CAAM,OAAA,CAAQ4J,CAAU,EAC1B2D,CAAAA,CAAM,IAAA,CAAK,GAAG3D,CAAU,CAAA,CAExB2D,CAAAA,CAAM,IAAA,CAAK3D,CAAU,EAIvBN,CAAAA,CAAgBxG,CAAAA,CAAM9C,CAAG,CAAA,CACzBsJ,CAAAA,CAAgB,CAAA,EAAGxG,CAAI,CAAA,EAAA,CAAA,CAAM9C,CAAG,EAClC,CCtDA,eAAsByN,EAAAA,CACpBzN,CAAAA,CACAa,CAAAA,CACe,CAEf,GAAM,CAAE,IAAA,CAAAiC,CAAK,CAAA,CAAIjC,CAAAA,CAEjB,GAAI,CAACiC,CAAAA,EAAQ,OAAOA,GAAS,QAAA,CAC3B,MAAM,IAAIlC,CAAAA,CACRC,CAAAA,CACA,sCAAA,CACAQ,CAAAA,CAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,MAAO,CAAE,CAChC,CAAA,CAIF,IAAMkM,EAAQvN,CAAAA,CAAI,IAAA,CAAK8C,CAAI,CAAA,CAC3B,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQyK,CAAK,CAAA,CACtB,MAAM,IAAI3M,CAAAA,CACRC,CAAAA,CACA,CAAA,MAAA,EAASiC,CAAI,CAAA,4BAAA,CAAA,CACbzB,EAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,MAAO,MAAA,CAAQ,IAAA,CAAAyB,CAAAA,CAAM,UAAA,CAAY,OAAOyK,CAAM,CAAE,CAChE,CAAA,CAIFA,CAAAA,CAAM,GAAA,EAAI,CAGVjE,CAAAA,CAAgBxG,EAAM9C,CAAG,CAAA,CACzBsJ,CAAAA,CAAgB,CAAA,EAAGxG,CAAI,CAAA,EAAA,CAAA,CAAM9C,CAAG,EAClC,CCjCA,eAAsB0N,EAAAA,CACpB1N,CAAAA,CACAa,CAAAA,CACe,CAEf,GAAM,CAAE,IAAA,CAAAiC,CAAK,CAAA,CAAIjC,CAAAA,CAEjB,GAAI,CAACiC,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,CAC3B,MAAM,IAAIlC,CAAAA,CACRC,CAAAA,CACA,wCAAA,CACAQ,CAAAA,CAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,MAAO,CAAE,CAChC,CAAA,CAIF,IAAMkM,CAAAA,CAAQvN,CAAAA,CAAI,KAAK8C,CAAI,CAAA,CAC3B,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQyK,CAAK,CAAA,CACtB,MAAM,IAAI3M,CAAAA,CACRC,CAAAA,CACA,CAAA,MAAA,EAASiC,CAAI,CAAA,4BAAA,CAAA,CACbzB,CAAAA,CAAW,oBAAA,CACX,CAAE,SAAU,CAAE,KAAA,CAAO,MAAA,CAAQ,IAAA,CAAAyB,CAAAA,CAAM,UAAA,CAAY,OAAOyK,CAAM,CAAE,CAChE,CAAA,CAIFA,CAAAA,CAAM,KAAA,EAAM,CAGZjE,CAAAA,CAAgBxG,CAAAA,CAAM9C,CAAG,EACzBsJ,CAAAA,CAAgB,CAAA,EAAGxG,CAAI,CAAA,EAAA,CAAA,CAAM9C,CAAG,EAClC,CC/BA,eAAsB2N,GACpB3N,CAAAA,CACAa,CAAAA,CACe,CAEf,GAAM,CAAE,IAAA,CAAAiC,CAAAA,CAAM,KAAA,CAAA1C,EAAO,KAAA,CAAAkN,CAAM,CAAA,CAAIzM,CAAAA,CAE/B,GAAI,CAACiC,CAAAA,EAAQ,OAAOA,GAAS,QAAA,CAC3B,MAAM,IAAIlC,CAAAA,CACRC,CAAAA,CACA,0CAAA,CACAQ,CAAAA,CAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,MAAO,CAAE,CAChC,CAAA,CAIF,IAAMkM,EAAQvN,CAAAA,CAAI,IAAA,CAAK8C,CAAI,CAAA,CAC3B,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQyK,CAAK,EACtB,MAAM,IAAI3M,CAAAA,CACRC,CAAAA,CACA,CAAA,MAAA,EAASiC,CAAI,CAAA,4BAAA,CAAA,CACbzB,CAAAA,CAAW,qBACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,MAAA,CAAQ,IAAA,CAAAyB,CAAAA,CAAM,UAAA,CAAY,OAAOyK,CAAM,CAAE,CAChE,CAAA,CAIF,IAAMC,CAAAA,CAAaF,CAAAA,GAAU,MAAA,CAAYA,EAAQlN,CAAAA,CAEjD,GAAIoN,CAAAA,GAAe,MAAA,CACjB,MAAM,IAAI5M,CAAAA,CACRC,CAAAA,CACA,uDACAQ,CAAAA,CAAW,oBAAA,CACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,aAAc,CAAE,CACvC,CAAA,CAIF,IAAMuI,CAAAA,CAAauD,CAAAA,CAA+BK,CAAAA,CAAYxN,CAAG,CAAA,CAG7D,KAAA,CAAM,QAAQ4J,CAAU,CAAA,CAC1B2D,CAAAA,CAAM,OAAA,CAAQ,GAAG3D,CAAU,CAAA,CAE3B2D,CAAAA,CAAM,QAAQ3D,CAAU,CAAA,CAI1BN,CAAAA,CAAgBxG,CAAAA,CAAM9C,CAAG,CAAA,CACzBsJ,CAAAA,CAAgB,CAAA,EAAGxG,CAAI,KAAM9C,CAAG,EAClC,CCpDA,eAAsB4N,EAAAA,CACpB5N,CAAAA,CACAa,CAAAA,CACe,CAEf,GAAM,CAAE,IAAA,CAAAiC,CAAAA,CAAM,KAAA,CAAA+K,CAAAA,CAAO,WAAA,CAAAC,CAAAA,CAAc,CAAA,CAAG,MAAAR,CAAM,CAAA,CAAIzM,CAAAA,CAEhD,GAAI,CAACiC,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,SAC3B,MAAM,IAAIlC,CAAAA,CACRC,CAAAA,CACA,yCAAA,CACAQ,CAAAA,CAAW,oBAAA,CACX,CAAE,SAAU,CAAE,KAAA,CAAO,MAAO,CAAE,CAChC,CAAA,CAIF,IAAMkM,CAAAA,CAAQvN,EAAI,IAAA,CAAK8C,CAAI,CAAA,CAC3B,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQyK,CAAK,EACtB,MAAM,IAAI3M,CAAAA,CACRC,CAAAA,CACA,CAAA,MAAA,EAASiC,CAAI,CAAA,4BAAA,CAAA,CACbzB,CAAAA,CAAW,qBACX,CAAE,QAAA,CAAU,CAAE,KAAA,CAAO,OAAQ,IAAA,CAAAyB,CAAAA,CAAM,UAAA,CAAY,OAAOyK,CAAM,CAAE,CAChE,CAAA,CAIF,IAAIQ,CAAAA,CACJ,GAAI,OAAOF,CAAAA,EAAU,UAAYA,CAAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAKA,CAAAA,CAAM,QAAA,CAAS,IAAI,CAAA,CAAG,CAC/E,IAAMtM,CAAAA,CAAOsM,CAAAA,CAAM,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAAE,IAAA,GAChCE,CAAAA,CAAa,MAAA,CAAOpJ,CAAAA,CAASpD,CAAAA,CAAMvB,CAAG,CAAW,EACnD,CAAA,KACE+N,EAAa,MAAA,CAAOF,CAAe,CAAA,CAIrC,IAAIG,CAAAA,CACJ,GAAI,OAAOF,CAAAA,EAAgB,UAAYA,CAAAA,CAAY,UAAA,CAAW,IAAI,CAAA,EAAKA,CAAAA,CAAY,QAAA,CAAS,IAAI,CAAA,CAAG,CACjG,IAAMvM,CAAAA,CAAOuM,CAAAA,CAAY,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAAE,IAAA,GACtCE,CAAAA,CAAmB,MAAA,CAAOrJ,CAAAA,CAASpD,CAAAA,CAAMvB,CAAG,CAAW,EACzD,CAAA,KACEgO,CAAAA,CAAmB,OAAOF,CAAqB,CAAA,CAIjD,IAAIG,CAAAA,CAAwB,EAAC,CAC7B,GAAIX,CAAAA,EAAS,KAAM,CACjB,IAAMY,CAAAA,CAAYf,CAAAA,CAA+BG,CAAAA,CAAOtN,CAAG,CAAA,CACvD,KAAA,CAAM,QAAQkO,CAAS,CAAA,CACzBD,CAAAA,CAAaC,CAAAA,CAEbD,CAAAA,CAAa,CAACC,CAAS,EAE3B,CAGAX,CAAAA,CAAM,MAAA,CAAOQ,CAAAA,CAAYC,CAAAA,CAAkB,GAAGC,CAAU,CAAA,CAGxD3E,CAAAA,CAAgBxG,EAAM9C,CAAG,CAAA,CACzBsJ,CAAAA,CAAgB,CAAA,EAAGxG,CAAI,CAAA,EAAA,CAAA,CAAM9C,CAAG,EAClC,CCtDA,IAAMmO,EAAAA,CAAiD,CAErD,GAAA,CAAOxE,EAAAA,CACP,IAAA,CAAQE,EAAAA,CACR,QAAA,CAAY6C,GACZ,GAAA,CAAOI,EAAAA,CAGP,EAAA,CAAMnC,EAAAA,CACN,IAAA,CAAQgB,EAAAA,CAGR,IAAA,CAAQM,EAAAA,CACR,MAASO,EAAAA,CAGT,IAAA,CAAQa,EAAAA,CACR,GAAA,CAAOI,GACP,KAAA,CAASC,EAAAA,CACT,OAAA,CAAWC,EAAAA,CACX,OAAUC,EACZ,CAAA,CAQO,SAASQ,CAAAA,CAAuBpO,CAAAA,CAA2B,CAEhE,IAAA,GAAW,CAAC+B,EAAM2I,CAAO,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQyD,EAAe,CAAA,CACpDpM,CAAAA,IAAQ/B,CAAAA,CAAI,WAChBA,CAAAA,CAAI,QAAA,CAAS+B,CAAI,CAAA,CAAI2I,CAAAA,EAG3B,CCnBO,SAAS2D,EAAAA,CACdC,EAA0D,EAAC,CAC3DjM,CAAAA,CAAwF,EAAC,CACjE,CAExBkM,EAAAA,CAAkBD,CAAY,EAE9B,GAAM,CACJ,MAAA,CAAAE,CAAAA,CACA,OAAA,CAAAC,CAAAA,CAAU,EAAC,CACX,cAAAC,CAAAA,CACA,YAAA,CAAA3G,CAAAA,CAAe,KAAO,EAAC,CAAA,CACvB,WAAA,CAAAC,CAAAA,CAAc,IAAM,EAAC,CACrB,WAAA,CAAA2G,CACF,CAAA,CAAItM,CAAAA,CAGAuM,CAAAA,CAA4C,IAAA,CAG1C5O,EAAM,CACV,GAAGsO,CAAAA,CACH,KAAA,CAAO,CAACxE,CAAAA,CAAeC,CAAAA,GAAmB,CACpCyE,CAAAA,EACFA,EAAO1E,CAAAA,CAAOC,CAAI,EAEtB,CAAA,CACA,QAAA,CAAU0E,CAAAA,CACV,YAAA,CAAcE,CAAAA,CACd,KAA6B7L,CAAAA,EACpB8E,CAAAA,CAAQ5H,CAAAA,CAAgC8C,CAAI,CAAA,CAErD,IAAA,CAAM,CAAuBA,CAAAA,CAAa1C,EAAoCiC,CAAAA,GAA+C,CAC3HwF,CAAAA,CAAQ7H,CAAAA,CAAgC8C,CAAAA,CAAM1C,CAAAA,CAAO,CACnD,YAAA,CAAA2H,EACA,WAAA,CAAAC,CACF,CAAC,CAAA,CAEDsB,CAAAA,CAAgBxG,CAAAA,CAAO8L,CAAAA,EAAc5O,CAAsB,EACvD0O,CAAAA,EAAiB,CAACrM,CAAAA,EAAS,YAAA,EAC3BqM,CAAAA,CAAgD5L,CAAAA,CAAM1C,CAAAA,CAAOwO,CAAAA,EAAc5O,CAAG,EAEpF,CACF,CAAA,CAGAoO,CAAAA,CAAuBpO,CAAgC,CAAA,CAGvD,IAAM6O,CAAAA,CAAU9O,EAAYC,CAAgC,CAAA,CAG5D,OAAA4O,CAAAA,CAAaC,CAAAA,CAENA,CACT,CAKA,SAASN,GAAkBO,CAAAA,CAAsC,CAC/D,IAAA,IAAWzL,CAAAA,IAAOyL,EAChB,GAAIzL,CAAAA,CAAI,UAAA,CAAW,GAAG,GAAKA,CAAAA,CAAI,UAAA,CAAW,GAAG,CAAA,CAC3C,MAAM,IAAI,KAAA,CACR,CAAA,eAAA,EAAkBA,CAAG,CAAA,oGAAA,CAEvB,CAGN,CC5FO,SAAS0L,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CAAoB,IACd,CAEN,SAASC,CAAAA,CACPtM,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAqM,CAAAA,CACA,CAKA,GAJI,EAAA,CAACvM,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,EAGNoM,CAAAA,CAASpM,CAAAA,CAAMC,CAAAA,CAAMC,EAAOqM,CAAM,CAAA,GAClC,KAAA,CAAA,EAInBvM,CAAAA,CAAK,QAAA,CAAA,CACP,GAAI,KAAA,CAAM,OAAA,CAAQA,EAAK,QAAQ,CAAA,CAC7BA,CAAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,CAACS,CAAAA,CAAYC,CAAAA,GAAkB,CACnD,GAAID,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,CAAU,CACrC,IAAM+L,CAAAA,CAAYvM,EAAO,CAAA,EAAGA,CAAI,CAAA,EAAGoM,CAAS,WAAWA,CAAS,CAAA,EAAG3L,CAAK,CAAA,CAAA,CAAK,WAAW2L,CAAS,CAAA,EAAG3L,CAAK,CAAA,CAAA,CACzG4L,CAAAA,CAAK7L,CAAAA,CAAqB+L,CAAAA,CAAWtM,CAAAA,CAAQ,EAAGF,CAAI,EACvD,CAEF,CAAC,CAAA,CAAA,KAAA,GACQ,OAAOA,CAAAA,CAAK,QAAA,EAAa,SAAU,CAE3C,IAAMwM,CAAAA,CAAYvM,CAAAA,CAAO,CAAA,EAAGA,CAAI,CAAA,EAAGoM,CAAS,WAAa,UAAA,CACzDC,CAAAA,CAAKtM,CAAAA,CAAK,QAAA,CAAmCwM,CAAAA,CAAWtM,CAAAA,CAAQ,CAAA,CAAGF,CAAI,EAC1E,CAAA,CAEJ,CAGAsM,CAAAA,CAAKH,CAAAA,CAAM,EAAA,CAAI,CAAA,CAAG,IAAI,EACxB,CCXO,SAASM,EAAAA,CACdC,CAAAA,CACAlN,CAAAA,CAKI,EAAC,CACW,CAChB,IAAMmN,EAAqB,CACzB,SAAA,CAAW,CAAA,CACX,QAAA,CAAU,CACZ,CAAA,CAEMC,CAAAA,CAAQ,IAAI,IACZC,CAAAA,CAAUrN,CAAAA,CAAQ,YAAA,CAAe,IAAI,IAA4B,MAAA,CAEvE,OAAA0M,CAAAA,CAAeQ,CAAAA,CAAQ,CAAC1M,CAAAA,CAAkBC,CAAAA,CAAcC,CAAAA,GAAkB,CAExEyM,CAAAA,CAAM,SAAA,EAAA,CACFzM,CAAAA,CAAQyM,CAAAA,CAAM,WAChBA,CAAAA,CAAM,QAAA,CAAWzM,CAAAA,CAAAA,CAInB,IAAM4M,CAAAA,CAAa9M,CAAAA,CACf8M,CAAAA,CAAW,EAAA,EAAM,OAAOA,CAAAA,CAAW,EAAA,EAAO,QAAA,EAC5CF,CAAAA,CAAM,GAAA,CAAIE,CAAAA,CAAW,EAAA,CAAI7M,CAAI,EAI3B4M,CAAAA,EACFA,CAAAA,CAAQ,GAAA,CAAI5M,CAAAA,CAAMD,CAAI,CAAA,CAIxBR,CAAAA,CAAQ,MAAA,GAASQ,EAAMC,CAAAA,CAAMC,CAAK,EACpC,CAAC,CAAA,CAEM,CACL,KAAA,CAAAyM,CAAAA,CACA,MAAO,CAAE,KAAA,CAAAC,CAAAA,CAAO,OAAA,CAAAC,CAAQ,CAC1B,CACF,CASO,SAASE,EAAAA,CACdL,CAAAA,CACAM,CAAAA,CAC2C,CAC3C,IAAMC,CAAAA,CAAqD,EAAC,CAE5D,OAAAf,CAAAA,CAAeQ,CAAAA,CAAQ,CAAC1M,CAAAA,CAAkBC,IAAiB,CACrD+M,CAAAA,CAAUhN,CAAI,CAAA,EAChBiN,EAAQ,IAAA,CAAK,CAAE,IAAA,CAAAjN,CAAAA,CAAM,IAAA,CAAAC,CAAK,CAAC,EAE/B,CAAC,CAAA,CAEMgN,CACT,CASO,SAASC,EAAAA,CACdR,CAAAA,CACAM,CAAAA,CAC2C,CAC3C,IAAI7J,CAAAA,CAAoD,IAAA,CAExD,OAAA+I,CAAAA,CAAeQ,CAAAA,CAAQ,CAAC1M,CAAAA,CAAkBC,CAAAA,GAAiB,CACzD,GAAI+M,CAAAA,CAAUhN,CAAI,CAAA,CAChB,OAAAmD,CAAAA,CAAS,CAAE,IAAA,CAAAnD,EAAM,IAAA,CAAAC,CAAK,CAAA,CACf,KAGX,CAAC,CAAA,CAEMkD,CACT,CASO,SAASgK,EAAAA,CAAaT,CAAAA,CAAoBlJ,CAAAA,CAA2B,CAE1E,OADe0J,EAAAA,CAASR,CAAAA,CAAS1M,CAAAA,EAAUA,EAAa,EAAA,GAAOwD,CAAE,CAAA,EAClD,IAAA,EAAQ,IACzB,CClHO,SAAS4J,EAAAA,CAAkB5N,EAA6B,CAC7D,GAAM,CAAE,MAAA,CAAAkN,EAAQ,KAAA,CAAAhM,CAAM,CAAA,CAAIlB,CAAAA,CAsE1B,OAAO,CACL,QAAA,CAlEgBgE,CAAAA,EAAkC,CAElD,GAAI9C,CAAAA,EAAO,KAAA,CAAO,CAChB,IAAMT,CAAAA,CAAOS,CAAAA,CAAM,KAAA,CAAM,GAAA,CAAI8C,CAAE,CAAA,CAC/B,GAAI,CAACvD,EAAM,OAAO,IAAA,CAGlB,GAAIS,CAAAA,CAAM,OAAA,CAAS,CACjB,IAAMV,CAAAA,CAAOU,EAAM,OAAA,CAAQ,GAAA,CAAIT,CAAI,CAAA,CACnC,OAAOD,CAAAA,CAAO,CAAE,IAAA,CAAAA,EAAM,IAAA,CAAAC,CAAK,CAAA,CAAI,IACjC,CAGA,IAAMD,CAAAA,CAAO+E,CAAAA,CAAa2H,EAAQzM,CAAI,CAAA,CACtC,OAAOD,CAAAA,CAAO,CAAE,IAAA,CAAAA,CAAAA,CAAM,IAAA,CAAAC,CAAK,CAAA,CAAI,IACjC,CAGA,OAAO,IACT,CAAA,CAgDE,SAAA,CA3CiBA,CAAAA,EAAoC,CAMrD,GALI,CAACA,CAAAA,EAKD,CAACA,EAAK,QAAA,CAAS,GAAG,CAAA,CACpB,OAAO,KAGT,IAAIoN,CAAAA,CAAcpN,CAAAA,CAElB,OAAa,CACX,IAAMqN,CAAAA,CAAUD,CAAAA,CAAY,YAAY,GAAG,CAAA,CAC3C,GAAIC,CAAAA,GAAY,EAAA,CAEd,OAAO,CAAE,IAAA,CAAMZ,EAAQ,IAAA,CAAM,EAAG,CAAA,CAGlCW,CAAAA,CAAcA,CAAAA,CAAY,SAAA,CAAU,CAAA,CAAGC,CAAO,EAE9C,IAAMlI,CAAAA,CAAciI,CAAAA,CAAY,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,CAG/C,GAAIjI,CAAAA,EAAe,CAAC,UAAA,CAAY,aAAA,CAAe,OAAO,CAAA,CAAE,QAAA,CAASA,CAAW,EAC1E,SAGF,IAAMpF,CAAAA,CAAO+E,CAAAA,CAAa2H,CAAAA,CAAQW,CAAW,CAAA,CAG7C,GAAI,QAAM,OAAA,CAAQrN,CAAI,CAAA,EAAK,OAAOA,CAAAA,EAAS,QAAA,CAAA,EAIvCA,CAAAA,EAAQ,OAAOA,GAAS,QAAA,CAC1B,OAAO,CAAE,IAAA,CAAAA,EAAM,IAAA,CAAMqN,CAAY,CAErC,CACF,CAKA,CACF","file":"index.js","sourcesContent":["/**\n * Proxy 沙箱实现\n * \n * 功能:\n * - 防止覆盖系统 API($ 和 _ 前缀保护)\n * - 拦截属性设置操作\n */\n\nimport type { RuntimeContext } from '@variojs/types'\n\n/**\n * 创建受保护的 Proxy 上下文\n * 禁止设置以 $ 或 _ 开头的属性\n * \n * @template T 上下文类型,必须是 RuntimeContext 的子类型\n * @param ctx 运行时上下文对象\n * @returns 受保护的 Proxy 包装的上下文\n */\nexport function createProxy<T extends RuntimeContext>(ctx: T): T {\n // 允许设置和删除的特殊变量(循环/事件上下文变量;vario-vue 节点关系扩展)\n // 注意:$methods 不在此列表中,不允许被整体覆盖\n const allowedSpecialVars = [\n '$event',\n '$item',\n '$index',\n '$self',\n '$parent',\n '$siblings',\n '$children'\n ]\n \n return new Proxy(ctx, {\n set(target, prop, value) {\n const propName = String(prop)\n \n // 禁止覆盖系统 API\n if (propName.startsWith('$') || propName.startsWith('_')) {\n // 允许设置特殊变量\n if (allowedSpecialVars.includes(propName)) {\n return Reflect.set(target, prop, value)\n }\n \n throw new Error(\n `Cannot override system API: ${propName}. ` +\n `Properties starting with \"$\" or \"_\" are protected.`\n )\n }\n \n return Reflect.set(target, prop, value)\n },\n \n get(target, prop) {\n return Reflect.get(target, prop)\n },\n \n has(target, prop) {\n return Reflect.has(target, prop)\n },\n \n deleteProperty(target, prop) {\n const propName = String(prop)\n \n // 禁止删除系统 API\n if (propName.startsWith('$') || propName.startsWith('_')) {\n // 允许删除特殊变量\n if (allowedSpecialVars.includes(propName)) {\n return Reflect.deleteProperty(target, prop)\n }\n throw new Error(`Cannot delete system API: ${propName}`)\n }\n \n return Reflect.deleteProperty(target, prop)\n }\n })\n}\n","/**\n * Vario 错误处理体系\n * \n * 统一的错误基类和错误码系统\n */\n\nimport type { Action } from '@variojs/types'\n\n/**\n * 错误上下文信息\n */\nexport interface ErrorContext {\n /** Schema 路径(如 \"events.click[0]\") */\n schemaPath?: string\n /** 表达式字符串 */\n expression?: string\n /** 动作对象 */\n action?: Action\n /** 调用栈(简化版) */\n stack?: string[]\n /** 额外上下文信息 */\n metadata?: Record<string, unknown>\n}\n\n/**\n * Vario 错误基类\n * \n * 所有 Vario 相关错误都应继承此类\n */\nexport class VarioError extends Error {\n /** 错误码 */\n public readonly code: string\n /** 错误上下文 */\n public readonly context: ErrorContext\n\n constructor(\n message: string,\n code: string,\n context: ErrorContext = {}\n ) {\n super(message)\n this.name = 'VarioError'\n this.code = code\n this.context = context\n \n // 确保 stack 属性存在\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, VarioError)\n }\n }\n\n /**\n * 获取友好的错误消息\n */\n getFriendlyMessage(): string {\n const parts: string[] = [this.message]\n \n if (this.context.schemaPath) {\n parts.push(`\\n Schema 路径: ${this.context.schemaPath}`)\n }\n \n if (this.context.expression) {\n parts.push(`\\n 表达式: ${this.context.expression}`)\n }\n \n if (this.context.action) {\n parts.push(`\\n 动作类型: ${this.context.action.type}`)\n }\n \n return parts.join('')\n }\n\n /**\n * 转换为 JSON(用于序列化)\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n context: this.context,\n stack: this.stack\n }\n }\n}\n\n/**\n * 动作执行错误\n */\nexport class ActionError extends VarioError {\n constructor(\n action: Action,\n message: string,\n code: string = 'ACTION_ERROR',\n context: Omit<ErrorContext, 'action'> = {}\n ) {\n super(message, code, {\n ...context,\n action\n })\n this.name = 'ActionError'\n }\n}\n\n/**\n * 表达式求值错误\n */\nexport class ExpressionError extends VarioError {\n constructor(\n expression: string,\n message: string,\n code: string = 'EXPRESSION_ERROR',\n context: Omit<ErrorContext, 'expression'> = {}\n ) {\n super(message, code, {\n ...context,\n expression\n })\n this.name = 'ExpressionError'\n }\n}\n\n/**\n * 服务调用错误\n */\nexport class ServiceError extends VarioError {\n public readonly service: string\n public readonly originalError?: Error\n\n constructor(\n service: string,\n message: string,\n originalError?: Error,\n context: ErrorContext = {}\n ) {\n super(message, 'SERVICE_ERROR', context)\n this.name = 'ServiceError'\n this.service = service\n this.originalError = originalError\n }\n}\n\n/**\n * 批量执行错误\n */\nexport class BatchError extends VarioError {\n public readonly failedActions: Array<{ action: Action; error: Error }>\n\n constructor(\n failedActions: Array<{ action: Action; error: Error }>,\n message: string,\n context: ErrorContext = {}\n ) {\n super(message, 'BATCH_ERROR', context)\n this.name = 'BatchError'\n this.failedActions = failedActions\n }\n}\n\n/**\n * 错误码定义\n */\nexport const ErrorCodes = {\n // 动作相关错误\n ACTION_UNKNOWN_TYPE: 'ACTION_UNKNOWN_TYPE',\n ACTION_EXECUTION_ERROR: 'ACTION_EXECUTION_ERROR',\n ACTION_ABORTED: 'ACTION_ABORTED',\n ACTION_TIMEOUT: 'ACTION_TIMEOUT',\n ACTION_MAX_STEPS_EXCEEDED: 'ACTION_MAX_STEPS_EXCEEDED',\n ACTION_MISSING_PARAM: 'ACTION_MISSING_PARAM',\n ACTION_INVALID_PARAM: 'ACTION_INVALID_PARAM',\n \n // 表达式相关错误\n EXPRESSION_PARSE_ERROR: 'EXPRESSION_PARSE_ERROR',\n EXPRESSION_VALIDATION_ERROR: 'EXPRESSION_VALIDATION_ERROR',\n EXPRESSION_EVALUATION_ERROR: 'EXPRESSION_EVALUATION_ERROR',\n EXPRESSION_TIMEOUT: 'EXPRESSION_TIMEOUT',\n EXPRESSION_MAX_STEPS_EXCEEDED: 'EXPRESSION_MAX_STEPS_EXCEEDED',\n EXPRESSION_UNSAFE_ACCESS: 'EXPRESSION_UNSAFE_ACCESS',\n EXPRESSION_FUNCTION_NOT_WHITELISTED: 'EXPRESSION_FUNCTION_NOT_WHITELISTED',\n \n // 服务相关错误\n SERVICE_NOT_FOUND: 'SERVICE_NOT_FOUND',\n SERVICE_CALL_ERROR: 'SERVICE_CALL_ERROR',\n \n // 批量执行错误\n BATCH_ERROR: 'BATCH_ERROR',\n \n // Schema 相关错误\n SCHEMA_VALIDATION_ERROR: 'SCHEMA_VALIDATION_ERROR',\n SCHEMA_INVALID_ACTION: 'SCHEMA_INVALID_ACTION',\n} as const\n\nexport type ErrorCode = typeof ErrorCodes[keyof typeof ErrorCodes]\n","/**\n * 表达式解析器\n * \n * 使用 @babel/parser 解析 JavaScript 表达式为 AST\n * 移除 models. 前缀支持\n */\n\nimport { parse } from '@babel/parser'\nimport type * as ESTree from '@babel/types'\nimport { ExpressionError, ErrorCodes } from '../errors.js'\n\n/**\n * 解析表达式为 AST\n * \n * @param expr 表达式字符串(如 \"user.name + 1\")\n * @returns ESTree.Node AST 节点\n */\nexport function parseExpression(expr: string): ESTree.Node {\n try {\n // 解析为表达式(ExpressionStatement)\n const ast = parse(`(${expr})`, {\n plugins: ['typescript'],\n sourceType: 'module',\n allowReturnOutsideFunction: true,\n })\n \n // 提取表达式部分\n const statement = ast.program.body[0]\n if (statement?.type === 'ExpressionStatement') {\n return statement.expression\n }\n \n throw new ExpressionError(\n expr,\n `Failed to parse expression: ${expr}`,\n ErrorCodes.EXPRESSION_PARSE_ERROR\n )\n } catch (error: unknown) {\n if (error instanceof ExpressionError) {\n throw error\n }\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new ExpressionError(\n expr,\n `Expression parse error: ${errorMessage}`,\n ErrorCodes.EXPRESSION_PARSE_ERROR,\n {\n metadata: {\n originalError: error instanceof Error ? error.name : 'Unknown'\n }\n }\n )\n }\n}\n","/**\n * AST 白名单验证器\n * \n * 功能:\n * - 深度遍历 AST,检查每个节点\n * - 只允许安全的语法节点\n * - 禁止危险的语法(赋值、函数、this 等)\n * - 检查函数调用中的函数名是否在白名单中\n */\n\nimport type * as ESTree from '@babel/types'\nimport { ExpressionError, ErrorCodes } from '../errors.js'\n\n/**\n * 白名单全局函数\n */\nconst WHITELISTED_GLOBALS = new Set([\n 'String', 'Number', 'Boolean', 'BigInt', 'Symbol',\n 'Array', 'Object', 'Math', 'Date',\n])\n\n/**\n * 白名单函数(带命名空间)\n */\nconst WHITELISTED_FUNCTIONS = new Set([\n 'Array.isArray',\n 'Object.is',\n 'Number.isFinite',\n 'Number.isInteger',\n 'Number.isNaN',\n 'Number.isSafeInteger',\n 'Math.abs',\n 'Math.round',\n 'Math.floor',\n 'Math.ceil',\n 'Math.random',\n 'Math.max',\n 'Math.min',\n 'Date.now',\n])\n\n/**\n * 检查名称是否为全局对象名称\n */\nfunction isGlobalObjectName(name: string): boolean {\n return ['window', 'document', 'global', 'globalThis', 'self'].includes(name)\n}\n\n/**\n * 允许的 AST 节点类型\n * \n * 注意:@babel/types 可能使用更具体的字面量类型(如 NumericLiteral, StringLiteral)\n * 这些都应该被允许,因为它们都是 Literal 的子类型\n */\nconst ALLOWED_NODE_TYPES = new Set([\n 'MemberExpression', // 成员访问:user.name\n 'OptionalMemberExpression', // 可选链:user?.name\n 'ArrayExpression', // 数组字面量:[1, 2, 3]\n 'ObjectExpression', // 对象字面量:{ a: 1 }\n 'ObjectProperty', // 对象属性:{ a: 1 } 中的 a: 1\n 'Literal', // 字面量:'string', 123, true\n 'NumericLiteral', // 数字字面量:123(@babel/types 的具体类型)\n 'StringLiteral', // 字符串字面量:'string'\n 'BooleanLiteral', // 布尔字面量:true, false\n 'NullLiteral', // null 字面量\n 'Identifier', // 标识符:user, name\n 'BinaryExpression', // 二元运算:a + b\n 'LogicalExpression', // 逻辑运算:a && b\n 'UnaryExpression', // 一元运算:!a, -b\n 'ConditionalExpression', // 三元表达式:a ? b : c\n 'CallExpression', // 函数调用:Math.max()\n 'TemplateLiteral', // 模板字符串:`${name}`\n 'SequenceExpression', // 序列表达式:(a, b)\n 'NullishCoalescingExpression', // 空值合并:a ?? b\n])\n\n/**\n * 禁止的 AST 节点类型\n */\nconst FORBIDDEN_NODE_TYPES = new Set([\n 'AssignmentExpression', // 赋值:a = b\n 'UpdateExpression', // 自增/自减:a++, --b\n 'FunctionExpression', // 函数表达式:function() {}\n 'ArrowFunctionExpression', // 箭头函数:() => {}\n 'ThisExpression', // this\n 'NewExpression', // new 运算符\n 'YieldExpression', // yield\n 'AwaitExpression', // await\n 'ImportExpression', // import()\n 'MetaProperty', // import.meta\n 'SpreadElement', // 展开运算符:...array(在函数调用中不安全)\n])\n\n/**\n * 默认最大嵌套深度(防止 DoS 攻击)\n */\nconst DEFAULT_MAX_NESTING_DEPTH = 50\n\n/**\n * 验证 AST 是否通过白名单检查\n * \n * @param ast AST 节点\n * @param options 验证选项\n * @param options.allowGlobals 是否允许全局函数调用(跳过白名单检查)\n * @param options.maxNestingDepth 最大嵌套深度(默认 50)\n * @throws ExpressionError 如果发现禁止的节点\n */\nexport function validateAST(ast: ESTree.Node, options?: { allowGlobals?: boolean; maxNestingDepth?: number }): void {\n const allowGlobals = options?.allowGlobals === true\n const maxNestingDepth = options?.maxNestingDepth ?? DEFAULT_MAX_NESTING_DEPTH\n const errors: string[] = []\n \n function getFunctionName(callee: ESTree.Node): string | null {\n if (callee.type === 'Identifier') {\n return callee.name\n }\n if (callee.type === 'MemberExpression') {\n const member = callee as ESTree.MemberExpression\n if (member.object.type === 'Identifier' && member.property.type === 'Identifier') {\n return `${member.object.name}.${member.property.name}`\n }\n }\n return null\n }\n\n function traverse(node: ESTree.Node, path: string = 'root', depth: number = 0): void {\n // 检查嵌套深度(防止 DoS 攻击)\n if (depth > maxNestingDepth) {\n errors.push(`Maximum nesting depth (${maxNestingDepth}) exceeded at ${path}`)\n return\n }\n \n // 检查节点类型\n if (FORBIDDEN_NODE_TYPES.has(node.type)) {\n errors.push(`Forbidden node type \"${node.type}\" at ${path}`)\n return\n }\n \n // 检查函数调用中的函数名\n if (node.type === 'CallExpression') {\n const call = node as ESTree.CallExpression\n const funcName = getFunctionName(call.callee)\n if (funcName) {\n // 检查是否为危险函数(eval, Function, etc.)- 即使 allowGlobals 也禁止\n const dangerousFunctions = ['eval', 'Function', 'setTimeout', 'setInterval', 'execScript']\n if (dangerousFunctions.includes(funcName) || funcName.startsWith('eval') || funcName.startsWith('Function')) {\n errors.push(`Dangerous function \"${funcName}\" is not allowed at ${path}`)\n return\n }\n \n // 如果 allowGlobals,跳过白名单检查\n if (!allowGlobals) {\n // 检查是否为全局函数调用(如 Array.isArray, Math.max)\n const isGlobalFunction = \n WHITELISTED_FUNCTIONS.has(funcName) ||\n WHITELISTED_GLOBALS.has(funcName.split('.')[0])\n \n // 检查是否为对象方法调用(如 array.slice, user.getName)\n // 如果 callee 是 MemberExpression 且 object 不是全局对象,则允许\n let isObjectMethod = false\n if (call.callee.type === 'MemberExpression') {\n const member = call.callee as ESTree.MemberExpression\n // 如果 object 是 Identifier(变量名),且不在全局对象白名单中,则认为是对象方法\n if (member.object.type === 'Identifier') {\n const objName = member.object.name\n // 不是全局对象名称,则认为是用户数据的对象方法\n if (!WHITELISTED_GLOBALS.has(objName) && !isGlobalObjectName(objName)) {\n isObjectMethod = true\n }\n }\n }\n \n if (!isGlobalFunction && !isObjectMethod && !funcName.startsWith('$')) {\n // 不在白名单中的函数,禁止调用\n errors.push(`Function \"${funcName}\" is not in whitelist at ${path}`)\n return\n }\n }\n }\n }\n \n if (!ALLOWED_NODE_TYPES.has(node.type) && node.type !== 'Program') {\n // 未知节点类型,保守策略:禁止\n errors.push(`Unknown node type \"${node.type}\" at ${path}`)\n return\n }\n \n // 递归遍历子节点\n for (const key in node) {\n const value = (node as unknown as Record<string, unknown>)[key]\n \n if (value == null) continue\n \n // 处理数组\n if (Array.isArray(value)) {\n value.forEach((child, index) => {\n if (child && typeof child === 'object' && 'type' in child) {\n traverse(child as ESTree.Node, `${path}[${index}]`, depth + 1)\n }\n })\n }\n // 处理对象节点\n else if (value && typeof value === 'object' && 'type' in value) {\n traverse(value as ESTree.Node, `${path}.${key}`, depth + 1)\n }\n }\n }\n \n traverse(ast, 'root', 0)\n \n if (errors.length > 0) {\n throw new ExpressionError(\n JSON.stringify(ast),\n `AST validation failed:\\n${errors.join('\\n')}`,\n ErrorCodes.EXPRESSION_VALIDATION_ERROR,\n {\n metadata: {\n errors,\n nodeType: ast.type\n }\n }\n )\n }\n}\n","/**\n * 沙箱边界控制\n * \n * 功能:\n * - 表达式层:严格沙箱,无法访问全局对象\n * - 方法层:白名单控制,可访问全局对象\n */\n\nimport type { RuntimeContext } from '@variojs/types'\n\n/**\n * 创建表达式沙箱上下文\n * 移除全局对象访问能力\n */\nexport function createExpressionSandbox(ctx: RuntimeContext): RuntimeContext {\n // 创建受限的上下文副本,移除全局对象\n const sandbox = { ...ctx }\n \n // 移除可能的全局对象引用\n // 表达式求值时,只能访问状态属性和白名单函数\n \n return sandbox\n}\n\n/**\n * 检查属性访问是否安全(用于表达式求值)\n */\nexport function isSafePropertyAccess(\n prop: string,\n ctx: RuntimeContext,\n options: { allowGlobals?: boolean } = {}\n): boolean {\n const allowGlobals = options.allowGlobals ?? ctx.$exprOptions?.allowGlobals ?? false\n\n // 禁止访问全局对象(可通过 allowGlobals 开关控制)\n const globalProps = ['window', 'document', 'global', 'globalThis', 'self']\n if (!allowGlobals && globalProps.includes(prop)) {\n return false\n }\n \n // 允许访问状态属性和系统 API\n return true\n}\n","/**\n * 表达式求值器\n * \n * 功能:\n * - 安全求值 AST\n * - 支持白名单函数调用\n * - 执行步数/时间限制\n */\n\nimport type * as ESTree from '@babel/types'\nimport type { RuntimeContext, ExpressionOptions } from '@variojs/types'\nimport { ExpressionError, ErrorCodes } from '../errors.js'\nimport { isSafePropertyAccess } from '../runtime/sandbox.js'\n\n/**\n * 白名单全局函数\n */\nconst WHITELISTED_GLOBALS = new Set([\n 'String', 'Number', 'Boolean', 'BigInt', 'Symbol',\n 'Array', 'Object', 'Math', 'Date',\n])\n\n/**\n * 白名单函数(带命名空间)\n */\nconst WHITELISTED_FUNCTIONS = new Set([\n 'Array.isArray',\n 'Object.is',\n 'Number.isFinite',\n 'Number.isInteger',\n 'Number.isNaN',\n 'Number.isSafeInteger',\n 'Math.abs',\n 'Math.round',\n 'Math.floor',\n 'Math.ceil',\n 'Math.random',\n 'Math.max',\n 'Math.min',\n 'Date.now',\n])\n\n/**\n * 安全的数组方法(只读或返回新数组,不修改原状态)\n */\nconst SAFE_ARRAY_METHODS = new Set([\n // 返回新数组\n 'slice',\n 'concat',\n 'filter',\n 'map',\n 'flat',\n 'flatMap',\n 'toReversed', // ES2023 不修改原数组的 reverse\n 'toSorted', // ES2023 不修改原数组的 sort\n 'toSpliced', // ES2023 不修改原数组的 splice\n 'with', // ES2023 不修改原数组的索引赋值\n // 只读方法\n 'indexOf',\n 'lastIndexOf',\n 'includes',\n 'find',\n 'findIndex',\n 'findLast',\n 'findLastIndex',\n 'every',\n 'some',\n 'at',\n // 返回字符串\n 'join',\n 'toString',\n 'toLocaleString',\n // 在链式调用中安全使用(如 slice().reverse())\n 'reverse',\n 'sort',\n])\n\n/**\n * 危险属性名称集合(用于阻止原型链污染攻击)\n * - constructor: 可用于访问 Function 构造函数\n * - prototype: 可用于修改原型链\n * - __proto__: 可用于修改对象原型\n */\nconst DANGEROUS_PROPERTIES = new Set([\n 'constructor',\n 'prototype',\n '__proto__',\n])\n\n/**\n * 检查属性名是否为危险属性\n */\nfunction isDangerousProperty(propName: string | number): boolean {\n return typeof propName === 'string' && DANGEROUS_PROPERTIES.has(propName)\n}\n\n/**\n * 运行时辅助函数\n */\n const RUNTIME_HELPERS: Record<string, (...args: unknown[]) => unknown> = {\n '$truncate': (str: unknown, length: unknown): unknown => {\n if (typeof str !== 'string') return str\n const len = typeof length === 'number' ? length : 0\n return str.length > len ? str.slice(0, len) + '...' : str\n },\n '$format': (date: unknown, _format?: unknown): unknown => {\n const d = typeof date === 'number' ? new Date(date) : (date as Date)\n // 简单格式化,可根据需要扩展\n // format 参数暂未实现,保留接口以便未来扩展\n return d.toISOString()\n },\n}\n\n/**\n * 安全求值 AST\n * \n * @param ast AST 节点\n * @param ctx 运行时上下文\n * @param options 求值选项\n * @returns 求值结果(类型无法静态推导)\n * \n * 注意:表达式求值结果类型无法在编译时确定,返回 unknown\n */\nexport function evaluateExpression(\n ast: ESTree.Node,\n ctx: RuntimeContext,\n options: ExpressionOptions = {}\n): unknown {\n const mergedOptions = {\n ...ctx.$exprOptions,\n ...options\n }\n const allowGlobals = mergedOptions.allowGlobals === true\n const maxSteps = mergedOptions.maxSteps ?? 1000\n const timeout = mergedOptions.timeout ?? 100\n let stepCount = 0\n const startTime = Date.now()\n \n function getGlobalValueByName(name: string): unknown {\n if (!allowGlobals) return undefined\n // 只有在 allowGlobals 为 true 时才返回全局对象\n if (name === 'globalThis') return globalThis\n if (name === 'window' && typeof window !== 'undefined') return window\n if (name === 'document' && typeof document !== 'undefined') return document\n if (name === 'global' && typeof global !== 'undefined') return global\n if (name === 'self' && typeof self !== 'undefined') return self\n // 只有在 allowGlobals 为 true 时才访问 globalThis 的属性\n return (globalThis as Record<string, unknown>)[name]\n }\n \n function isGlobalObjectName(name: string): boolean {\n return ['window', 'document', 'global', 'globalThis', 'self'].includes(name)\n }\n\n function checkLimits(): void {\n stepCount++\n if (stepCount > maxSteps) {\n throw new ExpressionError(\n JSON.stringify(ast),\n `Expression evaluation exceeded max steps (${maxSteps})`,\n ErrorCodes.EXPRESSION_MAX_STEPS_EXCEEDED,\n {\n metadata: {\n maxSteps,\n currentSteps: stepCount\n }\n }\n )\n }\n \n if (Date.now() - startTime > timeout) {\n throw new ExpressionError(\n JSON.stringify(ast),\n `Expression evaluation exceeded timeout (${timeout}ms)`,\n ErrorCodes.EXPRESSION_TIMEOUT,\n {\n metadata: {\n timeout,\n elapsedTime: Date.now() - startTime\n }\n }\n )\n }\n }\n \n function evaluate(node: ESTree.Node): unknown {\n checkLimits()\n \n // 使用类型断言处理 node.type,因为 @babel/types 的类型定义可能不完整\n // TypeScript 的严格类型检查可能不识别某些节点类型,使用类型断言绕过\n const nodeType = (node as { type: string }).type as string\n switch (nodeType) {\n case 'NumericLiteral':\n case 'StringLiteral':\n case 'BooleanLiteral':\n case 'BigIntLiteral':\n case 'DecimalLiteral':\n case 'RegExpLiteral': {\n // 这些字面量类型都有 value 属性\n return (node as any).value;\n }\n case 'NullLiteral': {\n return null;\n }\n \n case 'Literal': {\n const literal = node as ESTree.Literal\n // 处理不同类型的字面量\n // @babel/types 的 Literal 类型包含多种字面量类型\n // 使用类型守卫安全访问 value 属性\n if ('value' in literal && literal.value !== undefined) {\n return literal.value\n }\n // NullLiteral 或 BigIntLiteral 可能没有 value 属性,或 value 为 null\n // 检查类型名称\n const literalType = (literal as { type: string }).type\n if (literalType === 'NullLiteral') {\n return null\n }\n // 其他情况:尝试访问 value,如果不存在则返回 undefined\n return (literal as { value?: unknown }).value ?? undefined\n }\n \n case 'Identifier': {\n const name = (node as ESTree.Identifier).name\n \n // 检查是否为全局对象名称(无论是否存在,都应该被禁止,除非 allowGlobals)\n // 必须在检查 ctx 之前,防止 ctx 中有同名属性绕过检查\n if (isGlobalObjectName(name) && !allowGlobals) {\n throw new ExpressionError(\n name,\n `Access to global \"${name}\" is not allowed in expressions`,\n ErrorCodes.EXPRESSION_UNSAFE_ACCESS\n )\n }\n \n // 从上下文获取值(优先从 ctx,但全局对象名称已经被上面的检查拦截)\n // 注意:即使 ctx 中有 window/document 等属性,也不应该访问(安全考虑)\n if (name in ctx && !isGlobalObjectName(name)) {\n return ctx[name]\n }\n\n // 允许直接访问全局对象(由 allowGlobals 控制)\n if (allowGlobals) {\n const globalValue = getGlobalValueByName(name)\n if (globalValue !== undefined) {\n return globalValue\n }\n }\n \n // 如果是白名单全局函数,允许访问(但仅用于函数调用,这里返回 undefined)\n if (WHITELISTED_GLOBALS.has(name)) {\n return (globalThis as Record<string, unknown>)[name]\n }\n \n // 未定义的标识符返回 undefined(而不是抛出错误,允许可选链等场景)\n return undefined\n }\n \n case 'MemberExpression': {\n const member = node as ESTree.MemberExpression\n const object = evaluate(member.object)\n \n // null/undefined 检查\n if (object == null) {\n return undefined\n }\n \n // 禁止访问全局对象(检查对象是否为全局对象)\n if (!allowGlobals) {\n // 检查对象是否为全局对象\n const isGlobal = object === globalThis || \n (typeof window !== 'undefined' && object === window) ||\n (typeof global !== 'undefined' && object === global) ||\n (typeof self !== 'undefined' && object === self)\n if (isGlobal) {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Access to global object is not allowed in expressions',\n ErrorCodes.EXPRESSION_UNSAFE_ACCESS\n )\n }\n }\n \n // 获取属性名\n let propName: string | number\n if (member.computed) {\n // 计算属性:obj[key]\n propName = evaluate(member.property) as string | number\n } else {\n // 静态属性:obj.prop\n propName = (member.property as ESTree.Identifier).name\n }\n \n // 禁止访问危险属性(constructor, prototype, __proto__)\n if (!allowGlobals && isDangerousProperty(propName)) {\n throw new ExpressionError(\n String(propName),\n `Access to \"${propName}\" is not allowed in expressions`,\n ErrorCodes.EXPRESSION_UNSAFE_ACCESS\n )\n }\n \n return (object as Record<string | number, unknown>)[propName]\n }\n \n case 'OptionalMemberExpression': {\n const member = node as ESTree.OptionalMemberExpression\n const object = evaluate(member.object)\n \n // null/undefined 检查(可选链特性)\n if (object == null) {\n return undefined\n }\n \n // 禁止访问全局对象(检查对象是否为全局对象)\n if (!allowGlobals) {\n // 检查对象是否为全局对象\n const isGlobal = object === globalThis || \n (typeof window !== 'undefined' && object === window) ||\n (typeof global !== 'undefined' && object === global) ||\n (typeof self !== 'undefined' && object === self)\n if (isGlobal) {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Access to global object is not allowed in expressions',\n ErrorCodes.EXPRESSION_UNSAFE_ACCESS\n )\n }\n }\n \n // 获取属性名\n let propName: string | number\n if (member.computed) {\n // 计算属性:obj?.[key]\n propName = evaluate(member.property) as string | number\n } else {\n // 静态属性:obj?.prop\n propName = (member.property as ESTree.Identifier).name\n }\n \n // 禁止访问危险属性(constructor, prototype, __proto__)\n if (!allowGlobals && isDangerousProperty(propName)) {\n throw new ExpressionError(\n String(propName),\n `Access to \"${propName}\" is not allowed in expressions`,\n ErrorCodes.EXPRESSION_UNSAFE_ACCESS\n )\n }\n \n return (object as Record<string | number, unknown>)?.[propName]\n }\n \n case 'BinaryExpression': {\n const binary = node as ESTree.BinaryExpression\n const left = evaluate(binary.left)\n const right = evaluate(binary.right)\n const operator = binary.operator\n \n // 类型安全的二元运算\n switch (operator) {\n case '+': return (left as number) + (right as number)\n case '-': return (left as number) - (right as number)\n case '*': return (left as number) * (right as number)\n case '/': return (left as number) / (right as number)\n case '%': return (left as number) % (right as number)\n case '**': return (left as number) ** (right as number)\n case '==': return left == right\n case '!=': return left != right\n case '===': return left === right\n case '!==': return left !== right\n case '<': return (left as number) < (right as number)\n case '<=': return (left as number) <= (right as number)\n case '>': return (left as number) > (right as number)\n case '>=': return (left as number) >= (right as number)\n case '<<': return (left as number) << (right as number)\n case '>>': return (left as number) >> (right as number)\n case '>>>': return (left as number) >>> (right as number)\n case '&': return (left as number) & (right as number)\n case '|': return (left as number) | (right as number)\n case '^': return (left as number) ^ (right as number)\n case 'in': return (left as string | number) in (right as object)\n case 'instanceof': {\n // instanceof 需要检查 right 是否为构造函数\n if (typeof right !== 'function' && typeof right !== 'object') {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Right-hand side of instanceof must be a constructor',\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n return left instanceof (right as new (...args: unknown[]) => unknown)\n }\n default:\n throw new ExpressionError(\n JSON.stringify(node),\n `Unsupported binary operator: ${operator}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n }\n \n case 'LogicalExpression': {\n const logical = node as ESTree.LogicalExpression\n const left = evaluate(logical.left)\n const operator = logical.operator\n \n if (operator === '&&') {\n return left && evaluate(logical.right)\n } else if (operator === '||') {\n return left || evaluate(logical.right)\n } else if (operator === '??') {\n return left ?? evaluate(logical.right)\n }\n \n throw new ExpressionError(\n JSON.stringify(node),\n `Unsupported logical operator: ${operator}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n \n case 'UnaryExpression': {\n const unary = node as ESTree.UnaryExpression\n const argument = evaluate(unary.argument)\n const operator = unary.operator\n \n switch (operator) {\n case '+': return +(argument as number)\n case '-': return -(argument as number)\n case '!': return !argument\n case '~': return ~(argument as number)\n case 'typeof': return typeof argument\n case 'void': return void argument\n case 'delete': throw new ExpressionError(\n JSON.stringify(node),\n 'delete operator is not allowed',\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n default:\n throw new ExpressionError(\n JSON.stringify(node),\n `Unsupported unary operator: ${operator}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n }\n \n case 'ConditionalExpression': {\n const conditional = node as ESTree.ConditionalExpression\n const test = evaluate(conditional.test)\n return test ? evaluate(conditional.consequent) : evaluate(conditional.alternate)\n }\n \n // NullishCoalescingExpression 在 @babel/types 中可能不存在\n // 使用 LogicalExpression 处理 ?? 运算符(operator === '??')\n // 如果类型系统支持,可以添加此 case\n \n case 'CallExpression': {\n const call = node as ESTree.CallExpression\n const callee = call.callee\n \n // 获取函数名和对象\n let funcName: string\n let funcObj: unknown\n let callContext: unknown = null // 函数调用的上下文(this)\n \n if (callee.type === 'Identifier') {\n // 直接函数调用:String(), Math.max()\n funcName = callee.name\n \n // 检查是否为全局对象(禁止访问)\n if (!isSafePropertyAccess(funcName, ctx, { allowGlobals })) {\n throw new ExpressionError(\n funcName,\n `Access to global \"${funcName}\" is not allowed in expressions`,\n 'UNSAFE_ACCESS'\n )\n }\n \n // 从上下文或全局获取函数\n funcObj = ctx[funcName] ?? (globalThis as Record<string, unknown>)[funcName]\n callContext = null // 全局函数调用,this 为 null\n } else if (callee.type === 'MemberExpression') {\n // 成员函数调用:Math.max(), Array.isArray(), array.slice()\n const member = callee as ESTree.MemberExpression\n const obj = evaluate(member.object)\n \n // null/undefined 检查\n if (obj == null) {\n throw new ExpressionError(\n JSON.stringify(node),\n `Cannot call method on ${obj === null ? 'null' : 'undefined'}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n \n // 检查对象是否为全局对象(禁止访问)\n if (!allowGlobals) {\n // 检查对象是否为全局对象\n const isGlobal = obj === globalThis || \n (typeof window !== 'undefined' && obj === window) ||\n (typeof global !== 'undefined' && obj === global) ||\n (typeof self !== 'undefined' && obj === self)\n if (isGlobal) {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Access to global object is not allowed in expressions',\n ErrorCodes.EXPRESSION_UNSAFE_ACCESS\n )\n }\n }\n \n // 检查是否是数组实例方法调用(安全的只读方法)\n if (Array.isArray(obj) && !member.computed && member.property.type === 'Identifier') {\n const methodName = (member.property as ESTree.Identifier).name\n if (SAFE_ARRAY_METHODS.has(methodName)) {\n // 这是安全的数组方法,直接使用\n funcObj = (obj as any)[methodName]\n funcName = `Array.${methodName}` // 用于标识和错误信息\n callContext = obj // 数组方法调用,this 为数组本身\n } else {\n // 不是安全的数组方法,需要检查白名单\n const objName = member.object.type === 'Identifier' \n ? (member.object as ESTree.Identifier).name \n : String(obj)\n funcName = `${objName}.${methodName}`\n funcObj = (obj as unknown as Record<string, unknown>)?.[methodName]\n callContext = obj\n }\n } else {\n // 非数组对象,正常处理\n // 获取对象标识符名称(如果是 Identifier)\n let objName = '';\n if (member.object.type === 'Identifier') {\n objName = (member.object as ESTree.Identifier).name;\n } else {\n // 对于其他情况,使用字符串表示,但可能不在白名单内\n objName = String(obj);\n }\n \n if (member.computed) {\n const prop = evaluate(member.property)\n funcName = `${objName}[${String(prop)}]`\n funcObj = (obj as Record<string, unknown>)?.[prop as string]\n callContext = obj\n } else {\n const prop = (member.property as ESTree.Identifier).name\n funcName = `${objName}.${prop}`\n funcObj = (obj as Record<string, unknown>)?.[prop]\n callContext = obj\n }\n }\n } else {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Invalid function call: only Identifier and MemberExpression are allowed',\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n \n // 检查白名单\n // 如果是数组方法(funcName 以 Array. 开头且方法在安全列表中),则允许\n const isArrayMethod = funcName.startsWith('Array.') && SAFE_ARRAY_METHODS.has(funcName.split('.')[1])\n const isWhitelisted = isArrayMethod ||\n WHITELISTED_FUNCTIONS.has(funcName) || \n WHITELISTED_GLOBALS.has(funcName.split('.')[0]) ||\n RUNTIME_HELPERS[funcName] !== undefined\n \n if (!allowGlobals && !isWhitelisted) {\n throw new ExpressionError(\n funcName,\n `Function \"${funcName}\" is not in whitelist`,\n ErrorCodes.EXPRESSION_FUNCTION_NOT_WHITELISTED\n )\n }\n \n // 执行函数调用\n const args = call.arguments.map(arg => {\n if (arg.type === 'SpreadElement') {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Spread operator is not allowed',\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n return evaluate(arg)\n })\n \n // 调用运行时辅助函数\n if (RUNTIME_HELPERS[funcName]) {\n return RUNTIME_HELPERS[funcName](...args)\n }\n \n // 调用白名单全局函数或数组方法\n if (typeof funcObj === 'function') {\n try {\n // 如果有上下文(如数组方法),使用 apply;否则直接调用\n return callContext !== null \n ? funcObj.apply(callContext, args)\n : funcObj(...args)\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new ExpressionError(\n funcName,\n `Error calling \"${funcName}\": ${errorMessage}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n }\n \n throw new ExpressionError(\n funcName,\n `\"${funcName}\" is not a function${funcObj === undefined ? ' (undefined)' : funcObj === null ? ' (null)' : ''}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n \n case 'ArrayExpression': {\n const array = node as ESTree.ArrayExpression\n return array.elements.map(el => {\n if (el == null) return null\n if (el.type === 'SpreadElement') {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Spread operator is not allowed',\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n return evaluate(el)\n })\n }\n \n case 'ObjectExpression': {\n const object = node as ESTree.ObjectExpression\n const result: Record<string, any> = {}\n \n for (const prop of object.properties) {\n if (prop.type === 'ObjectMethod' || prop.type === 'SpreadElement') {\n throw new ExpressionError(\n JSON.stringify(node),\n 'Object methods and spread are not allowed',\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n \n const key = prop.key.type === 'Identifier'\n ? prop.key.name\n : String(evaluate(prop.key))\n \n result[key] = evaluate(prop.value)\n }\n \n return result\n }\n \n case 'TemplateLiteral': {\n const template = node as ESTree.TemplateLiteral\n let result = ''\n \n for (let i = 0; i < template.quasis.length; i++) {\n result += template.quasis[i].value.cooked\n if (i < template.expressions.length) {\n result += String(evaluate(template.expressions[i]))\n }\n }\n \n return result\n }\n \n default:\n throw new ExpressionError(\n JSON.stringify(node),\n `Unsupported node type: ${node.type}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR\n )\n }\n }\n \n return evaluate(ast)\n}\n","/**\n * 依赖提取算法\n * \n * 功能:\n * - 从 AST 中提取状态依赖\n * - 支持通配符依赖(items.*)\n * - 保守策略:标记整个对象\n */\n\nimport type * as ESTree from '@babel/types'\n\n/**\n * 从 AST 中提取依赖的状态路径\n * \n * @param ast AST 节点\n * @returns 依赖路径数组(支持通配符)\n */\nexport function extractDependencies(ast: ESTree.Node): string[] {\n const dependencies = new Set<string>()\n \n function traverse(node: ESTree.Node, path: string = ''): void {\n switch (node.type) {\n case 'Identifier': {\n const id = node as ESTree.Identifier\n // 标识符可能是状态依赖(排除全局函数)\n if (!isGlobalFunction(id.name)) {\n dependencies.add(id.name)\n }\n break\n }\n \n case 'MemberExpression': {\n const member = node as ESTree.MemberExpression\n const object = member.object\n \n if (object.type === 'Identifier') {\n const basePath = object.name\n \n if (member.computed) {\n // 计算属性:items[0] -> 保守策略:标记 items.*\n dependencies.add(`${basePath}.*`)\n traverse(member.property, path)\n } else {\n // 静态属性:user.name\n const prop = (member.property as ESTree.Identifier).name\n dependencies.add(`${basePath}.${prop}`)\n // 同时添加通配符依赖(保守策略)\n dependencies.add(`${basePath}.*`)\n }\n } else {\n // 嵌套成员访问:user.profile.name\n traverse(object, path)\n }\n \n break\n }\n \n case 'OptionalMemberExpression': {\n const member = node as ESTree.OptionalMemberExpression\n const object = member.object\n \n if (object.type === 'Identifier') {\n const basePath = object.name\n \n if (member.computed) {\n dependencies.add(`${basePath}.*`)\n traverse(member.property, path)\n } else {\n const prop = (member.property as ESTree.Identifier).name\n dependencies.add(`${basePath}.${prop}`)\n dependencies.add(`${basePath}.*`)\n }\n } else {\n traverse(object, path)\n }\n \n break\n }\n \n default: {\n // 递归遍历所有子节点\n for (const key in node) {\n const value = (node as unknown as Record<string, unknown>)[key]\n \n if (value == null) continue\n \n if (Array.isArray(value)) {\n value.forEach(child => {\n if (child && typeof child === 'object' && 'type' in child) {\n traverse(child as ESTree.Node, path)\n }\n })\n } else if (value && typeof value === 'object' && 'type' in value) {\n traverse(value as ESTree.Node, path)\n }\n }\n }\n }\n }\n \n traverse(ast)\n return Array.from(dependencies)\n}\n\n/**\n * 检查是否为全局函数(不应作为依赖)\n */\nfunction isGlobalFunction(name: string): boolean {\n const globals = new Set([\n 'String', 'Number', 'Boolean', 'BigInt', 'Symbol',\n 'Array', 'Object', 'Math', 'Date',\n 'console', 'JSON', 'parseInt', 'parseFloat',\n 'isNaN', 'isFinite',\n ])\n return globals.has(name)\n}\n","/**\n * 表达式编译器\n * \n * 功能:\n * - 将简单表达式编译为直接访问函数\n * - 提升简单表达式的执行性能\n * - 复杂表达式回退到解释执行\n */\n\nimport type * as ESTree from '@babel/types'\nimport type { RuntimeContext } from '@variojs/types'\n\n/**\n * 编译后的表达式函数类型\n */\nexport type CompiledExpression = (ctx: RuntimeContext) => unknown\n\n/**\n * 编译缓存(全局,表达式字符串 → 编译函数)\n */\nconst compiledCache = new Map<string, CompiledExpression | null>()\n\n/**\n * 危险属性名称(不应被编译,需要回退到解释执行进行安全检查)\n * - constructor: 可用于访问 Function 构造函数\n * - prototype: 可用于修改原型链\n * - __proto__: 可用于修改对象原型\n */\nconst DANGEROUS_PROPERTIES = ['constructor', 'prototype', '__proto__']\n\n/**\n * 检查路径是否包含危险属性\n */\nfunction containsDangerousProperty(path: string): boolean {\n const segments = path.split('.')\n return segments.some(segment => DANGEROUS_PROPERTIES.includes(segment))\n}\n\n/**\n * 提取静态路径(从 MemberExpression)\n * \n * 例如:user.name → \"user.name\"\n * 例如:items.0.text → \"items.0.text\"\n */\nfunction extractStaticPath(node: ESTree.Node): string | null {\n if (node.type === 'Identifier') {\n return node.name\n }\n \n if (node.type === 'MemberExpression') {\n const object = extractStaticPath(node.object)\n if (!object) return null\n \n if (node.computed) {\n // 计算属性:obj[key],需要检查 key 是否为字面量\n if (node.property.type === 'NumericLiteral') {\n const prop = (node.property as ESTree.NumericLiteral).value\n return `${object}.${String(prop)}`\n }\n if (node.property.type === 'StringLiteral') {\n const prop = (node.property as ESTree.StringLiteral).value\n return `${object}.${String(prop)}`\n }\n // 处理其他字面量类型(已由上面的具体类型处理,这里不需要)\n return null\n } else {\n // 静态属性:obj.prop\n if (node.property.type === 'Identifier') {\n return `${object}.${node.property.name}`\n }\n return null\n }\n }\n \n return null\n}\n\n/**\n * 编译简单表达式为直接访问函数\n * \n * @param ast AST 节点\n * @returns 编译后的函数,如果无法编译则返回 null\n */\nexport function compileSimpleExpression(ast: ESTree.Node): CompiledExpression | null {\n // 字面量:{{ 42 }} → () => 42\n if (ast.type === 'NumericLiteral') {\n const value = (ast as ESTree.NumericLiteral).value\n return () => value\n }\n if (ast.type === 'StringLiteral') {\n const value = (ast as ESTree.StringLiteral).value\n return () => value\n }\n if (ast.type === 'BooleanLiteral') {\n const value = (ast as ESTree.BooleanLiteral).value\n return () => value\n }\n if (ast.type === 'NullLiteral') {\n return () => null\n }\n // 注意:Literal 类型已被更具体的类型(NumericLiteral, StringLiteral等)替代\n // 如果遇到其他字面量类型,回退到解释执行\n \n // 标识符:{{ user }} → (ctx) => ctx._get('user')\n // 注意:全局对象名称(window, document等)不应该被编译,应该回退到解释执行以进行安全检查\n if (ast.type === 'Identifier') {\n const name = ast.name\n // 全局对象名称不应该被编译(需要安全检查)\n const globalObjectNames = ['window', 'document', 'global', 'globalThis', 'self']\n if (globalObjectNames.includes(name)) {\n return null // 回退到解释执行\n }\n return (ctx: RuntimeContext) => ctx._get(name)\n }\n \n // 静态成员访问:{{ user.name }} → (ctx) => ctx._get('user.name')\n // 注意:如果路径以全局对象名称开头或包含危险属性,不应该被编译\n const path = extractStaticPath(ast)\n if (path) {\n // 检查路径是否以全局对象名称开头\n const globalObjectNames = ['window', 'document', 'global', 'globalThis', 'self']\n const firstSegment = path.split('.')[0]\n if (globalObjectNames.includes(firstSegment)) {\n return null // 回退到解释执行以进行安全检查\n }\n // 检查路径是否包含危险属性(constructor, prototype, __proto__)\n if (containsDangerousProperty(path)) {\n return null // 回退到解释执行以进行安全检查\n }\n return (ctx: RuntimeContext) => ctx._get(path)\n }\n \n return null // 复杂表达式,无法编译\n}\n\n/**\n * 获取或编译表达式\n * \n * @param expr 表达式字符串\n * @param ast AST 节点(已解析)\n * @returns 编译后的函数,如果无法编译则返回 null\n */\nexport function getCompiledExpression(\n expr: string,\n ast: ESTree.Node\n): CompiledExpression | null {\n // 检查缓存\n if (compiledCache.has(expr)) {\n return compiledCache.get(expr) || null\n }\n \n // 尝试编译\n const compiled = compileSimpleExpression(ast)\n compiledCache.set(expr, compiled)\n \n return compiled\n}\n\n/**\n * 清除编译缓存\n */\nexport function clearCompiledCache(): void {\n compiledCache.clear()\n}\n","/**\n * 路径解析工具模块\n * \n * 统一的路径解析逻辑,供 vario-core 和框架集成层使用\n * \n * 设计原则:\n * - 单一职责:只处理路径解析,不涉及响应式\n * - 可组合:提供原子操作,框架集成层可自由组合\n * - 类型安全:尽可能提供类型推导\n */\n\n/**\n * 路径段类型\n */\nexport type PathSegment = string | number\n\ntype PathCache = {\n parsed: Map<string, PathSegment[]>\n}\n\nconst pathCache: PathCache = {\n parsed: new Map()\n}\n\n/**\n * 解析路径字符串为段数组\n * \n * 支持两种语法:\n * - 点语法:`user.name` → ['user', 'name']\n * - 括号语法:`users[0].name` → ['users', 0, 'name']\n * - 混合语法:`data.users[0].profile.tags[1]` → ['data', 'users', 0, 'profile', 'tags', 1]\n * - 空括号:`users[].name` → ['users', -1, 'name'](-1 表示动态索引,由循环上下文填充)\n * \n * @param path 路径字符串\n * @returns 路径段数组\n * \n * @example\n * parsePath('user.name') // ['user', 'name']\n * parsePath('items.0.text') // ['items', 0, 'text']\n * parsePath('users[0].name') // ['users', 0, 'name']\n * parsePath('users[].name') // ['users', -1, 'name']\n */\nexport function parsePath(path: string): PathSegment[] {\n if (!path || path.length === 0) {\n return []\n }\n \n const segments: PathSegment[] = []\n let current = ''\n let i = 0\n \n while (i < path.length) {\n const char = path[i]\n \n if (char === '.') {\n // 点分隔符:保存当前段\n if (current) {\n segments.push(parseSegment(current))\n current = ''\n }\n i++\n } else if (char === '[') {\n // 括号开始:保存当前段(如果有),然后解析括号内容\n if (current) {\n segments.push(parseSegment(current))\n current = ''\n }\n \n // 找到匹配的 ]\n const closeIndex = path.indexOf(']', i)\n if (closeIndex === -1) {\n // 没有匹配的 ],当作普通字符处理\n current += char\n i++\n } else {\n const indexStr = path.slice(i + 1, closeIndex)\n if (indexStr === '') {\n // 空括号 [] 表示动态索引\n segments.push(-1)\n } else if (/^\\d+$/.test(indexStr)) {\n // 数字索引\n segments.push(parseInt(indexStr, 10))\n } else {\n // 非数字,当作字符串键\n segments.push(indexStr)\n }\n i = closeIndex + 1\n \n // 跳过紧跟的点\n if (path[i] === '.') {\n i++\n }\n }\n } else {\n current += char\n i++\n }\n }\n \n // 处理最后一段\n if (current) {\n segments.push(parseSegment(current))\n }\n \n return segments\n}\n\n/**\n * 解析单个路径段\n */\nfunction parseSegment(segment: string): PathSegment {\n // 纯数字视为数组索引(保持向后兼容 items.0.text 语法)\n if (/^\\d+$/.test(segment)) {\n return parseInt(segment, 10)\n }\n return segment\n}\n\n/**\n * 解析路径(带缓存)\n *\n * @param path 点分隔的路径字符串\n * @returns 路径段数组\n */\nexport function parsePathCached(path: string): PathSegment[] {\n if (!path || path.length === 0) {\n return []\n }\n\n const cached = pathCache.parsed.get(path)\n if (cached) {\n return cached\n }\n\n const segments = parsePath(path)\n pathCache.parsed.set(path, segments)\n return segments\n}\n\n/**\n * 清理路径缓存\n */\nexport function clearPathCache(): void {\n pathCache.parsed.clear()\n}\n\n/**\n * 将路径段数组转换为路径字符串\n * \n * @param segments 路径段数组\n * @returns 点分隔的路径字符串\n */\nexport function stringifyPath(segments: PathSegment[]): string {\n return segments.map(String).join('.')\n}\n\n/**\n * 获取嵌套路径的值\n * \n * @param obj 目标对象\n * @param path 路径字符串或路径段数组\n * @returns 路径对应的值,不存在返回 undefined\n */\nexport function getPathValue(\n obj: Record<string, unknown>,\n path: string | PathSegment[]\n): unknown {\n const segments = typeof path === 'string' ? parsePathCached(path) : path\n \n if (segments.length === 0) {\n return obj\n }\n \n let value: unknown = obj\n \n for (const segment of segments) {\n if (value == null) {\n return undefined\n }\n \n if (typeof segment === 'number') {\n // 数组索引\n if (!Array.isArray(value)) {\n return undefined\n }\n value = value[segment]\n } else {\n // 对象属性\n if (typeof value !== 'object') {\n return undefined\n }\n value = (value as Record<string, unknown>)[segment]\n }\n }\n \n return value\n}\n\n/**\n * 设置嵌套路径的值\n * \n * @param obj 目标对象\n * @param path 路径字符串或路径段数组\n * @param value 要设置的值\n * @param options 配置选项\n * @returns 是否设置成功\n */\nexport function setPathValue(\n obj: Record<string, unknown>,\n path: string | PathSegment[],\n value: unknown,\n options: {\n /**\n * 自动创建中间路径\n * @default true\n */\n createIntermediate?: boolean\n \n /**\n * 创建对象的工厂函数\n * 用于框架集成层创建响应式对象\n */\n createObject?: () => Record<string, unknown>\n \n /**\n * 创建数组的工厂函数\n * 用于框架集成层创建响应式数组\n */\n createArray?: () => unknown[]\n } = {}\n): boolean {\n const {\n createIntermediate = true,\n createObject = () => ({}),\n createArray = () => []\n } = options\n \n const segments = typeof path === 'string' ? parsePathCached(path) : path\n \n if (segments.length === 0) {\n return false\n }\n \n const lastSegment = segments[segments.length - 1]\n const parentSegments = segments.slice(0, -1)\n \n // 找到或创建父对象\n let target: unknown = obj\n \n for (let i = 0; i < parentSegments.length; i++) {\n const segment = parentSegments[i]\n const nextSegment = parentSegments[i + 1] ?? lastSegment\n const nextIsArrayIndex = typeof nextSegment === 'number'\n \n if (typeof segment === 'number') {\n // 当前段是数组索引\n if (!Array.isArray(target)) {\n if (!createIntermediate) return false\n // 无法将非数组转换为数组\n return false\n }\n \n // 确保数组足够长\n while (target.length <= segment) {\n target.push(undefined)\n }\n \n // 确保目标位置是对象或数组\n if (target[segment] == null || typeof target[segment] !== 'object') {\n if (!createIntermediate) return false\n target[segment] = nextIsArrayIndex ? createArray() : createObject()\n }\n \n target = target[segment]\n } else {\n // 当前段是对象属性\n if (typeof target !== 'object' || target === null) {\n return false\n }\n \n const targetObj = target as Record<string, unknown>\n \n if (targetObj[segment] == null || typeof targetObj[segment] !== 'object') {\n if (!createIntermediate) return false\n targetObj[segment] = nextIsArrayIndex ? createArray() : createObject()\n }\n \n target = targetObj[segment]\n }\n }\n \n // 设置最终值\n if (typeof lastSegment === 'number') {\n if (!Array.isArray(target)) {\n return false\n }\n while (target.length <= lastSegment) {\n target.push(undefined)\n }\n target[lastSegment] = value\n } else {\n if (typeof target !== 'object' || target === null) {\n return false\n }\n (target as Record<string, unknown>)[lastSegment] = value\n }\n \n return true\n}\n\n/**\n * 检查路径是否匹配(支持通配符)\n * \n * @param pattern 模式路径(支持 * 通配符)\n * @param path 目标路径\n * @returns 是否匹配\n * \n * @example\n * matchPath('items.*', 'items.0') // true\n * matchPath('items.*.name', 'items.0.name') // true\n * matchPath('user.name', 'user.name') // true\n * matchPath('user.name', 'user.age') // false\n */\nexport function matchPath(pattern: string, path: string): boolean {\n // 精确匹配\n if (pattern === path) {\n return true\n }\n \n // 检查是否为父路径\n if (path.startsWith(pattern + '.')) {\n return true\n }\n \n // 通配符匹配\n if (pattern.includes('*')) {\n const parentPath = pattern.split('.*')[0]\n return path.startsWith(parentPath + '.') || path === parentPath\n }\n \n // 检查是否路径影响模式\n if (pattern.startsWith(path + '.')) {\n return true\n }\n \n return false\n}\n\n/**\n * 提取路径的父路径\n * \n * @param path 路径字符串\n * @returns 父路径,顶层路径返回空字符串\n */\nexport function getParentPath(path: string): string {\n const segments = parsePathCached(path)\n if (segments.length <= 1) {\n return ''\n }\n return stringifyPath(segments.slice(0, -1))\n}\n\n/**\n * 获取路径的最后一段\n * \n * @param path 路径字符串\n * @returns 最后一段\n */\nexport function getLastSegment(path: string): PathSegment | undefined {\n const segments = parsePathCached(path)\n return segments[segments.length - 1]\n}\n","/**\n * 表达式缓存系统\n * \n * 功能:\n * - 每个 RuntimeContext 独立缓存(WeakMap 关联)\n * - LRU 淘汰策略\n * - 通配符依赖匹配\n * - 缓存失效机制\n * \n * 设计原则:\n * - 惰性求值:只在需要时计算\n * - 依赖追踪:精确的缓存失效\n * - 内存友好:WeakMap + LRU 淘汰\n */\n\nimport type { RuntimeContext, ExpressionCache } from '@variojs/types'\nimport { matchPath } from '../runtime/path.js'\n\n/**\n * 每个上下文独立缓存\n * 使用 RuntimeContext 作为键(WeakMap 自动回收)\n */\nconst cacheMap = new WeakMap<RuntimeContext<Record<string, unknown>>, Map<string, ExpressionCache>>()\n\n/**\n * 缓存配置\n */\nconst CACHE_CONFIG = {\n /** 最大缓存条目数 */\n maxSize: 100,\n /** 缓存有效期(毫秒),0 表示不过期 */\n ttl: 0\n} as const\n\n/**\n * 获取上下文的缓存 Map\n */\nfunction getCache(ctx: RuntimeContext): Map<string, ExpressionCache> {\n let cache = cacheMap.get(ctx as RuntimeContext<Record<string, unknown>>)\n if (!cache) {\n cache = new Map()\n cacheMap.set(ctx as RuntimeContext<Record<string, unknown>>, cache)\n }\n return cache\n}\n\n/**\n * 检查缓存条目是否有效\n */\nfunction isCacheValid(\n entry: ExpressionCache,\n ctx: RuntimeContext\n): boolean {\n // TTL 检查\n if (CACHE_CONFIG.ttl > 0 && Date.now() - entry.timestamp > CACHE_CONFIG.ttl) {\n return false\n }\n \n // 依赖检查:所有依赖的值必须存在\n return entry.dependencies.every(dep => {\n if (dep.includes('*')) {\n // 通配符依赖:检查父路径是否存在\n const parentPath = dep.split('.*')[0]\n return ctx._get(parentPath) != null\n }\n // 具体路径:检查值是否存在\n return ctx._get(dep) !== undefined\n })\n}\n\n/**\n * LRU 淘汰:删除最旧的缓存条目\n */\nfunction evictOldest(cache: Map<string, ExpressionCache>): void {\n let oldestKey: string | null = null\n let oldestTime = Infinity\n \n for (const [key, entry] of cache.entries()) {\n if (entry.timestamp < oldestTime) {\n oldestTime = entry.timestamp\n oldestKey = key\n }\n }\n \n if (oldestKey) {\n cache.delete(oldestKey)\n }\n}\n\n/**\n * 获取缓存的表达式结果\n * \n * @param expr 表达式字符串\n * @param ctx 运行时上下文\n * @returns 缓存的结果,无缓存或已失效返回 null\n */\nexport function getCachedExpression(\n expr: string,\n ctx: RuntimeContext\n): unknown | null {\n const cache = getCache(ctx)\n const entry = cache.get(expr)\n \n if (!entry) {\n return null\n }\n \n if (!isCacheValid(entry, ctx)) {\n cache.delete(expr)\n return null\n }\n \n // 更新时间戳(LRU)\n entry.timestamp = Date.now()\n return entry.result\n}\n\n/**\n * 设置表达式缓存\n * \n * @param expr 表达式字符串\n * @param result 求值结果\n * @param dependencies 依赖的状态路径\n * @param ctx 运行时上下文\n */\nexport function setCachedExpression(\n expr: string,\n result: unknown,\n dependencies: string[],\n ctx: RuntimeContext\n): void {\n const cache = getCache(ctx)\n \n // LRU 淘汰\n if (cache.size >= CACHE_CONFIG.maxSize) {\n evictOldest(cache)\n }\n \n cache.set(expr, {\n expr,\n result,\n dependencies,\n timestamp: Date.now()\n })\n}\n\n/**\n * 使缓存失效\n * \n * 当状态变化时调用,精确删除依赖该状态的缓存\n * \n * @param changedPath 变化的状态路径\n * @param ctx 运行时上下文\n */\nexport function invalidateCache(\n changedPath: string,\n ctx: RuntimeContext\n): void {\n const cache = getCache(ctx)\n const toDelete: string[] = []\n \n for (const [expr, entry] of cache.entries()) {\n // 检查是否有依赖被影响\n const isAffected = entry.dependencies.some(dep => \n matchPath(dep, changedPath) || matchPath(changedPath, dep)\n )\n \n if (isAffected) {\n toDelete.push(expr)\n }\n }\n \n // 批量删除\n for (const expr of toDelete) {\n cache.delete(expr)\n }\n}\n\n/**\n * 清除指定上下文的所有缓存\n */\nexport function clearCache(ctx: RuntimeContext): void {\n const cache = getCache(ctx)\n cache.clear()\n}\n\n/**\n * 获取缓存统计信息(调试用)\n */\nexport function getCacheStats(ctx: RuntimeContext): {\n size: number\n expressions: string[]\n} {\n const cache = getCache(ctx)\n return {\n size: cache.size,\n expressions: Array.from(cache.keys())\n }\n}\n","/**\n * 表达式求值入口函数\n * \n * 整合解析、验证、缓存、求值流程\n */\n\nimport type { RuntimeContext, ExpressionOptions } from '@variojs/types'\nimport { ExpressionError, ErrorCodes } from '../errors.js'\nimport { parseExpression } from './parser.js'\nimport { validateAST } from './whitelist.js'\nimport { evaluateExpression } from './evaluator.js'\nimport { extractDependencies } from './dependencies.js'\nimport { getCompiledExpression } from './compiler.js'\nimport {\n getCachedExpression,\n setCachedExpression,\n} from './cache.js'\n\n/**\n * 求值表达式(完整流程)\n * \n * @param expr 表达式字符串\n * @param ctx 运行时上下文\n * @returns 求值结果(类型无法静态推导,返回 unknown)\n * \n * 注意:表达式求值结果类型无法在编译时确定,因为:\n * 1. 表达式是运行时字符串\n * 2. 状态类型是动态的\n * 3. 表达式可能返回任意类型\n * \n * 如果需要类型安全,应在使用结果时进行类型守卫或类型断言\n */\nexport function evaluate(\n expr: string,\n ctx: RuntimeContext,\n options: ExpressionOptions = {}\n): unknown {\n try {\n // 合并选项:ctx.$exprOptions 优先级低于直接传入的 options\n const mergedOptions = {\n ...ctx.$exprOptions,\n ...options\n }\n \n // 1. 检查结果缓存\n const cached = getCachedExpression(expr, ctx)\n if (cached !== null) {\n return cached\n }\n \n // 2. 解析为 AST\n const ast = parseExpression(expr)\n \n // 3. AST 白名单校验(传递 allowGlobals 和 maxNestingDepth 选项)\n validateAST(ast, { \n allowGlobals: mergedOptions.allowGlobals,\n maxNestingDepth: mergedOptions.maxNestingDepth\n })\n \n // 4. 尝试使用编译缓存(简单表达式)\n const compiled = getCompiledExpression(expr, ast)\n if (compiled) {\n const result = compiled(ctx)\n // 提取依赖并缓存结果\n const dependencies = extractDependencies(ast)\n setCachedExpression(expr, result, dependencies, ctx)\n return result\n }\n \n // 5. 复杂表达式,使用解释执行\n const result = evaluateExpression(ast, ctx, mergedOptions)\n \n // 6. 提取依赖并缓存\n const dependencies = extractDependencies(ast)\n setCachedExpression(expr, result, dependencies, ctx)\n \n return result\n } catch (error: unknown) {\n if (error instanceof ExpressionError) {\n throw error\n }\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new ExpressionError(\n expr,\n `Expression evaluation failed: ${errorMessage}`,\n ErrorCodes.EXPRESSION_EVALUATION_ERROR,\n {\n metadata: {\n originalError: error instanceof Error ? error.name : 'Unknown',\n stack: error instanceof Error ? error.stack?.split('\\n').slice(0, 5) : undefined\n }\n }\n )\n }\n}\n","/**\n * set 动作处理器\n * \n * 功能:修改状态\n * 示例:{ \"type\": \"set\", \"path\": \"user.name\", \"value\": \"张三\" }\n * \n * 注意:缓存失效通过 RuntimeContext 的 onStateChange 钩子处理\n * 框架集成层应在创建上下文时注册该钩子\n */\n\nimport type { RuntimeContext, Action } from '@variojs/types'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { evaluate } from '@/expression/evaluate.js'\n\n/**\n * 处理 set 动作\n */\nexport async function handleSet(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n // 类型断言:确保 action 包含 set 动作的属性\n const { path, value } = action as Action & { path?: string; value?: unknown }\n \n if (!path || typeof path !== 'string') {\n throw new ActionError(\n action,\n 'set action requires \"path\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'path' } }\n )\n }\n \n // 求值 value(支持表达式)\n let finalValue = value\n if (typeof value === 'string' && value.startsWith('{{') && value.endsWith('}}')) {\n // 表达式插值:{{ user.age + 1 }}\n const expr = value.slice(2, -2).trim()\n finalValue = evaluate(expr, ctx)\n }\n \n // 设置状态(缓存失效通过 onStateChange 钩子自动处理)\n ctx._set(path, finalValue)\n}\n","/**\n * emit 动作处理器\n * \n * 功能:触发事件\n * 示例:{ \"type\": \"emit\", \"event\": \"submit\", \"data\": { \"userId\": 123 } }\n */\n\nimport type { RuntimeContext, Action } from '@variojs/types'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { evaluate } from '@/expression/evaluate.js'\n\n/**\n * 处理 emit 动作\n */\nexport async function handleEmit(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n // 类型断言:确保 action 包含 emit 动作的属性\n const { event, data } = action as Action & { event?: string; data?: unknown }\n \n if (!event || typeof event !== 'string') {\n throw new ActionError(\n action,\n 'emit action requires \"event\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'event' } }\n )\n }\n \n // 求值 data(支持表达式)\n let finalData = data\n if (typeof data === 'string' && data.startsWith('{{') && data.endsWith('}}')) {\n const expr = data.slice(2, -2).trim()\n finalData = evaluate(expr, ctx)\n }\n \n // 触发事件\n ctx.$emit(event, finalData)\n}\n","/**\n * 表达式工具函数\n * \n * 提供表达式解析、格式化的通用工具\n * 支持 {{ }} 格式的表达式提取和规范化\n */\n\n/**\n * 提取表达式字符串\n * 支持 {{ expression }} 格式,自动去掉包装\n * \n * @param expr 表达式字符串,可能是 \"{{ showContent }}\" 或 \"showContent\"\n * @returns 去掉 {{ }} 包装后的表达式字符串\n * \n * @example\n * ```typescript\n * extractExpression(\"{{ showContent }}\") // => \"showContent\"\n * extractExpression(\"showContent\") // => \"showContent\"\n * extractExpression(\"{{ userRole === 'admin' }}\") // => \"userRole === 'admin'\"\n * ```\n */\nexport function extractExpression(expr: string): string {\n if (typeof expr !== 'string') {\n return String(expr)\n }\n \n // 如果表达式是 {{ }} 格式,去掉包装\n if (expr.startsWith('{{') && expr.endsWith('}}')) {\n return expr.slice(2, -2).trim()\n }\n \n return expr.trim()\n}\n\n/**\n * 规范化表达式字符串\n * 确保表达式格式统一,便于后续处理\n * \n * @param expr 表达式字符串\n * @returns 规范化后的表达式字符串(去掉 {{ }} 包装)\n */\nexport function normalizeExpression(expr: string): string {\n return extractExpression(expr)\n}\n\n/**\n * 检查是否为表达式格式\n * \n * @param value 要检查的值\n * @returns 如果是 {{ }} 格式返回 true\n */\nexport function isExpressionFormat(value: any): boolean {\n return typeof value === 'string' && value.startsWith('{{') && value.endsWith('}}')\n}\n\n/**\n * 批量提取表达式\n * 从对象或数组中提取所有表达式字符串\n * \n * @param value 要处理的值(对象、数组或字符串)\n * @param extractor 提取函数,默认使用 extractExpression\n * @returns 处理后的值\n */\nexport function extractExpressionsRecursively(\n value: any,\n extractor: (expr: string) => string = extractExpression\n): any {\n // 字符串:检查是否为表达式\n if (typeof value === 'string') {\n return extractor(value)\n }\n \n // 数组:递归处理每个元素\n if (Array.isArray(value)) {\n return value.map(item => extractExpressionsRecursively(item, extractor))\n }\n \n // 对象:递归处理每个属性值\n if (value && typeof value === 'object') {\n const result: Record<string, any> = {}\n for (const [key, val] of Object.entries(value)) {\n result[key] = extractExpressionsRecursively(val, extractor)\n }\n return result\n }\n \n // 其他类型:直接返回\n return value\n}\n","/**\n * Action VM 执行器\n * \n * 功能:\n * - 执行动作序列\n * - 通过 $methods 查找动作处理器\n * - 错误处理和堆栈跟踪\n * - 超时保护(防止无限循环)\n * \n * 参考架构图:vario-core/vm - Action VM\n */\n\nimport type { RuntimeContext, Action } from '@variojs/types'\nimport { ActionError, ServiceError, ErrorCodes } from '../errors.js'\n\n/**\n * 执行动作序列的选项\n */\nexport interface ExecuteOptions {\n /**\n * 超时时间(毫秒),默认 5000ms\n */\n timeout?: number\n /**\n * 最大执行步数,默认 10000\n * 每执行一个动作计为一步\n */\n maxSteps?: number\n}\n\n/**\n * 执行动作序列\n * \n * @param actions 动作数组\n * @param ctx 运行时上下文\n * @param options 执行选项\n */\nexport async function execute(\n actions: Action[],\n ctx: RuntimeContext,\n options: ExecuteOptions = {}\n): Promise<void> {\n const timeout = options.timeout ?? 5000\n const maxSteps = options.maxSteps ?? 10000\n const startTime = Date.now()\n let stepCount = 0\n \n // 创建 AbortController 用于超时中断(如果支持)\n let abortController: AbortController | null = null\n if (typeof AbortController !== 'undefined') {\n abortController = new AbortController()\n \n // 设置超时定时器\n const timeoutId = setTimeout(() => {\n abortController?.abort()\n }, timeout)\n \n // 清理定时器(如果执行完成)\n const cleanup = () => clearTimeout(timeoutId)\n \n try {\n await executeActions(actions, ctx, abortController.signal, maxSteps, () => {\n stepCount++\n if (stepCount > maxSteps) {\n throw new ActionError(\n actions[actions.length - 1] || { type: 'unknown' } as Action,\n `Action execution exceeded max steps (${maxSteps})`,\n ErrorCodes.ACTION_MAX_STEPS_EXCEEDED,\n {\n metadata: {\n maxSteps,\n currentSteps: stepCount\n }\n }\n )\n }\n // 检查超时\n if (Date.now() - startTime > timeout) {\n throw new ActionError(\n actions[actions.length - 1] || { type: 'unknown' } as Action,\n `Action execution exceeded timeout (${timeout}ms)`,\n ErrorCodes.ACTION_TIMEOUT,\n {\n metadata: {\n timeout,\n elapsedTime: Date.now() - startTime\n }\n }\n )\n }\n })\n cleanup()\n } catch (error) {\n cleanup()\n throw error\n }\n } else {\n // 不支持 AbortController 的环境,使用时间检查\n await executeActions(actions, ctx, null, maxSteps, () => {\n stepCount++\n if (stepCount > maxSteps) {\n throw new ActionError(\n actions[actions.length - 1] || { type: 'unknown' } as Action,\n `Action execution exceeded max steps (${maxSteps})`,\n ErrorCodes.ACTION_MAX_STEPS_EXCEEDED,\n {\n metadata: {\n maxSteps,\n currentSteps: stepCount\n }\n }\n )\n }\n // 检查超时\n if (Date.now() - startTime > timeout) {\n throw new ActionError(\n actions[actions.length - 1] || { type: 'unknown' } as Action,\n `Action execution exceeded timeout (${timeout}ms)`,\n ErrorCodes.ACTION_TIMEOUT,\n {\n metadata: {\n timeout,\n elapsedTime: Date.now() - startTime\n }\n }\n )\n }\n })\n }\n \n // 最终检查超时(即使有 AbortController,也做双重检查)\n if (Date.now() - startTime > timeout) {\n throw new ActionError(\n actions[actions.length - 1] || { type: 'unknown' } as Action,\n `Action execution exceeded timeout (${timeout}ms)`,\n ErrorCodes.ACTION_TIMEOUT,\n {\n metadata: {\n timeout,\n elapsedTime: Date.now() - startTime,\n actionCount: actions.length\n }\n }\n )\n }\n}\n\n/**\n * 执行动作序列(内部实现)\n */\nasync function executeActions(\n actions: Action[],\n ctx: RuntimeContext,\n signal: AbortSignal | null,\n _maxSteps: number, // 用于类型,实际限制在 checkLimits 中检查\n checkLimits: () => void\n): Promise<void> {\n for (const action of actions) {\n // 检查中断信号\n if (signal?.aborted) {\n throw new ActionError(\n action,\n 'Action execution was aborted',\n ErrorCodes.ACTION_ABORTED\n )\n }\n \n // 检查步数和超时限制\n checkLimits()\n \n // 所有动作(包括内置动作)统一通过 $methods 注册\n const handler = ctx.$methods[action.type]\n \n if (!handler) {\n throw new ActionError(\n action,\n `Unknown action type: ${action.type}. Make sure the action is registered in $methods`,\n ErrorCodes.ACTION_UNKNOWN_TYPE\n )\n }\n \n try {\n await handler(ctx, action)\n } catch (error: unknown) {\n // 如果已经是 ActionError,直接抛出\n if (error instanceof ActionError) {\n throw error\n }\n \n // 如果已经是 ServiceError,直接抛出\n if (error instanceof ServiceError) {\n throw error\n }\n \n // 包装为 ActionError,收集上下文信息\n const errorMessage = error instanceof Error ? error.message : String(error)\n throw new ActionError(\n action,\n `Action execution failed: ${errorMessage}`,\n ErrorCodes.ACTION_EXECUTION_ERROR,\n {\n metadata: {\n originalError: error instanceof Error ? error.name : 'Unknown',\n stack: error instanceof Error ? error.stack?.split('\\n').slice(0, 5) : undefined\n }\n }\n )\n }\n }\n}\n","/**\n * if 动作处理器\n * \n * 功能:条件分支\n * 示例:{ \"type\": \"if\", \"cond\": \"user.age > 18\", \"then\": [...], \"else\": [...] }\n * 示例:{ \"type\": \"if\", \"cond\": \"{{ counter < 10 }}\", \"then\": [...], \"else\": [...] }\n */\n\nimport type { RuntimeContext, Action } from '@variojs/types'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { evaluate, extractExpression } from '@/expression/index.js'\nimport { execute } from '../executor.js'\n\n/**\n * 处理 if 动作\n */\nexport async function handleIf(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n // 类型断言:确保 action 包含 if 动作的属性\n const { cond, then, else: elseBranch } = action as Action & { \n cond?: string; \n then?: Action[]; \n else?: Action[] \n }\n \n if (!cond || typeof cond !== 'string') {\n throw new ActionError(\n action,\n 'if action requires \"cond\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'cond' } }\n )\n }\n \n // 提取表达式(支持 {{ }} 格式)\n const condExpr = extractExpression(cond)\n \n // 求值条件表达式\n const condition = evaluate(condExpr, ctx)\n \n // 执行对应的分支\n if (condition) {\n if (then && Array.isArray(then)) {\n await execute(then, ctx)\n }\n } else {\n if (elseBranch && Array.isArray(elseBranch)) {\n await execute(elseBranch, ctx)\n }\n }\n}\n","/**\n * 循环上下文对象池\n * \n * 功能:\n * - 复用循环上下文对象,减少内存分配\n * - 提升循环性能\n * - 自动清理和重置\n */\n\nimport type { RuntimeContext } from '@variojs/types'\n\n/**\n * 循环上下文对象池\n */\nclass LoopContextPool {\n private pool: Array<Partial<RuntimeContext>> = []\n private maxSize: number\n\n constructor(maxSize: number = 10) {\n this.maxSize = maxSize\n }\n\n /**\n * 获取一个循环上下文对象\n */\n acquire(): Partial<RuntimeContext> {\n if (this.pool.length > 0) {\n return this.pool.pop()!\n }\n return {}\n }\n\n /**\n * 释放循环上下文对象回池中\n */\n release(ctx: Partial<RuntimeContext>): void {\n // 清理循环相关属性\n if ('$item' in ctx) delete ctx.$item\n if ('$index' in ctx) delete ctx.$index\n \n // 清理动态添加的循环变量(保留系统 API)\n const keysToDelete: string[] = []\n for (const key in ctx) {\n if (!key.startsWith('$') && !key.startsWith('_')) {\n keysToDelete.push(key)\n }\n }\n for (const key of keysToDelete) {\n delete ctx[key]\n }\n \n // 如果池未满,回收对象\n if (this.pool.length < this.maxSize) {\n this.pool.push(ctx)\n }\n }\n\n /**\n * 清空对象池\n */\n clear(): void {\n this.pool.length = 0\n }\n\n /**\n * 获取池大小\n */\n get size(): number {\n return this.pool.length\n }\n}\n\n/**\n * 全局循环上下文对象池实例\n */\nlet globalPool: LoopContextPool | null = null\n\n/**\n * 获取全局循环上下文对象池\n */\nexport function getLoopContextPool(): LoopContextPool {\n if (!globalPool) {\n globalPool = new LoopContextPool()\n }\n return globalPool\n}\n\n/**\n * 创建循环上下文(使用对象池)\n * \n * @param parentCtx 父上下文\n * @param item 循环项\n * @param index 循环索引\n * @returns 循环上下文\n */\nexport function createLoopContext(\n parentCtx: RuntimeContext,\n item: unknown,\n index: number\n): RuntimeContext {\n const pool = getLoopContextPool()\n const baseCtx = pool.acquire()\n \n // 创建循环上下文(浅拷贝父上下文 + 循环属性)\n const loopCtx = Object.create(parentCtx) as RuntimeContext\n \n // 复制基础对象池中的属性(如果有)\n Object.assign(loopCtx, baseCtx)\n \n // 设置循环相关属性\n loopCtx.$item = item\n loopCtx.$index = index\n \n return loopCtx\n}\n\n/**\n * 释放循环上下文(回收到对象池)\n * \n * @param loopCtx 循环上下文\n */\nexport function releaseLoopContext(loopCtx: Partial<RuntimeContext>): void {\n const pool = getLoopContextPool()\n pool.release(loopCtx)\n}\n\n/**\n * 清空对象池(用于测试或重置)\n */\nexport function clearLoopContextPool(): void {\n if (globalPool) {\n globalPool.clear()\n }\n}\n","/**\n * loop 动作处理器\n * \n * 功能:循环执行\n * 示例:{ \"type\": \"loop\", \"var\": \"item\", \"in\": \"items\", \"body\": [...] }\n */\n\nimport type { RuntimeContext, Action } from '@variojs/types'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { evaluate } from '@/expression/evaluate.js'\nimport { invalidateCache } from '@/expression/cache.js'\nimport { execute } from '../executor.js'\nimport { createLoopContext, releaseLoopContext } from '@/runtime/loop-context-pool.js'\n\n/**\n * 处理 loop 动作\n */\nexport async function handleLoop(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n // 类型断言:确保 action 包含 loop 动作的属性\n const { var: varName, in: inExpr, body } = action as Action & { var?: string; in?: string; body?: Action[] }\n \n if (!varName || typeof varName !== 'string') {\n throw new ActionError(\n action,\n 'loop action requires \"var\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'var' } }\n )\n }\n \n if (!inExpr || typeof inExpr !== 'string') {\n throw new ActionError(\n action,\n 'loop action requires \"in\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'in' } }\n )\n }\n \n if (!body || !Array.isArray(body)) {\n throw new ActionError(\n action,\n 'loop action requires \"body\" parameter (array of actions)',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'body' } }\n )\n }\n \n // 求值 in 表达式,获取要遍历的数组或对象\n const iterable = evaluate(inExpr, ctx)\n \n if (iterable == null) {\n return\n }\n \n // 遍历数组\n if (Array.isArray(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n // 使用对象池创建循环上下文\n const loopCtx = createLoopContext(ctx, iterable[i], i)\n loopCtx[varName] = iterable[i]\n \n try {\n // 触发缓存失效,确保表达式重新求值\n invalidateCache(varName, loopCtx)\n await execute(body, loopCtx)\n } finally {\n // 释放循环上下文回对象池\n releaseLoopContext(loopCtx)\n }\n }\n }\n // 遍历对象\n else if (typeof iterable === 'object' && iterable !== null) {\n const entries = Object.entries(iterable)\n for (let i = 0; i < entries.length; i++) {\n const [, value] = entries[i]\n // 使用对象池创建循环上下文\n const loopCtx = createLoopContext(ctx, value, i)\n loopCtx[varName] = value\n \n try {\n // 触发缓存失效,确保表达式重新求值\n invalidateCache(varName, loopCtx)\n await execute(body, loopCtx)\n } finally {\n // 释放循环上下文回对象池\n releaseLoopContext(loopCtx)\n }\n }\n }\n else {\n throw new ActionError(\n action,\n `loop \"in\" expression must evaluate to an array or object, got ${typeof iterable}`,\n ErrorCodes.ACTION_INVALID_PARAM,\n { metadata: { param: 'in', actualType: typeof iterable } }\n )\n }\n}\n","/**\n * call 动作处理器\n * \n * 功能:调用 method(通过 $methods)\n * \n * params 参数支持三种形式:\n * 1. 对象(命名参数):{ \"type\": \"call\", \"method\": \"fetchUser\", \"params\": { id: \"{{userId}}\" } }\n * 2. 数组(位置参数):{ \"type\": \"call\", \"method\": \"sum\", \"params\": [\"{{a}}\", \"{{b}}\"] }\n * 3. 字符串(表达式):{ \"type\": \"call\", \"method\": \"fetchUser\", \"params\": \"{{ userParams }}\" }\n * \n * resultTo:将方法返回值保存到状态中\n * \n * 参考文档:action-reference.md - call 动作\n */\n\nimport type { RuntimeContext, Action } from '@variojs/types'\nimport { ActionError, ServiceError, ErrorCodes } from '@/errors.js'\nimport { evaluate } from '@/expression/evaluate.js'\nimport { invalidateCache } from '@/expression/cache.js'\n\n/**\n * 处理 call 动作\n */\nexport async function handleCall(\n ctx: RuntimeContext,\n action: Action\n): Promise<unknown> {\n // 类型断言:确保 action 包含 call 动作的属性\n const { method, params: rawParams, resultTo } = action as Action & {\n method?: string\n params?: string | Record<string, unknown> | unknown[]\n resultTo?: string\n }\n \n if (!method || typeof method !== 'string') {\n throw new ActionError(\n action,\n 'call action requires \"method\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'method' } }\n )\n }\n \n // 查找方法(通过 $methods)\n const handler = ctx.$methods[method]\n if (!handler) {\n throw new ServiceError(\n method,\n `Method \"${method}\" not found in $methods`,\n undefined,\n {\n metadata: { method }\n }\n )\n }\n \n // 求值参数(params 支持字符串表达式、对象、数组三种形式)\n let finalParams: unknown\n \n try {\n if (rawParams == null) {\n // 没有 params,使用空对象\n finalParams = {}\n } else if (typeof rawParams === 'string' && rawParams.startsWith('{{') && rawParams.endsWith('}}')) {\n // 字符串表达式,求值\n const expr = rawParams.slice(2, -2).trim()\n finalParams = evaluate(expr, ctx)\n } else if (Array.isArray(rawParams)) {\n // 数组形式(位置参数),求值每个元素\n const evaluatedParams: unknown[] = []\n for (const param of rawParams) {\n if (typeof param === 'string' && param.startsWith('{{') && param.endsWith('}}')) {\n const expr = param.slice(2, -2).trim()\n evaluatedParams.push(evaluate(expr, ctx))\n } else {\n evaluatedParams.push(param)\n }\n }\n finalParams = evaluatedParams\n } else if (typeof rawParams === 'object') {\n // 对象形式(命名参数),求值每个属性\n const evaluatedParams: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(rawParams as Record<string, unknown>)) {\n if (typeof value === 'string' && value.startsWith('{{') && value.endsWith('}}')) {\n const expr = value.slice(2, -2).trim()\n evaluatedParams[key] = evaluate(expr, ctx)\n } else {\n evaluatedParams[key] = value\n }\n }\n finalParams = evaluatedParams\n } else {\n // 其他情况直接使用\n finalParams = rawParams\n }\n \n // 调用 method\n const result = await handler(ctx, finalParams)\n \n // 如果指定了 resultTo,保存结果到状态\n if (resultTo) {\n ctx._set(resultTo, result)\n invalidateCache(resultTo, ctx)\n }\n \n return result\n } catch (error: unknown) {\n // 如果错误已经是 ServiceError,直接抛出\n if (error instanceof ServiceError) {\n throw error\n }\n \n const errorMessage = error instanceof Error ? error.message : String(error)\n const originalError = error instanceof Error ? error : undefined\n \n throw new ServiceError(\n method,\n `Service call failed: ${errorMessage}`,\n originalError,\n {\n metadata: {\n method,\n params: finalParams\n }\n }\n )\n }\n}\n","/**\n * batch 动作处理器\n * \n * 功能:批量执行动作(保证原子性)\n * 示例:{ \"type\": \"batch\", \"actions\": [...] }\n */\n\nimport type { RuntimeContext, Action } from '@variojs/types'\nimport { ActionError, BatchError, ErrorCodes } from '@/errors.js'\nimport { execute } from '../executor.js'\n\n/**\n * 处理 batch 动作\n */\nexport async function handleBatch(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n // 类型断言:确保 action 包含 batch 动作的属性\n const { actions } = action as Action & { actions?: Action[] }\n \n if (!actions || !Array.isArray(actions)) {\n throw new ActionError(\n action,\n 'batch action requires \"actions\" parameter (array)',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'actions' } }\n )\n }\n \n const errors: Array<{ action: Action; error: Error }> = []\n \n // 批量执行,收集错误\n for (const act of actions) {\n try {\n await execute([act], ctx)\n } catch (error: unknown) {\n errors.push({\n action: act,\n error: error instanceof Error ? error : new Error(String(error))\n })\n }\n }\n \n // 如果有错误,抛出 BatchError\n if (errors.length > 0) {\n throw new BatchError(\n errors,\n `${errors.length} actions failed in batch`,\n {\n metadata: {\n failedCount: errors.length,\n totalCount: actions.length\n }\n }\n )\n }\n}\n","/**\n * navigate 动作处理器\n * \n * 功能:路由导航\n * 示例:{ \"type\": \"navigate\", \"to\": \"/users/123\" }\n */\n\nimport type { RuntimeContext, Action } from '@variojs/types'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { evaluate } from '@/expression/evaluate.js'\n\n/**\n * 处理 navigate 动作\n */\nexport async function handleNavigate(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n // 类型断言:确保 action 包含 navigate 动作的属性\n const { to } = action as Action & { to?: string }\n \n if (!to || typeof to !== 'string') {\n throw new ActionError(\n action,\n 'navigate action requires \"to\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'to' } }\n )\n }\n \n // 求值 to(支持表达式)\n let finalTo: string = to\n if (to.startsWith('{{') && to.endsWith('}}')) {\n const expr = to.slice(2, -2).trim()\n const result = evaluate(expr, ctx)\n if (typeof result !== 'string') {\n throw new ActionError(\n action,\n `navigate \"to\" expression must evaluate to a string, got ${typeof result}`,\n ErrorCodes.ACTION_INVALID_PARAM,\n { metadata: { param: 'to', actualType: typeof result } }\n )\n }\n finalTo = result\n }\n \n // 调用路由导航方法(如果已注册)\n const navigateHandler = ctx.$methods['navigate'] || ctx.$methods['$navigate']\n if (navigateHandler) {\n await navigateHandler(ctx, { to: finalTo })\n } else {\n // 如果没有注册导航方法,使用默认行为(浏览器导航)\n // 使用类型安全的 window 访问\n if (typeof window !== 'undefined' && (window as { location?: { href: string } }).location) {\n ((window as unknown) as { location: { href: string } }).location.href = finalTo\n } else {\n throw new ActionError(\n action,\n 'navigate method not registered and window.location is not available',\n ErrorCodes.ACTION_EXECUTION_ERROR,\n { metadata: { reason: 'navigate_not_available' } }\n )\n }\n }\n}\n","/**\n * log 动作处理器\n * \n * 功能:调试输出\n * 示例:{ \"type\": \"log\", \"level\": \"info\", \"message\": \"User logged in\" }\n */\n\nimport type { RuntimeContext, Action } from '@variojs/types'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { evaluate } from '@/expression/evaluate.js'\n\n/**\n * 处理 log 动作\n */\nexport async function handleLog(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n // 类型断言:确保 action 包含 log 动作的属性\n const { level = 'info', message } = action as Action & { level?: 'info' | 'warn' | 'error'; message?: string }\n \n if (!message) {\n throw new ActionError(\n action,\n 'log action requires \"message\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'message' } }\n )\n }\n \n // 求值 message(支持表达式)\n let finalMessage: unknown = message\n if (typeof message === 'string' && message.startsWith('{{') && message.endsWith('}}')) {\n const expr = message.slice(2, -2).trim()\n finalMessage = evaluate(expr, ctx)\n }\n \n // 输出日志(将 finalMessage 转换为字符串)\n const logLevel = String(level).toLowerCase()\n const messageStr = String(finalMessage)\n if (typeof console !== 'undefined') {\n switch (logLevel) {\n case 'error':\n console.error('[Vario]', messageStr)\n break\n case 'warn':\n console.warn('[Vario]', messageStr)\n break\n case 'info':\n default:\n console.log('[Vario]', messageStr)\n break\n }\n }\n}\n","/**\n * 数组指令工具函数\n */\n\nimport type { RuntimeContext } from '@variojs/types'\nimport { evaluate } from '@/expression/evaluate.js'\n\n/**\n * 递归求值对象/数组中的表达式\n * 支持在对象属性和数组元素中使用 {{ expression }} 格式\n */\nexport function evaluateExpressionsRecursively(\n value: any,\n ctx: RuntimeContext\n): any {\n // 字符串:检查是否为表达式\n if (typeof value === 'string') {\n if (value.startsWith('{{') && value.endsWith('}}')) {\n const expr = value.slice(2, -2).trim()\n return evaluate(expr, ctx)\n }\n return value\n }\n \n // 数组:递归处理每个元素\n if (Array.isArray(value)) {\n return value.map(item => evaluateExpressionsRecursively(item, ctx))\n }\n \n // 对象:递归处理每个属性值\n if (value && typeof value === 'object') {\n const result: Record<string, any> = {}\n for (const [key, val] of Object.entries(value)) {\n result[key] = evaluateExpressionsRecursively(val, ctx)\n }\n return result\n }\n \n // 其他类型:直接返回\n return value\n}\n","/**\n * push 动作处理器\n * \n * 功能:添加元素到数组末尾\n * 示例:{ \"type\": \"push\", \"path\": \"items\", \"value\": \"{{ newItem }}\" }\n * 示例:{ \"type\": \"push\", \"path\": \"todos\", \"items\": [{ text: \"{{ newTodo }}\", done: false }] }\n */\n\nimport type { RuntimeContext, Action } from '@variojs/types'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { invalidateCache } from '@/expression/cache.js'\nimport { evaluateExpressionsRecursively } from './utils.js'\n\n/**\n * 处理 push 动作\n */\nexport async function handlePush(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n // 类型断言:确保 action 包含 push 动作的属性\n const { path, value, items } = action as Action & { path?: string; value?: unknown; items?: unknown[] }\n \n if (!path || typeof path !== 'string') {\n throw new ActionError(\n action,\n 'push action requires \"path\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'path' } }\n )\n }\n \n // 获取数组\n const array = ctx._get(path)\n if (!Array.isArray(array)) {\n throw new ActionError(\n action,\n `Path \"${path}\" does not point to an array`,\n ErrorCodes.ACTION_INVALID_PARAM,\n { metadata: { param: 'path', path, actualType: typeof array } }\n )\n }\n \n // 支持 items 作为 value 的别名\n const inputValue = items !== undefined ? items : value\n \n if (inputValue === undefined) {\n throw new ActionError(\n action,\n 'push action requires \"value\" or \"items\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'value|items' } }\n )\n }\n \n // 递归求值表达式(支持对象/数组中的表达式)\n const finalValue = evaluateExpressionsRecursively(inputValue, ctx)\n \n // 如果是数组,展开添加\n if (Array.isArray(finalValue)) {\n array.push(...finalValue)\n } else {\n array.push(finalValue)\n }\n \n // 使相关缓存失效\n invalidateCache(path, ctx)\n invalidateCache(`${path}.*`, ctx)\n}\n","/**\n * pop 动作处理器\n * \n * 功能:删除数组末尾元素\n * 示例:{ \"type\": \"pop\", \"path\": \"items\" }\n */\n\nimport type { RuntimeContext, Action } from '@variojs/types'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { invalidateCache } from '@/expression/cache.js'\n\n/**\n * 处理 pop 动作\n */\nexport async function handlePop(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n // 类型断言:确保 action 包含 pop 动作的属性\n const { path } = action as Action & { path?: string }\n \n if (!path || typeof path !== 'string') {\n throw new ActionError(\n action,\n 'pop action requires \"path\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'path' } }\n )\n }\n \n // 获取数组\n const array = ctx._get(path)\n if (!Array.isArray(array)) {\n throw new ActionError(\n action,\n `Path \"${path}\" does not point to an array`,\n ErrorCodes.ACTION_INVALID_PARAM,\n { metadata: { param: 'path', path, actualType: typeof array } }\n )\n }\n \n // 删除末尾元素\n array.pop()\n \n // 使相关缓存失效\n invalidateCache(path, ctx)\n invalidateCache(`${path}.*`, ctx)\n}\n","/**\n * shift 动作处理器\n * \n * 功能:删除数组首元素\n * 示例:{ \"type\": \"shift\", \"path\": \"items\" }\n */\n\nimport type { RuntimeContext, Action } from '@variojs/types'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { invalidateCache } from '@/expression/cache.js'\n\n/**\n * 处理 shift 动作\n */\nexport async function handleShift(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n // 类型断言:确保 action 包含 shift 动作的属性\n const { path } = action as Action & { path?: string }\n \n if (!path || typeof path !== 'string') {\n throw new ActionError(\n action,\n 'shift action requires \"path\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'path' } }\n )\n }\n \n // 获取数组\n const array = ctx._get(path)\n if (!Array.isArray(array)) {\n throw new ActionError(\n action,\n `Path \"${path}\" does not point to an array`,\n ErrorCodes.ACTION_INVALID_PARAM,\n { metadata: { param: 'path', path, actualType: typeof array } }\n )\n }\n \n // 删除首元素\n array.shift()\n \n // 使相关缓存失效\n invalidateCache(path, ctx)\n invalidateCache(`${path}.*`, ctx)\n}\n","/**\n * unshift 动作处理器\n * \n * 功能:添加元素到数组开头\n * 示例:{ \"type\": \"unshift\", \"path\": \"items\", \"value\": \"{{ firstItem }}\" }\n * 示例:{ \"type\": \"unshift\", \"path\": \"todos\", \"items\": [{ text: \"{{ newTodo }}\", done: false }] }\n */\n\nimport type { RuntimeContext, Action } from '@variojs/types'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { invalidateCache } from '@/expression/cache.js'\nimport { evaluateExpressionsRecursively } from './utils.js'\n\n/**\n * 处理 unshift 动作\n */\nexport async function handleUnshift(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n // 类型断言:确保 action 包含 unshift 动作的属性\n const { path, value, items } = action as Action & { path?: string; value?: unknown; items?: unknown[] }\n \n if (!path || typeof path !== 'string') {\n throw new ActionError(\n action,\n 'unshift action requires \"path\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'path' } }\n )\n }\n \n // 获取数组\n const array = ctx._get(path)\n if (!Array.isArray(array)) {\n throw new ActionError(\n action,\n `Path \"${path}\" does not point to an array`,\n ErrorCodes.ACTION_INVALID_PARAM,\n { metadata: { param: 'path', path, actualType: typeof array } }\n )\n }\n \n // 支持 items 作为 value 的别名\n const inputValue = items !== undefined ? items : value\n \n if (inputValue === undefined) {\n throw new ActionError(\n action,\n 'unshift action requires \"value\" or \"items\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'value|items' } }\n )\n }\n \n // 递归求值表达式(支持对象/数组中的表达式)\n const finalValue = evaluateExpressionsRecursively(inputValue, ctx)\n \n // 如果是数组,展开添加\n if (Array.isArray(finalValue)) {\n array.unshift(...finalValue)\n } else {\n array.unshift(finalValue)\n }\n \n // 使相关缓存失效\n invalidateCache(path, ctx)\n invalidateCache(`${path}.*`, ctx)\n}\n","/**\n * splice 动作处理器\n * \n * 功能:删除或替换数组元素\n * 示例:{ \"type\": \"splice\", \"path\": \"items\", \"start\": 0, \"deleteCount\": 1, \"items\": \"{{ newItem }}\" }\n */\n\nimport type { RuntimeContext, Action } from '@variojs/types'\nimport { ActionError, ErrorCodes } from '@/errors.js'\nimport { evaluate } from '@/expression/evaluate.js'\nimport { invalidateCache } from '@/expression/cache.js'\nimport { evaluateExpressionsRecursively } from './utils.js'\n\n/**\n * 处理 splice 动作\n */\nexport async function handleSplice(\n ctx: RuntimeContext,\n action: Action\n): Promise<void> {\n // 类型断言:确保 action 包含 splice 动作的属性\n const { path, start, deleteCount = 0, items } = action as Action & { path?: string; start?: number | string; deleteCount?: number | string; items?: unknown[] }\n \n if (!path || typeof path !== 'string') {\n throw new ActionError(\n action,\n 'splice action requires \"path\" parameter',\n ErrorCodes.ACTION_MISSING_PARAM,\n { metadata: { param: 'path' } }\n )\n }\n \n // 获取数组\n const array = ctx._get(path)\n if (!Array.isArray(array)) {\n throw new ActionError(\n action,\n `Path \"${path}\" does not point to an array`,\n ErrorCodes.ACTION_INVALID_PARAM,\n { metadata: { param: 'path', path, actualType: typeof array } }\n )\n }\n \n // 求值 start(支持表达式)\n let finalStart: number\n if (typeof start === 'string' && start.startsWith('{{') && start.endsWith('}}')) {\n const expr = start.slice(2, -2).trim()\n finalStart = Number(evaluate(expr, ctx) as number)\n } else {\n finalStart = Number(start as number)\n }\n\n // 求值 deleteCount(支持表达式)\n let finalDeleteCount: number\n if (typeof deleteCount === 'string' && deleteCount.startsWith('{{') && deleteCount.endsWith('}}')) {\n const expr = deleteCount.slice(2, -2).trim()\n finalDeleteCount = Number(evaluate(expr, ctx) as number)\n } else {\n finalDeleteCount = Number(deleteCount as number)\n }\n \n // 求值 items(支持递归表达式)\n let finalItems: unknown[] = []\n if (items != null) {\n const evaluated = evaluateExpressionsRecursively(items, ctx)\n if (Array.isArray(evaluated)) {\n finalItems = evaluated\n } else {\n finalItems = [evaluated]\n }\n }\n \n // 执行 splice\n array.splice(finalStart, finalDeleteCount, ...finalItems)\n \n // 使相关缓存失效\n invalidateCache(path, ctx)\n invalidateCache(`${path}.*`, ctx)\n}\n","/**\n * 内置动作处理器\n * \n * 所有内置动作统一注册到 ctx.$methods\n */\n\nimport type { RuntimeContext, MethodHandler } from '@variojs/types'\nimport { handleSet } from './set.js'\nimport { handleEmit } from './emit.js'\nimport { handleIf } from './if.js'\nimport { handleLoop } from './loop.js'\nimport { handleCall } from './call.js'\nimport { handleBatch } from './batch.js'\nimport { handleNavigate } from './navigate.js'\nimport { handleLog } from './log.js'\nimport { handlePush } from './array/push.js'\nimport { handlePop } from './array/pop.js'\nimport { handleShift } from './array/shift.js'\nimport { handleUnshift } from './array/unshift.js'\nimport { handleSplice } from './array/splice.js'\n\n/**\n * 内置动作处理器映射\n */\nconst BUILTIN_METHODS: Record<string, MethodHandler> = {\n // 原子动作\n 'set': handleSet as MethodHandler,\n 'emit': handleEmit as MethodHandler,\n 'navigate': handleNavigate as MethodHandler,\n 'log': handleLog as MethodHandler,\n \n // 控制流动作\n 'if': handleIf as MethodHandler,\n 'loop': handleLoop as MethodHandler,\n \n // 复合动作\n 'call': handleCall as MethodHandler,\n 'batch': handleBatch as MethodHandler,\n \n // 数组操作动作\n 'push': handlePush as MethodHandler,\n 'pop': handlePop as MethodHandler,\n 'shift': handleShift as MethodHandler,\n 'unshift': handleUnshift as MethodHandler,\n 'splice': handleSplice as MethodHandler,\n}\n\n/**\n * 注册所有内置动作到 $methods\n * \n * 注意:此函数通过向现有 $methods 对象添加属性来注册方法,\n * 而不是整体覆盖 $methods,以确保在 Proxy 保护下也能正常工作。\n */\nexport function registerBuiltinMethods(ctx: RuntimeContext): void {\n // 向现有 $methods 对象添加内置方法,不覆盖已有的同名方法\n for (const [name, handler] of Object.entries(BUILTIN_METHODS)) {\n if (!(name in ctx.$methods)) {\n ctx.$methods[name] = handler\n }\n }\n}\n","/**\n * RuntimeContext 创建工厂\n *\n * 实现要点:扁平化状态存储、系统 API 保护、命名冲突检测、Proxy 保护。\n * 复杂类型见 ../types.ts(CreateContextOptions、OnStateChangeCallback 等)。\n */\n\nimport type {\n RuntimeContext,\n CreateContextOptions,\n MethodsRegistry,\n GetPathValue,\n SetPathValue,\n OnStateChangeCallback\n} from '@variojs/types'\nimport { createProxy } from './proxy.js'\nimport { registerBuiltinMethods } from '../vm/handlers/index.js'\nimport { getPathValue as getPath, setPathValue as setPath } from './path.js'\nimport { invalidateCache } from '../expression/cache.js'\n\n/**\n * 创建运行时上下文(传入具体 initialState 时,TState 从实参自动推导)\n */\nexport function createRuntimeContext<TState extends Record<string, unknown>>(\n initialState: TState,\n options?: CreateContextOptions<TState>\n): RuntimeContext<TState>\n/**\n * 创建运行时上下文(显式指定 TState 时可传空或部分初始状态,如 createRuntimeContext<MyState>({}, options))\n */\nexport function createRuntimeContext<TState extends Record<string, unknown>>(\n initialState: Partial<TState> & Record<string, unknown>,\n options?: CreateContextOptions<TState>\n): RuntimeContext<TState>\n/**\n * 创建运行时上下文(不传或传空且未指定 TState 时,退回 Record<string, unknown>)\n */\nexport function createRuntimeContext(\n initialState?: Record<string, unknown>,\n options?: CreateContextOptions<Record<string, unknown>>\n): RuntimeContext<Record<string, unknown>>\nexport function createRuntimeContext<TState extends Record<string, unknown>>(\n initialState: Partial<TState> & Record<string, unknown> = {} as Partial<TState> & Record<string, unknown>,\n options: CreateContextOptions<TState> | CreateContextOptions<Record<string, unknown>> = {}\n): RuntimeContext<TState> {\n // 1. 验证命名冲突\n validateStateKeys(initialState)\n\n const {\n onEmit,\n methods = {},\n onStateChange,\n createObject = () => ({}),\n createArray = () => [],\n exprOptions\n } = options\n\n // 用于存储 proxied 引用,以便 _set 中的 onStateChange 能使用正确的引用\n let proxiedRef: RuntimeContext<TState> | null = null\n\n // 2. 创建基础上下文对象\n const ctx = {\n ...initialState,\n $emit: (event: string, data?: unknown) => {\n if (onEmit) {\n onEmit(event, data)\n }\n },\n $methods: methods as MethodsRegistry,\n $exprOptions: exprOptions,\n _get: <TPath extends string>(path: TPath): GetPathValue<TState, TPath> => {\n return getPath(ctx as Record<string, unknown>, path) as GetPathValue<TState, TPath>\n },\n _set: <TPath extends string>(path: TPath, value: SetPathValue<TState, TPath>, options?: { skipCallback?: boolean }): void => {\n setPath(ctx as Record<string, unknown>, path, value, {\n createObject,\n createArray\n })\n // 使缓存失效(使用 proxied 引用以确保缓存键一致)\n invalidateCache(path, (proxiedRef || ctx) as RuntimeContext)\n if (onStateChange && !options?.skipCallback) {\n ;(onStateChange as OnStateChangeCallback<TState>)(path, value, proxiedRef || ctx)\n }\n },\n } as RuntimeContext<TState>\n\n // 3. 自动注册内置指令到 $methods(RuntimeContext<TState> 与 RuntimeContext 在 _set 值域上逆变,需通过 unknown 转接)\n registerBuiltinMethods(ctx as unknown as RuntimeContext)\n\n // 4. 使用 Proxy 保护系统 API\n const proxied = createProxy(ctx as unknown as RuntimeContext) as RuntimeContext<TState>\n \n // 5. 保存 proxied 引用供 _set 使用\n proxiedRef = proxied\n \n return proxied\n}\n\n/**\n * 验证状态键名,防止与系统 API 冲突\n */\nfunction validateStateKeys(state: Record<string, unknown>): void {\n for (const key in state) {\n if (key.startsWith('$') || key.startsWith('_')) {\n throw new Error(\n `Property name \"${key}\" conflicts with system API. ` +\n `Properties starting with \"$\" or \"_\" are reserved. Use a different name.`\n )\n }\n }\n}\n","\nimport type { SchemaNode } from '@variojs/types'\n\nexport type TraversalCallback = (\n node: SchemaNode,\n path: string,\n depth: number,\n parent: SchemaNode | null\n) => boolean | void // return false to stop\n\n/**\n * 通用 Schema 遍历工具 (UI Component Tree 风格)\n * 采用深度优先遍历 (DFS)\n * \n * @param root 根节点\n * @param callback 回调函数\n * @param separator 路径分隔符,默认为 '.'\n */\nexport function traverseSchema(\n root: SchemaNode,\n callback: TraversalCallback,\n separator: string = '.'\n): void {\n \n function walk(\n node: SchemaNode,\n path: string,\n depth: number,\n parent: SchemaNode | null\n ) {\n if (!node || typeof node !== 'object') return\n\n // 执行回调,如果返回 false 则停止遍历当前分支的子节点\n const shouldContinue = callback(node, path, depth, parent)\n if (shouldContinue === false) return\n\n // 处理 children (Schema 树结构)\n // 根据 Vario Schema 定义,主要是 children 属性\n if (node.children) {\n if (Array.isArray(node.children)) {\n node.children.forEach((child: any, index: number) => {\n if (child && typeof child === 'object') {\n const childPath = path ? `${path}${separator}children${separator}${index}` : `children${separator}${index}`\n walk(child as SchemaNode, childPath, depth + 1, node)\n } \n // ignore string children as they are text content\n })\n } else if (typeof node.children === 'object') {\n // 虽然类型定义说 children 是 array | string,但防御性处理单对象情况\n const childPath = path ? `${path}${separator}children` : `children`\n walk(node.children as unknown as SchemaNode, childPath, depth + 1, node)\n }\n }\n }\n\n // 从根开始\n walk(root, '', 0, null)\n}\n","/**\n * Schema 分析器 - 框架无关的纯函数实现\n * \n * 提供 Schema 统计和索引构建能力,不依赖任何前端框架\n */\n\nimport type { SchemaNode } from '@variojs/types'\nimport { traverseSchema } from '../runtime/traversal.js'\n\n/**\n * Schema 统计信息\n */\nexport interface SchemaStats {\n /** 节点总数 */\n nodeCount: number\n /** 最大深度 */\n maxDepth: number\n}\n\n/**\n * Schema 索引映射\n */\nexport interface SchemaIndex {\n /** ID -> 路径的映射 */\n idMap: Map<string, string>\n /** 路径 -> 节点的映射(可选,用于快速访问) */\n pathMap?: Map<string, SchemaNode>\n}\n\n/**\n * 分析结果\n */\nexport interface AnalysisResult {\n stats: SchemaStats\n index: SchemaIndex\n}\n\n/**\n * 分析 Schema 结构\n * \n * 遍历整个 Schema 树,收集统计信息和构建索引\n * \n * @param schema 要分析的 Schema 根节点\n * @param options 分析选项\n * @returns 分析结果\n */\nexport function analyzeSchema(\n schema: SchemaNode,\n options: {\n /** 是否构建路径映射(会增加内存开销) */\n buildPathMap?: boolean\n /** 自定义回调,在遍历每个节点时调用 */\n onNode?: (node: SchemaNode, path: string, depth: number) => void\n } = {}\n): AnalysisResult {\n const stats: SchemaStats = {\n nodeCount: 0,\n maxDepth: 0\n }\n\n const idMap = new Map<string, string>()\n const pathMap = options.buildPathMap ? new Map<string, SchemaNode>() : undefined\n\n traverseSchema(schema, (node: SchemaNode, path: string, depth: number) => {\n // 统计\n stats.nodeCount++\n if (depth > stats.maxDepth) {\n stats.maxDepth = depth\n }\n\n // 构建 ID 索引\n const nodeWithId = node as any\n if (nodeWithId.id && typeof nodeWithId.id === 'string') {\n idMap.set(nodeWithId.id, path)\n }\n\n // 构建路径映射(可选)\n if (pathMap) {\n pathMap.set(path, node)\n }\n\n // 用户自定义回调\n options.onNode?.(node, path, depth)\n })\n\n return {\n stats,\n index: { idMap, pathMap }\n }\n}\n\n/**\n * 在 Schema 中查找节点\n * \n * @param schema Schema 根节点\n * @param predicate 判断条件\n * @returns 匹配的节点路径数组\n */\nexport function findNodes(\n schema: SchemaNode,\n predicate: (node: SchemaNode) => boolean\n): Array<{ node: SchemaNode; path: string }> {\n const results: Array<{ node: SchemaNode; path: string }> = []\n\n traverseSchema(schema, (node: SchemaNode, path: string) => {\n if (predicate(node)) {\n results.push({ node, path })\n }\n })\n\n return results\n}\n\n/**\n * 在 Schema 中查找第一个匹配的节点\n * \n * @param schema Schema 根节点\n * @param predicate 判断条件\n * @returns 匹配的节点和路径,如果未找到返回 null\n */\nexport function findNode(\n schema: SchemaNode,\n predicate: (node: SchemaNode) => boolean\n): { node: SchemaNode; path: string } | null {\n let result: { node: SchemaNode; path: string } | null = null\n\n traverseSchema(schema, (node: SchemaNode, path: string) => {\n if (predicate(node)) {\n result = { node, path }\n return false // 停止遍历\n }\n return undefined // 继续遍历\n })\n\n return result\n}\n\n/**\n * 通过 ID 查找节点路径\n * \n * @param schema Schema 根节点\n * @param id 节点 ID\n * @returns 节点路径,如果未找到返回 null\n */\nexport function findPathById(schema: SchemaNode, id: string): string | null {\n const result = findNode(schema, (node) => (node as any).id === id)\n return result?.path || null\n}\n","/**\n * Schema 查询引擎 - 框架无关的查询 API\n */\n\nimport type { SchemaNode } from '@variojs/types'\nimport { getPathValue } from '../runtime/path.js'\nimport type { SchemaIndex } from './analyzer.js'\n\n/**\n * 查询引擎配置\n */\nexport interface QueryEngineOptions {\n /** Schema 根节点 */\n schema: SchemaNode\n /** 索引(可选,用于加速 ID 查询) */\n index?: SchemaIndex\n}\n\n/**\n * 节点查询结果\n */\nexport interface NodeResult {\n /** 节点对象 */\n node: SchemaNode\n /** 节点路径 */\n path: string\n}\n\n/**\n * 创建查询引擎\n * \n * 提供高性能的 Schema 查询能力\n */\nexport function createQueryEngine(options: QueryEngineOptions) {\n const { schema, index } = options\n\n /**\n * 通过 ID 查找节点\n */\n const findById = (id: string): NodeResult | null => {\n // 如果有索引,使用索引查找(O(1))\n if (index?.idMap) {\n const path = index.idMap.get(id)\n if (!path) return null\n\n // 如果有 pathMap,直接返回\n if (index.pathMap) {\n const node = index.pathMap.get(path)\n return node ? { node, path } : null\n }\n\n // 否则通过路径获取节点\n const node = getPathValue(schema, path) as SchemaNode\n return node ? { node, path } : null\n }\n\n // 没有索引,需要遍历查找(回退方案)\n return null\n }\n\n /**\n * 获取节点的父节点\n */\n const getParent = (path: string): NodeResult | null => {\n if (!path) {\n return null // Root has no parent\n }\n\n // 如果路径不包含 . (顶层节点),返回根节点\n if (!path.includes('.')) {\n return null // Invalid path for top-level\n }\n\n let currentPath = path\n \n while (true) {\n const lastDot = currentPath.lastIndexOf('.')\n if (lastDot === -1) {\n // 已经到达根级别,返回根节点\n return { node: schema, path: '' }\n }\n \n currentPath = currentPath.substring(0, lastDot)\n \n const lastSegment = currentPath.split('.').pop()\n \n // 跳过容器属性 (根据 Vario Schema 主要是 children)\n if (lastSegment && ['children', 'definitions', 'items'].includes(lastSegment)) {\n continue\n }\n \n const node = getPathValue(schema, currentPath) as any\n \n // 跳过数组容器和字符串\n if (Array.isArray(node) || typeof node === 'string') {\n continue\n }\n \n if (node && typeof node === 'object') {\n return { node, path: currentPath }\n }\n }\n }\n\n return {\n findById,\n getParent\n }\n}\n"]}
|