@codehz/json-expr 0.4.0 → 0.5.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["getVariablePlaceholder"],"sources":["../src/parser.ts","../src/proxy-metadata.ts","../src/proxy-variable.ts","../src/variable.ts","../src/compile.ts","../src/evaluate.ts","../src/expr.ts","../src/template.ts"],"sourcesContent":["/**\n * JavaScript 表达式解析器\n * 将表达式字符串解析为 AST,支持常见的运算符和语法\n */\n\n// AST 节点类型\nexport type ASTNode =\n | NumberLiteral\n | StringLiteral\n | BooleanLiteral\n | NullLiteral\n | Identifier\n | BinaryExpr\n | UnaryExpr\n | ConditionalExpr\n | MemberExpr\n | CallExpr\n | ArrayExpr\n | ObjectExpr;\n\nexport interface NumberLiteral {\n type: \"NumberLiteral\";\n value: number;\n raw: string;\n}\n\nexport interface StringLiteral {\n type: \"StringLiteral\";\n value: string;\n quote: \"'\" | '\"' | \"`\";\n}\n\nexport interface BooleanLiteral {\n type: \"BooleanLiteral\";\n value: boolean;\n}\n\nexport interface NullLiteral {\n type: \"NullLiteral\";\n}\n\nexport interface Identifier {\n type: \"Identifier\";\n name: string;\n}\n\nexport interface BinaryExpr {\n type: \"BinaryExpr\";\n operator: string;\n left: ASTNode;\n right: ASTNode;\n}\n\nexport interface UnaryExpr {\n type: \"UnaryExpr\";\n operator: string;\n argument: ASTNode;\n prefix: boolean;\n}\n\nexport interface ConditionalExpr {\n type: \"ConditionalExpr\";\n test: ASTNode;\n consequent: ASTNode;\n alternate: ASTNode;\n}\n\nexport interface MemberExpr {\n type: \"MemberExpr\";\n object: ASTNode;\n property: ASTNode;\n computed: boolean;\n optional: boolean;\n}\n\nexport interface CallExpr {\n type: \"CallExpr\";\n callee: ASTNode;\n arguments: ASTNode[];\n optional: boolean;\n}\n\nexport interface ArrayExpr {\n type: \"ArrayExpr\";\n elements: ASTNode[];\n}\n\nexport interface ObjectExpr {\n type: \"ObjectExpr\";\n properties: ObjectProperty[];\n}\n\nexport interface ObjectProperty {\n key: ASTNode;\n value: ASTNode;\n computed: boolean;\n shorthand: boolean;\n}\n\n// 运算符优先级(从低到高)\nconst PRECEDENCE: Record<string, number> = {\n \"||\": 1,\n \"??\": 1,\n \"&&\": 2,\n \"|\": 3,\n \"^\": 4,\n \"&\": 5,\n \"==\": 6,\n \"!=\": 6,\n \"===\": 6,\n \"!==\": 6,\n \"<\": 7,\n \">\": 7,\n \"<=\": 7,\n \">=\": 7,\n in: 7,\n instanceof: 7,\n \"<<\": 8,\n \">>\": 8,\n \">>>\": 8,\n \"+\": 9,\n \"-\": 9,\n \"*\": 10,\n \"/\": 10,\n \"%\": 10,\n \"**\": 11,\n};\n\n// 右结合运算符\nconst RIGHT_ASSOCIATIVE = new Set([\"**\"]);\n\nclass Parser {\n private pos = 0;\n private source: string;\n\n constructor(source: string) {\n this.source = source;\n }\n\n parse(): ASTNode {\n this.skipWhitespace();\n const node = this.parseExpression();\n this.skipWhitespace();\n if (this.pos < this.source.length) {\n throw new Error(`Unexpected token at position ${this.pos}: ${this.source.slice(this.pos, this.pos + 10)}`);\n }\n return node;\n }\n\n private parseExpression(): ASTNode {\n return this.parseConditional();\n }\n\n private parseConditional(): ASTNode {\n let node = this.parseBinary(0);\n\n this.skipWhitespace();\n if (this.peek() === \"?\") {\n this.advance();\n this.skipWhitespace();\n const consequent = this.parseExpression();\n this.skipWhitespace();\n this.expect(\":\");\n this.skipWhitespace();\n const alternate = this.parseExpression();\n node = {\n type: \"ConditionalExpr\",\n test: node,\n consequent,\n alternate,\n };\n }\n\n return node;\n }\n\n private parseBinary(minPrec: number): ASTNode {\n let left = this.parseUnary();\n\n while (true) {\n this.skipWhitespace();\n const op = this.peekOperator();\n if (!op || PRECEDENCE[op] === undefined || PRECEDENCE[op] < minPrec) {\n break;\n }\n\n this.pos += op.length;\n this.skipWhitespace();\n\n const nextMinPrec = RIGHT_ASSOCIATIVE.has(op) ? PRECEDENCE[op] : PRECEDENCE[op] + 1;\n\n const right = this.parseBinary(nextMinPrec);\n\n left = {\n type: \"BinaryExpr\",\n operator: op,\n left,\n right,\n };\n }\n\n return left;\n }\n\n private parseUnary(): ASTNode {\n this.skipWhitespace();\n const ch = this.peek();\n\n // Single-character unary operators\n if (ch === \"!\" || ch === \"~\" || ch === \"+\" || ch === \"-\") {\n this.advance();\n this.skipWhitespace();\n return {\n type: \"UnaryExpr\",\n operator: ch,\n argument: this.parseUnary(),\n prefix: true,\n };\n }\n\n // Keyword unary operators\n for (const keyword of [\"typeof\", \"void\"] as const) {\n if (this.matchKeyword(keyword)) {\n this.skipWhitespace();\n return {\n type: \"UnaryExpr\",\n operator: keyword,\n argument: this.parseUnary(),\n prefix: true,\n };\n }\n }\n\n return this.parsePostfix();\n }\n\n private parsePostfix(): ASTNode {\n let node = this.parsePrimary();\n\n while (true) {\n this.skipWhitespace();\n const ch = this.peek();\n\n if (ch === \".\") {\n this.advance();\n this.skipWhitespace();\n const property = this.parseIdentifier();\n node = {\n type: \"MemberExpr\",\n object: node,\n property,\n computed: false,\n optional: false,\n };\n } else if (ch === \"[\") {\n this.advance();\n this.skipWhitespace();\n const property = this.parseExpression();\n this.skipWhitespace();\n this.expect(\"]\");\n node = {\n type: \"MemberExpr\",\n object: node,\n property,\n computed: true,\n optional: false,\n };\n } else if (ch === \"(\") {\n this.advance();\n const args = this.parseArguments();\n this.expect(\")\");\n node = {\n type: \"CallExpr\",\n callee: node,\n arguments: args,\n optional: false,\n };\n } else if (ch === \"?\" && this.peekAt(1) === \".\") {\n this.advance();\n this.advance();\n this.skipWhitespace();\n if (this.peek() === \"[\") {\n this.advance();\n this.skipWhitespace();\n const property = this.parseExpression();\n this.skipWhitespace();\n this.expect(\"]\");\n node = {\n type: \"MemberExpr\",\n object: node,\n property,\n computed: true,\n optional: true,\n };\n } else if (this.peek() === \"(\") {\n this.advance();\n const args = this.parseArguments();\n this.expect(\")\");\n node = {\n type: \"CallExpr\",\n callee: node,\n arguments: args,\n optional: true,\n };\n } else {\n const property = this.parseIdentifier();\n node = {\n type: \"MemberExpr\",\n object: node,\n property,\n computed: false,\n optional: true,\n };\n }\n } else {\n break;\n }\n }\n\n return node;\n }\n\n private parsePrimary(): ASTNode {\n this.skipWhitespace();\n const ch = this.peek();\n\n // 数字\n if (this.isDigit(ch) || (ch === \".\" && this.isDigit(this.peekAt(1)))) {\n return this.parseNumber();\n }\n\n // 字符串\n if (ch === '\"' || ch === \"'\" || ch === \"`\") {\n return this.parseString();\n }\n\n // 数组\n if (ch === \"[\") {\n return this.parseArray();\n }\n\n // 对象\n if (ch === \"{\") {\n return this.parseObject();\n }\n\n // 括号表达式\n if (ch === \"(\") {\n this.advance();\n this.skipWhitespace();\n const expr = this.parseExpression();\n this.skipWhitespace();\n this.expect(\")\");\n return expr;\n }\n\n // 关键字字面量\n if (this.matchKeyword(\"true\")) {\n return { type: \"BooleanLiteral\", value: true };\n }\n if (this.matchKeyword(\"false\")) {\n return { type: \"BooleanLiteral\", value: false };\n }\n if (this.matchKeyword(\"null\")) {\n return { type: \"NullLiteral\" };\n }\n if (this.matchKeyword(\"undefined\")) {\n return { type: \"Identifier\", name: \"undefined\" };\n }\n\n // 标识符\n if (this.isIdentifierStart(ch)) {\n return this.parseIdentifier();\n }\n\n throw new Error(`Unexpected character at position ${this.pos}: ${ch}`);\n }\n\n private parseNumber(): NumberLiteral {\n const start = this.pos;\n\n // 处理十六进制、八进制、二进制\n if (this.peek() === \"0\") {\n const next = this.peekAt(1)?.toLowerCase();\n if (next === \"x\" || next === \"o\" || next === \"b\") {\n this.advance();\n this.advance();\n while (this.isHexDigit(this.peek())) {\n this.advance();\n }\n const raw = this.source.slice(start, this.pos);\n return {\n type: \"NumberLiteral\",\n value: Number(raw),\n raw,\n };\n }\n }\n\n // 整数部分\n while (this.isDigit(this.peek())) {\n this.advance();\n }\n\n // 小数部分\n if (this.peek() === \".\" && this.isDigit(this.peekAt(1))) {\n this.advance();\n while (this.isDigit(this.peek())) {\n this.advance();\n }\n }\n\n // 指数部分\n if (this.peek()?.toLowerCase() === \"e\") {\n this.advance();\n if (this.peek() === \"+\" || this.peek() === \"-\") {\n this.advance();\n }\n while (this.isDigit(this.peek())) {\n this.advance();\n }\n }\n\n const raw = this.source.slice(start, this.pos);\n return {\n type: \"NumberLiteral\",\n value: Number(raw),\n raw,\n };\n }\n\n private static readonly ESCAPE_CHARS: Record<string, string> = {\n n: \"\\n\",\n r: \"\\r\",\n t: \"\\t\",\n \"\\\\\": \"\\\\\",\n \"'\": \"'\",\n '\"': '\"',\n \"`\": \"`\",\n };\n\n private parseString(): StringLiteral {\n const quote = this.peek() as \"'\" | '\"' | \"`\";\n this.advance();\n\n let value = \"\";\n while (this.pos < this.source.length && this.peek() !== quote) {\n if (this.peek() === \"\\\\\") {\n this.advance();\n const escaped = this.peek();\n value += Parser.ESCAPE_CHARS[escaped] ?? escaped;\n this.advance();\n } else {\n value += this.peek();\n this.advance();\n }\n }\n\n this.expect(quote);\n return { type: \"StringLiteral\", value, quote };\n }\n\n private parseArray(): ArrayExpr {\n this.expect(\"[\");\n const elements: ASTNode[] = [];\n\n this.skipWhitespace();\n while (this.peek() !== \"]\") {\n elements.push(this.parseExpression());\n this.skipWhitespace();\n if (this.peek() === \",\") {\n this.advance();\n this.skipWhitespace();\n } else {\n break;\n }\n }\n\n this.expect(\"]\");\n return { type: \"ArrayExpr\", elements };\n }\n\n private parseObject(): ObjectExpr {\n this.expect(\"{\");\n const properties: ObjectProperty[] = [];\n\n this.skipWhitespace();\n while (this.peek() !== \"}\") {\n const prop = this.parseObjectProperty();\n properties.push(prop);\n this.skipWhitespace();\n if (this.peek() === \",\") {\n this.advance();\n this.skipWhitespace();\n } else {\n break;\n }\n }\n\n this.expect(\"}\");\n return { type: \"ObjectExpr\", properties };\n }\n\n private parseObjectProperty(): ObjectProperty {\n this.skipWhitespace();\n let key: ASTNode;\n let computed = false;\n\n if (this.peek() === \"[\") {\n this.advance();\n this.skipWhitespace();\n key = this.parseExpression();\n this.skipWhitespace();\n this.expect(\"]\");\n computed = true;\n } else if (this.peek() === '\"' || this.peek() === \"'\") {\n key = this.parseString();\n } else {\n key = this.parseIdentifier();\n }\n\n this.skipWhitespace();\n if (this.peek() === \":\") {\n this.advance();\n this.skipWhitespace();\n const value = this.parseExpression();\n return { key, value, computed, shorthand: false };\n }\n\n // Shorthand property\n if (key.type !== \"Identifier\") {\n throw new Error(\"Shorthand property must be an identifier\");\n }\n return { key, value: key, computed: false, shorthand: true };\n }\n\n private parseIdentifier(): Identifier {\n const start = this.pos;\n while (this.isIdentifierPart(this.peek())) {\n this.advance();\n }\n const name = this.source.slice(start, this.pos);\n if (!name) {\n throw new Error(`Expected identifier at position ${this.pos}`);\n }\n return { type: \"Identifier\", name };\n }\n\n private parseArguments(): ASTNode[] {\n const args: ASTNode[] = [];\n this.skipWhitespace();\n while (this.peek() !== \")\") {\n args.push(this.parseExpression());\n this.skipWhitespace();\n if (this.peek() === \",\") {\n this.advance();\n this.skipWhitespace();\n } else {\n break;\n }\n }\n return args;\n }\n\n // Operators sorted by length (longest first) to ensure correct matching\n private static readonly OPERATORS = [\n // 10 chars\n \"instanceof\",\n // 3 chars\n \">>>\",\n \"===\",\n \"!==\",\n // 2 chars\n \"&&\",\n \"||\",\n \"??\",\n \"==\",\n \"!=\",\n \"<=\",\n \">=\",\n \"<<\",\n \">>\",\n \"**\",\n \"in\",\n // 1 char\n \"+\",\n \"-\",\n \"*\",\n \"/\",\n \"%\",\n \"<\",\n \">\",\n \"&\",\n \"|\",\n \"^\",\n ];\n\n private static readonly KEYWORD_OPERATORS = new Set([\"in\", \"instanceof\"]);\n\n private peekOperator(): string | null {\n for (const op of Parser.OPERATORS) {\n if (!this.source.startsWith(op, this.pos)) continue;\n\n // Keyword operators must not be followed by identifier characters\n if (Parser.KEYWORD_OPERATORS.has(op)) {\n const nextChar = this.source[this.pos + op.length];\n if (nextChar && this.isIdentifierPart(nextChar)) continue;\n }\n\n return op;\n }\n return null;\n }\n\n private matchKeyword(keyword: string): boolean {\n if (this.source.startsWith(keyword, this.pos)) {\n const nextChar = this.source[this.pos + keyword.length];\n if (!nextChar || !this.isIdentifierPart(nextChar)) {\n this.pos += keyword.length;\n return true;\n }\n }\n return false;\n }\n\n private peek(): string {\n return this.source[this.pos] || \"\";\n }\n\n private peekAt(offset: number): string {\n return this.source[this.pos + offset] || \"\";\n }\n\n private advance(): string {\n return this.source[this.pos++] || \"\";\n }\n\n private expect(ch: string): void {\n if (this.peek() !== ch) {\n throw new Error(`Expected '${ch}' at position ${this.pos}, got '${this.peek()}'`);\n }\n this.advance();\n }\n\n private skipWhitespace(): void {\n while (/\\s/.test(this.peek())) {\n this.advance();\n }\n }\n\n private isDigit(ch: string): boolean {\n const code = ch.charCodeAt(0);\n return code >= 48 && code <= 57; // 0-9\n }\n\n private isHexDigit(ch: string): boolean {\n const code = ch.charCodeAt(0);\n return (code >= 48 && code <= 57) || (code >= 65 && code <= 70) || (code >= 97 && code <= 102);\n }\n\n private isIdentifierStart(ch: string): boolean {\n const code = ch.charCodeAt(0);\n return (code >= 65 && code <= 90) || (code >= 97 && code <= 122) || code === 95 || code === 36;\n }\n\n private isIdentifierPart(ch: string): boolean {\n const code = ch.charCodeAt(0);\n return (\n (code >= 65 && code <= 90) ||\n (code >= 97 && code <= 122) ||\n (code >= 48 && code <= 57) ||\n code === 95 ||\n code === 36\n );\n }\n}\n\n/**\n * 解析 JavaScript 表达式为 AST\n */\nexport function parse(source: string): ASTNode {\n return new Parser(source).parse();\n}\n\n/**\n * 从 AST 生成规范化的代码\n */\nexport function generate(node: ASTNode): string {\n switch (node.type) {\n case \"NumberLiteral\":\n return node.raw;\n\n case \"StringLiteral\":\n // 使用双引号,转义必要的字符\n return JSON.stringify(node.value);\n\n case \"BooleanLiteral\":\n return node.value ? \"true\" : \"false\";\n\n case \"NullLiteral\":\n return \"null\";\n\n case \"Identifier\":\n return node.name;\n\n case \"BinaryExpr\": {\n const left = wrapIfNeeded(node.left, node, \"left\");\n const right = wrapIfNeeded(node.right, node, \"right\");\n // 关键字运算符需要空格\n if (node.operator === \"in\" || node.operator === \"instanceof\") {\n return `${left} ${node.operator} ${right}`;\n }\n return `${left}${node.operator}${right}`;\n }\n\n case \"UnaryExpr\":\n if (node.prefix) {\n const arg = wrapIfNeeded(node.argument, node, \"argument\");\n // 对于关键字运算符(typeof, void)需要空格\n if (node.operator === \"typeof\" || node.operator === \"void\") {\n return `${node.operator} ${arg}`;\n }\n return `${node.operator}${arg}`;\n }\n return generate(node.argument) + node.operator;\n\n case \"ConditionalExpr\": {\n const test = generate(node.test);\n const consequent = generate(node.consequent);\n const alternate = generate(node.alternate);\n return `${test}?${consequent}:${alternate}`;\n }\n\n case \"MemberExpr\": {\n const object = wrapIfNeeded(node.object, node, \"object\");\n if (node.computed) {\n const property = generate(node.property);\n return node.optional ? `${object}?.[${property}]` : `${object}[${property}]`;\n }\n const property = generate(node.property);\n return node.optional ? `${object}?.${property}` : `${object}.${property}`;\n }\n\n case \"CallExpr\": {\n const callee = wrapIfNeeded(node.callee, node, \"callee\");\n const args = node.arguments.map(generate).join(\",\");\n return node.optional ? `${callee}?.(${args})` : `${callee}(${args})`;\n }\n\n case \"ArrayExpr\":\n return `[${node.elements.map(generate).join(\",\")}]`;\n\n case \"ObjectExpr\": {\n const props = node.properties.map((prop) => {\n if (prop.shorthand) {\n return generate(prop.key);\n }\n const key = prop.computed ? `[${generate(prop.key)}]` : generate(prop.key);\n return `${key}:${generate(prop.value)}`;\n });\n return `{${props.join(\",\")}}`;\n }\n\n default: {\n const unknownNode = node as { type?: string };\n const nodeType = unknownNode.type ?? \"unknown\";\n throw new Error(`Unknown node type: ${nodeType}`);\n }\n }\n}\n\n/**\n * 判断是否需要括号包裹,并生成代码\n */\nfunction wrapIfNeeded(\n child: ASTNode,\n parent: ASTNode,\n position: \"left\" | \"right\" | \"argument\" | \"object\" | \"callee\"\n): string {\n const code = generate(child);\n\n if (needsParens(child, parent, position)) {\n return `(${code})`;\n }\n return code;\n}\n\n/**\n * 判断子节点是否需要括号\n */\nfunction needsParens(child: ASTNode, parent: ASTNode, position: string): boolean {\n // 条件表达式在二元表达式中需要括号\n if (child.type === \"ConditionalExpr\" && parent.type === \"BinaryExpr\") {\n return true;\n }\n\n // 二元表达式嵌套时根据优先级判断\n if (child.type === \"BinaryExpr\" && parent.type === \"BinaryExpr\") {\n const childPrec = PRECEDENCE[child.operator] || 0;\n const parentPrec = PRECEDENCE[parent.operator] || 0;\n\n if (childPrec < parentPrec) {\n return true;\n }\n\n // 相同优先级时,右侧需要括号(除了右结合运算符)\n if (childPrec === parentPrec && position === \"right\") {\n if (!RIGHT_ASSOCIATIVE.has(parent.operator)) {\n return true;\n }\n }\n }\n\n // 二元表达式或条件表达式作为一元表达式的参数时需要括号\n if (\n (child.type === \"BinaryExpr\" || child.type === \"ConditionalExpr\") &&\n parent.type === \"UnaryExpr\" &&\n position === \"argument\"\n ) {\n return true;\n }\n\n // 一元表达式作为二元表达式的操作数时需要括号(为了保持原有的语义清晰)\n if (child.type === \"UnaryExpr\" && parent.type === \"BinaryExpr\") {\n // ** 运算符左侧不能有一元表达式\n if (parent.operator === \"**\" && position === \"left\") {\n return true;\n }\n // 逻辑运算符、位运算符等需要明确一元表达式的边界\n return true;\n }\n\n return false;\n}\n\n/**\n * 转换 AST 中的标识符\n */\nexport function transformIdentifiers(node: ASTNode, transform: (name: string) => string): ASTNode {\n switch (node.type) {\n case \"Identifier\":\n return { ...node, name: transform(node.name) };\n\n case \"BinaryExpr\":\n return {\n ...node,\n left: transformIdentifiers(node.left, transform),\n right: transformIdentifiers(node.right, transform),\n };\n\n case \"UnaryExpr\":\n return {\n ...node,\n argument: transformIdentifiers(node.argument, transform),\n };\n\n case \"ConditionalExpr\":\n return {\n ...node,\n test: transformIdentifiers(node.test, transform),\n consequent: transformIdentifiers(node.consequent, transform),\n alternate: transformIdentifiers(node.alternate, transform),\n };\n\n case \"MemberExpr\":\n return {\n ...node,\n object: transformIdentifiers(node.object, transform),\n // 只有 computed 属性需要转换\n property: node.computed ? transformIdentifiers(node.property, transform) : node.property,\n };\n\n case \"CallExpr\":\n return {\n ...node,\n callee: transformIdentifiers(node.callee, transform),\n arguments: node.arguments.map((arg) => transformIdentifiers(arg, transform)),\n };\n\n case \"ArrayExpr\":\n return {\n ...node,\n elements: node.elements.map((el) => transformIdentifiers(el, transform)),\n };\n\n case \"ObjectExpr\":\n return {\n ...node,\n properties: node.properties.map((prop) => ({\n ...prop,\n key: prop.computed ? transformIdentifiers(prop.key, transform) : prop.key,\n value: transformIdentifiers(prop.value, transform),\n })),\n };\n\n default:\n return node;\n }\n}\n\n/**\n * 收集 AST 中所有使用的标识符名称\n */\nexport function collectIdentifiers(node: ASTNode): Set<string> {\n const identifiers = new Set<string>();\n\n function visit(n: ASTNode): void {\n switch (n.type) {\n case \"Identifier\":\n identifiers.add(n.name);\n break;\n\n case \"BinaryExpr\":\n visit(n.left);\n visit(n.right);\n break;\n\n case \"UnaryExpr\":\n visit(n.argument);\n break;\n\n case \"ConditionalExpr\":\n visit(n.test);\n visit(n.consequent);\n visit(n.alternate);\n break;\n\n case \"MemberExpr\":\n visit(n.object);\n if (n.computed) {\n visit(n.property);\n }\n break;\n\n case \"CallExpr\":\n visit(n.callee);\n n.arguments.forEach(visit);\n break;\n\n case \"ArrayExpr\":\n n.elements.forEach(visit);\n break;\n\n case \"ObjectExpr\":\n n.properties.forEach((prop) => {\n if (prop.computed) {\n visit(prop.key);\n }\n visit(prop.value);\n });\n break;\n }\n }\n\n visit(node);\n return identifiers;\n}\n","// proxy-metadata.ts\n\n/**\n * Proxy 元数据接口\n */\nexport interface ProxyMetadata {\n type: \"variable\" | \"expression\";\n path: string[]; // 表达式路径,如 [\"ui\", \"Text\"]\n source?: string; // 完整表达式源码(expression 类型)\n rootVariable?: symbol; // 根 variable 的唯一标识\n dependencies?: Set<symbol>; // 依赖的所有 variable Symbol\n}\n\n/**\n * 全局 WeakMap 存储\n */\nconst proxyMetadata = new WeakMap<object, ProxyMetadata>();\n\n/**\n * 设置 Proxy 元数据\n */\nexport function setProxyMetadata(proxy: object, metadata: ProxyMetadata): void {\n proxyMetadata.set(proxy, metadata);\n}\n\n/**\n * 获取 Proxy 元数据\n */\nexport function getProxyMetadata(proxy: object): ProxyMetadata | undefined {\n return proxyMetadata.get(proxy);\n}\n\n/**\n * 检查对象是否是 Proxy variable\n */\nexport function isProxyVariable(obj: unknown): obj is object {\n if ((typeof obj !== \"object\" && typeof obj !== \"function\") || obj === null) return false;\n const meta = proxyMetadata.get(obj);\n return meta?.type === \"variable\";\n}\n\n/**\n * 检查对象是否是 Proxy expression\n */\nexport function isProxyExpression(obj: unknown): obj is object {\n if ((typeof obj !== \"object\" && typeof obj !== \"function\") || obj === null) return false;\n const meta = proxyMetadata.get(obj);\n return meta?.type === \"expression\";\n}\n\n/**\n * 检查对象是否是任意 Proxy (variable 或 expression)\n */\nexport function isProxy(obj: unknown): obj is object {\n if ((typeof obj !== \"object\" && typeof obj !== \"function\") || obj === null) return false;\n return proxyMetadata.has(obj);\n}\n","// proxy-variable.ts\nimport { getProxyMetadata, setProxyMetadata } from \"./proxy-metadata\";\nimport type { Proxify } from \"./types\";\n\n/**\n * 使用 Symbol.description 生成占位符\n * 用于在表达式源码中标识变量\n */\nfunction getVariablePlaceholder(id: symbol): string {\n return `$$VAR_${id.description}$$`;\n}\n\n/**\n * 序列化参数为表达式字符串\n * - Proxy Variable/Expression:使用源码或占位符\n * - 数组:递归处理元素\n * - 对象:递归处理属性\n * - 原始值:JSON.stringify\n */\nexport function serializeArgument(arg: unknown): string {\n // 1. 检查是否是 Proxy (通过 getProxyMetadata)\n // 注意:Proxy 包装的是函数,所以 typeof 可能是 \"function\" 或 \"object\"\n if ((typeof arg === \"object\" || typeof arg === \"function\") && arg !== null) {\n const meta = getProxyMetadata(arg);\n if (meta) {\n // 如果有 source,直接返回(已是完整表达式)\n if (meta.source) return meta.source;\n // 否则是根 variable,用占位符\n if (meta.rootVariable) return getVariablePlaceholder(meta.rootVariable);\n }\n }\n\n // 2. 数组递归处理\n if (Array.isArray(arg)) {\n return `[${arg.map(serializeArgument).join(\", \")}]`;\n }\n\n // 3. 普通对象递归处理\n if (typeof arg === \"object\" && arg !== null) {\n const entries = Object.entries(arg)\n .map(([k, v]) => {\n // 如果 key 需要引号(非有效标识符)\n const safeKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(k) ? k : JSON.stringify(k);\n return `${safeKey}: ${serializeArgument(v)}`;\n })\n .join(\", \");\n return `{${entries}}`;\n }\n\n // 4. 原始值(包括 null, undefined, number, string, boolean)\n return JSON.stringify(arg);\n}\n\n/**\n * 从参数中收集依赖的 Symbol\n * 递归遍历数组和对象,收集所有 Proxy 的依赖\n */\nexport function collectDepsFromArgs(args: unknown[], deps: Set<symbol>): void {\n for (const arg of args) {\n // 注意:Proxy 包装的是函数,所以 typeof 可能是 \"function\" 或 \"object\"\n if ((typeof arg === \"object\" || typeof arg === \"function\") && arg !== null) {\n const meta = getProxyMetadata(arg);\n if (meta?.dependencies) {\n for (const dep of meta.dependencies) {\n deps.add(dep);\n }\n } else if (Array.isArray(arg)) {\n collectDepsFromArgs(arg, deps);\n } else if (typeof arg === \"object\") {\n collectDepsFromArgs(Object.values(arg), deps);\n }\n }\n }\n}\n\n/**\n * 创建根 Variable Proxy\n * 拦截属性访问,返回新的 expression proxy\n * 不可直接调用(apply 应该只在链式调用后可用)\n *\n * @param id - 变量的唯一标识 Symbol\n * @returns Proxy 包装的 Variable\n */\nexport function createProxyVariable<T>(id: symbol): Proxify<T> {\n const deps = new Set([id]);\n\n const proxy = new Proxy(function () {} as unknown as Proxify<T>, {\n get(_target, prop) {\n if (typeof prop === \"symbol\") return undefined;\n // 属性访问:创建 expression proxy\n return createProxyExpression<unknown>(id, [String(prop)], deps);\n },\n apply() {\n throw new Error(\"Variable cannot be called directly\");\n },\n });\n\n setProxyMetadata(proxy, {\n type: \"variable\",\n path: [],\n rootVariable: id,\n dependencies: deps,\n });\n\n return proxy;\n}\n\n/**\n * 创建属性访问后的 Proxy\n * 继续拦截属性访问(链式访问)\n * 拦截 apply 进行方法调用\n *\n * @param rootId - 根变量的 Symbol\n * @param path - 属性访问路径\n * @param deps - 依赖集合\n * @returns Proxy 包装的 Expression\n */\nexport function createProxyExpression<T>(rootId: symbol, path: string[], deps: Set<symbol>): Proxify<T> {\n const source = `${getVariablePlaceholder(rootId)}.${path.join(\".\")}`;\n\n const proxy = new Proxy(function () {} as unknown as Proxify<T>, {\n get(_target, prop) {\n if (typeof prop === \"symbol\") return undefined;\n return createProxyExpression<unknown>(rootId, [...path, String(prop)], deps);\n },\n apply(_target, _thisArg, args) {\n const serializedArgs = args.map(serializeArgument).join(\", \");\n const callSource = `${source}(${serializedArgs})`;\n // 收集参数中的依赖\n const newDeps = new Set(deps);\n collectDepsFromArgs(args, newDeps);\n return createProxyExpressionWithSource<T>(callSource, newDeps);\n },\n });\n\n setProxyMetadata(proxy, {\n type: \"expression\",\n path,\n rootVariable: rootId,\n source,\n dependencies: deps,\n });\n\n return proxy;\n}\n\n/**\n * 创建带完整源码的 Proxy(方法调用后)\n * 可以继续链式访问和调用\n *\n * @param source - 完整的表达式源码\n * @param deps - 依赖集合\n * @returns Proxy 包装的 Expression\n */\nexport function createProxyExpressionWithSource<T>(source: string, deps: Set<symbol>): Proxify<T> {\n const proxy = new Proxy(function () {} as unknown as Proxify<T>, {\n get(_target, prop) {\n if (typeof prop === \"symbol\") return undefined;\n // 继续访问:source.prop\n const newSource = `(${source}).${String(prop)}`;\n return createProxyExpressionWithSource<unknown>(newSource, deps);\n },\n apply(_target, _thisArg, args) {\n const serializedArgs = args.map(serializeArgument).join(\", \");\n const callSource = `(${source})(${serializedArgs})`;\n const newDeps = new Set(deps);\n collectDepsFromArgs(args, newDeps);\n return createProxyExpressionWithSource<T>(callSource, newDeps);\n },\n });\n\n setProxyMetadata(proxy, {\n type: \"expression\",\n path: [source],\n source,\n dependencies: deps,\n });\n\n return proxy;\n}\n","import { createProxyVariable } from \"./proxy-variable\";\nimport type { Variable } from \"./types\";\n\n/**\n * 跟踪每个 variable 的唯一 Symbol ID\n */\nconst variableIds = new WeakMap<object, symbol>();\n\n/**\n * 计数器用于生成唯一变量 ID\n */\nlet variableCounter = 0;\n\n/**\n * 创建一个类型化变量\n * 返回 Proxy 对象,支持链式属性访问和方法调用\n *\n * @example\n * ```ts\n * const x = variable<number>();\n * const config = variable<{ timeout: number }>();\n * const timeout = config.timeout; // Proxy expression\n * ```\n */\nexport function variable<T>(): Variable<T> {\n const id = Symbol(`var_${variableCounter++}`);\n const proxy = createProxyVariable<T>(id);\n variableIds.set(proxy as object, id);\n return proxy;\n}\n\n/**\n * 获取 variable 的唯一 Symbol ID\n */\nexport function getVariableId(variable: unknown): symbol | undefined {\n // Proxy 包装函数,typeof 可能是 'function' 或 'object'\n if ((typeof variable !== \"object\" && typeof variable !== \"function\") || variable === null) return undefined;\n return variableIds.get(variable);\n}\n\n/**\n * 生成变量占位符字符串\n * 格式:$$VAR_var_N$$\n */\nexport function getVariablePlaceholder(id: symbol): string {\n return `$$VAR_${id.description}$$`;\n}\n\n/**\n * 从占位符提取变量 ID 描述\n * 返回 null 如果不是有效占位符\n */\nexport function parseVariablePlaceholder(placeholder: string): string | null {\n const match = placeholder.match(/^\\$\\$VAR_(.+)\\$\\$$/);\n return match ? (match[1] ?? null) : null;\n}\n","import { generate, parse, type ASTNode } from \"./parser\";\nimport { getProxyMetadata } from \"./proxy-metadata\";\nimport type { BranchNode, CompiledData, CompiledExpression, JumpNode, PhiNode, ProxyExpression } from \"./types\";\nimport { getVariableId } from \"./variable\";\n\nconst ALLOWED_GLOBALS = new Set([\n \"Math\",\n \"JSON\",\n \"Date\",\n \"RegExp\",\n \"Number\",\n \"String\",\n \"Boolean\",\n \"Array\",\n \"Object\",\n \"undefined\",\n \"NaN\",\n \"Infinity\",\n \"isNaN\",\n \"isFinite\",\n \"parseInt\",\n \"parseFloat\",\n]);\n\n/**\n * 编译选项\n */\nexport interface CompileOptions {\n /**\n * 是否启用短路求值\n * 为 &&, ||, ??, 和三元表达式生成控制流节点\n * @default true\n */\n shortCircuit?: boolean;\n}\n\n/**\n * 将占位符替换为实际变量名\n *\n * @param source - 包含占位符的表达式源码\n * @param context - 变量名到值的映射\n * @returns 替换后的源码\n */\nfunction preprocessExpression(source: string, context: Record<string, unknown>): string {\n // 建立 Symbol description -> 变量名 映射\n const descToName = new Map<string, string>();\n\n for (const [name, value] of Object.entries(context)) {\n const id = getVariableId(value);\n if (id && id.description) {\n descToName.set(id.description, name);\n }\n }\n\n // 替换 $$VAR_xxx$$ 占位符\n return source.replace(/\\$\\$VAR_([^$]+)\\$\\$/g, (match, desc: string) => {\n const name = descToName.get(desc);\n if (!name) {\n throw new Error(`Unknown variable placeholder: ${match}`);\n }\n return name;\n });\n}\n\n/**\n * 将 Proxy Expression 编译为可序列化的 JSON 结构\n *\n * @template TResult - 表达式结果类型\n * @param expression - Proxy Expression\n * @param variables - 所有使用的变量定义\n * @param options - 编译选项\n * @returns 编译后的数据结构 [变量名列表, 表达式1, 表达式2, ...]\n *\n * @throws 如果传入无效的表达式或未定义的变量引用\n *\n * @example\n * ```ts\n * const x = variable<number>()\n * const y = variable<number>()\n * const sum = expr({ x, y })(\"x + y\")\n * const result = expr({ sum, x })(\"sum * x\")\n * const compiled = compile(result, { x, y })\n * // => [[\"x\", \"y\"], \"($0+$1)*$0\"]\n * ```\n */\nexport function compile<TResult>(\n expression: ProxyExpression<TResult>,\n variables: Record<string, unknown>,\n options: CompileOptions = {}\n): CompiledData {\n const { shortCircuit = true } = options;\n\n // 获取 Proxy 的元数据\n const meta = getProxyMetadata(expression as object);\n if (!meta?.source) {\n throw new Error(\"Invalid expression: expected a Proxy Expression\");\n }\n\n // 预处理:将占位符替换为变量名\n const source = preprocessExpression(meta.source, variables);\n\n // 建立变量名到索引的映射\n const variableOrder: string[] = [];\n const variableToIndex = new Map<string, number>();\n\n for (const name of Object.keys(variables)) {\n if (!variableToIndex.has(name)) {\n variableToIndex.set(name, variableOrder.length);\n variableOrder.push(name);\n }\n }\n\n // 解析表达式为 AST\n const ast = parse(source);\n\n // 转换 AST:将变量引用替换为 $N\n const undefinedVars: string[] = [];\n const transformed = transformIdentifiers(ast, (name) => {\n const index = variableToIndex.get(name);\n if (index !== undefined) {\n return { type: \"Identifier\", name: `$${index}` } as ASTNode;\n }\n // 检查是否为允许的全局对象\n if (!ALLOWED_GLOBALS.has(name)) {\n undefinedVars.push(name);\n }\n return null;\n });\n\n if (undefinedVars.length > 0) {\n throw new Error(`Undefined variable(s): ${[...new Set(undefinedVars)].join(\", \")}`);\n }\n\n // 生成编译后的表达式\n const expressions: CompiledExpression[] = [];\n\n if (shortCircuit) {\n // 短路求值模式:生成控制流节点\n let nextIndex = variableOrder.length;\n\n function compileAst(node: ASTNode): number {\n // 检查是否需要短路处理\n if (node.type === \"BinaryExpr\" && (node.operator === \"||\" || node.operator === \"&&\" || node.operator === \"??\")) {\n return compileShortCircuit(node);\n }\n\n if (node.type === \"ConditionalExpr\") {\n return compileConditional(node);\n }\n\n // 普通表达式:直接生成\n const exprStr = generate(node);\n const idx = nextIndex++;\n expressions.push(exprStr);\n return idx;\n }\n\n function compileShortCircuit(node: ASTNode & { type: \"BinaryExpr\" }): number {\n // 递归编译左操作数\n const leftIdx = compileAst(node.left);\n\n // 生成跳转条件\n let branchCondition: string;\n switch (node.operator) {\n case \"||\":\n branchCondition = `$${leftIdx}`;\n break;\n case \"&&\":\n branchCondition = `!$${leftIdx}`;\n break;\n default:\n branchCondition = `$${leftIdx}!=null`;\n }\n\n const branchIdx = expressions.length;\n expressions.push([\"br\", branchCondition, 0] as BranchNode);\n nextIndex++;\n\n compileAst(node.right);\n\n const skipCount = expressions.length - branchIdx - 1;\n (expressions[branchIdx] as BranchNode)[2] = skipCount;\n\n const phiIdx = nextIndex++;\n expressions.push([\"phi\"] as PhiNode);\n\n return phiIdx;\n }\n\n function compileConditional(node: ASTNode & { type: \"ConditionalExpr\" }): number {\n const testIdx = compileAst(node.test);\n\n const branchIdx = expressions.length;\n expressions.push([\"br\", `$${testIdx}`, 0] as BranchNode);\n nextIndex++;\n\n compileAst(node.alternate);\n\n const jmpIdx = expressions.length;\n expressions.push([\"jmp\", 0] as JumpNode);\n nextIndex++;\n\n compileAst(node.consequent);\n const thenEndIdx = expressions.length;\n\n (expressions[branchIdx] as BranchNode)[2] = jmpIdx - branchIdx;\n (expressions[jmpIdx] as JumpNode)[1] = thenEndIdx - jmpIdx - 1;\n\n const phiIdx = nextIndex++;\n expressions.push([\"phi\"] as PhiNode);\n\n return phiIdx;\n }\n\n compileAst(transformed);\n } else {\n // 原始模式:直接生成表达式字符串\n expressions.push(generate(transformed));\n }\n\n return [variableOrder, ...expressions];\n}\n\n/**\n * 将 AST 中的标识符替换为对应的 AST 节点\n *\n * @param node - 要转换的 AST 节点\n * @param getReplacementAst - 根据标识符名称返回替换的 AST 节点,返回 null 表示不替换\n * @returns 转换后的 AST 节点\n */\nfunction transformIdentifiers(node: ASTNode, getReplacementAst: (name: string) => ASTNode | null): ASTNode {\n switch (node.type) {\n case \"Identifier\": {\n const replacement = getReplacementAst(node.name);\n return replacement ?? node;\n }\n\n case \"BinaryExpr\":\n return {\n ...node,\n left: transformIdentifiers(node.left, getReplacementAst),\n right: transformIdentifiers(node.right, getReplacementAst),\n };\n\n case \"UnaryExpr\":\n return {\n ...node,\n argument: transformIdentifiers(node.argument, getReplacementAst),\n };\n\n case \"ConditionalExpr\":\n return {\n ...node,\n test: transformIdentifiers(node.test, getReplacementAst),\n consequent: transformIdentifiers(node.consequent, getReplacementAst),\n alternate: transformIdentifiers(node.alternate, getReplacementAst),\n };\n\n case \"MemberExpr\":\n return {\n ...node,\n object: transformIdentifiers(node.object, getReplacementAst),\n property: node.computed ? transformIdentifiers(node.property, getReplacementAst) : node.property,\n };\n\n case \"CallExpr\":\n return {\n ...node,\n callee: transformIdentifiers(node.callee, getReplacementAst),\n arguments: node.arguments.map((arg) => transformIdentifiers(arg, getReplacementAst)),\n };\n\n case \"ArrayExpr\":\n return {\n ...node,\n elements: node.elements.map((el) => transformIdentifiers(el, getReplacementAst)),\n };\n\n case \"ObjectExpr\":\n return {\n ...node,\n properties: node.properties.map((prop) => ({\n ...prop,\n key: prop.computed ? transformIdentifiers(prop.key, getReplacementAst) : prop.key,\n value: transformIdentifiers(prop.value, getReplacementAst),\n })),\n };\n\n default:\n return node;\n }\n}\n","import type { CompiledData, CompiledExpression } from \"./types\";\n\n/**\n * 缓存已构造的求值函数,以提升重复执行性能\n */\nconst evaluatorCache = new Map<string, (values: unknown[]) => unknown>();\n\n/**\n * 检测编译数据是否包含控制流节点(V2 格式)\n */\nfunction isV2Format(expressions: CompiledExpression[]): boolean {\n return expressions.some((expr) => Array.isArray(expr));\n}\n\n/**\n * 执行编译后的表达式\n *\n * @template TResult - 表达式结果类型\n * @param data - 编译后的数据结构 [变量名列表, 表达式1, 表达式2, ...]\n * @param values - 变量值映射,按变量名提供值\n * @returns 最后一个表达式的求值结果\n *\n * @throws 如果运行时类型验证失败或表达式执行出错\n *\n * @example\n * ```ts\n * const compiled = [[\"x\", \"y\"], \"$0+$1\", \"$1*2\"]\n * const result = evaluate<number>(compiled, { x: 2, y: 3 })\n * // => 6 (3 * 2)\n * ```\n */\nexport function evaluate<TResult>(data: CompiledData, values: Record<string, unknown>): TResult {\n if (data.length < 1) {\n throw new Error(\"Invalid compiled data: must have at least variable names\");\n }\n\n const [variableNames, ...expressions] = data;\n\n if (!Array.isArray(variableNames)) {\n throw new Error(\"Invalid compiled data: first element must be variable names array\");\n }\n\n // 验证所有必需的变量都已提供\n for (const varName of variableNames) {\n if (typeof varName !== \"string\") {\n throw new Error(\"Invalid compiled data: variable names must be strings\");\n }\n if (!(varName in values)) {\n throw new Error(`Missing required variable: ${varName}`);\n }\n }\n\n // 创建值数组,按变量名顺序填入传入的值\n const valueArray: unknown[] = [];\n for (const varName of variableNames) {\n valueArray.push(values[varName]);\n }\n\n // 获取或构造求值函数\n const cacheKey = JSON.stringify(data);\n let evaluator = evaluatorCache.get(cacheKey);\n\n if (!evaluator) {\n // 根据格式选择合适的函数体构造器\n const functionBody = isV2Format(expressions)\n ? buildEvaluatorFunctionBodyV2(expressions, variableNames.length)\n : buildEvaluatorFunctionBody(expressions as string[], variableNames.length);\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n evaluator = new Function(\"$values\", functionBody) as (values: unknown[]) => unknown;\n evaluatorCache.set(cacheKey, evaluator);\n }\n\n // 执行求值函数\n try {\n const result = evaluator(valueArray);\n return result as TResult;\n } catch (error) {\n throw new Error(`Failed to evaluate expression: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * 构造求值函数体\n *\n * @param expressions - 表达式列表\n * @param variableCount - 变量数量\n * @returns 函数体字符串\n *\n * @example\n * ```ts\n * buildEvaluatorFunctionBody([\"$0+$1\", \"$2*2\"], 2)\n * // 返回执行 $0+$1 并存储到 $values[2],然后执行 $2*2 的函数体\n * ```\n */\nfunction buildEvaluatorFunctionBody(expressions: string[], variableCount: number): string {\n if (expressions.length === 0) {\n throw new Error(\"No expressions to evaluate\");\n }\n\n const lines: string[] = [];\n\n // 为了使 $0, $1 等能在函数体中访问,我们需要创建局部变量\n // 或者使用代理访问值数组\n for (let i = 0; i < variableCount; i++) {\n lines.push(`const $${i} = $values[${i}];`);\n }\n\n // 依次对每个表达式求值,结果追加到值数组\n for (let i = 0; i < expressions.length; i++) {\n const exprSource = expressions[i];\n const resultIndex = variableCount + i;\n\n lines.push(`const $${resultIndex} = ${exprSource};`);\n lines.push(`$values[${resultIndex}] = $${resultIndex};`);\n }\n\n // 返回最后一个表达式的结果(即最后一个元素)\n lines.push(`return $values[$values.length - 1];`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * 构造带控制流支持的求值函数体(V2 格式)\n *\n * @param expressions - 表达式列表(可包含控制流节点)\n * @param variableCount - 变量数量\n * @returns 函数体字符串\n */\nfunction buildEvaluatorFunctionBodyV2(expressions: CompiledExpression[], variableCount: number): string {\n if (expressions.length === 0) {\n throw new Error(\"No expressions to evaluate\");\n }\n\n const lines: string[] = [];\n\n // 初始化变量\n for (let i = 0; i < variableCount; i++) {\n lines.push(`const $${i} = $values[${i}];`);\n }\n\n // 程序计数器和最近值寄存器\n lines.push(`let $pc = 0;`);\n lines.push(`let $lastValue;`);\n\n // 预先声明所有中间变量\n for (let i = 0; i < expressions.length; i++) {\n lines.push(`let $${variableCount + i};`);\n }\n\n lines.push(`while ($pc < ${expressions.length}) {`);\n lines.push(` switch ($pc) {`);\n\n for (let i = 0; i < expressions.length; i++) {\n const expr = expressions[i]!;\n const idx = variableCount + i;\n\n lines.push(` case ${i}: {`);\n\n if (typeof expr === \"string\") {\n // 普通表达式:求值并存储\n lines.push(` $${idx} = ${expr};`);\n lines.push(` $values[${idx}] = $${idx};`);\n lines.push(` $lastValue = $${idx};`);\n lines.push(` $pc++; break;`);\n } else if (expr[0] === \"br\") {\n // 条件跳转:条件为任意表达式\n const [, condExpr, offset] = expr;\n lines.push(` if (${condExpr}) { $pc += ${offset + 1}; } else { $pc++; }`);\n lines.push(` break;`);\n } else if (expr[0] === \"jmp\") {\n // 无条件跳转\n const [, offset] = expr;\n lines.push(` $pc += ${offset + 1}; break;`);\n } else if (expr[0] === \"phi\") {\n // phi 节点:取最近值\n lines.push(` $${idx} = $lastValue;`);\n lines.push(` $values[${idx}] = $lastValue;`);\n lines.push(` $pc++; break;`);\n }\n\n lines.push(` }`);\n }\n\n lines.push(` }`);\n lines.push(`}`);\n lines.push(`return $values[$values.length - 1];`);\n\n return lines.join(\"\\n\");\n}\n","import { getProxyMetadata } from \"./proxy-metadata\";\nimport { createProxyExpressionWithSource } from \"./proxy-variable\";\nimport type { InferExpressionResult, ValidateExpression } from \"./type-parser\";\nimport type { Proxify } from \"./types\";\nimport { getVariableId, getVariablePlaceholder } from \"./variable\";\n\n/**\n * 创建表达式\n * 返回 Proxy Expression,可以继续链式调用\n *\n * @template TContext - 表达式上下文类型\n * @param context - 包含 Variable 或 Proxy Expression 的上下文对象\n * @returns 返回一个函数,该函数接收表达式源码字符串并返回 Proxy Expression\n *\n * 类型系统会:\n * 1. 验证表达式中使用的所有标识符都在 context 中定义\n * 2. 根据表达式和操作数类型自动推导返回类型\n *\n * @example\n * ```ts\n * const x = variable<number>();\n * const y = variable<number>();\n *\n * // 自动推导返回类型为 number\n * const sum = expr({ x, y })(\"x + y\")\n *\n * // 自动推导返回类型为 boolean\n * const isPositive = expr({ sum })(\"sum > 0\")\n *\n * // 编译错误:z 未在 context 中定义\n * // const invalid = expr({ x, y })(\"x + z\")\n * ```\n */\nexport function expr<TContext extends Record<string, unknown>>(\n context: TContext\n): <TSource extends string>(\n source: ValidateExpression<TSource, TContext> extends never ? never : TSource\n) => Proxify<InferExpressionResult<TSource, TContext>> {\n return <TSource extends string>(source: ValidateExpression<TSource, TContext> extends never ? never : TSource) => {\n // 收集所有依赖的 Symbol\n const deps = new Set<symbol>();\n\n // 建立 变量名 -> Symbol 的映射\n const nameToId = new Map<string, symbol>();\n\n for (const [name, value] of Object.entries(context)) {\n // 检查是否是 Proxy variable\n const id = getVariableId(value);\n if (id) {\n deps.add(id);\n nameToId.set(name, id);\n } else {\n // 也可能是另一个 Proxy expression(注意:Proxy 包装函数,typeof 返回 'function')\n const meta =\n (typeof value === \"object\" || typeof value === \"function\") && value !== null\n ? getProxyMetadata(value)\n : undefined;\n if (meta?.dependencies) {\n for (const dep of meta.dependencies) {\n deps.add(dep);\n }\n }\n }\n }\n\n // 将源码中的变量名替换为占位符\n let transformedSource = source as string;\n for (const [name, id] of nameToId) {\n // 使用正则替换,确保是完整的标识符\n const placeholder = getVariablePlaceholder(id);\n // 注意:在 replace 的替换字符串中,$$ 会被解释为字面量 $\n // 所以需要将 $ 替换为 $$\n const escapedPlaceholder = placeholder.replace(/\\$/g, \"$$$$\");\n const regex = new RegExp(`\\\\b${name}\\\\b`, \"g\");\n transformedSource = transformedSource.replace(regex, escapedPlaceholder);\n }\n\n // 处理 context 中的 Proxy expression(它们的 source 已包含占位符)\n for (const [name, value] of Object.entries(context)) {\n // 注意:Proxy 包装函数,typeof 返回 'function'\n if ((typeof value === \"object\" || typeof value === \"function\") && value !== null && !getVariableId(value)) {\n const meta = getProxyMetadata(value);\n if (meta?.source) {\n const regex = new RegExp(`\\\\b${name}\\\\b`, \"g\");\n // 转义 $ 以避免被解释为替换模式\n const escapedSource = `(${meta.source})`.replace(/\\$/g, \"$$$$\");\n transformedSource = transformedSource.replace(regex, escapedSource);\n }\n }\n }\n\n return createProxyExpressionWithSource<InferExpressionResult<TSource, TContext>>(transformedSource, deps);\n };\n}\n","import { collectDepsFromArgs, createProxyExpressionWithSource, serializeArgument } from \"./proxy-variable\";\nimport type { Proxify } from \"./types\";\n\n/**\n * 转义字符串字面量中的特殊字符\n */\nfunction escapeStringLiteral(str: string): string {\n return str\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\");\n}\n\n/**\n * Tagged template 函数,用于创建包含变量的字符串表达式\n *\n * @example\n * ```ts\n * const name = variable<string>();\n * const count = variable<number>();\n *\n * const greeting = t`Hello, ${name}!`;\n * const message = t`You have ${count} items.`;\n *\n * const compiled = compile(greeting, { name });\n * const result = evaluate(compiled, { name: \"Alice\" }); // => \"Hello, Alice!\"\n * ```\n */\nexport function t(strings: TemplateStringsArray, ...values: unknown[]): Proxify<string> {\n // 收集所有依赖\n const deps = new Set<symbol>();\n collectDepsFromArgs(values, deps);\n\n // 构建字符串拼接表达式的各个部分\n const parts: string[] = [];\n\n for (let i = 0; i < strings.length; i++) {\n const str = strings[i]!;\n // 添加静态字符串部分(作为字符串字面量)\n if (str.length > 0) {\n parts.push(`\"${escapeStringLiteral(str)}\"`);\n }\n\n if (i < values.length) {\n // 序列化插值部分\n const serialized = serializeArgument(values[i]);\n parts.push(serialized);\n }\n }\n\n // 如果没有任何部分,返回空字符串\n if (parts.length === 0) {\n return createProxyExpressionWithSource<string>('\"\"', deps);\n }\n\n // 如果只有一个部分且是字符串字面量,直接返回\n if (parts.length === 1) {\n return createProxyExpressionWithSource<string>(parts[0]!, deps);\n }\n\n // 用 + 连接所有部分,加括号确保优先级\n const source = \"(\" + parts.join(\" + \") + \")\";\n\n return createProxyExpressionWithSource<string>(source, deps);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["getVariablePlaceholder"],"sources":["../src/parser.ts","../src/proxy-metadata.ts","../src/proxy-variable.ts","../src/variable.ts","../src/compile.ts","../src/evaluate.ts","../src/expr.ts","../src/lambda.ts","../src/template.ts"],"sourcesContent":["/**\n * JavaScript 表达式解析器\n * 将表达式字符串解析为 AST,支持常见的运算符和语法\n */\n\n// AST 节点类型\nexport type ASTNode =\n | NumberLiteral\n | StringLiteral\n | BooleanLiteral\n | NullLiteral\n | Identifier\n | BinaryExpr\n | UnaryExpr\n | ConditionalExpr\n | MemberExpr\n | CallExpr\n | ArrayExpr\n | ObjectExpr\n | ArrowFunctionExpr;\n\nexport interface NumberLiteral {\n type: \"NumberLiteral\";\n value: number;\n raw: string;\n}\n\nexport interface StringLiteral {\n type: \"StringLiteral\";\n value: string;\n quote: \"'\" | '\"' | \"`\";\n}\n\nexport interface BooleanLiteral {\n type: \"BooleanLiteral\";\n value: boolean;\n}\n\nexport interface NullLiteral {\n type: \"NullLiteral\";\n}\n\nexport interface Identifier {\n type: \"Identifier\";\n name: string;\n}\n\nexport interface BinaryExpr {\n type: \"BinaryExpr\";\n operator: string;\n left: ASTNode;\n right: ASTNode;\n}\n\nexport interface UnaryExpr {\n type: \"UnaryExpr\";\n operator: string;\n argument: ASTNode;\n prefix: boolean;\n}\n\nexport interface ConditionalExpr {\n type: \"ConditionalExpr\";\n test: ASTNode;\n consequent: ASTNode;\n alternate: ASTNode;\n}\n\nexport interface MemberExpr {\n type: \"MemberExpr\";\n object: ASTNode;\n property: ASTNode;\n computed: boolean;\n optional: boolean;\n}\n\nexport interface CallExpr {\n type: \"CallExpr\";\n callee: ASTNode;\n arguments: ASTNode[];\n optional: boolean;\n}\n\nexport interface ArrayExpr {\n type: \"ArrayExpr\";\n elements: ASTNode[];\n}\n\nexport interface ObjectExpr {\n type: \"ObjectExpr\";\n properties: ObjectProperty[];\n}\n\nexport interface ObjectProperty {\n key: ASTNode;\n value: ASTNode;\n computed: boolean;\n shorthand: boolean;\n}\n\nexport interface ArrowFunctionExpr {\n type: \"ArrowFunctionExpr\";\n params: Identifier[];\n body: ASTNode;\n}\n\n// 运算符优先级(从低到高)\nconst PRECEDENCE: Record<string, number> = {\n \"||\": 1,\n \"??\": 1,\n \"&&\": 2,\n \"|\": 3,\n \"^\": 4,\n \"&\": 5,\n \"==\": 6,\n \"!=\": 6,\n \"===\": 6,\n \"!==\": 6,\n \"<\": 7,\n \">\": 7,\n \"<=\": 7,\n \">=\": 7,\n in: 7,\n instanceof: 7,\n \"<<\": 8,\n \">>\": 8,\n \">>>\": 8,\n \"+\": 9,\n \"-\": 9,\n \"*\": 10,\n \"/\": 10,\n \"%\": 10,\n \"**\": 11,\n};\n\n// 右结合运算符\nconst RIGHT_ASSOCIATIVE = new Set([\"**\"]);\n\nclass Parser {\n private pos = 0;\n private source: string;\n\n constructor(source: string) {\n this.source = source;\n }\n\n parse(): ASTNode {\n this.skipWhitespace();\n const node = this.parseExpression();\n this.skipWhitespace();\n if (this.pos < this.source.length) {\n throw new Error(`Unexpected token at position ${this.pos}: ${this.source.slice(this.pos, this.pos + 10)}`);\n }\n return node;\n }\n\n private parseExpression(): ASTNode {\n return this.parseConditional();\n }\n\n private parseConditional(): ASTNode {\n let node = this.parseBinary(0);\n\n this.skipWhitespace();\n if (this.peek() === \"?\") {\n this.advance();\n this.skipWhitespace();\n const consequent = this.parseExpression();\n this.skipWhitespace();\n this.expect(\":\");\n this.skipWhitespace();\n const alternate = this.parseExpression();\n node = {\n type: \"ConditionalExpr\",\n test: node,\n consequent,\n alternate,\n };\n }\n\n return node;\n }\n\n private parseBinary(minPrec: number): ASTNode {\n let left = this.parseUnary();\n\n while (true) {\n this.skipWhitespace();\n const op = this.peekOperator();\n if (!op || PRECEDENCE[op] === undefined || PRECEDENCE[op] < minPrec) {\n break;\n }\n\n this.pos += op.length;\n this.skipWhitespace();\n\n const nextMinPrec = RIGHT_ASSOCIATIVE.has(op) ? PRECEDENCE[op] : PRECEDENCE[op] + 1;\n\n const right = this.parseBinary(nextMinPrec);\n\n left = {\n type: \"BinaryExpr\",\n operator: op,\n left,\n right,\n };\n }\n\n return left;\n }\n\n private parseUnary(): ASTNode {\n this.skipWhitespace();\n const ch = this.peek();\n\n // Single-character unary operators\n if (ch === \"!\" || ch === \"~\" || ch === \"+\" || ch === \"-\") {\n this.advance();\n this.skipWhitespace();\n return {\n type: \"UnaryExpr\",\n operator: ch,\n argument: this.parseUnary(),\n prefix: true,\n };\n }\n\n // Keyword unary operators\n for (const keyword of [\"typeof\", \"void\"] as const) {\n if (this.matchKeyword(keyword)) {\n this.skipWhitespace();\n return {\n type: \"UnaryExpr\",\n operator: keyword,\n argument: this.parseUnary(),\n prefix: true,\n };\n }\n }\n\n return this.parsePostfix();\n }\n\n private parsePostfix(): ASTNode {\n let node = this.parsePrimary();\n\n while (true) {\n this.skipWhitespace();\n const ch = this.peek();\n\n if (ch === \".\") {\n this.advance();\n this.skipWhitespace();\n const property = this.parseIdentifier();\n node = {\n type: \"MemberExpr\",\n object: node,\n property,\n computed: false,\n optional: false,\n };\n } else if (ch === \"[\") {\n this.advance();\n this.skipWhitespace();\n const property = this.parseExpression();\n this.skipWhitespace();\n this.expect(\"]\");\n node = {\n type: \"MemberExpr\",\n object: node,\n property,\n computed: true,\n optional: false,\n };\n } else if (ch === \"(\") {\n this.advance();\n const args = this.parseArguments();\n this.expect(\")\");\n node = {\n type: \"CallExpr\",\n callee: node,\n arguments: args,\n optional: false,\n };\n } else if (ch === \"?\" && this.peekAt(1) === \".\") {\n this.advance();\n this.advance();\n this.skipWhitespace();\n if (this.peek() === \"[\") {\n this.advance();\n this.skipWhitespace();\n const property = this.parseExpression();\n this.skipWhitespace();\n this.expect(\"]\");\n node = {\n type: \"MemberExpr\",\n object: node,\n property,\n computed: true,\n optional: true,\n };\n } else if (this.peek() === \"(\") {\n this.advance();\n const args = this.parseArguments();\n this.expect(\")\");\n node = {\n type: \"CallExpr\",\n callee: node,\n arguments: args,\n optional: true,\n };\n } else {\n const property = this.parseIdentifier();\n node = {\n type: \"MemberExpr\",\n object: node,\n property,\n computed: false,\n optional: true,\n };\n }\n } else {\n break;\n }\n }\n\n return node;\n }\n\n private parsePrimary(): ASTNode {\n this.skipWhitespace();\n const ch = this.peek();\n\n // 数字\n if (this.isDigit(ch) || (ch === \".\" && this.isDigit(this.peekAt(1)))) {\n return this.parseNumber();\n }\n\n // 字符串\n if (ch === '\"' || ch === \"'\" || ch === \"`\") {\n return this.parseString();\n }\n\n // 数组\n if (ch === \"[\") {\n return this.parseArray();\n }\n\n // 对象\n if (ch === \"{\") {\n return this.parseObject();\n }\n\n // 括号表达式或箭头函数参数列表\n if (ch === \"(\") {\n const arrowFunc = this.tryParseArrowFunction();\n if (arrowFunc) return arrowFunc;\n\n this.advance();\n this.skipWhitespace();\n const expr = this.parseExpression();\n this.skipWhitespace();\n this.expect(\")\");\n return expr;\n }\n\n // 关键字字面量\n if (this.matchKeyword(\"true\")) {\n return { type: \"BooleanLiteral\", value: true };\n }\n if (this.matchKeyword(\"false\")) {\n return { type: \"BooleanLiteral\", value: false };\n }\n if (this.matchKeyword(\"null\")) {\n return { type: \"NullLiteral\" };\n }\n if (this.matchKeyword(\"undefined\")) {\n return { type: \"Identifier\", name: \"undefined\" };\n }\n\n // 标识符(可能是单参数箭头函数)\n if (this.isIdentifierStart(ch)) {\n const arrowFunc = this.tryParseSingleParamArrowFunction();\n if (arrowFunc) return arrowFunc;\n\n return this.parseIdentifier();\n }\n\n throw new Error(`Unexpected character at position ${this.pos}: ${ch}`);\n }\n\n private parseNumber(): NumberLiteral {\n const start = this.pos;\n\n // 处理十六进制、八进制、二进制\n if (this.peek() === \"0\") {\n const next = this.peekAt(1)?.toLowerCase();\n if (next === \"x\" || next === \"o\" || next === \"b\") {\n this.advance();\n this.advance();\n while (this.isHexDigit(this.peek())) {\n this.advance();\n }\n const raw = this.source.slice(start, this.pos);\n return {\n type: \"NumberLiteral\",\n value: Number(raw),\n raw,\n };\n }\n }\n\n // 整数部分\n while (this.isDigit(this.peek())) {\n this.advance();\n }\n\n // 小数部分\n if (this.peek() === \".\" && this.isDigit(this.peekAt(1))) {\n this.advance();\n while (this.isDigit(this.peek())) {\n this.advance();\n }\n }\n\n // 指数部分\n if (this.peek()?.toLowerCase() === \"e\") {\n this.advance();\n if (this.peek() === \"+\" || this.peek() === \"-\") {\n this.advance();\n }\n while (this.isDigit(this.peek())) {\n this.advance();\n }\n }\n\n const raw = this.source.slice(start, this.pos);\n return {\n type: \"NumberLiteral\",\n value: Number(raw),\n raw,\n };\n }\n\n private static readonly ESCAPE_CHARS: Record<string, string> = {\n n: \"\\n\",\n r: \"\\r\",\n t: \"\\t\",\n \"\\\\\": \"\\\\\",\n \"'\": \"'\",\n '\"': '\"',\n \"`\": \"`\",\n };\n\n private parseString(): StringLiteral {\n const quote = this.peek() as \"'\" | '\"' | \"`\";\n this.advance();\n\n let value = \"\";\n while (this.pos < this.source.length && this.peek() !== quote) {\n if (this.peek() === \"\\\\\") {\n this.advance();\n const escaped = this.peek();\n value += Parser.ESCAPE_CHARS[escaped] ?? escaped;\n this.advance();\n } else {\n value += this.peek();\n this.advance();\n }\n }\n\n this.expect(quote);\n return { type: \"StringLiteral\", value, quote };\n }\n\n private parseArray(): ArrayExpr {\n this.expect(\"[\");\n const elements: ASTNode[] = [];\n\n this.skipWhitespace();\n while (this.peek() !== \"]\") {\n elements.push(this.parseExpression());\n this.skipWhitespace();\n if (this.peek() === \",\") {\n this.advance();\n this.skipWhitespace();\n } else {\n break;\n }\n }\n\n this.expect(\"]\");\n return { type: \"ArrayExpr\", elements };\n }\n\n private parseObject(): ObjectExpr {\n this.expect(\"{\");\n const properties: ObjectProperty[] = [];\n\n this.skipWhitespace();\n while (this.peek() !== \"}\") {\n const prop = this.parseObjectProperty();\n properties.push(prop);\n this.skipWhitespace();\n if (this.peek() === \",\") {\n this.advance();\n this.skipWhitespace();\n } else {\n break;\n }\n }\n\n this.expect(\"}\");\n return { type: \"ObjectExpr\", properties };\n }\n\n private parseObjectProperty(): ObjectProperty {\n this.skipWhitespace();\n let key: ASTNode;\n let computed = false;\n\n if (this.peek() === \"[\") {\n this.advance();\n this.skipWhitespace();\n key = this.parseExpression();\n this.skipWhitespace();\n this.expect(\"]\");\n computed = true;\n } else if (this.peek() === '\"' || this.peek() === \"'\") {\n key = this.parseString();\n } else {\n key = this.parseIdentifier();\n }\n\n this.skipWhitespace();\n if (this.peek() === \":\") {\n this.advance();\n this.skipWhitespace();\n const value = this.parseExpression();\n return { key, value, computed, shorthand: false };\n }\n\n // Shorthand property\n if (key.type !== \"Identifier\") {\n throw new Error(\"Shorthand property must be an identifier\");\n }\n return { key, value: key, computed: false, shorthand: true };\n }\n\n private parseIdentifier(): Identifier {\n const start = this.pos;\n while (this.isIdentifierPart(this.peek())) {\n this.advance();\n }\n const name = this.source.slice(start, this.pos);\n if (!name) {\n throw new Error(`Expected identifier at position ${this.pos}`);\n }\n return { type: \"Identifier\", name };\n }\n\n /**\n * 尝试解析带括号的箭头函数: (a, b) => expr\n * 使用回溯机制\n */\n private tryParseArrowFunction(): ArrowFunctionExpr | null {\n const savedPos = this.pos;\n\n try {\n this.expect(\"(\");\n this.skipWhitespace();\n\n const params: Identifier[] = [];\n\n // 解析参数列表\n while (this.peek() !== \")\") {\n if (!this.isIdentifierStart(this.peek())) {\n throw new Error(\"Expected identifier\");\n }\n params.push(this.parseIdentifier());\n this.skipWhitespace();\n if (this.peek() === \",\") {\n this.advance();\n this.skipWhitespace();\n } else {\n break;\n }\n }\n\n this.expect(\")\");\n this.skipWhitespace();\n\n // 检查 =>\n if (this.source.slice(this.pos, this.pos + 2) !== \"=>\") {\n throw new Error(\"Expected =>\");\n }\n this.pos += 2;\n this.skipWhitespace();\n\n // 解析函数体\n const body = this.parseExpression();\n\n return {\n type: \"ArrowFunctionExpr\",\n params,\n body,\n };\n } catch {\n // 回溯\n this.pos = savedPos;\n return null;\n }\n }\n\n /**\n * 尝试解析单参数无括号的箭头函数: a => expr\n * 使用回溯机制\n */\n private tryParseSingleParamArrowFunction(): ArrowFunctionExpr | null {\n const savedPos = this.pos;\n\n try {\n const param = this.parseIdentifier();\n this.skipWhitespace();\n\n // 检查 =>\n if (this.source.slice(this.pos, this.pos + 2) !== \"=>\") {\n throw new Error(\"Expected =>\");\n }\n this.pos += 2;\n this.skipWhitespace();\n\n // 解析函数体\n const body = this.parseExpression();\n\n return {\n type: \"ArrowFunctionExpr\",\n params: [param],\n body,\n };\n } catch {\n // 回溯\n this.pos = savedPos;\n return null;\n }\n }\n\n private parseArguments(): ASTNode[] {\n const args: ASTNode[] = [];\n this.skipWhitespace();\n while (this.peek() !== \")\") {\n args.push(this.parseExpression());\n this.skipWhitespace();\n if (this.peek() === \",\") {\n this.advance();\n this.skipWhitespace();\n } else {\n break;\n }\n }\n return args;\n }\n\n // Operators sorted by length (longest first) to ensure correct matching\n private static readonly OPERATORS = [\n // 10 chars\n \"instanceof\",\n // 3 chars\n \">>>\",\n \"===\",\n \"!==\",\n // 2 chars\n \"&&\",\n \"||\",\n \"??\",\n \"==\",\n \"!=\",\n \"<=\",\n \">=\",\n \"<<\",\n \">>\",\n \"**\",\n \"in\",\n // 1 char\n \"+\",\n \"-\",\n \"*\",\n \"/\",\n \"%\",\n \"<\",\n \">\",\n \"&\",\n \"|\",\n \"^\",\n ];\n\n private static readonly KEYWORD_OPERATORS = new Set([\"in\", \"instanceof\"]);\n\n private peekOperator(): string | null {\n for (const op of Parser.OPERATORS) {\n if (!this.source.startsWith(op, this.pos)) continue;\n\n // Keyword operators must not be followed by identifier characters\n if (Parser.KEYWORD_OPERATORS.has(op)) {\n const nextChar = this.source[this.pos + op.length];\n if (nextChar && this.isIdentifierPart(nextChar)) continue;\n }\n\n return op;\n }\n return null;\n }\n\n private matchKeyword(keyword: string): boolean {\n if (this.source.startsWith(keyword, this.pos)) {\n const nextChar = this.source[this.pos + keyword.length];\n if (!nextChar || !this.isIdentifierPart(nextChar)) {\n this.pos += keyword.length;\n return true;\n }\n }\n return false;\n }\n\n private peek(): string {\n return this.source[this.pos] || \"\";\n }\n\n private peekAt(offset: number): string {\n return this.source[this.pos + offset] || \"\";\n }\n\n private advance(): string {\n return this.source[this.pos++] || \"\";\n }\n\n private expect(ch: string): void {\n if (this.peek() !== ch) {\n throw new Error(`Expected '${ch}' at position ${this.pos}, got '${this.peek()}'`);\n }\n this.advance();\n }\n\n private skipWhitespace(): void {\n while (/\\s/.test(this.peek())) {\n this.advance();\n }\n }\n\n private isDigit(ch: string): boolean {\n const code = ch.charCodeAt(0);\n return code >= 48 && code <= 57; // 0-9\n }\n\n private isHexDigit(ch: string): boolean {\n const code = ch.charCodeAt(0);\n return (code >= 48 && code <= 57) || (code >= 65 && code <= 70) || (code >= 97 && code <= 102);\n }\n\n private isIdentifierStart(ch: string): boolean {\n const code = ch.charCodeAt(0);\n return (code >= 65 && code <= 90) || (code >= 97 && code <= 122) || code === 95 || code === 36;\n }\n\n private isIdentifierPart(ch: string): boolean {\n const code = ch.charCodeAt(0);\n return (\n (code >= 65 && code <= 90) ||\n (code >= 97 && code <= 122) ||\n (code >= 48 && code <= 57) ||\n code === 95 ||\n code === 36\n );\n }\n}\n\n/**\n * 解析 JavaScript 表达式为 AST\n */\nexport function parse(source: string): ASTNode {\n return new Parser(source).parse();\n}\n\n/**\n * 从 AST 生成规范化的代码\n */\nexport function generate(node: ASTNode): string {\n switch (node.type) {\n case \"NumberLiteral\":\n return node.raw;\n\n case \"StringLiteral\":\n // 使用双引号,转义必要的字符\n return JSON.stringify(node.value);\n\n case \"BooleanLiteral\":\n return node.value ? \"true\" : \"false\";\n\n case \"NullLiteral\":\n return \"null\";\n\n case \"Identifier\":\n return node.name;\n\n case \"BinaryExpr\": {\n const left = wrapIfNeeded(node.left, node, \"left\");\n const right = wrapIfNeeded(node.right, node, \"right\");\n // 关键字运算符需要空格\n if (node.operator === \"in\" || node.operator === \"instanceof\") {\n return `${left} ${node.operator} ${right}`;\n }\n return `${left}${node.operator}${right}`;\n }\n\n case \"UnaryExpr\":\n if (node.prefix) {\n const arg = wrapIfNeeded(node.argument, node, \"argument\");\n // 对于关键字运算符(typeof, void)需要空格\n if (node.operator === \"typeof\" || node.operator === \"void\") {\n return `${node.operator} ${arg}`;\n }\n return `${node.operator}${arg}`;\n }\n return generate(node.argument) + node.operator;\n\n case \"ConditionalExpr\": {\n const test = generate(node.test);\n const consequent = generate(node.consequent);\n const alternate = generate(node.alternate);\n return `${test}?${consequent}:${alternate}`;\n }\n\n case \"MemberExpr\": {\n const object = wrapIfNeeded(node.object, node, \"object\");\n if (node.computed) {\n const property = generate(node.property);\n return node.optional ? `${object}?.[${property}]` : `${object}[${property}]`;\n }\n const property = generate(node.property);\n return node.optional ? `${object}?.${property}` : `${object}.${property}`;\n }\n\n case \"CallExpr\": {\n const callee = wrapIfNeeded(node.callee, node, \"callee\");\n const args = node.arguments.map(generate).join(\",\");\n // 检测是否需要使用 new 关键字(构造函数)\n const needsNew =\n node.callee.type === \"Identifier\" &&\n [\n \"Date\",\n \"RegExp\",\n \"URL\",\n \"URLSearchParams\",\n \"Map\",\n \"Set\",\n \"Int8Array\",\n \"Uint8Array\",\n \"Uint8ClampedArray\",\n \"Int16Array\",\n \"Uint16Array\",\n \"Int32Array\",\n \"Uint32Array\",\n \"Float32Array\",\n \"Float64Array\",\n \"BigInt64Array\",\n \"BigUint64Array\",\n \"ArrayBuffer\",\n \"DataView\",\n ].includes(node.callee.name);\n if (needsNew) {\n return node.optional ? `new ${callee}?.(${args})` : `new ${callee}(${args})`;\n }\n return node.optional ? `${callee}?.(${args})` : `${callee}(${args})`;\n }\n\n case \"ArrayExpr\":\n return `[${node.elements.map(generate).join(\",\")}]`;\n\n case \"ObjectExpr\": {\n const props = node.properties.map((prop) => {\n if (prop.shorthand) {\n return generate(prop.key);\n }\n const key = prop.computed ? `[${generate(prop.key)}]` : generate(prop.key);\n return `${key}:${generate(prop.value)}`;\n });\n return `{${props.join(\",\")}}`;\n }\n\n case \"ArrowFunctionExpr\": {\n const params = node.params.map((p) => p.name).join(\",\");\n let body = generate(node.body);\n // 如果 body 是对象字面量,需要用括号包裹,否则会被解释为代码块\n if (node.body.type === \"ObjectExpr\") {\n body = `(${body})`;\n }\n if (node.params.length === 1) {\n return `${params}=>${body}`;\n }\n return `(${params})=>${body}`;\n }\n\n default: {\n const unknownNode = node as { type?: string };\n const nodeType = unknownNode.type ?? \"unknown\";\n throw new Error(`Unknown node type: ${nodeType}`);\n }\n }\n}\n\n/**\n * 判断是否需要括号包裹,并生成代码\n */\nfunction wrapIfNeeded(\n child: ASTNode,\n parent: ASTNode,\n position: \"left\" | \"right\" | \"argument\" | \"object\" | \"callee\"\n): string {\n const code = generate(child);\n\n if (needsParens(child, parent, position)) {\n return `(${code})`;\n }\n return code;\n}\n\n/**\n * 判断子节点是否需要括号\n */\nfunction needsParens(child: ASTNode, parent: ASTNode, position: string): boolean {\n // 条件表达式在二元表达式中需要括号\n if (child.type === \"ConditionalExpr\" && parent.type === \"BinaryExpr\") {\n return true;\n }\n\n // 二元表达式嵌套时根据优先级判断\n if (child.type === \"BinaryExpr\" && parent.type === \"BinaryExpr\") {\n const childPrec = PRECEDENCE[child.operator] || 0;\n const parentPrec = PRECEDENCE[parent.operator] || 0;\n\n if (childPrec < parentPrec) {\n return true;\n }\n\n // 相同优先级时,右侧需要括号(除了右结合运算符)\n if (childPrec === parentPrec && position === \"right\") {\n if (!RIGHT_ASSOCIATIVE.has(parent.operator)) {\n return true;\n }\n }\n }\n\n // 二元表达式或条件表达式作为一元表达式的参数时需要括号\n if (\n (child.type === \"BinaryExpr\" || child.type === \"ConditionalExpr\") &&\n parent.type === \"UnaryExpr\" &&\n position === \"argument\"\n ) {\n return true;\n }\n\n // 一元表达式作为二元表达式的操作数时需要括号(为了保持原有的语义清晰)\n if (child.type === \"UnaryExpr\" && parent.type === \"BinaryExpr\") {\n // ** 运算符左侧不能有一元表达式\n if (parent.operator === \"**\" && position === \"left\") {\n return true;\n }\n // 逻辑运算符、位运算符等需要明确一元表达式的边界\n return true;\n }\n\n return false;\n}\n\n/**\n * 转换 AST 中的标识符\n * 回调函数可以返回:\n * - string: 替换标识符名称\n * - ASTNode: 内联该 AST 节点(用于子表达式内联)\n */\nexport function transformIdentifiers(node: ASTNode, transform: (name: string) => string | ASTNode): ASTNode {\n switch (node.type) {\n case \"Identifier\": {\n const result = transform(node.name);\n // 如果返回 ASTNode,直接内联;否则替换名称\n return typeof result === \"string\" ? { ...node, name: result } : result;\n }\n\n case \"BinaryExpr\":\n return {\n ...node,\n left: transformIdentifiers(node.left, transform),\n right: transformIdentifiers(node.right, transform),\n };\n\n case \"UnaryExpr\":\n return {\n ...node,\n argument: transformIdentifiers(node.argument, transform),\n };\n\n case \"ConditionalExpr\":\n return {\n ...node,\n test: transformIdentifiers(node.test, transform),\n consequent: transformIdentifiers(node.consequent, transform),\n alternate: transformIdentifiers(node.alternate, transform),\n };\n\n case \"MemberExpr\":\n return {\n ...node,\n object: transformIdentifiers(node.object, transform),\n // 只有 computed 属性需要转换\n property: node.computed ? transformIdentifiers(node.property, transform) : node.property,\n };\n\n case \"CallExpr\":\n return {\n ...node,\n callee: transformIdentifiers(node.callee, transform),\n arguments: node.arguments.map((arg) => transformIdentifiers(arg, transform)),\n };\n\n case \"ArrayExpr\":\n return {\n ...node,\n elements: node.elements.map((el) => transformIdentifiers(el, transform)),\n };\n\n case \"ObjectExpr\":\n return {\n ...node,\n properties: node.properties.map((prop) => ({\n ...prop,\n key: prop.computed ? transformIdentifiers(prop.key, transform) : prop.key,\n value: transformIdentifiers(prop.value, transform),\n })),\n };\n\n case \"ArrowFunctionExpr\": {\n // 箭头函数:参数名不转换,只转换函数体中的非参数标识符\n const paramNames = new Set(node.params.map((p) => p.name));\n return {\n ...node,\n body: transformIdentifiers(node.body, (name) => (paramNames.has(name) ? name : transform(name))),\n };\n }\n\n default:\n return node;\n }\n}\n\n/**\n * 收集 AST 中所有使用的标识符名称\n */\nexport function collectIdentifiers(node: ASTNode): Set<string> {\n const identifiers = new Set<string>();\n\n function visit(n: ASTNode): void {\n switch (n.type) {\n case \"Identifier\":\n identifiers.add(n.name);\n break;\n\n case \"BinaryExpr\":\n visit(n.left);\n visit(n.right);\n break;\n\n case \"UnaryExpr\":\n visit(n.argument);\n break;\n\n case \"ConditionalExpr\":\n visit(n.test);\n visit(n.consequent);\n visit(n.alternate);\n break;\n\n case \"MemberExpr\":\n visit(n.object);\n if (n.computed) {\n visit(n.property);\n }\n break;\n\n case \"CallExpr\":\n visit(n.callee);\n n.arguments.forEach(visit);\n break;\n\n case \"ArrayExpr\":\n n.elements.forEach(visit);\n break;\n\n case \"ObjectExpr\":\n n.properties.forEach((prop) => {\n if (prop.computed) {\n visit(prop.key);\n }\n visit(prop.value);\n });\n break;\n\n case \"ArrowFunctionExpr\": {\n // 箭头函数:收集参数名和函数体中的标识符\n // 但从闭包角度,只需收集非参数的自由变量\n const paramNames = new Set(n.params.map((p) => p.name));\n const bodyIdentifiers = collectIdentifiers(n.body);\n for (const id of bodyIdentifiers) {\n if (!paramNames.has(id)) {\n identifiers.add(id);\n }\n }\n break;\n }\n }\n }\n\n visit(node);\n return identifiers;\n}\n","// proxy-metadata.ts\nimport type { ASTNode } from \"./parser\";\n\n/**\n * Proxy 元数据接口\n */\nexport interface ProxyMetadata {\n type: \"variable\" | \"expression\";\n path: string[]; // 表达式路径,如 [\"ui\", \"Text\"]\n ast?: ASTNode; // 完整表达式 AST(expression 类型)\n rootVariable?: symbol; // 根 variable 的唯一标识\n dependencies?: Set<symbol>; // 依赖的所有 variable Symbol\n}\n\n/**\n * 全局 WeakMap 存储\n */\nconst proxyMetadata = new WeakMap<object, ProxyMetadata>();\n\n/**\n * 设置 Proxy 元数据\n */\nexport function setProxyMetadata(proxy: object, metadata: ProxyMetadata): void {\n proxyMetadata.set(proxy, metadata);\n}\n\n/**\n * 获取 Proxy 元数据\n */\nexport function getProxyMetadata(proxy: object): ProxyMetadata | undefined {\n return proxyMetadata.get(proxy);\n}\n\n/**\n * 检查对象是否是 Proxy variable\n */\nexport function isProxyVariable(obj: unknown): obj is object {\n if ((typeof obj !== \"object\" && typeof obj !== \"function\") || obj === null) return false;\n const meta = proxyMetadata.get(obj);\n return meta?.type === \"variable\";\n}\n\n/**\n * 检查对象是否是 Proxy expression\n */\nexport function isProxyExpression(obj: unknown): obj is object {\n if ((typeof obj !== \"object\" && typeof obj !== \"function\") || obj === null) return false;\n const meta = proxyMetadata.get(obj);\n return meta?.type === \"expression\";\n}\n\n/**\n * 检查对象是否是任意 Proxy (variable 或 expression)\n */\nexport function isProxy(obj: unknown): obj is object {\n if ((typeof obj !== \"object\" && typeof obj !== \"function\") || obj === null) return false;\n return proxyMetadata.has(obj);\n}\n","// proxy-variable.ts\nimport type {\n ArrayExpr,\n ASTNode,\n BooleanLiteral,\n CallExpr,\n Identifier,\n MemberExpr,\n NullLiteral,\n NumberLiteral,\n ObjectExpr,\n StringLiteral,\n} from \"./parser\";\nimport { getProxyMetadata, setProxyMetadata } from \"./proxy-metadata\";\nimport type { Proxify } from \"./types\";\n\n/**\n * TypedArray 构造函数类型\n */\ntype TypedArrayConstructor =\n | Int8ArrayConstructor\n | Uint8ArrayConstructor\n | Uint8ClampedArrayConstructor\n | Int16ArrayConstructor\n | Uint16ArrayConstructor\n | Int32ArrayConstructor\n | Uint32ArrayConstructor\n | Float32ArrayConstructor\n | Float64ArrayConstructor\n | BigInt64ArrayConstructor\n | BigUint64ArrayConstructor;\n\n/**\n * 使用 Symbol.description 生成占位符\n * 用于在表达式源码中标识变量\n */\nfunction getVariablePlaceholder(id: symbol): string {\n return `$$VAR_${id.description}$$`;\n}\n\n/**\n * 序列化参数为 AST 节点\n * - Proxy Variable/Expression:使用 ast 或占位符标识符\n * - 数组:返回 ArrayExpr 节点\n * - 对象:返回 ObjectExpr 节点\n * - 原始值:返回对应的字面量节点\n * - Date, RegExp, BigInt, URL, URLSearchParams, Map, Set, TypedArray, DataView: 构造函数调用\n */\nexport function serializeArgumentToAST(arg: unknown): ASTNode {\n // 1. 检查是否是 Proxy (通过 getProxyMetadata)\n // 注意:Proxy 包装的是函数,所以 typeof 可能是 \"function\" 或 \"object\"\n if ((typeof arg === \"object\" || typeof arg === \"function\") && arg !== null) {\n const meta = getProxyMetadata(arg);\n if (meta) {\n // 如果有 ast,直接返回\n if (meta.ast) return meta.ast;\n // 否则是根 variable,返回占位符标识符\n if (meta.rootVariable) {\n return {\n type: \"Identifier\",\n name: getVariablePlaceholder(meta.rootVariable),\n } as Identifier;\n }\n }\n }\n\n // 2. 数组递归处理\n if (Array.isArray(arg)) {\n return {\n type: \"ArrayExpr\",\n elements: arg.map(serializeArgumentToAST),\n } as ArrayExpr;\n }\n\n // 3. 特殊内置对象类型\n if (typeof arg === \"object\" && arg !== null) {\n // Date: new Date(timestamp)\n if (arg instanceof Date) {\n return {\n type: \"CallExpr\",\n callee: { type: \"Identifier\", name: \"Date\" } as Identifier,\n arguments: [\n {\n type: \"NumberLiteral\",\n value: arg.getTime(),\n raw: String(arg.getTime()),\n } as NumberLiteral,\n ],\n optional: false,\n } as CallExpr;\n }\n\n // RegExp: new RegExp(source, flags)\n if (arg instanceof RegExp) {\n const args: ASTNode[] = [{ type: \"StringLiteral\", value: arg.source, quote: '\"' } as StringLiteral];\n if (arg.flags) {\n args.push({ type: \"StringLiteral\", value: arg.flags, quote: '\"' } as StringLiteral);\n }\n return {\n type: \"CallExpr\",\n callee: { type: \"Identifier\", name: \"RegExp\" } as Identifier,\n arguments: args,\n optional: false,\n } as CallExpr;\n }\n\n // URL: new URL(href)\n if (typeof URL !== \"undefined\" && arg instanceof URL) {\n return {\n type: \"CallExpr\",\n callee: { type: \"Identifier\", name: \"URL\" } as Identifier,\n arguments: [{ type: \"StringLiteral\", value: arg.href, quote: '\"' } as StringLiteral],\n optional: false,\n } as CallExpr;\n }\n\n // URLSearchParams: new URLSearchParams(entries)\n if (typeof URLSearchParams !== \"undefined\" && arg instanceof URLSearchParams) {\n const entries: ASTNode[] = [];\n arg.forEach((value, key) => {\n entries.push({\n type: \"ArrayExpr\",\n elements: [\n { type: \"StringLiteral\", value: key, quote: '\"' } as StringLiteral,\n { type: \"StringLiteral\", value, quote: '\"' } as StringLiteral,\n ],\n } as ArrayExpr);\n });\n return {\n type: \"CallExpr\",\n callee: { type: \"Identifier\", name: \"URLSearchParams\" } as Identifier,\n arguments: [{ type: \"ArrayExpr\", elements: entries } as ArrayExpr],\n optional: false,\n } as CallExpr;\n }\n\n // Map: new Map(entries)\n if (arg instanceof Map) {\n const entries: ASTNode[] = [];\n arg.forEach((value, key) => {\n entries.push({\n type: \"ArrayExpr\",\n elements: [serializeArgumentToAST(key), serializeArgumentToAST(value)],\n } as ArrayExpr);\n });\n return {\n type: \"CallExpr\",\n callee: { type: \"Identifier\", name: \"Map\" } as Identifier,\n arguments: [{ type: \"ArrayExpr\", elements: entries } as ArrayExpr],\n optional: false,\n } as CallExpr;\n }\n\n // Set: new Set(values)\n if (arg instanceof Set) {\n const values: ASTNode[] = [];\n arg.forEach((value) => {\n values.push(serializeArgumentToAST(value));\n });\n return {\n type: \"CallExpr\",\n callee: { type: \"Identifier\", name: \"Set\" } as Identifier,\n arguments: [{ type: \"ArrayExpr\", elements: values } as ArrayExpr],\n optional: false,\n } as CallExpr;\n }\n\n // TypedArray: new Uint8Array([...])\n const typedArrayConstructors = [\n \"Int8Array\",\n \"Uint8Array\",\n \"Uint8ClampedArray\",\n \"Int16Array\",\n \"Uint16Array\",\n \"Int32Array\",\n \"Uint32Array\",\n \"Float32Array\",\n \"Float64Array\",\n \"BigInt64Array\",\n \"BigUint64Array\",\n ];\n\n for (const constructorName of typedArrayConstructors) {\n if (typeof globalThis[constructorName as keyof typeof globalThis] !== \"undefined\") {\n const Constructor = globalThis[constructorName as keyof typeof globalThis] as TypedArrayConstructor;\n if (arg instanceof Constructor) {\n // 使用扩展运算符处理 bigint 类型的 TypedArray\n const values = [...(arg as Iterable<unknown>)].map((val) => serializeArgumentToAST(val));\n return {\n type: \"CallExpr\",\n callee: { type: \"Identifier\", name: constructorName } as Identifier,\n arguments: [{ type: \"ArrayExpr\", elements: values } as ArrayExpr],\n optional: false,\n } as CallExpr;\n }\n }\n }\n\n // ArrayBuffer: new Uint8Array([...]).buffer\n if (arg instanceof ArrayBuffer) {\n const uint8Array = new Uint8Array(arg);\n const values = Array.from(uint8Array).map((val) => serializeArgumentToAST(val));\n return {\n type: \"MemberExpr\",\n object: {\n type: \"CallExpr\",\n callee: { type: \"Identifier\", name: \"Uint8Array\" } as Identifier,\n arguments: [{ type: \"ArrayExpr\", elements: values } as ArrayExpr],\n optional: false,\n } as CallExpr,\n property: { type: \"Identifier\", name: \"buffer\" } as Identifier,\n computed: false,\n optional: false,\n } as MemberExpr;\n }\n\n // DataView: new DataView(buffer)\n if (arg instanceof DataView) {\n const bufferAst = serializeArgumentToAST(arg.buffer);\n return {\n type: \"CallExpr\",\n callee: { type: \"Identifier\", name: \"DataView\" } as Identifier,\n arguments: [bufferAst],\n optional: false,\n } as CallExpr;\n }\n }\n\n // 4. 普通对象递归处理\n if (typeof arg === \"object\" && arg !== null) {\n const properties = Object.entries(arg).map(([k, v]) => {\n // 检查 key 是否为有效标识符\n const isValidIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(k);\n const key: ASTNode = isValidIdentifier\n ? ({ type: \"Identifier\", name: k } as Identifier)\n : ({ type: \"StringLiteral\", value: k, quote: '\"' } as StringLiteral);\n const value = serializeArgumentToAST(v);\n return {\n key,\n value,\n computed: false,\n shorthand: false,\n };\n });\n return {\n type: \"ObjectExpr\",\n properties,\n } as ObjectExpr;\n }\n\n // 5. 原始值(包括 null, undefined, number, string, boolean, bigint)\n if (arg === null) {\n return { type: \"NullLiteral\" } as NullLiteral;\n }\n if (arg === undefined) {\n return { type: \"Identifier\", name: \"undefined\" } as Identifier;\n }\n if (typeof arg === \"boolean\") {\n return { type: \"BooleanLiteral\", value: arg } as BooleanLiteral;\n }\n if (typeof arg === \"number\") {\n return { type: \"NumberLiteral\", value: arg, raw: String(arg) } as NumberLiteral;\n }\n if (typeof arg === \"string\") {\n return { type: \"StringLiteral\", value: arg, quote: '\"' } as StringLiteral;\n }\n if (typeof arg === \"bigint\") {\n // BigInt: BigInt(\"123\")\n return {\n type: \"CallExpr\",\n callee: { type: \"Identifier\", name: \"BigInt\" } as Identifier,\n arguments: [{ type: \"StringLiteral\", value: arg.toString(), quote: '\"' } as StringLiteral],\n optional: false,\n } as CallExpr;\n }\n\n // 其他类型(symbol 等)暂不支持\n throw new Error(`Unsupported argument type: ${typeof arg}`);\n}\n\n/**\n * 从参数中收集依赖的 Symbol\n * 递归遍历数组和对象,收集所有 Proxy 的依赖\n */\nexport function collectDepsFromArgs(args: unknown[], deps: Set<symbol>): void {\n for (const arg of args) {\n // 注意:Proxy 包装的是函数,所以 typeof 可能是 \"function\" 或 \"object\"\n if ((typeof arg === \"object\" || typeof arg === \"function\") && arg !== null) {\n const meta = getProxyMetadata(arg);\n if (meta?.dependencies) {\n for (const dep of meta.dependencies) {\n deps.add(dep);\n }\n } else if (Array.isArray(arg)) {\n collectDepsFromArgs(arg, deps);\n } else if (typeof arg === \"object\") {\n collectDepsFromArgs(Object.values(arg), deps);\n }\n }\n }\n}\n\n/**\n * 创建根 Variable Proxy\n * 拦截属性访问,返回新的 expression proxy\n * 不可直接调用(apply 应该只在链式调用后可用)\n *\n * @param id - 变量的唯一标识 Symbol\n * @returns Proxy 包装的 Variable\n */\nexport function createProxyVariable<T>(id: symbol): Proxify<T> {\n const deps = new Set([id]);\n\n const proxy = new Proxy(function () {} as unknown as Proxify<T>, {\n get(_target, prop) {\n if (typeof prop === \"symbol\") return undefined;\n // 属性访问:创建 expression proxy\n return createProxyExpression<unknown>(id, [String(prop)], deps);\n },\n apply() {\n throw new Error(\"Variable cannot be called directly\");\n },\n });\n\n setProxyMetadata(proxy, {\n type: \"variable\",\n path: [],\n rootVariable: id,\n dependencies: deps,\n });\n\n return proxy;\n}\n\n/**\n * 创建属性访问后的 Proxy\n * 继续拦截属性访问(链式访问)\n * 拦截 apply 进行方法调用\n *\n * @param rootId - 根变量的 Symbol\n * @param path - 属性访问路径\n * @param deps - 依赖集合\n * @returns Proxy 包装的 Expression\n */\nexport function createProxyExpression<T>(rootId: symbol, path: string[], deps: Set<symbol>): Proxify<T> {\n // 构建 MemberExpr AST 节点\n let ast: ASTNode = {\n type: \"Identifier\",\n name: getVariablePlaceholder(rootId),\n } as Identifier;\n\n for (const prop of path) {\n ast = {\n type: \"MemberExpr\",\n object: ast,\n property: { type: \"Identifier\", name: prop } as Identifier,\n computed: false,\n optional: false,\n } as MemberExpr;\n }\n\n const proxy = new Proxy(function () {} as unknown as Proxify<T>, {\n get(_target, prop) {\n if (typeof prop === \"symbol\") return undefined;\n return createProxyExpression<unknown>(rootId, [...path, String(prop)], deps);\n },\n apply(_target, _thisArg, args) {\n // 构建 CallExpr AST 节点\n const callAst: CallExpr = {\n type: \"CallExpr\",\n callee: ast,\n arguments: args.map(serializeArgumentToAST),\n optional: false,\n };\n // 收集参数中的依赖\n const newDeps = new Set(deps);\n collectDepsFromArgs(args, newDeps);\n return createProxyExpressionWithAST<T>(callAst, newDeps);\n },\n });\n\n setProxyMetadata(proxy, {\n type: \"expression\",\n path,\n rootVariable: rootId,\n ast,\n dependencies: deps,\n });\n\n return proxy;\n}\n\n/**\n * 创建带完整 AST 的 Proxy(方法调用后)\n * 可以继续链式访问和调用\n *\n * @param ast - 完整的表达式 AST\n * @param deps - 依赖集合\n * @returns Proxy 包装的 Expression\n */\nexport function createProxyExpressionWithAST<T>(ast: ASTNode, deps: Set<symbol>): Proxify<T> {\n const proxy = new Proxy(function () {} as unknown as Proxify<T>, {\n get(_target, prop) {\n if (typeof prop === \"symbol\") return undefined;\n // 继续访问:创建新的 MemberExpr\n const newAst: MemberExpr = {\n type: \"MemberExpr\",\n object: ast,\n property: { type: \"Identifier\", name: String(prop) } as Identifier,\n computed: false,\n optional: false,\n };\n return createProxyExpressionWithAST<unknown>(newAst, deps);\n },\n apply(_target, _thisArg, args) {\n // 创建 CallExpr AST 节点\n const callAst: CallExpr = {\n type: \"CallExpr\",\n callee: ast,\n arguments: args.map(serializeArgumentToAST),\n optional: false,\n };\n const newDeps = new Set(deps);\n collectDepsFromArgs(args, newDeps);\n return createProxyExpressionWithAST<T>(callAst, newDeps);\n },\n });\n\n setProxyMetadata(proxy, {\n type: \"expression\",\n path: [], // AST 节点不再需要 path 信息\n ast,\n dependencies: deps,\n });\n\n return proxy;\n}\n","import { createProxyVariable } from \"./proxy-variable\";\nimport type { Variable } from \"./types\";\n\n/**\n * 跟踪每个 variable 的唯一 Symbol ID\n */\nconst variableIds = new WeakMap<object, symbol>();\n\n/**\n * 计数器用于生成唯一变量 ID\n */\nlet variableCounter = 0;\n\n/**\n * 创建一个类型化变量\n * 返回 Proxy 对象,支持链式属性访问和方法调用\n *\n * @example\n * ```ts\n * const x = variable<number>();\n * const config = variable<{ timeout: number }>();\n * const timeout = config.timeout; // Proxy expression\n * ```\n */\nexport function variable<T>(): Variable<T> {\n const id = Symbol(`var_${variableCounter++}`);\n const proxy = createProxyVariable<T>(id);\n variableIds.set(proxy as object, id);\n return proxy;\n}\n\n/**\n * 获取 variable 的唯一 Symbol ID\n */\nexport function getVariableId(variable: unknown): symbol | undefined {\n // Proxy 包装函数,typeof 可能是 'function' 或 'object'\n if ((typeof variable !== \"object\" && typeof variable !== \"function\") || variable === null) return undefined;\n return variableIds.get(variable);\n}\n\n/**\n * 生成变量占位符字符串\n * 格式:$$VAR_var_N$$\n */\nexport function getVariablePlaceholder(id: symbol): string {\n return `$$VAR_${id.description}$$`;\n}\n\n/**\n * 从占位符提取变量 ID 描述\n * 返回 null 如果不是有效占位符\n */\nexport function parseVariablePlaceholder(placeholder: string): string | null {\n const match = placeholder.match(/^\\$\\$VAR_(.+)\\$\\$$/);\n return match ? (match[1] ?? null) : null;\n}\n","import { generate, transformIdentifiers, type ASTNode } from \"./parser\";\nimport { serializeArgumentToAST } from \"./proxy-variable\";\nimport type { BranchNode, CompiledData, CompiledExpression, JumpNode, LambdaBodyResult, PhiNode } from \"./types\";\nimport { getVariableId } from \"./variable\";\n\nconst ALLOWED_GLOBALS = new Set([\n \"Math\",\n \"JSON\",\n \"Date\",\n \"RegExp\",\n \"Number\",\n \"String\",\n \"Boolean\",\n \"Array\",\n \"Object\",\n \"undefined\",\n \"NaN\",\n \"Infinity\",\n \"isNaN\",\n \"isFinite\",\n \"parseInt\",\n \"parseFloat\",\n \"BigInt\",\n \"URL\",\n \"URLSearchParams\",\n \"Map\",\n \"Set\",\n \"Int8Array\",\n \"Uint8Array\",\n \"Uint8ClampedArray\",\n \"Int16Array\",\n \"Uint16Array\",\n \"Int32Array\",\n \"Uint32Array\",\n \"Float32Array\",\n \"Float64Array\",\n \"BigInt64Array\",\n \"BigUint64Array\",\n \"ArrayBuffer\",\n \"DataView\",\n]);\n\n/**\n * 编译选项\n */\nexport interface CompileOptions {\n /**\n * 是否启用短路求值\n * 为 &&, ||, ??, 和三元表达式生成控制流节点\n * @default true\n */\n shortCircuit?: boolean;\n}\n\n/**\n * 将 Proxy Expression 编译为可序列化的 JSON 结构\n *\n * @template TResult - 表达式结果类型\n * @param expression - Proxy Expression,或包含 Proxy 的对象/数组/原始值\n * @param variables - 所有使用的变量定义\n * @param options - 编译选项\n * @returns 编译后的数据结构 [变量名列表, 表达式1, 表达式2, ...]\n *\n * @throws 如果传入无效的表达式或未定义的变量引用\n *\n * @example\n * ```ts\n * const x = variable<number>()\n * const y = variable<number>()\n * const sum = expr({ x, y })(\"x + y\")\n * const result = expr({ sum, x })(\"sum * x\")\n * const compiled = compile(result, { x, y })\n * // => [[\"x\", \"y\"], \"($0+$1)*$0\"]\n * ```\n */\nexport function compile<TResult>(\n expression: LambdaBodyResult<TResult>,\n variables: Record<string, unknown>,\n options: CompileOptions = {}\n): CompiledData {\n const { shortCircuit = true } = options;\n\n // 序列化:支持 Proxy, Object, Array 和原始值\n const ast = serializeArgumentToAST(expression);\n\n // 建立变量名到索引的映射\n const variableOrder: string[] = [];\n const variableToIndex = new Map<string, number>();\n\n for (const name of Object.keys(variables)) {\n if (!variableToIndex.has(name)) {\n variableToIndex.set(name, variableOrder.length);\n variableOrder.push(name);\n }\n }\n\n // 建立 Symbol description -> 变量名 映射(用于占位符替换)\n const descToName = new Map<string, string>();\n for (const [name, value] of Object.entries(variables)) {\n const id = getVariableId(value);\n if (id && id.description) {\n descToName.set(id.description, name);\n }\n }\n\n // 转换 AST:将占位符替换为变量名,然后替换为 $N\n const undefinedVars: string[] = [];\n const transformed = transformIdentifiers(ast, (name) => {\n // 1. 如果是占位符,先替换为变量名\n const placeholderMatch = name.match(/^\\$\\$VAR_(.+)\\$\\$$/);\n if (placeholderMatch) {\n const desc = placeholderMatch[1];\n const varName = descToName.get(desc!);\n if (!varName) {\n throw new Error(`Unknown variable placeholder: ${name}`);\n }\n name = varName;\n }\n\n // 2. 将变量名替换为 $N\n const index = variableToIndex.get(name);\n if (index !== undefined) {\n return `$${index}`;\n }\n\n // 3. 检查是否为允许的全局对象\n if (!ALLOWED_GLOBALS.has(name)) {\n undefinedVars.push(name);\n }\n return name;\n });\n\n if (undefinedVars.length > 0) {\n throw new Error(`Undefined variable(s): ${[...new Set(undefinedVars)].join(\", \")}`);\n }\n\n // 生成编译后的表达式\n const expressions: CompiledExpression[] = [];\n\n if (shortCircuit) {\n // 短路求值模式:生成控制流节点\n let nextIndex = variableOrder.length;\n\n function compileAst(node: ASTNode): number {\n // 检查是否需要短路处理\n if (node.type === \"BinaryExpr\" && (node.operator === \"||\" || node.operator === \"&&\" || node.operator === \"??\")) {\n return compileShortCircuit(node);\n }\n\n if (node.type === \"ConditionalExpr\") {\n return compileConditional(node);\n }\n\n // 普通表达式:直接生成\n const exprStr = generate(node);\n const idx = nextIndex++;\n expressions.push(exprStr);\n return idx;\n }\n\n function compileShortCircuit(node: ASTNode & { type: \"BinaryExpr\" }): number {\n // 递归编译左操作数\n const leftIdx = compileAst(node.left);\n\n // 生成跳转条件\n let branchCondition: string;\n switch (node.operator) {\n case \"||\":\n branchCondition = `$${leftIdx}`;\n break;\n case \"&&\":\n branchCondition = `!$${leftIdx}`;\n break;\n default:\n branchCondition = `$${leftIdx}!=null`;\n }\n\n const branchIdx = expressions.length;\n expressions.push([\"br\", branchCondition, 0] as BranchNode);\n nextIndex++;\n\n compileAst(node.right);\n\n const skipCount = expressions.length - branchIdx - 1;\n (expressions[branchIdx] as BranchNode)[2] = skipCount;\n\n const phiIdx = nextIndex++;\n expressions.push([\"phi\"] as PhiNode);\n\n return phiIdx;\n }\n\n function compileConditional(node: ASTNode & { type: \"ConditionalExpr\" }): number {\n const testIdx = compileAst(node.test);\n\n const branchIdx = expressions.length;\n expressions.push([\"br\", `$${testIdx}`, 0] as BranchNode);\n nextIndex++;\n\n compileAst(node.alternate);\n\n const jmpIdx = expressions.length;\n expressions.push([\"jmp\", 0] as JumpNode);\n nextIndex++;\n\n compileAst(node.consequent);\n const thenEndIdx = expressions.length;\n\n (expressions[branchIdx] as BranchNode)[2] = jmpIdx - branchIdx;\n (expressions[jmpIdx] as JumpNode)[1] = thenEndIdx - jmpIdx - 1;\n\n const phiIdx = nextIndex++;\n expressions.push([\"phi\"] as PhiNode);\n\n return phiIdx;\n }\n\n compileAst(transformed);\n } else {\n // 原始模式:直接生成表达式字符串\n expressions.push(generate(transformed));\n }\n\n return [variableOrder, ...expressions];\n}\n","import type { CompiledData, CompiledExpression } from \"./types\";\n\n/**\n * 缓存已构造的求值函数,以提升重复执行性能\n */\nconst evaluatorCache = new Map<string, (values: unknown[]) => unknown>();\n\n/**\n * 检测编译数据是否包含控制流节点(V2 格式)\n */\nfunction isV2Format(expressions: CompiledExpression[]): boolean {\n return expressions.some((expr) => Array.isArray(expr));\n}\n\n/**\n * 执行编译后的表达式\n *\n * @template TResult - 表达式结果类型\n * @param data - 编译后的数据结构 [变量名列表, 表达式1, 表达式2, ...]\n * @param values - 变量值映射,按变量名提供值\n * @returns 最后一个表达式的求值结果\n *\n * @throws 如果运行时类型验证失败或表达式执行出错\n *\n * @example\n * ```ts\n * const compiled = [[\"x\", \"y\"], \"$0+$1\", \"$1*2\"]\n * const result = evaluate<number>(compiled, { x: 2, y: 3 })\n * // => 6 (3 * 2)\n * ```\n */\nexport function evaluate<TResult>(data: CompiledData, values: Record<string, unknown>): TResult {\n if (data.length < 1) {\n throw new Error(\"Invalid compiled data: must have at least variable names\");\n }\n\n const [variableNames, ...expressions] = data;\n\n if (!Array.isArray(variableNames)) {\n throw new Error(\"Invalid compiled data: first element must be variable names array\");\n }\n\n // 验证所有必需的变量都已提供\n for (const varName of variableNames) {\n if (typeof varName !== \"string\") {\n throw new Error(\"Invalid compiled data: variable names must be strings\");\n }\n if (!(varName in values)) {\n throw new Error(`Missing required variable: ${varName}`);\n }\n }\n\n // 创建值数组,按变量名顺序填入传入的值\n const valueArray: unknown[] = [];\n for (const varName of variableNames) {\n valueArray.push(values[varName]);\n }\n\n // 获取或构造求值函数\n const cacheKey = JSON.stringify(data);\n let evaluator = evaluatorCache.get(cacheKey);\n\n if (!evaluator) {\n // 根据格式选择合适的函数体构造器\n const functionBody = isV2Format(expressions)\n ? buildEvaluatorFunctionBodyV2(expressions, variableNames.length)\n : buildEvaluatorFunctionBody(expressions as string[], variableNames.length);\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n evaluator = new Function(\"$values\", functionBody) as (values: unknown[]) => unknown;\n evaluatorCache.set(cacheKey, evaluator);\n }\n\n // 执行求值函数\n try {\n const result = evaluator(valueArray);\n return result as TResult;\n } catch (error) {\n throw new Error(`Failed to evaluate expression: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * 构造求值函数体\n *\n * @param expressions - 表达式列表\n * @param variableCount - 变量数量\n * @returns 函数体字符串\n *\n * @example\n * ```ts\n * buildEvaluatorFunctionBody([\"$0+$1\", \"$2*2\"], 2)\n * // 返回执行 $0+$1 并存储到 $values[2],然后执行 $2*2 的函数体\n * ```\n */\nfunction buildEvaluatorFunctionBody(expressions: string[], variableCount: number): string {\n if (expressions.length === 0) {\n throw new Error(\"No expressions to evaluate\");\n }\n\n const lines: string[] = [];\n\n // 为了使 $0, $1 等能在函数体中访问,我们需要创建局部变量\n // 或者使用代理访问值数组\n for (let i = 0; i < variableCount; i++) {\n lines.push(`const $${i} = $values[${i}];`);\n }\n\n // 依次对每个表达式求值,结果追加到值数组\n for (let i = 0; i < expressions.length; i++) {\n const exprSource = expressions[i];\n const resultIndex = variableCount + i;\n\n lines.push(`const $${resultIndex} = ${exprSource};`);\n lines.push(`$values[${resultIndex}] = $${resultIndex};`);\n }\n\n // 返回最后一个表达式的结果(即最后一个元素)\n lines.push(`return $values[$values.length - 1];`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * 构造带控制流支持的求值函数体(V2 格式)\n *\n * @param expressions - 表达式列表(可包含控制流节点)\n * @param variableCount - 变量数量\n * @returns 函数体字符串\n */\nfunction buildEvaluatorFunctionBodyV2(expressions: CompiledExpression[], variableCount: number): string {\n if (expressions.length === 0) {\n throw new Error(\"No expressions to evaluate\");\n }\n\n const lines: string[] = [];\n\n // 初始化变量\n for (let i = 0; i < variableCount; i++) {\n lines.push(`const $${i} = $values[${i}];`);\n }\n\n // 程序计数器和最近值寄存器\n lines.push(`let $pc = 0;`);\n lines.push(`let $lastValue;`);\n\n // 预先声明所有中间变量\n for (let i = 0; i < expressions.length; i++) {\n lines.push(`let $${variableCount + i};`);\n }\n\n lines.push(`while ($pc < ${expressions.length}) {`);\n lines.push(` switch ($pc) {`);\n\n for (let i = 0; i < expressions.length; i++) {\n const expr = expressions[i]!;\n const idx = variableCount + i;\n\n lines.push(` case ${i}: {`);\n\n if (typeof expr === \"string\") {\n // 普通表达式:求值并存储\n lines.push(` $${idx} = ${expr};`);\n lines.push(` $values[${idx}] = $${idx};`);\n lines.push(` $lastValue = $${idx};`);\n lines.push(` $pc++; break;`);\n } else if (expr[0] === \"br\") {\n // 条件跳转:条件为任意表达式\n const [, condExpr, offset] = expr;\n lines.push(` if (${condExpr}) { $pc += ${offset + 1}; } else { $pc++; }`);\n lines.push(` break;`);\n } else if (expr[0] === \"jmp\") {\n // 无条件跳转\n const [, offset] = expr;\n lines.push(` $pc += ${offset + 1}; break;`);\n } else if (expr[0] === \"phi\") {\n // phi 节点:取最近值\n lines.push(` $${idx} = $lastValue;`);\n lines.push(` $values[${idx}] = $lastValue;`);\n lines.push(` $pc++; break;`);\n }\n\n lines.push(` }`);\n }\n\n lines.push(` }`);\n lines.push(`}`);\n lines.push(`return $values[$values.length - 1];`);\n\n return lines.join(\"\\n\");\n}\n","import { parse, transformIdentifiers, type ASTNode } from \"./parser\";\nimport { getProxyMetadata } from \"./proxy-metadata\";\nimport { createProxyExpressionWithAST } from \"./proxy-variable\";\nimport type { InferExpressionResult, ValidateExpression } from \"./type-parser\";\nimport type { Proxify } from \"./types\";\nimport { getVariableId, getVariablePlaceholder } from \"./variable\";\n\n/**\n * 创建表达式\n * 返回 Proxy Expression,可以继续链式调用\n *\n * @template TContext - 表达式上下文类型\n * @param context - 包含 Variable 或 Proxy Expression 的上下文对象\n * @returns 返回一个函数,该函数接收表达式源码字符串并返回 Proxy Expression\n *\n * 类型系统会:\n * 1. 验证表达式中使用的所有标识符都在 context 中定义\n * 2. 根据表达式和操作数类型自动推导返回类型\n *\n * @example\n * ```ts\n * const x = variable<number>();\n * const y = variable<number>();\n *\n * // 自动推导返回类型为 number\n * const sum = expr({ x, y })(\"x + y\")\n *\n * // 自动推导返回类型为 boolean\n * const isPositive = expr({ sum })(\"sum > 0\")\n *\n * // 编译错误:z 未在 context 中定义\n * // const invalid = expr({ x, y })(\"x + z\")\n * ```\n */\nexport function expr<TContext extends Record<string, unknown>>(\n context: TContext\n): <TSource extends string>(\n source: ValidateExpression<TSource, TContext> extends never ? never : TSource\n) => Proxify<InferExpressionResult<TSource, TContext>> {\n return <TSource extends string>(source: ValidateExpression<TSource, TContext> extends never ? never : TSource) => {\n // 收集所有依赖的 Symbol\n const deps = new Set<symbol>();\n\n // 建立 变量名 -> Symbol 的映射\n const nameToId = new Map<string, symbol>();\n\n for (const [name, value] of Object.entries(context)) {\n // 检查是否是 Proxy variable(包括通过 variable() 创建的和 lambda 参数)\n let id = getVariableId(value);\n\n // 如果 getVariableId 返回 undefined,尝试从 ProxyMetadata 获取 rootVariable\n // 这用于支持 lambda 参数(它们没有注册到 variableIds 中)\n if (!id && (typeof value === \"object\" || typeof value === \"function\") && value !== null) {\n const meta = getProxyMetadata(value);\n if (meta?.type === \"variable\" && meta.rootVariable) {\n id = meta.rootVariable;\n }\n }\n\n if (id) {\n deps.add(id);\n nameToId.set(name, id);\n } else {\n // 也可能是另一个 Proxy expression(注意:Proxy 包装函数,typeof 返回 'function')\n const meta =\n (typeof value === \"object\" || typeof value === \"function\") && value !== null\n ? getProxyMetadata(value)\n : undefined;\n if (meta?.dependencies) {\n for (const dep of meta.dependencies) {\n deps.add(dep);\n }\n }\n }\n }\n\n // 建立变量名到子表达式 AST 的映射(用于 Proxy expression)\n const nameToExprAST = new Map<string, ASTNode>();\n for (const [name, value] of Object.entries(context)) {\n // 注意:Proxy 包装函数,typeof 返回 'function'\n if ((typeof value === \"object\" || typeof value === \"function\") && value !== null) {\n // 跳过已经在 nameToId 中的变量\n if (nameToId.has(name)) continue;\n\n const meta = getProxyMetadata(value);\n if (meta?.ast) {\n nameToExprAST.set(name, meta.ast);\n }\n }\n }\n\n // 解析用户输入的字符串为 AST\n const ast = parse(source as string);\n\n // 在 AST 级别进行标识符替换\n const transformedAst = transformIdentifiers(ast, (name) => {\n // 检查是否是 context 中的变量\n const id = nameToId.get(name);\n if (id) {\n // 返回占位符标识符名称\n return getVariablePlaceholder(id);\n }\n\n // 检查是否是子表达式\n const exprAST = nameToExprAST.get(name);\n if (exprAST) {\n // 返回 AST 节点以内联子表达式\n return exprAST;\n }\n\n // 保持原样(可能是全局对象如 Math, JSON 等)\n return name;\n });\n\n return createProxyExpressionWithAST<InferExpressionResult<TSource, TContext>>(transformedAst, deps);\n };\n}\n","// lambda.ts\nimport { transformIdentifiers, type ASTNode } from \"./parser\";\nimport { getProxyMetadata, setProxyMetadata } from \"./proxy-metadata\";\nimport {\n collectDepsFromArgs,\n createProxyExpressionWithAST,\n createProxyVariable,\n serializeArgumentToAST,\n} from \"./proxy-variable\";\nimport type { Lambda, LambdaBuilder, Proxify } from \"./types\";\n\n/**\n * Lambda 参数计数器,用于生成唯一 ID\n */\nlet lambdaParamCounter = 0;\n\n/**\n * Lambda 参数到索引的映射\n * 用于编译时确定参数位置\n */\nconst lambdaParamIndices = new WeakMap<object, number>();\n\n/**\n * 获取 lambda 参数的索引\n */\nexport function getLambdaParamIndex(param: unknown): number | undefined {\n if ((typeof param !== \"object\" && typeof param !== \"function\") || param === null) {\n return undefined;\n }\n return lambdaParamIndices.get(param);\n}\n\n/**\n * 创建 lambda 参数代理\n * 生成带特殊标记的 Proxy,用于在表达式中追踪参数\n *\n * @param index - 参数索引(0, 1, 2...)\n * @returns Lambda 参数代理\n */\nfunction createLambdaParam<T>(index: number): Proxify<T> {\n // 使用带前缀的唯一 ID,避免与普通变量冲突\n const id = Symbol(`lambda_param_${lambdaParamCounter++}_${index}`);\n const proxy = createProxyVariable<T>(id);\n\n // 记录参数索引\n lambdaParamIndices.set(proxy as object, index);\n\n return proxy;\n}\n\n/**\n * 创建类型安全的 lambda 表达式\n *\n * @template Args - 参数类型元组\n * @template R - 返回值类型\n * @param builder - Lambda 构建函数,接收参数代理,返回函数体表达式\n * @returns Lambda 表达式代理\n *\n * @example\n * ```ts\n * const add = lambda<[number, number], number>(\n * (a, b) => expr({ a, b })(\"a + b\")\n * );\n *\n * const numbers = variable<number[]>();\n * const sum = numbers.reduce(add, 0);\n * ```\n */\nexport function lambda<Args extends unknown[], R>(builder: LambdaBuilder<Args, R>): Lambda<Args, R> {\n // 1. 根据 builder 函数的参数数量创建参数代理\n const paramCount = builder.length;\n const params: Proxify<unknown>[] = [];\n const paramSymbols: symbol[] = [];\n\n for (let i = 0; i < paramCount; i++) {\n const param = createLambdaParam<unknown>(i);\n params.push(param);\n\n // 获取参数的 Symbol ID\n const meta = getProxyMetadata(param as object);\n if (meta?.rootVariable) {\n paramSymbols.push(meta.rootVariable);\n }\n }\n\n // 2. 调用 builder 获取函数体表达式\n const bodyExpr = builder(...(params as Parameters<LambdaBuilder<Args, R>>));\n\n // 3. 从 bodyExpr 中提取 AST 和依赖\n // 支持返回 Proxy 表达式、普通对象/数组、或原始值\n let bodyAst: ASTNode;\n let bodyDeps: Set<symbol>;\n\n const meta =\n (typeof bodyExpr === \"object\" || typeof bodyExpr === \"function\") && bodyExpr !== null\n ? getProxyMetadata(bodyExpr as object)\n : undefined;\n\n if (meta?.ast) {\n // Proxy 表达式:使用其 AST 和依赖\n bodyAst = meta.ast;\n bodyDeps = meta.dependencies ?? new Set<symbol>();\n } else {\n // 普通对象、数组或原始值:使用 serializeArgumentToAST 转换\n // 并收集其中可能包含的 Proxy 变量依赖\n bodyAst = serializeArgumentToAST(bodyExpr);\n bodyDeps = new Set<symbol>();\n collectDepsFromArgs([bodyExpr], bodyDeps);\n }\n\n // 4. 将参数占位符标识符转换为实际参数名 (_0, _1, _2...)\n const transformedBodyAst = transformIdentifiers(bodyAst, (name) => {\n for (let i = 0; i < paramSymbols.length; i++) {\n const sym = paramSymbols[i];\n if (!sym) continue;\n // 占位符格式:$$VAR_lambda_param_N_INDEX$$\n const placeholder = `$$VAR_${sym.description}$$`;\n if (name === placeholder) {\n return `_${i}`;\n }\n }\n return name;\n });\n\n // 5. 构造完整的箭头函数 AST\n const paramIdentifiers = params.map((_, i) => ({ type: \"Identifier\" as const, name: `_${i}` }));\n const arrowFunctionAst: ASTNode = {\n type: \"ArrowFunctionExpr\",\n params: paramIdentifiers,\n body: transformedBodyAst,\n };\n\n // 6. 过滤掉 lambda 参数依赖,只保留外部闭包变量\n const closureDeps = new Set<symbol>();\n for (const dep of bodyDeps) {\n if (!paramSymbols.includes(dep)) {\n closureDeps.add(dep);\n }\n }\n\n // 7. 返回包含 lambda AST 的 Proxy\n const lambdaProxy = createProxyExpressionWithAST<(...args: Args) => R>(arrowFunctionAst, closureDeps);\n\n // 8. 设置额外的 lambda 元数据(标记为 lambda 类型)\n const existingMeta = getProxyMetadata(lambdaProxy as object);\n if (existingMeta) {\n setProxyMetadata(lambdaProxy as object, {\n ...existingMeta,\n type: \"expression\", // 保持为 expression,但 AST 包含箭头函数\n });\n }\n\n return lambdaProxy as Lambda<Args, R>;\n}\n","import type { ASTNode, BinaryExpr, StringLiteral } from \"./parser\";\nimport { collectDepsFromArgs, createProxyExpressionWithAST, serializeArgumentToAST } from \"./proxy-variable\";\nimport type { Proxify } from \"./types\";\n\n/**\n * Tagged template 函数,用于创建包含变量的字符串表达式\n *\n * @example\n * ```ts\n * const name = variable<string>();\n * const count = variable<number>();\n *\n * const greeting = t`Hello, ${name}!`;\n * const message = t`You have ${count} items.`;\n *\n * const compiled = compile(greeting, { name });\n * const result = evaluate(compiled, { name: \"Alice\" }); // => \"Hello, Alice!\"\n * ```\n */\nexport function t(strings: TemplateStringsArray, ...values: unknown[]): Proxify<string> {\n // 收集所有依赖\n const deps = new Set<symbol>();\n collectDepsFromArgs(values, deps);\n\n // 构建字符串拼接表达式的各个 AST 节点\n const parts: ASTNode[] = [];\n\n for (let i = 0; i < strings.length; i++) {\n const str = strings[i]!;\n // 添加静态字符串部分(作为字符串字面量 AST 节点)\n if (str.length > 0) {\n parts.push({\n type: \"StringLiteral\",\n value: str,\n quote: '\"',\n } as StringLiteral);\n }\n\n if (i < values.length) {\n // 序列化插值部分为 AST\n const ast = serializeArgumentToAST(values[i]);\n parts.push(ast);\n }\n }\n\n // 如果没有任何部分,返回空字符串\n if (parts.length === 0) {\n const emptyStringAst: StringLiteral = {\n type: \"StringLiteral\",\n value: \"\",\n quote: '\"',\n };\n return createProxyExpressionWithAST<string>(emptyStringAst, deps);\n }\n\n // 如果只有一个部分,直接返回\n if (parts.length === 1) {\n return createProxyExpressionWithAST<string>(parts[0]!, deps);\n }\n\n // 用 + 连接所有部分\n let resultAst = parts[0]!;\n for (let i = 1; i < parts.length; i++) {\n resultAst = {\n type: \"BinaryExpr\",\n operator: \"+\",\n left: resultAst,\n right: parts[i]!,\n } as BinaryExpr;\n }\n\n return createProxyExpressionWithAST<string>(resultAst, deps);\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codehz/json-expr",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "A JSON expression evaluation library",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",