@codehz/json-expr 0.5.4 → 0.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +176 -127
- package/dist/index.mjs +30 -41
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -12,9 +12,37 @@ type ProxyExpression<T = unknown> = {
|
|
|
12
12
|
*/
|
|
13
13
|
type ProxifyArgs<T extends unknown[]> = { [K in keyof T]: T[K] | Proxify<T[K]> };
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* 需要保留泛型参数的数组方法名
|
|
16
|
+
* 这些方法需要显式定义以保留类型推导
|
|
17
|
+
*/
|
|
18
|
+
type GenericMethodNames = keyof GenericArrayMethods<unknown>;
|
|
19
|
+
/**
|
|
20
|
+
* 泛型数组方法 - 需要手动定义以保留类型参数
|
|
21
|
+
*/
|
|
22
|
+
type GenericArrayMethods<E> = {
|
|
23
|
+
map<U>(fn: Proxify<(value: E, index: number, array: E[]) => U>): Proxify<U[]>;
|
|
24
|
+
flatMap<U>(fn: Proxify<(value: E, index: number, array: E[]) => U | readonly U[]>): Proxify<U[]>;
|
|
25
|
+
filter<S extends E>(predicate: Proxify<(value: E, index: number, array: E[]) => value is S>): Proxify<S[]>;
|
|
26
|
+
filter(predicate: Proxify<(value: E, index: number, array: E[]) => unknown>): Proxify<E[]>;
|
|
27
|
+
find(predicate: Proxify<(value: E, index: number, obj: E[]) => unknown>): Proxify<E | undefined>;
|
|
28
|
+
findLast(predicate: Proxify<(value: E, index: number, obj: E[]) => unknown>): Proxify<E | undefined>;
|
|
29
|
+
findIndex(predicate: Proxify<(value: E, index: number, obj: E[]) => unknown>): Proxify<number>;
|
|
30
|
+
findLastIndex(predicate: Proxify<(value: E, index: number, obj: E[]) => unknown>): Proxify<number>;
|
|
31
|
+
reduce<U>(fn: Proxify<(acc: U, val: E, idx: number, arr: E[]) => U>, init: U | Proxify<U>): Proxify<U>;
|
|
32
|
+
reduce(fn: Proxify<(acc: E, val: E, idx: number, arr: E[]) => E>): Proxify<E>;
|
|
33
|
+
reduceRight<U>(fn: Proxify<(acc: U, val: E, idx: number, arr: E[]) => U>, init: U | Proxify<U>): Proxify<U>;
|
|
34
|
+
reduceRight(fn: Proxify<(acc: E, val: E, idx: number, arr: E[]) => E>): Proxify<E>;
|
|
35
|
+
every(predicate: Proxify<(value: E, index: number, array: E[]) => unknown>): Proxify<boolean>;
|
|
36
|
+
some(predicate: Proxify<(value: E, index: number, array: E[]) => unknown>): Proxify<boolean>;
|
|
37
|
+
forEach(fn: Proxify<(value: E, index: number, array: E[]) => void>): Proxify<void>;
|
|
38
|
+
toSorted(compareFn?: Proxify<(a: E, b: E) => number>): Proxify<E[]>;
|
|
39
|
+
sort(compareFn?: Proxify<(a: E, b: E) => number>): Proxify<E[]>;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* 通用方法/属性转换
|
|
43
|
+
* 将对象 T 的所有方法返回值和属性包装为 Proxify
|
|
16
44
|
*/
|
|
17
|
-
type
|
|
45
|
+
type ProxifyMethods<T> = { readonly [K in keyof T]: T[K] extends ((...args: infer A) => infer R) ? (...args: ProxifyArgs<A>) => Proxify<R> : Proxify<T[K]> };
|
|
18
46
|
/**
|
|
19
47
|
* 字符串类型的 Proxify 版本
|
|
20
48
|
* 将所有字符串方法返回值包装为 Proxify
|
|
@@ -55,59 +83,26 @@ type ProxifiedString = {
|
|
|
55
83
|
[key: string]: unknown;
|
|
56
84
|
};
|
|
57
85
|
/**
|
|
58
|
-
* 数组类型的 Proxify 版本
|
|
59
|
-
*
|
|
60
|
-
*/
|
|
61
|
-
type ProxifiedArray<
|
|
62
|
-
map<U>(callbackfn: Proxify<(value: T, index: number, array: T[]) => U>): Proxify<U[]>;
|
|
63
|
-
flatMap<U>(callbackfn: Proxify<(value: T, index: number, array: T[]) => U | readonly U[]>): Proxify<U[]>;
|
|
64
|
-
filter<S extends T>(predicate: Proxify<(value: T, index: number, array: T[]) => value is S>): Proxify<S[]>;
|
|
65
|
-
filter(predicate: Proxify<(value: T, index: number, array: T[]) => unknown>): Proxify<T[]>;
|
|
66
|
-
reduce<U>(callbackfn: Proxify<(previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U>, initialValue: U | Proxify<U>): Proxify<U>;
|
|
67
|
-
reduce(callbackfn: Proxify<(previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T>): Proxify<T>;
|
|
68
|
-
reduceRight<U>(callbackfn: Proxify<(previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U>, initialValue: U | Proxify<U>): Proxify<U>;
|
|
69
|
-
reduceRight(callbackfn: Proxify<(previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T>): Proxify<T>;
|
|
70
|
-
find<S extends T>(predicate: Proxify<(value: T, index: number, obj: T[]) => value is S>): Proxify<S | undefined>;
|
|
71
|
-
find(predicate: Proxify<(value: T, index: number, obj: T[]) => unknown>): Proxify<T | undefined>;
|
|
72
|
-
findIndex(predicate: Proxify<(value: T, index: number, obj: T[]) => unknown>): Proxify<number>;
|
|
73
|
-
findLast<S extends T>(predicate: Proxify<(value: T, index: number, array: T[]) => value is S>): Proxify<S | undefined>;
|
|
74
|
-
findLast(predicate: Proxify<(value: T, index: number, array: T[]) => unknown>): Proxify<T | undefined>;
|
|
75
|
-
findLastIndex(predicate: Proxify<(value: T, index: number, array: T[]) => unknown>): Proxify<number>;
|
|
76
|
-
every<S extends T>(predicate: Proxify<(value: T, index: number, array: T[]) => value is S>): Proxify<boolean>;
|
|
77
|
-
every(predicate: Proxify<(value: T, index: number, array: T[]) => unknown>): Proxify<boolean>;
|
|
78
|
-
some(predicate: Proxify<(value: T, index: number, array: T[]) => unknown>): Proxify<boolean>;
|
|
79
|
-
forEach(callbackfn: Proxify<(value: T, index: number, array: T[]) => void>): Proxify<void>;
|
|
80
|
-
toSorted(compareFn?: Proxify<(a: T, b: T) => number>): Proxify<T[]>;
|
|
81
|
-
sort(compareFn?: Proxify<(a: T, b: T) => number>): Proxify<T[]>;
|
|
82
|
-
} & { [K in Exclude<keyof T[], ProxifiedArrayMethods>]: Proxify<T[][K]> };
|
|
86
|
+
* 数组类型的 Proxify 版本 - 使用交叉类型
|
|
87
|
+
* 泛型方法单独定义 + 其他方法自动映射
|
|
88
|
+
*/
|
|
89
|
+
type ProxifiedArray<E> = GenericArrayMethods<E> & { [K in Exclude<keyof E[], GenericMethodNames>]: E[][K] extends ((...args: infer A) => infer R) ? (...args: ProxifyArgs<A>) => Proxify<R> : Proxify<E[][K]> };
|
|
83
90
|
/**
|
|
84
91
|
* 将类型 T 转换为 Proxy 包装类型
|
|
85
92
|
* - 始终包含 ProxyExpression<T> 标记,用于 compile 函数类型检查
|
|
86
|
-
* - 函数类型:保持函数签名,但参数允许 Proxy 或原始值,返回值递归应用 Proxify
|
|
87
93
|
* - 字符串类型:使用 ProxifiedString 特殊处理字符串方法
|
|
88
94
|
* - 数组类型:使用 ProxifiedArray 特殊处理泛型方法
|
|
89
|
-
* -
|
|
95
|
+
* - 函数类型:保持函数签名,但参数允许 Proxy 或原始值,返回值递归应用 Proxify
|
|
96
|
+
* - 对象类型:使用 ProxifyMethods 映射所有属性
|
|
90
97
|
* - 原始类型:保持不变(返回 ProxyExpression 包装)
|
|
91
98
|
*/
|
|
92
|
-
type Proxify<T> = ProxyExpression<T> & (T extends string ? ProxifiedString : T extends ((...args: infer Args) => infer R) ? (...args: ProxifyArgs<Args>) => Proxify<R> : T extends
|
|
99
|
+
type Proxify<T> = ProxyExpression<T> & (T extends string ? ProxifiedString : T extends readonly (infer E)[] ? ProxifiedArray<E> : T extends ((...args: infer Args) => infer R) ? (...args: ProxifyArgs<Args>) => Proxify<R> : T extends object ? ProxifyMethods<T> : unknown);
|
|
93
100
|
/**
|
|
94
101
|
* Variable 类型定义
|
|
95
102
|
* 总是返回 Proxy 包装后的类型
|
|
96
103
|
* @template T - 变量的值类型
|
|
97
104
|
*/
|
|
98
105
|
type Variable<T = unknown> = Proxify<T>;
|
|
99
|
-
/**
|
|
100
|
-
* 表示一个表达式
|
|
101
|
-
* @template TContext - 表达式上下文类型
|
|
102
|
-
* @template TResult - 表达式结果类型
|
|
103
|
-
* @deprecated 请使用新的 Proxy 类型系统
|
|
104
|
-
*/
|
|
105
|
-
type Expression<TContext = Record<string, unknown>, TResult = unknown> = {
|
|
106
|
-
_tag: "expression";
|
|
107
|
-
context: TContext;
|
|
108
|
-
source: string;
|
|
109
|
-
_type: TResult;
|
|
110
|
-
};
|
|
111
106
|
/**
|
|
112
107
|
* 条件跳转节点
|
|
113
108
|
* 如果条件为 truthy,跳过 offset 条指令
|
|
@@ -140,37 +135,14 @@ type CompiledExpression = string | ControlFlowNode;
|
|
|
140
135
|
*/
|
|
141
136
|
type CompiledData = [variableNames: string[], ...expressions: CompiledExpression[]];
|
|
142
137
|
/**
|
|
143
|
-
*
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
source?: string;
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* 编译上下文接口(供编译器使用)
|
|
138
|
+
* 递归地去除 Proxify 包装
|
|
139
|
+
* 处理嵌套的对象和数组中的所有 Proxy 类型
|
|
140
|
+
* - 如果是 Proxify<T>,提取并返回 UnproxyDeep<T>
|
|
141
|
+
* - 如果是对象,递归处理每个属性
|
|
142
|
+
* - 如果是数组,递归处理元素
|
|
143
|
+
* - 其他情况返回原值
|
|
153
144
|
*/
|
|
154
|
-
|
|
155
|
-
variableOrder: string[];
|
|
156
|
-
nodeToIndex: Map<symbol, number>;
|
|
157
|
-
expressions: CompiledExpression[];
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* 从 Variable 推导值类型
|
|
161
|
-
* @template V - Variable 类型
|
|
162
|
-
*/
|
|
163
|
-
type InferVariableType<V> = V extends Variable<infer T> ? T : never;
|
|
164
|
-
/**
|
|
165
|
-
* 从上下文对象推导各项的类型
|
|
166
|
-
* @template C - 上下文对象类型
|
|
167
|
-
*/
|
|
168
|
-
type InferContextType<C> = { [K in keyof C]: C[K] extends Variable<infer T> ? T : C[K] extends Expression<unknown, infer R> ? R : never };
|
|
169
|
-
/**
|
|
170
|
-
* 从 Expression 推导结果类型
|
|
171
|
-
* @template E - Expression 类型
|
|
172
|
-
*/
|
|
173
|
-
type InferExpressionType<E> = E extends Expression<unknown, infer R> ? R : never;
|
|
145
|
+
type UnproxyDeep<T> = T extends ProxyExpression<infer U> ? UnproxyDeep<U> : T extends readonly (infer E)[] ? UnproxyDeep<E>[] : T extends object ? { [K in keyof T]: UnproxyDeep<T[K]> } : T;
|
|
174
146
|
/**
|
|
175
147
|
* Lambda 参数代理类型
|
|
176
148
|
* 与普通 Proxify<T> 相同,但标记为 lambda 参数
|
|
@@ -186,19 +158,19 @@ type Primitive = string | number | boolean | null | undefined | symbol | bigint;
|
|
|
186
158
|
*/
|
|
187
159
|
type DeepPartialProxy<T> = T extends Primitive ? T : T extends readonly (infer E)[] ? readonly (Proxify<E> | DeepPartialProxy<E>)[] : T extends object ? { [K in keyof T]: Proxify<T[K]> | DeepPartialProxy<T[K]> } : T;
|
|
188
160
|
/**
|
|
189
|
-
*
|
|
190
|
-
*
|
|
191
|
-
* - Proxify<
|
|
161
|
+
* 表达式值类型
|
|
162
|
+
* 支持:
|
|
163
|
+
* - Proxify<T>: 完整的代理表达式
|
|
192
164
|
* - 原始值: 字符串、数字等
|
|
193
165
|
* - 对象/数组: 可以混合 Proxy 值和原始值
|
|
194
166
|
*/
|
|
195
|
-
type
|
|
167
|
+
type ExprValue<T> = Proxify<T> | DeepPartialProxy<T>;
|
|
196
168
|
/**
|
|
197
169
|
* Lambda 构建函数签名
|
|
198
170
|
* @template Args - 参数类型元组
|
|
199
171
|
* @template R - 返回值类型
|
|
200
172
|
*/
|
|
201
|
-
type LambdaBuilder<Args extends unknown[], R> = (...params: { [K in keyof Args]: LambdaParam<Args[K]> }) =>
|
|
173
|
+
type LambdaBuilder<Args extends unknown[], R> = (...params: { [K in keyof Args]: LambdaParam<Args[K]> }) => ExprValue<R>;
|
|
202
174
|
/**
|
|
203
175
|
* Lambda 表达式类型
|
|
204
176
|
* 表示一个可序列化的函数
|
|
@@ -212,14 +184,6 @@ type InferLambdaArgs<L> = L extends Lambda<infer Args, unknown> ? Args : never;
|
|
|
212
184
|
* 从 Lambda 类型提取返回类型
|
|
213
185
|
*/
|
|
214
186
|
type InferLambdaReturn<L> = L extends Lambda<unknown[], infer R> ? R : never;
|
|
215
|
-
/**
|
|
216
|
-
* 常用 Lambda 类型别名
|
|
217
|
-
*/
|
|
218
|
-
type MapCallback<T, R> = Lambda<[T, number, T[]], R>;
|
|
219
|
-
type FilterCallback<T> = Lambda<[T, number, T[]], boolean>;
|
|
220
|
-
type ReduceCallback<T, R> = Lambda<[R, T, number, T[]], R>;
|
|
221
|
-
type FindCallback<T> = Lambda<[T, number, T[]], boolean>;
|
|
222
|
-
type SortCallback<T> = Lambda<[T, T], number>;
|
|
223
187
|
//#endregion
|
|
224
188
|
//#region src/compile.d.ts
|
|
225
189
|
/**
|
|
@@ -254,7 +218,7 @@ interface CompileOptions {
|
|
|
254
218
|
* // => [["x", "y"], "($0+$1)*$0"]
|
|
255
219
|
* ```
|
|
256
220
|
*/
|
|
257
|
-
declare function compile<TResult>(expression:
|
|
221
|
+
declare function compile<TResult>(expression: ExprValue<TResult>, variables: Record<string, unknown>, options?: CompileOptions): CompiledData;
|
|
258
222
|
//#endregion
|
|
259
223
|
//#region src/evaluate.d.ts
|
|
260
224
|
/**
|
|
@@ -286,7 +250,7 @@ type IsIdentifierChar<C extends string> = IsIdentifierStart<C> extends true ? tr
|
|
|
286
250
|
/** 是否是数字 */
|
|
287
251
|
type IsDigit<C extends string> = C extends "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ? true : false;
|
|
288
252
|
/** JS保留字和全局对象 */
|
|
289
|
-
type ReservedWords = "true" | "false" | "null" | "undefined" | "if" | "else" | "for" | "while" | "do" | "switch" | "case" | "break" | "continue" | "return" | "function" | "var" | "let" | "const" | "class" | "new" | "this" | "typeof" | "instanceof" |
|
|
253
|
+
type ReservedWords = "true" | "false" | "null" | "undefined" | "if" | "else" | "for" | "while" | "do" | "switch" | "case" | "break" | "continue" | "return" | "function" | "var" | "let" | "const" | "class" | "new" | "this" | "typeof" | "instanceof" | keyof GlobalTypeMap;
|
|
290
254
|
/** 解析一个标识符,返回 [标识符, 剩余字符串] */
|
|
291
255
|
type ParseIdentifier<S extends string, Acc extends string = ""> = S extends `${infer C}${infer Rest}` ? IsIdentifierChar<C> extends true ? ParseIdentifier<Rest, `${Acc}${C}`> : [Acc, S] : [Acc, S];
|
|
292
256
|
/** 跳过数字字面量 */
|
|
@@ -305,8 +269,8 @@ type SkipTemplateStringContent<S extends string> = S extends `\\\`${infer Rest}`
|
|
|
305
269
|
* 返回标识符的联合类型
|
|
306
270
|
*/
|
|
307
271
|
type ExtractIdentifiers<S extends string, Collected extends string = never> = S extends "" ? Collected : TrimStart<S> extends `${infer Trimmed}` ? Trimmed extends "" ? Collected : Trimmed extends `'${string}` ? ExtractIdentifiers<SkipSingleQuoteString<Trimmed>, Collected> : Trimmed extends `"${string}` ? ExtractIdentifiers<SkipDoubleQuoteString<Trimmed>, Collected> : Trimmed extends `\`${string}` ? ExtractIdentifiers<SkipTemplateString<Trimmed>, Collected> : Trimmed extends `${infer First}${infer Rest}` ? IsIdentifierStart<First> extends true ? ParseIdentifier<Trimmed> extends [infer Id extends string, infer Remaining extends string] ? Id extends ReservedWords ? ExtractIdentifiers<Remaining, Collected> : ExtractIdentifiers<Remaining, Collected | Id> : Collected : IsDigit<First> extends true ? ExtractIdentifiers<SkipNumber<Trimmed>, Collected> : ExtractIdentifiers<Rest, Collected> : Collected : Collected;
|
|
308
|
-
/** 从 Variable
|
|
309
|
-
type ExtractType<T> = T extends
|
|
272
|
+
/** 从 Variable 提取值类型 */
|
|
273
|
+
type ExtractType<T> = T extends ProxyExpression<infer V> ? V : T extends Variable<infer V> ? V : never;
|
|
310
274
|
/** 从上下文对象构建类型映射 */
|
|
311
275
|
type ContextTypeMap<TContext> = { [K in keyof TContext]: ExtractType<TContext[K]> };
|
|
312
276
|
/** 找出未定义的标识符 */
|
|
@@ -350,6 +314,11 @@ interface ASTMemberAccess<Obj = unknown, Prop extends string = string> {
|
|
|
350
314
|
object: Obj;
|
|
351
315
|
property: Prop;
|
|
352
316
|
}
|
|
317
|
+
interface ASTComputedMember<Obj = unknown, Index = unknown> {
|
|
318
|
+
type: "computed";
|
|
319
|
+
object: Obj;
|
|
320
|
+
index: Index;
|
|
321
|
+
}
|
|
353
322
|
interface ASTCall<Callee = unknown, Args extends unknown[] = unknown[]> {
|
|
354
323
|
type: "call";
|
|
355
324
|
callee: Callee;
|
|
@@ -358,6 +327,14 @@ interface ASTCall<Callee = unknown, Args extends unknown[] = unknown[]> {
|
|
|
358
327
|
interface ASTUnknown {
|
|
359
328
|
type: "unknown";
|
|
360
329
|
}
|
|
330
|
+
interface ASTArray<Elements extends unknown[] = unknown[]> {
|
|
331
|
+
type: "array";
|
|
332
|
+
elements: Elements;
|
|
333
|
+
}
|
|
334
|
+
interface ASTObject<Props extends Record<string, unknown> = Record<string, unknown>> {
|
|
335
|
+
type: "object";
|
|
336
|
+
properties: Props;
|
|
337
|
+
}
|
|
361
338
|
/** 运算符优先级(从低到高) */
|
|
362
339
|
/** 解析结果:[AST, 剩余字符串] */
|
|
363
340
|
type ParseResult<T, Rest extends string> = {
|
|
@@ -370,28 +347,46 @@ type ParseError = {
|
|
|
370
347
|
/** 解析三元表达式(最低优先级)- 右结合 */
|
|
371
348
|
type ParseTernary<S extends string> = ParseLogicalOr<TrimStart<S>> extends ParseResult<infer Left, infer Rest1> ? TrimStart<Rest1> extends `?${infer AfterQ}` ? ParseTernary<AfterQ> extends ParseResult<infer Then, infer Rest2> ? TrimStart<Rest2> extends `:${infer AfterColon}` ? ParseTernary<AfterColon> extends ParseResult<infer Else, infer Rest3> ? ParseResult<ASTTernary<Left, Then, Else>, Rest3> : ParseResult<Left, Rest1> : ParseResult<Left, Rest1> : ParseResult<Left, Rest1> : ParseResult<Left, Rest1> : ParseError;
|
|
372
349
|
/** 解析逻辑或 || */
|
|
373
|
-
type ParseLogicalOr<S extends string> =
|
|
374
|
-
type ParseLogicalOrTail<Left, S extends string> = TrimStart<S> extends `||${infer Rest}` ?
|
|
350
|
+
type ParseLogicalOr<S extends string> = ParseNullishCoalescing<TrimStart<S>> extends ParseResult<infer Left, infer Rest> ? ParseLogicalOrTail<Left, Rest> : ParseError;
|
|
351
|
+
type ParseLogicalOrTail<Left, S extends string> = TrimStart<S> extends `||${infer Rest}` ? ParseNullishCoalescing<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseLogicalOrTail<ASTBinary<"||", Left, Right>, Rest2> : ParseResult<Left, S> : ParseResult<Left, S>;
|
|
352
|
+
/** 解析空值合并 ?? */
|
|
353
|
+
type ParseNullishCoalescing<S extends string> = ParseLogicalAnd<TrimStart<S>> extends ParseResult<infer Left, infer Rest> ? ParseNullishCoalescingTail<Left, Rest> : ParseError;
|
|
354
|
+
type ParseNullishCoalescingTail<Left, S extends string> = TrimStart<S> extends `??${infer Rest}` ? ParseLogicalAnd<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseNullishCoalescingTail<ASTBinary<"??", Left, Right>, Rest2> : ParseResult<Left, S> : ParseResult<Left, S>;
|
|
375
355
|
/** 解析逻辑与 && */
|
|
376
|
-
type ParseLogicalAnd<S extends string> =
|
|
377
|
-
type ParseLogicalAndTail<Left, S extends string> = TrimStart<S> extends `&&${infer Rest}` ?
|
|
356
|
+
type ParseLogicalAnd<S extends string> = ParseBitwiseOr<TrimStart<S>> extends ParseResult<infer Left, infer Rest> ? ParseLogicalAndTail<Left, Rest> : ParseError;
|
|
357
|
+
type ParseLogicalAndTail<Left, S extends string> = TrimStart<S> extends `&&${infer Rest}` ? ParseBitwiseOr<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseLogicalAndTail<ASTBinary<"&&", Left, Right>, Rest2> : ParseResult<Left, S> : ParseResult<Left, S>;
|
|
358
|
+
/** 解析位或 | */
|
|
359
|
+
type ParseBitwiseOr<S extends string> = ParseBitwiseXor<TrimStart<S>> extends ParseResult<infer Left, infer Rest> ? ParseBitwiseOrTail<Left, Rest> : ParseError;
|
|
360
|
+
type ParseBitwiseOrTail<Left, S extends string> = TrimStart<S> extends `|${infer Rest}` ? Rest extends `|${string}` ? ParseResult<Left, S> : ParseBitwiseXor<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseBitwiseOrTail<ASTBinary<"|", Left, Right>, Rest2> : ParseResult<Left, S> : ParseResult<Left, S>;
|
|
361
|
+
/** 解析位异或 ^ */
|
|
362
|
+
type ParseBitwiseXor<S extends string> = ParseBitwiseAnd<TrimStart<S>> extends ParseResult<infer Left, infer Rest> ? ParseBitwiseXorTail<Left, Rest> : ParseError;
|
|
363
|
+
type ParseBitwiseXorTail<Left, S extends string> = TrimStart<S> extends `^${infer Rest}` ? ParseBitwiseAnd<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseBitwiseXorTail<ASTBinary<"^", Left, Right>, Rest2> : ParseResult<Left, S> : ParseResult<Left, S>;
|
|
364
|
+
/** 解析位与 & */
|
|
365
|
+
type ParseBitwiseAnd<S extends string> = ParseEquality<TrimStart<S>> extends ParseResult<infer Left, infer Rest> ? ParseBitwiseAndTail<Left, Rest> : ParseError;
|
|
366
|
+
type ParseBitwiseAndTail<Left, S extends string> = TrimStart<S> extends `&${infer Rest}` ? Rest extends `&${string}` ? ParseResult<Left, S> : ParseEquality<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseBitwiseAndTail<ASTBinary<"&", Left, Right>, Rest2> : ParseResult<Left, S> : ParseResult<Left, S>;
|
|
378
367
|
/** 解析相等性运算符 */
|
|
379
368
|
type ParseEquality<S extends string> = ParseComparison<TrimStart<S>> extends ParseResult<infer Left, infer Rest> ? ParseEqualityTail<Left, Rest> : ParseError;
|
|
380
369
|
type ParseEqualityTail<Left, S extends string> = TrimStart<S> extends `===${infer Rest}` ? ParseComparison<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseEqualityTail<ASTBinary<"===", Left, Right>, Rest2> : ParseResult<Left, S> : TrimStart<S> extends `!==${infer Rest}` ? ParseComparison<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseEqualityTail<ASTBinary<"!==", Left, Right>, Rest2> : ParseResult<Left, S> : TrimStart<S> extends `==${infer Rest}` ? Rest extends `=${string}` ? ParseResult<Left, S> : ParseComparison<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseEqualityTail<ASTBinary<"==", Left, Right>, Rest2> : ParseResult<Left, S> : TrimStart<S> extends `!=${infer Rest}` ? Rest extends `=${string}` ? ParseResult<Left, S> : ParseComparison<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseEqualityTail<ASTBinary<"!=", Left, Right>, Rest2> : ParseResult<Left, S> : ParseResult<Left, S>;
|
|
381
370
|
/** 解析比较运算符 */
|
|
382
|
-
type ParseComparison<S extends string> =
|
|
383
|
-
type ParseComparisonTail<Left, S extends string> = TrimStart<S> extends `<=${infer Rest}` ?
|
|
371
|
+
type ParseComparison<S extends string> = ParseShift<TrimStart<S>> extends ParseResult<infer Left, infer Rest> ? ParseComparisonTail<Left, Rest> : ParseError;
|
|
372
|
+
type ParseComparisonTail<Left, S extends string> = TrimStart<S> extends `<=${infer Rest}` ? ParseShift<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseComparisonTail<ASTBinary<"<=", Left, Right>, Rest2> : ParseResult<Left, S> : TrimStart<S> extends `>=${infer Rest}` ? ParseShift<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseComparisonTail<ASTBinary<">=", Left, Right>, Rest2> : ParseResult<Left, S> : TrimStart<S> extends `<${infer Rest}` ? Rest extends `=${string}` | `<${string}` ? ParseResult<Left, S> : ParseShift<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseComparisonTail<ASTBinary<"<", Left, Right>, Rest2> : ParseResult<Left, S> : TrimStart<S> extends `>${infer Rest}` ? Rest extends `=${string}` | `>${string}` ? ParseResult<Left, S> : ParseShift<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseComparisonTail<ASTBinary<">", Left, Right>, Rest2> : ParseResult<Left, S> : TrimStart<S> extends `in${infer Rest}` ? IsIdentifierChar<Rest extends `${infer C}${string}` ? C : ""> extends true ? ParseResult<Left, S> : ParseShift<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseComparisonTail<ASTBinary<"in", Left, Right>, Rest2> : ParseResult<Left, S> : TrimStart<S> extends `instanceof${infer Rest}` ? IsIdentifierChar<Rest extends `${infer C}${string}` ? C : ""> extends true ? ParseResult<Left, S> : ParseShift<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseComparisonTail<ASTBinary<"instanceof", Left, Right>, Rest2> : ParseResult<Left, S> : ParseResult<Left, S>;
|
|
373
|
+
/** 解析位移运算符 */
|
|
374
|
+
type ParseShift<S extends string> = ParseAdditive<TrimStart<S>> extends ParseResult<infer Left, infer Rest> ? ParseShiftTail<Left, Rest> : ParseError;
|
|
375
|
+
type ParseShiftTail<Left, S extends string> = TrimStart<S> extends `<<${infer Rest}` ? ParseAdditive<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseShiftTail<ASTBinary<"<<", Left, Right>, Rest2> : ParseResult<Left, S> : TrimStart<S> extends `>>>${infer Rest}` ? ParseAdditive<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseShiftTail<ASTBinary<">>>", Left, Right>, Rest2> : ParseResult<Left, S> : TrimStart<S> extends `>>${infer Rest}` ? ParseAdditive<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseShiftTail<ASTBinary<">>", Left, Right>, Rest2> : ParseResult<Left, S> : ParseResult<Left, S>;
|
|
384
376
|
/** 解析加减运算符 */
|
|
385
377
|
type ParseAdditive<S extends string> = ParseMultiplicative<TrimStart<S>> extends ParseResult<infer Left, infer Rest> ? ParseAdditiveTail<Left, Rest> : ParseError;
|
|
386
378
|
type ParseAdditiveTail<Left, S extends string> = TrimStart<S> extends `+${infer Rest}` ? ParseMultiplicative<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseAdditiveTail<ASTBinary<"+", Left, Right>, Rest2> : ParseResult<Left, S> : TrimStart<S> extends `-${infer Rest}` ? ParseMultiplicative<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseAdditiveTail<ASTBinary<"-", Left, Right>, Rest2> : ParseResult<Left, S> : ParseResult<Left, S>;
|
|
387
379
|
/** 解析乘除运算符 */
|
|
388
|
-
type ParseMultiplicative<S extends string> =
|
|
389
|
-
type ParseMultiplicativeTail<Left, S extends string> = TrimStart<S> extends `*${infer Rest}` ?
|
|
380
|
+
type ParseMultiplicative<S extends string> = ParseExponentiation<TrimStart<S>> extends ParseResult<infer Left, infer Rest> ? ParseMultiplicativeTail<Left, Rest> : ParseError;
|
|
381
|
+
type ParseMultiplicativeTail<Left, S extends string> = TrimStart<S> extends `*${infer Rest}` ? Rest extends `*${string}` ? ParseResult<Left, S> : ParseExponentiation<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseMultiplicativeTail<ASTBinary<"*", Left, Right>, Rest2> : ParseResult<Left, S> : TrimStart<S> extends `/${infer Rest}` ? ParseExponentiation<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseMultiplicativeTail<ASTBinary<"/", Left, Right>, Rest2> : ParseResult<Left, S> : TrimStart<S> extends `%${infer Rest}` ? ParseExponentiation<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseMultiplicativeTail<ASTBinary<"%", Left, Right>, Rest2> : ParseResult<Left, S> : ParseResult<Left, S>;
|
|
382
|
+
/** 解析幂运算符(右结合) */
|
|
383
|
+
type ParseExponentiation<S extends string> = ParseUnary<TrimStart<S>> extends ParseResult<infer Left, infer Rest> ? ParseExponentiationTail<Left, Rest> : ParseError;
|
|
384
|
+
type ParseExponentiationTail<Left, S extends string> = TrimStart<S> extends `**${infer Rest}` ? ParseExponentiation<Rest> extends ParseResult<infer Right, infer Rest2> ? ParseResult<ASTBinary<"**", Left, Right>, Rest2> : ParseResult<Left, S> : ParseResult<Left, S>;
|
|
390
385
|
/** 解析一元运算符 */
|
|
391
|
-
type ParseUnary<S extends string> = TrimStart<S> extends `!${infer Rest}` ? ParseUnary<Rest> extends ParseResult<infer Operand, infer Rest2> ? ParseResult<ASTUnary<"!", Operand>, Rest2> : ParseError : TrimStart<S> extends `-${infer Rest}` ? IsDigit<Rest extends `${infer C}${string}` ? C : ""> extends true ? ParsePostfix<S> : ParseUnary<Rest> extends ParseResult<infer Operand, infer Rest2> ? ParseResult<ASTUnary<"-", Operand>, Rest2> : ParseError : TrimStart<S> extends `+${infer Rest}` ? ParseUnary<Rest> extends ParseResult<infer Operand, infer Rest2> ? ParseResult<ASTUnary<"+", Operand>, Rest2> : ParseError : ParsePostfix<S>;
|
|
386
|
+
type ParseUnary<S extends string> = TrimStart<S> extends `!${infer Rest}` ? ParseUnary<Rest> extends ParseResult<infer Operand, infer Rest2> ? ParseResult<ASTUnary<"!", Operand>, Rest2> : ParseError : TrimStart<S> extends `~${infer Rest}` ? ParseUnary<Rest> extends ParseResult<infer Operand, infer Rest2> ? ParseResult<ASTUnary<"~", Operand>, Rest2> : ParseError : TrimStart<S> extends `typeof${infer Rest}` ? IsIdentifierChar<Rest extends `${infer C}${string}` ? C : ""> extends true ? ParseError : ParseUnary<Rest> extends ParseResult<infer Operand, infer Rest2> ? ParseResult<ASTUnary<"typeof", Operand>, Rest2> : ParseError : TrimStart<S> extends `void${infer Rest}` ? IsIdentifierChar<Rest extends `${infer C}${string}` ? C : ""> extends true ? ParseError : ParseUnary<Rest> extends ParseResult<infer Operand, infer Rest2> ? ParseResult<ASTUnary<"void", Operand>, Rest2> : ParseError : TrimStart<S> extends `-${infer Rest}` ? IsDigit<Rest extends `${infer C}${string}` ? C : ""> extends true ? ParsePostfix<S> : ParseUnary<Rest> extends ParseResult<infer Operand, infer Rest2> ? ParseResult<ASTUnary<"-", Operand>, Rest2> : ParseError : TrimStart<S> extends `+${infer Rest}` ? ParseUnary<Rest> extends ParseResult<infer Operand, infer Rest2> ? ParseResult<ASTUnary<"+", Operand>, Rest2> : ParseError : ParsePostfix<S>;
|
|
392
387
|
/** 解析后缀运算符(成员访问、函数调用) */
|
|
393
388
|
type ParsePostfix<S extends string> = ParsePrimary<TrimStart<S>> extends ParseResult<infer Base, infer Rest> ? ParsePostfixTail<Base, Rest> : ParseError;
|
|
394
|
-
type ParsePostfixTail<Base, S extends string> = TrimStart<S> extends `.${infer Rest}` ? ParseIdentifier<TrimStart<Rest>> extends [infer Prop extends string, infer Rest2 extends string] ? Prop extends "" ? ParseResult<Base, S> : ParsePostfixTail<ASTMemberAccess<Base, Prop>, Rest2> : ParseResult<Base, S> : TrimStart<S> extends `[${infer Rest}` ? ParseTernary<Rest> extends ParseResult<infer
|
|
389
|
+
type ParsePostfixTail<Base, S extends string> = TrimStart<S> extends `.${infer Rest}` ? ParseIdentifier<TrimStart<Rest>> extends [infer Prop extends string, infer Rest2 extends string] ? Prop extends "" ? ParseResult<Base, S> : ParsePostfixTail<ASTMemberAccess<Base, Prop>, Rest2> : ParseResult<Base, S> : TrimStart<S> extends `[${infer Rest}` ? ParseTernary<Rest> extends ParseResult<infer Index, infer Rest2> ? TrimStart<Rest2> extends `]${infer Rest3}` ? ParsePostfixTail<ASTComputedMember<Base, Index>, Rest3> : ParseResult<Base, S> : ParseResult<Base, S> : TrimStart<S> extends `(${infer Rest}` ? ParseCallArgs<Rest> extends {
|
|
395
390
|
args: infer Args extends unknown[];
|
|
396
391
|
rest: infer Rest2 extends string;
|
|
397
392
|
} ? ParsePostfixTail<ASTCall<Base, Args>, Rest2> : ParseResult<Base, S> : ParseResult<Base, S>;
|
|
@@ -411,8 +406,26 @@ type ParseCallArgs<S extends string, Args extends unknown[] = []> = TrimStart<S>
|
|
|
411
406
|
};
|
|
412
407
|
/** 解析数字字面量,返回 [数字字符串, 剩余] */
|
|
413
408
|
type ParseNumberLiteral<S extends string, Acc extends string = ""> = S extends `${infer C}${infer Rest}` ? C extends "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "." ? ParseNumberLiteral<Rest, `${Acc}${C}`> : [Acc, S] : [Acc, S];
|
|
409
|
+
/** 解析数组字面量 */
|
|
410
|
+
type ParseArrayLiteral<S extends string, Elements extends unknown[] = []> = TrimStart<S> extends `]${infer Rest}` ? ParseResult<ASTArray<Elements>, Rest> : ParseTernary<S> extends ParseResult<infer Element, infer Rest> ? TrimStart<Rest> extends `,${infer Rest2}` ? ParseArrayLiteral<Rest2, [...Elements, Element]> : TrimStart<Rest> extends `]${infer Rest2}` ? ParseResult<ASTArray<[...Elements, Element]>, Rest2> : ParseError : ParseError;
|
|
411
|
+
/** 解析对象属性键 */
|
|
412
|
+
type ParseObjectKey<S extends string> = TrimStart<S> extends `'${infer _}` ? SkipSingleQuoteStringContent<TrimStart<S> extends `'${infer Rest}` ? Rest : never> extends `${infer Rest}` ? TrimStart<S> extends `'${infer Key}'${infer _Rest}` ? {
|
|
413
|
+
key: Key;
|
|
414
|
+
rest: Rest;
|
|
415
|
+
} : never : never : TrimStart<S> extends `"${infer _}` ? SkipDoubleQuoteStringContent<TrimStart<S> extends `"${infer Rest}` ? Rest : never> extends `${infer Rest}` ? TrimStart<S> extends `"${infer Key}"${infer _Rest}` ? {
|
|
416
|
+
key: Key;
|
|
417
|
+
rest: Rest;
|
|
418
|
+
} : never : never : ParseIdentifier<TrimStart<S>> extends [infer Key extends string, infer Rest extends string] ? Key extends "" ? never : {
|
|
419
|
+
key: Key;
|
|
420
|
+
rest: Rest;
|
|
421
|
+
} : never;
|
|
422
|
+
/** 解析对象字面量 */
|
|
423
|
+
type ParseObjectLiteral<S extends string, Props extends Record<string, unknown> = {}> = TrimStart<S> extends `}${infer Rest}` ? ParseResult<ASTObject<Props>, Rest> : ParseObjectKey<S> extends {
|
|
424
|
+
key: infer Key extends string;
|
|
425
|
+
rest: infer Rest1 extends string;
|
|
426
|
+
} ? TrimStart<Rest1> extends `:${infer Rest2}` ? ParseTernary<Rest2> extends ParseResult<infer Value, infer Rest3> ? TrimStart<Rest3> extends `,${infer Rest4}` ? ParseObjectLiteral<Rest4, Props & Record<Key, Value>> : TrimStart<Rest3> extends `}${infer Rest4}` ? ParseResult<ASTObject<Props & Record<Key, Value>>, Rest4> : ParseError : ParseError : ParseError : ParseError;
|
|
414
427
|
/** 解析主表达式 */
|
|
415
|
-
type ParsePrimary<S extends string> = TrimStart<S> extends `(${infer Rest}` ? ParseTernary<Rest> extends ParseResult<infer Inner, infer Rest2> ? TrimStart<Rest2> extends `)${infer Rest3}` ? ParseResult<ASTParen<Inner>, Rest3> : ParseError : ParseError : TrimStart<S> extends `true${infer Rest}` ? IsIdentifierChar<Rest extends `${infer C}${string}` ? C : ""> extends true ? ParseIdentifierPrimary<S> : ParseResult<ASTBoolean, Rest> : TrimStart<S> extends `false${infer Rest}` ? IsIdentifierChar<Rest extends `${infer C}${string}` ? C : ""> extends true ? ParseIdentifierPrimary<S> : ParseResult<ASTBoolean, Rest> : TrimStart<S> extends `${infer C}${infer __Rest}` ? IsDigit<C> extends true ? ParseNumberLiteral<TrimStart<S>> extends [infer __Num, infer Rest2 extends string] ? ParseResult<ASTNumber, Rest2> : ParseError : C extends "-" ? TrimStart<__Rest> extends `${infer C2}${string}` ? IsDigit<C2> extends true ? ParseNumberLiteral<TrimStart<__Rest>> extends [infer __Num, infer Rest2 extends string] ? ParseResult<ASTNumber, Rest2> : ParseError : ParseError : ParseError : C extends "'" | '"' | "`" ? ParseStringLiteral<TrimStart<S>> extends {
|
|
428
|
+
type ParsePrimary<S extends string> = TrimStart<S> extends `(${infer Rest}` ? ParseTernary<Rest> extends ParseResult<infer Inner, infer Rest2> ? TrimStart<Rest2> extends `)${infer Rest3}` ? ParseResult<ASTParen<Inner>, Rest3> : ParseError : ParseError : TrimStart<S> extends `[${infer Rest}` ? ParseArrayLiteral<Rest> : TrimStart<S> extends `{${infer Rest}` ? ParseObjectLiteral<Rest> : TrimStart<S> extends `true${infer Rest}` ? IsIdentifierChar<Rest extends `${infer C}${string}` ? C : ""> extends true ? ParseIdentifierPrimary<S> : ParseResult<ASTBoolean, Rest> : TrimStart<S> extends `false${infer Rest}` ? IsIdentifierChar<Rest extends `${infer C}${string}` ? C : ""> extends true ? ParseIdentifierPrimary<S> : ParseResult<ASTBoolean, Rest> : TrimStart<S> extends `${infer C}${infer __Rest}` ? IsDigit<C> extends true ? ParseNumberLiteral<TrimStart<S>> extends [infer __Num, infer Rest2 extends string] ? ParseResult<ASTNumber, Rest2> : ParseError : C extends "-" ? TrimStart<__Rest> extends `${infer C2}${string}` ? IsDigit<C2> extends true ? ParseNumberLiteral<TrimStart<__Rest>> extends [infer __Num, infer Rest2 extends string] ? ParseResult<ASTNumber, Rest2> : ParseError : ParseError : ParseError : C extends "'" | '"' | "`" ? ParseStringLiteral<TrimStart<S>> extends {
|
|
416
429
|
rest: infer Rest2 extends string;
|
|
417
430
|
} ? ParseResult<ASTString, Rest2> : ParseError : IsIdentifierStart<C> extends true ? ParseIdentifierPrimary<S> : ParseError : ParseError;
|
|
418
431
|
type ParseIdentifierPrimary<S extends string> = ParseIdentifier<TrimStart<S>> extends [infer Name extends string, infer Rest extends string] ? Name extends "" ? ParseError : ParseResult<ASTIdentifier<Name>, Rest> : ParseError;
|
|
@@ -425,16 +438,43 @@ type ParseStringLiteral<S extends string> = S extends `'${infer __}` ? {
|
|
|
425
438
|
} : never;
|
|
426
439
|
/** 解析表达式入口 */
|
|
427
440
|
type ParseExpression<S extends string> = ParseTernary<S> extends ParseResult<infer AST, infer Rest> ? TrimStart<Rest> extends "" ? AST : ASTUnknown : ASTUnknown;
|
|
441
|
+
/** 推导数组元素类型 */
|
|
442
|
+
type InferArrayElements<Elements extends unknown[], TypeMap, Result extends unknown[] = []> = Elements extends [infer First, ...infer Rest] ? InferArrayElements<Rest, TypeMap, [...Result, InferTypeFromAST<First, TypeMap>]> : Result;
|
|
443
|
+
/** 推导对象属性类型 */
|
|
444
|
+
type InferObjectProperties<Props, TypeMap> = { [K in keyof Props]: InferTypeFromAST<Props[K], TypeMap> };
|
|
428
445
|
/** 从 AST 推导类型 */
|
|
429
|
-
type InferTypeFromAST<AST, TypeMap> = AST extends ASTNumber ? number : AST extends ASTString ? string : AST extends ASTBoolean ? boolean : AST extends ASTIdentifier<infer Name> ? Name extends keyof TypeMap ? TypeMap[Name] : unknown : AST extends ASTUnary<infer Op, infer __Operand> ? InferUnaryType<Op, InferTypeFromAST<__Operand, TypeMap>> : AST extends ASTBinary<infer Op, infer Left, infer Right> ? InferBinaryType<Op, InferTypeFromAST<Left, TypeMap>, InferTypeFromAST<Right, TypeMap>> : AST extends ASTTernary<infer __Cond, infer Then, infer Else> ? InferTypeFromAST<Then, TypeMap> | InferTypeFromAST<Else, TypeMap> : AST extends ASTParen<infer Inner> ? InferTypeFromAST<Inner, TypeMap> : AST extends ASTMemberAccess<infer Obj, infer Prop> ? InferMemberType<InferTypeFromAST<Obj, TypeMap>, Prop> : AST extends ASTCall<infer Callee, infer __Args> ? InferCallType<InferTypeFromAST<Callee, TypeMap>> : unknown;
|
|
446
|
+
type InferTypeFromAST<AST, TypeMap> = AST extends ASTNumber ? number : AST extends ASTString ? string : AST extends ASTBoolean ? boolean : AST extends ASTArray<infer Elements> ? InferArrayElements<Elements, TypeMap> : AST extends ASTObject<infer Props> ? InferObjectProperties<Props, TypeMap> : AST extends ASTIdentifier<infer Name> ? Name extends keyof GlobalTypeMap ? GlobalTypeMap[Name] : Name extends keyof TypeMap ? TypeMap[Name] : unknown : AST extends ASTUnary<infer Op, infer __Operand> ? InferUnaryType<Op, InferTypeFromAST<__Operand, TypeMap>> : AST extends ASTBinary<infer Op, infer Left, infer Right> ? InferBinaryType<Op, InferTypeFromAST<Left, TypeMap>, InferTypeFromAST<Right, TypeMap>> : AST extends ASTTernary<infer __Cond, infer Then, infer Else> ? InferTypeFromAST<Then, TypeMap> | InferTypeFromAST<Else, TypeMap> : AST extends ASTParen<infer Inner> ? InferTypeFromAST<Inner, TypeMap> : AST extends ASTMemberAccess<infer Obj, infer Prop> ? InferMemberType<InferTypeFromAST<Obj, TypeMap>, Prop> : AST extends ASTComputedMember<infer Obj, infer _Index> ? InferComputedMemberType<InferTypeFromAST<Obj, TypeMap>> : AST extends ASTCall<infer Callee, infer __Args> ? InferCallType<InferTypeFromAST<Callee, TypeMap>> : unknown;
|
|
430
447
|
/** 一元运算符类型推导 */
|
|
431
|
-
type InferUnaryType<Op extends string, __Operand> = Op extends "!" ? boolean : Op extends "-" | "+" ? number : unknown;
|
|
448
|
+
type InferUnaryType<Op extends string, __Operand> = Op extends "!" ? boolean : Op extends "-" | "+" ? number : Op extends "typeof" ? string : Op extends "~" ? number : unknown;
|
|
432
449
|
/** 二元运算符类型推导 */
|
|
433
|
-
type InferBinaryType<Op extends string, Left, Right> = Op extends "+" ? Left extends string ? Right extends string ? string : string | number : Right extends string ? string | number : Left extends number ? Right extends number ? number : number | string : unknown : Op extends "-" | "*" | "/" | "%" ? number : Op extends "<" | ">" | "<=" | ">=" | "==" | "!=" | "===" | "!==" ? boolean : Op extends "&&" ? Left extends false ? Left : Right : Op extends "||" ? Left extends true ? Left : Right : unknown;
|
|
434
|
-
/** 成员访问类型推导 */
|
|
435
|
-
type InferMemberType<Obj, Prop extends string> =
|
|
450
|
+
type InferBinaryType<Op extends string, Left, Right> = Op extends "+" ? Left extends string ? Right extends string ? string : string | number : Right extends string ? string | number : Left extends bigint ? Right extends bigint ? bigint : unknown : Left extends number ? Right extends number ? number : number | string : unknown : Op extends "-" | "*" | "/" | "%" | "**" ? Left extends bigint ? Right extends bigint ? bigint : unknown : number : Op extends "&" | "|" | "^" | "<<" | ">>" | ">>>" ? Left extends bigint ? Right extends bigint ? bigint : unknown : number : Op extends "<" | ">" | "<=" | ">=" | "==" | "!=" | "===" | "!==" | "in" | "instanceof" ? boolean : Op extends "&&" ? Left extends false ? Left : Right : Op extends "||" ? Left extends true ? Left : Right : Op extends "??" ? Left extends null | undefined ? Right : Exclude<Left, null | undefined> | Right : unknown;
|
|
451
|
+
/** 成员访问类型推导 - 分布式处理联合类型,跳过 null/undefined */
|
|
452
|
+
type InferMemberType<Obj, Prop extends string> = Prop extends keyof NonNullable<Obj> ? NonNullable<Obj>[Prop] : unknown;
|
|
453
|
+
/** 计算属性访问类型推导 */
|
|
454
|
+
type InferComputedMemberType<Obj> = Obj extends readonly (infer T)[] ? T : Obj extends {
|
|
455
|
+
[index: number]: infer T;
|
|
456
|
+
} ? T : Obj extends Record<string, infer V> ? V : unknown;
|
|
436
457
|
/** 函数调用类型推导 */
|
|
437
|
-
type InferCallType<Callee> = Callee extends ((...args:
|
|
458
|
+
type InferCallType<Callee> = Callee extends ((...args: any[]) => infer R) ? R : unknown;
|
|
459
|
+
/** 全局类型映射 */
|
|
460
|
+
interface GlobalTypeMap {
|
|
461
|
+
Math: Math;
|
|
462
|
+
JSON: JSON;
|
|
463
|
+
Number: NumberConstructor;
|
|
464
|
+
String: StringConstructor;
|
|
465
|
+
Boolean: BooleanConstructor;
|
|
466
|
+
Array: ArrayConstructor;
|
|
467
|
+
Object: ObjectConstructor;
|
|
468
|
+
Date: DateConstructor;
|
|
469
|
+
RegExp: RegExpConstructor;
|
|
470
|
+
undefined: undefined;
|
|
471
|
+
NaN: number;
|
|
472
|
+
Infinity: number;
|
|
473
|
+
parseInt: typeof globalThis.parseInt;
|
|
474
|
+
parseFloat: typeof globalThis.parseFloat;
|
|
475
|
+
isNaN: typeof globalThis.isNaN;
|
|
476
|
+
isFinite: typeof globalThis.isFinite;
|
|
477
|
+
}
|
|
438
478
|
/** 表达式验证结果 */
|
|
439
479
|
type ValidateExpression<Source extends string, TContext> = ExtractIdentifiers<Source> extends infer Ids extends string ? keyof TContext extends infer Keys extends string ? FindUndefinedIdentifiers<Ids, Keys> extends never ? true : {
|
|
440
480
|
error: "undefined_identifiers";
|
|
@@ -446,8 +486,6 @@ type ValidateExpression<Source extends string, TContext> = ExtractIdentifiers<So
|
|
|
446
486
|
};
|
|
447
487
|
/** 从表达式推导返回类型 */
|
|
448
488
|
type InferExpressionResult<Source extends string, TContext> = InferTypeFromAST<ParseExpression<Source>, ContextTypeMap<TContext>>;
|
|
449
|
-
/** 验证并推导表达式类型 */
|
|
450
|
-
type ExpressionType<Source extends string, TContext> = ValidateExpression<Source, TContext> extends true ? InferExpressionResult<Source, TContext> : ValidateExpression<Source, TContext>;
|
|
451
489
|
//#endregion
|
|
452
490
|
//#region src/expr.d.ts
|
|
453
491
|
/**
|
|
@@ -500,20 +538,6 @@ declare function expr<TContext extends Record<string, unknown>>(context: TContex
|
|
|
500
538
|
*/
|
|
501
539
|
declare function lambda<Args extends unknown[], R>(builder: LambdaBuilder<Args, R>): Lambda<Args, R>;
|
|
502
540
|
//#endregion
|
|
503
|
-
//#region src/proxy-metadata.d.ts
|
|
504
|
-
/**
|
|
505
|
-
* 检查对象是否是 Proxy variable
|
|
506
|
-
*/
|
|
507
|
-
declare function isProxyVariable(obj: unknown): obj is object;
|
|
508
|
-
/**
|
|
509
|
-
* 检查对象是否是 Proxy expression
|
|
510
|
-
*/
|
|
511
|
-
declare function isProxyExpression(obj: unknown): obj is object;
|
|
512
|
-
/**
|
|
513
|
-
* 检查对象是否是任意 Proxy (variable 或 expression)
|
|
514
|
-
*/
|
|
515
|
-
declare function isProxy(obj: unknown): obj is object;
|
|
516
|
-
//#endregion
|
|
517
541
|
//#region src/template.d.ts
|
|
518
542
|
/**
|
|
519
543
|
* Tagged template 函数,用于创建包含变量的字符串表达式
|
|
@@ -532,6 +556,35 @@ declare function isProxy(obj: unknown): obj is object;
|
|
|
532
556
|
*/
|
|
533
557
|
declare function t(strings: TemplateStringsArray, ...values: unknown[]): Proxify<string>;
|
|
534
558
|
//#endregion
|
|
559
|
+
//#region src/test-helper.d.ts
|
|
560
|
+
/**
|
|
561
|
+
* 从变量映射推导值类型
|
|
562
|
+
* 例如: { x: Variable<number> } -> { x: number }
|
|
563
|
+
*/
|
|
564
|
+
type InferVariableValues<T extends Record<string, Variable<unknown>>> = { [K in keyof T]: T[K] extends Variable<infer U> ? U : never };
|
|
565
|
+
/**
|
|
566
|
+
* 编译并求值表达式
|
|
567
|
+
* 自动推导变量类型和返回类型
|
|
568
|
+
*
|
|
569
|
+
* @template TResult - 表达式求值结果类型
|
|
570
|
+
* @template TVars - 变量映射类型
|
|
571
|
+
* @param expr - 要编译的表达式
|
|
572
|
+
* @param variables - 变量定义映射
|
|
573
|
+
* @param values - 变量值映射
|
|
574
|
+
* @returns 表达式求值结果
|
|
575
|
+
*
|
|
576
|
+
* @example
|
|
577
|
+
* ```ts
|
|
578
|
+
* const callback = variable<(f: (x: number) => number) => number>();
|
|
579
|
+
* const result = compileAndEvaluate(
|
|
580
|
+
* myExpr,
|
|
581
|
+
* { callback },
|
|
582
|
+
* { callback: (fn) => fn(5) }
|
|
583
|
+
* );
|
|
584
|
+
* ```
|
|
585
|
+
*/
|
|
586
|
+
declare function compileAndEvaluate<TResult = unknown, TVars extends Record<string, Variable<unknown>> = Record<string, Variable<unknown>>>(expr: ExprValue<TResult>, variables: TVars, values: InferVariableValues<TVars>, options?: CompileOptions): UnproxyDeep<TResult>;
|
|
587
|
+
//#endregion
|
|
535
588
|
//#region src/variable.d.ts
|
|
536
589
|
/**
|
|
537
590
|
* 创建一个类型化变量
|
|
@@ -545,10 +598,6 @@ declare function t(strings: TemplateStringsArray, ...values: unknown[]): Proxify
|
|
|
545
598
|
* ```
|
|
546
599
|
*/
|
|
547
600
|
declare function variable<T>(): Variable<T>;
|
|
548
|
-
/**
|
|
549
|
-
* 获取 variable 的唯一 Symbol ID
|
|
550
|
-
*/
|
|
551
|
-
declare function getVariableId(variable: unknown): symbol | undefined;
|
|
552
601
|
//#endregion
|
|
553
602
|
//#region src/wrap.d.ts
|
|
554
603
|
/**
|
|
@@ -577,5 +626,5 @@ declare function getVariableId(variable: unknown): symbol | undefined;
|
|
|
577
626
|
*/
|
|
578
627
|
declare function wrap<T>(value: T): Proxify<T>;
|
|
579
628
|
//#endregion
|
|
580
|
-
export { type
|
|
629
|
+
export { type CompileOptions, type CompiledData, type CompiledExpression, type ExprValue, type InferLambdaArgs, type InferLambdaReturn, type Lambda, type LambdaBuilder, type Proxify, type ProxyExpression, type Variable, compile, compileAndEvaluate, evaluate, expr, lambda, t, variable, wrap };
|
|
581
630
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.mjs
CHANGED
|
@@ -333,27 +333,6 @@ function setProxyMetadata(proxy, metadata) {
|
|
|
333
333
|
function getProxyMetadata(proxy) {
|
|
334
334
|
return proxyMetadata.get(proxy);
|
|
335
335
|
}
|
|
336
|
-
/**
|
|
337
|
-
* 检查对象是否是 Proxy variable
|
|
338
|
-
*/
|
|
339
|
-
function isProxyVariable(obj) {
|
|
340
|
-
if (typeof obj !== "object" && typeof obj !== "function" || obj === null) return false;
|
|
341
|
-
return proxyMetadata.get(obj)?.type === "variable";
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* 检查对象是否是 Proxy expression
|
|
345
|
-
*/
|
|
346
|
-
function isProxyExpression(obj) {
|
|
347
|
-
if (typeof obj !== "object" && typeof obj !== "function" || obj === null) return false;
|
|
348
|
-
return proxyMetadata.get(obj)?.type === "expression";
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* 检查对象是否是任意 Proxy (variable 或 expression)
|
|
352
|
-
*/
|
|
353
|
-
function isProxy(obj) {
|
|
354
|
-
if (typeof obj !== "object" && typeof obj !== "function" || obj === null) return false;
|
|
355
|
-
return proxyMetadata.has(obj);
|
|
356
|
-
}
|
|
357
336
|
|
|
358
337
|
//#endregion
|
|
359
338
|
//#region src/proxy-variable.ts
|
|
@@ -542,14 +521,6 @@ function collectDepsFromArgs(args, deps) {
|
|
|
542
521
|
}
|
|
543
522
|
}
|
|
544
523
|
/**
|
|
545
|
-
* 根据路径构建成员表达式 AST
|
|
546
|
-
*/
|
|
547
|
-
function buildMemberExprAst(rootId, path) {
|
|
548
|
-
let ast = placeholder(rootId);
|
|
549
|
-
for (const prop of path) ast = memberExpr(ast, identifier(prop));
|
|
550
|
-
return ast;
|
|
551
|
-
}
|
|
552
|
-
/**
|
|
553
524
|
* 创建 Proxy 的公共 handler
|
|
554
525
|
*/
|
|
555
526
|
function createProxyHandler(ast, deps) {
|
|
@@ -576,18 +547,10 @@ function createProxyHandler(ast, deps) {
|
|
|
576
547
|
*/
|
|
577
548
|
function createProxyVariable(id) {
|
|
578
549
|
const deps = new Set([id]);
|
|
579
|
-
const
|
|
580
|
-
|
|
581
|
-
if (typeof prop === "symbol") return void 0;
|
|
582
|
-
return createProxyExpressionWithAST(buildMemberExprAst(id, [String(prop)]), deps);
|
|
583
|
-
},
|
|
584
|
-
apply() {
|
|
585
|
-
throw new Error("Variable cannot be called directly");
|
|
586
|
-
}
|
|
587
|
-
});
|
|
550
|
+
const ast = placeholder(id);
|
|
551
|
+
const proxy = new Proxy(function() {}, createProxyHandler(ast, deps));
|
|
588
552
|
setProxyMetadata(proxy, {
|
|
589
553
|
type: "variable",
|
|
590
|
-
path: [],
|
|
591
554
|
rootVariable: id,
|
|
592
555
|
dependencies: deps
|
|
593
556
|
});
|
|
@@ -605,7 +568,6 @@ function createProxyExpressionWithAST(ast, deps) {
|
|
|
605
568
|
const proxy = new Proxy(function() {}, createProxyHandler(ast, deps));
|
|
606
569
|
setProxyMetadata(proxy, {
|
|
607
570
|
type: "expression",
|
|
608
|
-
path: [],
|
|
609
571
|
ast,
|
|
610
572
|
dependencies: deps
|
|
611
573
|
});
|
|
@@ -1641,6 +1603,33 @@ function t(strings, ...values) {
|
|
|
1641
1603
|
return createProxyExpressionWithAST(resultAst, deps);
|
|
1642
1604
|
}
|
|
1643
1605
|
|
|
1606
|
+
//#endregion
|
|
1607
|
+
//#region src/test-helper.ts
|
|
1608
|
+
/**
|
|
1609
|
+
* 编译并求值表达式
|
|
1610
|
+
* 自动推导变量类型和返回类型
|
|
1611
|
+
*
|
|
1612
|
+
* @template TResult - 表达式求值结果类型
|
|
1613
|
+
* @template TVars - 变量映射类型
|
|
1614
|
+
* @param expr - 要编译的表达式
|
|
1615
|
+
* @param variables - 变量定义映射
|
|
1616
|
+
* @param values - 变量值映射
|
|
1617
|
+
* @returns 表达式求值结果
|
|
1618
|
+
*
|
|
1619
|
+
* @example
|
|
1620
|
+
* ```ts
|
|
1621
|
+
* const callback = variable<(f: (x: number) => number) => number>();
|
|
1622
|
+
* const result = compileAndEvaluate(
|
|
1623
|
+
* myExpr,
|
|
1624
|
+
* { callback },
|
|
1625
|
+
* { callback: (fn) => fn(5) }
|
|
1626
|
+
* );
|
|
1627
|
+
* ```
|
|
1628
|
+
*/
|
|
1629
|
+
function compileAndEvaluate(expr, variables, values, options) {
|
|
1630
|
+
return evaluate(compile(expr, variables, options), values);
|
|
1631
|
+
}
|
|
1632
|
+
|
|
1644
1633
|
//#endregion
|
|
1645
1634
|
//#region src/wrap.ts
|
|
1646
1635
|
/**
|
|
@@ -1672,5 +1661,5 @@ function wrap(value) {
|
|
|
1672
1661
|
}
|
|
1673
1662
|
|
|
1674
1663
|
//#endregion
|
|
1675
|
-
export { compile, evaluate, expr,
|
|
1664
|
+
export { compile, compileAndEvaluate, evaluate, expr, lambda, t, variable, wrap };
|
|
1676
1665
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/ast-types.ts","../src/generate.ts","../src/proxy-metadata.ts","../src/proxy-variable.ts","../src/variable.ts","../src/compile.ts","../src/evaluate.ts","../src/parser.ts","../src/expr.ts","../src/lambda.ts","../src/template.ts","../src/wrap.ts"],"sourcesContent":["/**\n * AST 节点类型定义\n */\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\n/**\n * 变量占位符节点\n * 用于表示变量引用或 lambda 参数,在编译/代码生成时被替换\n */\nexport interface Placeholder {\n type: \"Placeholder\";\n /** 变量或 lambda 参数的唯一标识符 */\n id: symbol;\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 | Placeholder)[];\n body: ASTNode;\n}\n\n// AST 节点类型定义\nexport type ASTNode =\n | NumberLiteral\n | StringLiteral\n | BooleanLiteral\n | NullLiteral\n | Identifier\n | Placeholder\n | BinaryExpr\n | UnaryExpr\n | ConditionalExpr\n | MemberExpr\n | CallExpr\n | ArrayExpr\n | ObjectExpr\n | ArrowFunctionExpr;\n\n// 运算符优先级(从低到高)\nexport const 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// 右结合运算符\nexport const RIGHT_ASSOCIATIVE = new Set([\"**\"]);\n\n// 内置构造函数列表\nexport const BUILTIN_CONSTRUCTORS = new Set([\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]);\n","/**\n * 代码生成逻辑\n */\n\nimport type { ASTNode } from \"./ast-types.js\";\nimport { BUILTIN_CONSTRUCTORS, PRECEDENCE, RIGHT_ASSOCIATIVE } from \"./ast-types.js\";\n\n/**\n * 代码生成上下文\n * 用于在嵌套 lambda 中分配唯一参数名\n */\nexport interface GenerateContext {\n /** 当前已使用的参数名集合(用于嵌套 lambda 时避免冲突) */\n usedParamNames: Set<string>;\n /** 占位符 Symbol 到实际参数名的映射 */\n paramMapping: Map<symbol, string>;\n}\n\n/**\n * 创建新的生成上下文\n */\nexport function createGenerateContext(): GenerateContext {\n return {\n usedParamNames: new Set(),\n paramMapping: new Map(),\n };\n}\n\n/**\n * 从 AST 生成规范化的代码\n */\nexport function generate(node: ASTNode): string {\n const ctx = createGenerateContext();\n return generateWithContext(node, ctx);\n}\n\n/** 需要空格分隔的关键字运算符 */\nconst KEYWORD_BINARY_OPERATORS = new Set([\"in\", \"instanceof\"]);\nconst KEYWORD_UNARY_OPERATORS = new Set([\"typeof\", \"void\"]);\n\n/**\n * 带上下文的代码生成\n */\nexport function generateWithContext(node: ASTNode, ctx: GenerateContext): string {\n switch (node.type) {\n case \"NumberLiteral\":\n return node.raw;\n\n case \"StringLiteral\":\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 \"Placeholder\":\n return ctx.paramMapping.get(node.id) ?? `$$${node.id.description}$$`;\n\n case \"BinaryExpr\": {\n const left = wrapIfNeededWithContext(node.left, node, \"left\", ctx);\n const right = wrapIfNeededWithContext(node.right, node, \"right\", ctx);\n const sep = KEYWORD_BINARY_OPERATORS.has(node.operator) ? \" \" : \"\";\n return `${left}${sep}${node.operator}${sep}${right}`;\n }\n\n case \"UnaryExpr\": {\n if (!node.prefix) {\n return generateWithContext(node.argument, ctx) + node.operator;\n }\n const arg = wrapIfNeededWithContext(node.argument, node, \"argument\", ctx);\n const sep = KEYWORD_UNARY_OPERATORS.has(node.operator) ? \" \" : \"\";\n return `${node.operator}${sep}${arg}`;\n }\n\n case \"ConditionalExpr\": {\n const test = wrapIfNeededWithContext(node.test, node, \"test\", ctx);\n const consequent = wrapIfNeededWithContext(node.consequent, node, \"consequent\", ctx);\n const alternate = wrapIfNeededWithContext(node.alternate, node, \"alternate\", ctx);\n return `${test}?${consequent}:${alternate}`;\n }\n\n case \"MemberExpr\": {\n const object = wrapIfNeededWithContext(node.object, node, \"object\", ctx);\n const property = generateWithContext(node.property, ctx);\n const accessor = node.optional ? \"?.\" : node.computed ? \"\" : \".\";\n return node.computed ? `${object}${accessor}[${property}]` : `${object}${accessor}${property}`;\n }\n\n case \"CallExpr\": {\n const callee = wrapIfNeededWithContext(node.callee, node, \"callee\", ctx);\n const args = node.arguments.map((arg) => generateWithContext(arg, ctx)).join(\",\");\n const isNew = node.callee.type === \"Identifier\" && BUILTIN_CONSTRUCTORS.has(node.callee.name);\n const prefix = isNew ? \"new \" : \"\";\n const optional = node.optional ? \"?.\" : \"\";\n return `${prefix}${callee}${optional}(${args})`;\n }\n\n case \"ArrayExpr\":\n return `[${node.elements.map((el) => generateWithContext(el, ctx)).join(\",\")}]`;\n\n case \"ObjectExpr\": {\n const props = node.properties.map((prop) => {\n if (prop.shorthand) return generateWithContext(prop.key, ctx);\n const key = prop.computed ? `[${generateWithContext(prop.key, ctx)}]` : generateWithContext(prop.key, ctx);\n return `${key}:${generateWithContext(prop.value, ctx)}`;\n });\n return `{${props.join(\",\")}}`;\n }\n\n case \"ArrowFunctionExpr\":\n return generateArrowFunction(node, ctx);\n\n default: {\n const unknownNode = node as { type?: string };\n throw new Error(`Unknown node type: ${unknownNode.type ?? \"unknown\"}`);\n }\n }\n}\n\n/**\n * 生成箭头函数代码\n * 为 Placeholder 参数分配唯一名称,避免嵌套 lambda 冲突\n */\nfunction generateArrowFunction(\n node: {\n type: \"ArrowFunctionExpr\";\n params: ({ type: \"Identifier\"; name: string } | { type: \"Placeholder\"; id: symbol })[];\n body: ASTNode;\n },\n ctx: GenerateContext\n): string {\n const allocatedParams: { id: symbol; name: string }[] = [];\n const paramNames: string[] = [];\n\n for (const param of node.params) {\n if (param.type === \"Identifier\") {\n paramNames.push(param.name);\n } else {\n const name = allocateUniqueName(ctx.usedParamNames);\n paramNames.push(name);\n allocatedParams.push({ id: param.id, name });\n ctx.usedParamNames.add(name);\n ctx.paramMapping.set(param.id, name);\n }\n }\n\n const paramsStr = paramNames.length === 1 ? paramNames[0]! : `(${paramNames.join(\",\")})`;\n const bodyStr =\n node.body.type === \"ObjectExpr\" ? `(${generateWithContext(node.body, ctx)})` : generateWithContext(node.body, ctx);\n\n // 清理分配的参数名(退出作用域)\n for (const { id, name } of allocatedParams) {\n ctx.paramMapping.delete(id);\n ctx.usedParamNames.delete(name);\n }\n\n return `${paramsStr}=>${bodyStr}`;\n}\n\n/**\n * 分配一个未使用的参数名 (_0, _1, _2, ...)\n */\nfunction allocateUniqueName(usedNames: Set<string>): string {\n let index = 0;\n while (usedNames.has(`_${index}`)) {\n index++;\n }\n return `_${index}`;\n}\n\n/**\n * 判断是否需要括号包裹,并生成代码(带上下文版本)\n */\nexport function wrapIfNeededWithContext(\n child: ASTNode,\n parent: ASTNode,\n position: \"left\" | \"right\" | \"argument\" | \"object\" | \"callee\" | \"test\" | \"consequent\" | \"alternate\",\n ctx: GenerateContext\n): string {\n const code = generateWithContext(child, ctx);\n\n if (needsParens(child, parent, position)) {\n return `(${code})`;\n }\n return code;\n}\n\n/**\n * 判断子节点是否需要括号\n */\nexport function needsParens(child: ASTNode, parent: ASTNode, position: string): boolean {\n switch (parent.type) {\n case \"BinaryExpr\": {\n if (child.type === \"ConditionalExpr\" || child.type === \"UnaryExpr\") return true;\n if (child.type === \"BinaryExpr\") {\n const childPrec = PRECEDENCE[child.operator] ?? 0;\n const parentPrec = PRECEDENCE[parent.operator] ?? 0;\n if (childPrec < parentPrec) return true;\n if (childPrec === parentPrec && position === \"right\" && !RIGHT_ASSOCIATIVE.has(parent.operator)) return true;\n }\n return false;\n }\n\n case \"UnaryExpr\":\n return position === \"argument\" && (child.type === \"BinaryExpr\" || child.type === \"ConditionalExpr\");\n\n case \"MemberExpr\":\n case \"CallExpr\": {\n if (position !== \"object\" && position !== \"callee\") return false;\n if ([\"BinaryExpr\", \"ConditionalExpr\", \"UnaryExpr\", \"ArrowFunctionExpr\", \"ObjectExpr\"].includes(child.type)) {\n return true;\n }\n // 处理 (42).toString() 这种整数紧跟点号的情况\n if (child.type === \"NumberLiteral\" && parent.type === \"MemberExpr\" && !parent.computed) {\n return !child.raw.includes(\".\") && !child.raw.includes(\"e\") && !child.raw.includes(\"x\");\n }\n return false;\n }\n\n case \"ConditionalExpr\":\n return position === \"test\" && child.type === \"ConditionalExpr\";\n\n default:\n return false;\n }\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 \"Placeholder\":\n // Placeholder 不是 Identifier,保持不变\n return node;\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 // 箭头函数:只转换 Identifier 参数名,Placeholder 参数保持不变\n // 只转换函数体中的非参数标识符\n const paramNames = new Set(\n node.params.filter((p): p is { type: \"Identifier\"; name: string } => p.type === \"Identifier\").map((p) => p.name)\n );\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 * 回调函数接收 symbol,返回 Identifier 节点的名称\n * 如果返回 null/undefined,则保留原始 Placeholder 节点\n */\nexport function transformPlaceholders(node: ASTNode, transform: (id: symbol) => string | null | undefined): ASTNode {\n switch (node.type) {\n case \"Placeholder\": {\n const name = transform(node.id);\n return name != null ? { type: \"Identifier\", name } : node;\n }\n\n case \"Identifier\":\n return node;\n\n case \"BinaryExpr\":\n return {\n ...node,\n left: transformPlaceholders(node.left, transform),\n right: transformPlaceholders(node.right, transform),\n };\n\n case \"UnaryExpr\":\n return {\n ...node,\n argument: transformPlaceholders(node.argument, transform),\n };\n\n case \"ConditionalExpr\":\n return {\n ...node,\n test: transformPlaceholders(node.test, transform),\n consequent: transformPlaceholders(node.consequent, transform),\n alternate: transformPlaceholders(node.alternate, transform),\n };\n\n case \"MemberExpr\":\n return {\n ...node,\n object: transformPlaceholders(node.object, transform),\n property: node.computed ? transformPlaceholders(node.property, transform) : node.property,\n };\n\n case \"CallExpr\":\n return {\n ...node,\n callee: transformPlaceholders(node.callee, transform),\n arguments: node.arguments.map((arg) => transformPlaceholders(arg, transform)),\n };\n\n case \"ArrayExpr\":\n return {\n ...node,\n elements: node.elements.map((el) => transformPlaceholders(el, transform)),\n };\n\n case \"ObjectExpr\":\n return {\n ...node,\n properties: node.properties.map((prop) => ({\n ...prop,\n key: prop.computed ? transformPlaceholders(prop.key, transform) : prop.key,\n value: transformPlaceholders(prop.value, transform),\n })),\n };\n\n case \"ArrowFunctionExpr\": {\n // 箭头函数:参数保持不变(Placeholder 参数在代码生成时处理)\n // 函数体中的 Placeholder 需要转换,但要排除参数本身的 symbol\n const paramSymbols = new Set(node.params.filter((p) => p.type === \"Placeholder\").map((p) => p.id));\n return {\n ...node,\n body: transformPlaceholders(node.body, (id) => (paramSymbols.has(id) ? null : transform(id))),\n };\n }\n\n default:\n return node;\n }\n}\n\n/**\n * 收集 AST 中所有使用的标识符名称(自由变量)\n */\nexport function collectIdentifiers(node: ASTNode): Set<string> {\n switch (node.type) {\n case \"Identifier\":\n return new Set([node.name]);\n\n case \"BinaryExpr\":\n return union(collectIdentifiers(node.left), collectIdentifiers(node.right));\n\n case \"UnaryExpr\":\n return collectIdentifiers(node.argument);\n\n case \"ConditionalExpr\":\n return union(\n collectIdentifiers(node.test),\n collectIdentifiers(node.consequent),\n collectIdentifiers(node.alternate)\n );\n\n case \"MemberExpr\": {\n const result = collectIdentifiers(node.object);\n if (node.computed) {\n for (const id of collectIdentifiers(node.property)) {\n result.add(id);\n }\n }\n return result;\n }\n\n case \"CallExpr\": {\n const result = collectIdentifiers(node.callee);\n for (const arg of node.arguments) {\n for (const id of collectIdentifiers(arg)) {\n result.add(id);\n }\n }\n return result;\n }\n\n case \"ArrayExpr\": {\n const result = new Set<string>();\n for (const el of node.elements) {\n for (const id of collectIdentifiers(el)) {\n result.add(id);\n }\n }\n return result;\n }\n\n case \"ObjectExpr\": {\n const result = new Set<string>();\n for (const prop of node.properties) {\n if (prop.computed) {\n for (const id of collectIdentifiers(prop.key)) {\n result.add(id);\n }\n }\n for (const id of collectIdentifiers(prop.value)) {\n result.add(id);\n }\n }\n return result;\n }\n\n case \"ArrowFunctionExpr\": {\n // 收集自由变量:函数体中的标识符,排除参数名\n const paramNames = new Set(\n node.params.filter((p): p is { type: \"Identifier\"; name: string } => p.type === \"Identifier\").map((p) => p.name)\n );\n const bodyIds = collectIdentifiers(node.body);\n for (const name of paramNames) {\n bodyIds.delete(name);\n }\n return bodyIds;\n }\n\n default:\n return new Set();\n }\n}\n\n/** 合并多个 Set */\nfunction union<T>(...sets: Set<T>[]): Set<T> {\n const result = new Set<T>();\n for (const s of sets) {\n for (const item of s) {\n result.add(item);\n }\n }\n return result;\n}\n","// proxy-metadata.ts\nimport type { ASTNode } from \"./ast-types\";\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 Placeholder,\n StringLiteral,\n} from \"./ast-types\";\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\nconst 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/**\n * 创建占位符 AST 节点\n */\nfunction placeholder(id: symbol): Placeholder {\n return { type: \"Placeholder\", id };\n}\n\n/**\n * 创建标识符 AST 节点\n */\nfunction identifier(name: string): Identifier {\n return { type: \"Identifier\", name };\n}\n\n/**\n * 创建数字字面量 AST 节点\n */\nfunction numberLiteral(value: number): NumberLiteral {\n return { type: \"NumberLiteral\", value, raw: String(value) };\n}\n\n/**\n * 创建字符串字面量 AST 节点\n */\nfunction stringLiteral(value: string, quote: \"'\" | '\"' | \"`\" = '\"'): StringLiteral {\n return { type: \"StringLiteral\", value, quote };\n}\n\n/**\n * 创建成员表达式 AST 节点\n */\nfunction memberExpr(object: ASTNode, property: Identifier): MemberExpr {\n return { type: \"MemberExpr\", object, property, computed: false, optional: false };\n}\n\n/**\n * 创建调用表达式 AST 节点\n */\nfunction callExpr(callee: ASTNode, arguments_: ASTNode[]): CallExpr {\n return { type: \"CallExpr\", callee, arguments: arguments_, optional: false };\n}\n\n/**\n * 创建数组表达式 AST 节点\n */\nfunction arrayExpr(elements: ASTNode[]): ArrayExpr {\n return { type: \"ArrayExpr\", elements };\n}\n\n/**\n * 检查对象是否为 TypedArray 实例\n */\nfunction getTypedArrayConstructor(value: unknown): TypedArrayConstructor | null {\n for (const constructorName of typedArrayConstructors) {\n const Constructor = globalThis[constructorName as keyof typeof globalThis] as TypedArrayConstructor;\n if (Constructor && value instanceof Constructor) {\n return Constructor;\n }\n }\n return null;\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 placeholder(meta.rootVariable);\n }\n }\n }\n\n // 2. 数组递归处理\n if (Array.isArray(arg)) {\n return arrayExpr(arg.map(serializeArgumentToAST));\n }\n\n // 3. 特殊内置对象类型\n if (typeof arg === \"object\" && arg !== null) {\n // Date: new Date(timestamp)\n if (arg instanceof Date) {\n return callExpr(identifier(\"Date\"), [numberLiteral(arg.getTime())]);\n }\n\n // RegExp: new RegExp(source, flags)\n if (arg instanceof RegExp) {\n const args = [stringLiteral(arg.source)];\n if (arg.flags) args.push(stringLiteral(arg.flags));\n return callExpr(identifier(\"RegExp\"), args);\n }\n\n // URL: new URL(href)\n if (typeof URL !== \"undefined\" && arg instanceof URL) {\n return callExpr(identifier(\"URL\"), [stringLiteral(arg.href)]);\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(arrayExpr([stringLiteral(key), stringLiteral(value)]));\n });\n return callExpr(identifier(\"URLSearchParams\"), [arrayExpr(entries)]);\n }\n\n // Map: new Map(entries)\n if (arg instanceof Map) {\n const entries: ASTNode[] = [];\n arg.forEach((value, key) => {\n entries.push(arrayExpr([serializeArgumentToAST(key), serializeArgumentToAST(value)]));\n });\n return callExpr(identifier(\"Map\"), [arrayExpr(entries)]);\n }\n\n // Set: new Set(values)\n if (arg instanceof Set) {\n const values: ASTNode[] = [];\n arg.forEach((value) => values.push(serializeArgumentToAST(value)));\n return callExpr(identifier(\"Set\"), [arrayExpr(values)]);\n }\n\n // TypedArray: new Uint8Array([...])\n const typedArrayConstructor = getTypedArrayConstructor(arg);\n if (typedArrayConstructor) {\n const values = [...(arg as Iterable<unknown>)].map(serializeArgumentToAST);\n const constructorName = typedArrayConstructor.name;\n return callExpr(identifier(constructorName), [arrayExpr(values)]);\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(numberLiteral);\n return memberExpr(callExpr(identifier(\"Uint8Array\"), [arrayExpr(values)]), identifier(\"buffer\"));\n }\n\n // DataView: new DataView(buffer)\n if (arg instanceof DataView) {\n return callExpr(identifier(\"DataView\"), [serializeArgumentToAST(arg.buffer)]);\n }\n\n // 普通对象递归处理\n const properties = Object.entries(arg).map(([k, v]) => {\n const isValidIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(k);\n const key: ASTNode = isValidIdentifier ? identifier(k) : stringLiteral(k);\n return { key, value: serializeArgumentToAST(v), computed: false, shorthand: false };\n });\n return { type: \"ObjectExpr\", properties } as ObjectExpr;\n }\n\n // 4. 原始值\n if (arg === null) return { type: \"NullLiteral\" } as NullLiteral;\n if (arg === undefined) return identifier(\"undefined\");\n if (typeof arg === \"boolean\") return { type: \"BooleanLiteral\", value: arg } as BooleanLiteral;\n if (typeof arg === \"number\") return numberLiteral(arg);\n if (typeof arg === \"string\") return stringLiteral(arg);\n if (typeof arg === \"bigint\") return callExpr(identifier(\"BigInt\"), [stringLiteral(arg.toString())]);\n\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 * 根据路径构建成员表达式 AST\n */\nfunction buildMemberExprAst(rootId: symbol, path: string[]): ASTNode {\n let ast: ASTNode = placeholder(rootId);\n for (const prop of path) {\n ast = memberExpr(ast, identifier(prop));\n }\n return ast;\n}\n\n/**\n * 创建 Proxy 的公共 handler\n */\nfunction createProxyHandler<T>(ast: ASTNode, deps: Set<symbol>): ProxyHandler<Proxify<T>> {\n return {\n get(_target, prop) {\n if (typeof prop === \"symbol\") return undefined;\n const newAst = memberExpr(ast, identifier(String(prop)));\n return createProxyExpressionWithAST<unknown>(newAst, deps);\n },\n apply(_target, _thisArg, args) {\n const callAst = callExpr(ast, args.map(serializeArgumentToAST));\n const newDeps = new Set(deps);\n collectDepsFromArgs(args, newDeps);\n return createProxyExpressionWithAST<T>(callAst, newDeps);\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 const ast = buildMemberExprAst(id, [String(prop)]);\n return createProxyExpressionWithAST<unknown>(ast, 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 ast = buildMemberExprAst(rootId, path);\n const proxy = new Proxy(function () {} as unknown as Proxify<T>, createProxyHandler<T>(ast, deps));\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>, createProxyHandler<T>(ast, deps));\n\n setProxyMetadata(proxy, {\n type: \"expression\",\n 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","import type { ASTNode } from \"./ast-types\";\nimport { generate, transformIdentifiers, transformPlaceholders } from \"./generate\";\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 const ast = serializeArgumentToAST(expression);\n\n // 建立变量名到索引的映射,以及 symbol -> 变量名的映射\n const variableOrder: string[] = [];\n const variableToIndex = new Map<string, number>();\n const symbolToName = new Map<symbol, string>();\n\n for (const [name, value] of Object.entries(variables)) {\n if (!variableToIndex.has(name)) {\n variableToIndex.set(name, variableOrder.length);\n variableOrder.push(name);\n }\n const id = getVariableId(value);\n if (id) {\n symbolToName.set(id, name);\n }\n }\n\n // 第一步:转换 Placeholder 节点为 $N 格式的 Identifier\n // lambda 参数的 Placeholder 保留不转换(返回 null)\n const placeholderTransformed = transformPlaceholders(ast, (id) => {\n const name = symbolToName.get(id);\n if (!name) return null; // 不是变量占位符(可能是 lambda 参数),保留\n const index = variableToIndex.get(name);\n if (index === undefined) return null;\n return `$${index}`;\n });\n\n // 第二步:检查是否有未定义的 Identifier(非全局对象)\n const undefinedVars: string[] = [];\n const transformed = transformIdentifiers(placeholderTransformed, (name) => {\n // 已经转换为 $N 的跳过\n if (name.startsWith(\"$\") && /^\\$\\d+$/.test(name)) return name;\n\n const index = variableToIndex.get(name);\n if (index !== undefined) return `$${index}`;\n\n if (!ALLOWED_GLOBALS.has(name)) undefinedVars.push(name);\n return name;\n });\n\n if (undefinedVars.length > 0) {\n const uniqueVars = [...new Set(undefinedVars)];\n throw new Error(`Undefined variable(s): ${uniqueVars.join(\", \")}`);\n }\n\n // 生成编译后的表达式\n const expressions: CompiledExpression[] = [];\n\n if (shortCircuit) {\n let nextIndex = variableOrder.length;\n\n function compileAst(node: ASTNode): number {\n if (node.type === \"BinaryExpr\" && (node.operator === \"||\" || node.operator === \"&&\" || node.operator === \"??\")) {\n return compileShortCircuit(node);\n }\n if (node.type === \"ConditionalExpr\") {\n return compileConditional(node);\n }\n const exprStr = generate(node);\n expressions.push(exprStr);\n return nextIndex++;\n }\n\n function compileShortCircuit(node: ASTNode & { type: \"BinaryExpr\" }): number {\n const leftIdx = compileAst(node.left);\n\n const branchConditions: Record<string, string> = {\n \"||\": `$${leftIdx}`,\n \"&&\": `!$${leftIdx}`,\n \"??\": `$${leftIdx}!=null`,\n };\n\n const branchIdx = expressions.length;\n expressions.push([\"br\", branchConditions[node.operator], 0] as BranchNode);\n nextIndex++;\n\n compileAst(node.right);\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 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 = unknown>(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) throw new Error(\"No expressions to evaluate\");\n\n const lines = [\n ...Array.from({ length: variableCount }, (_, i) => `const $${i} = $values[${i}];`),\n ...expressions.map((expr, i) => {\n const idx = variableCount + i;\n return `const $${idx} = ${expr}; $values[${idx}] = $${idx};`;\n }),\n `return $values[$values.length - 1];`,\n ];\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) throw new Error(\"No expressions to evaluate\");\n\n const lines = [\n // 初始化变量\n ...Array.from({ length: variableCount }, (_, i) => `const $${i} = $values[${i}];`),\n \"let $pc = 0;\",\n \"let $lastValue;\",\n // 预先声明所有中间变量\n ...expressions.map((_, i) => `let $${variableCount + i};`),\n `while ($pc < ${expressions.length}) {`,\n \" switch ($pc) {\",\n ];\n\n expressions.forEach((expr, i) => {\n const idx = variableCount + i;\n lines.push(` case ${i}: {`);\n\n if (typeof expr === \"string\") {\n lines.push(` $${idx} = $lastValue = ${expr};`);\n lines.push(` $values[${idx}] = $${idx};`);\n lines.push(\" $pc++; break;\");\n } else {\n const [type] = expr;\n switch (type) {\n case \"br\":\n lines.push(` if (${expr[1]}) { $pc += ${expr[2] + 1}; } else { $pc++; } break;`);\n break;\n case \"jmp\":\n lines.push(` $pc += ${expr[1] + 1}; break;`);\n break;\n case \"phi\":\n lines.push(` $${idx} = $values[${idx}] = $lastValue; $pc++; break;`);\n break;\n }\n }\n lines.push(\" }\");\n });\n\n lines.push(\" }\", \"}\", \"return $values[$values.length - 1];\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * JavaScript 表达式解析器\n * 将表达式字符串解析为 AST,支持常见的运算符和语法\n */\n\nimport type {\n ASTNode,\n ArrayExpr,\n ArrowFunctionExpr,\n Identifier,\n NumberLiteral,\n ObjectExpr,\n ObjectProperty,\n StringLiteral,\n} from \"./ast-types\";\nimport { PRECEDENCE, RIGHT_ASSOCIATIVE } from \"./ast-types\";\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","import type { ASTNode, Placeholder } from \"./ast-types\";\nimport { transformIdentifiers } from \"./generate\";\nimport { parse } 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 } 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): string | ASTNode => {\n // 检查是否是 context 中的变量\n const id = nameToId.get(name);\n if (id) {\n // 返回占位符节点\n return { type: \"Placeholder\", id } satisfies Placeholder;\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 type { ASTNode } from \"./ast-types\";\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, 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. 创建参数代理和符号映射\n const paramCount = builder.length;\n const { params, paramSymbols } = createLambdaParams(paramCount);\n\n // 2. 调用 builder 获取函数体表达式\n const bodyExpr = builder(...(params as Parameters<LambdaBuilder<Args, R>>));\n\n // 3. 从 bodyExpr 中提取 AST 和依赖\n const { bodyAst, bodyDeps } = extractBodyAstAndDeps(bodyExpr);\n\n // 4. 构造完整的箭头函数 AST(参数名使用占位符,在代码生成时分配)\n // 注意:不再在此处转换参数占位符,而是保持占位符到代码生成时统一分配唯一参数名\n const arrowFunctionAst = createArrowFunctionAst(bodyAst, paramCount, paramSymbols);\n\n // 5. 过滤掉 lambda 参数依赖,只保留外部闭包变量\n const closureDeps = filterClosureDeps(bodyDeps, paramSymbols);\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);\n if (existingMeta) {\n setProxyMetadata(lambdaProxy, {\n ...existingMeta,\n type: \"expression\", // 保持为 expression,但 AST 包含箭头函数\n });\n }\n\n return lambdaProxy as Lambda<Args, R>;\n}\n\n/**\n * 创建 lambda 参数和符号映射\n */\nfunction createLambdaParams(paramCount: number) {\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);\n if (meta?.rootVariable) {\n paramSymbols.push(meta.rootVariable);\n }\n }\n\n return { params, paramSymbols };\n}\n\n/**\n * 从表达式中提取 AST 和依赖\n */\nfunction extractBodyAstAndDeps(bodyExpr: unknown): { bodyAst: ASTNode; bodyDeps: Set<symbol> } {\n const meta =\n (typeof bodyExpr === \"object\" || typeof bodyExpr === \"function\") && bodyExpr !== null\n ? getProxyMetadata(bodyExpr)\n : undefined;\n\n if (meta?.ast) {\n // Proxy 表达式:使用其 AST 和依赖\n return {\n bodyAst: meta.ast,\n bodyDeps: meta.dependencies ?? new Set<symbol>(),\n };\n } else {\n // 普通对象、数组或原始值:使用 serializeArgumentToAST 转换\n // 并收集其中可能包含的 Proxy 变量依赖\n const bodyDeps = new Set<symbol>();\n collectDepsFromArgs([bodyExpr], bodyDeps);\n return {\n bodyAst: serializeArgumentToAST(bodyExpr),\n bodyDeps,\n };\n }\n}\n\n/**\n * 创建箭头函数 AST\n * 使用 Placeholder 节点作为参数,在代码生成时再分配实际参数名\n */\nfunction createArrowFunctionAst(bodyAst: ASTNode, paramCount: number, paramSymbols: symbol[]): ASTNode {\n const paramPlaceholders = Array.from({ length: paramCount }, (_, i) => ({\n type: \"Placeholder\" as const,\n id: paramSymbols[i]!,\n }));\n\n return {\n type: \"ArrowFunctionExpr\",\n params: paramPlaceholders,\n body: bodyAst,\n };\n}\n\n/**\n * 过滤掉 lambda 参数依赖,只保留外部闭包变量\n */\nfunction filterClosureDeps(bodyDeps: Set<symbol>, paramSymbols: symbol[]): Set<symbol> {\n const closureDeps = new Set<symbol>();\n for (const dep of bodyDeps) {\n if (!paramSymbols.includes(dep)) {\n closureDeps.add(dep);\n }\n }\n return closureDeps;\n}\n","import type { ASTNode, BinaryExpr, StringLiteral } from \"./ast-types\";\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","import { createProxyExpressionWithAST, serializeArgumentToAST } from \"./proxy-variable\";\nimport type { Proxify } from \"./types\";\n\n/**\n * 将静态值包装为 Proxy Expression\n * 返回的 Proxy 可以像 Variable 一样调用方法和访问属性\n *\n * @template T - 值的类型\n * @param value - 要包装的静态值(支持原始值、对象、数组、Date、RegExp 等)\n * @returns Proxy Expression,可以继续链式调用\n *\n * @example\n * ```ts\n * // 包装 RegExp\n * const pattern = wrap(/^[a-z]+$/i);\n * const input = variable<string>();\n * const result = pattern.match(input);\n *\n * // 包装 Date\n * const now = wrap(new Date());\n * const year = now.getFullYear();\n *\n * // 包装数组\n * const numbers = wrap([1, 2, 3, 4, 5]);\n * const doubled = numbers.map((x) => x * 2);\n * ```\n */\nexport function wrap<T>(value: T): Proxify<T> {\n // 将静态值序列化为 AST\n const ast = serializeArgumentToAST(value);\n\n // 创建没有依赖的 Proxy Expression\n const deps = new Set<symbol>();\n\n return createProxyExpressionWithAST<T>(ast, deps);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/ast-types.ts","../src/generate.ts","../src/proxy-metadata.ts","../src/proxy-variable.ts","../src/variable.ts","../src/compile.ts","../src/evaluate.ts","../src/parser.ts","../src/expr.ts","../src/lambda.ts","../src/template.ts","../src/test-helper.ts","../src/wrap.ts"],"sourcesContent":["/**\n * AST 节点类型定义\n */\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\n/**\n * 变量占位符节点\n * 用于表示变量引用或 lambda 参数,在编译/代码生成时被替换\n */\nexport interface Placeholder {\n type: \"Placeholder\";\n /** 变量或 lambda 参数的唯一标识符 */\n id: symbol;\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 | Placeholder)[];\n body: ASTNode;\n}\n\n// AST 节点类型定义\nexport type ASTNode =\n | NumberLiteral\n | StringLiteral\n | BooleanLiteral\n | NullLiteral\n | Identifier\n | Placeholder\n | BinaryExpr\n | UnaryExpr\n | ConditionalExpr\n | MemberExpr\n | CallExpr\n | ArrayExpr\n | ObjectExpr\n | ArrowFunctionExpr;\n\n// 运算符优先级(从低到高)\nexport const 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// 右结合运算符\nexport const RIGHT_ASSOCIATIVE = new Set([\"**\"]);\n\n// 内置构造函数列表\nexport const BUILTIN_CONSTRUCTORS = new Set([\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]);\n","/**\n * 代码生成逻辑\n */\n\nimport type { ASTNode } from \"./ast-types.js\";\nimport { BUILTIN_CONSTRUCTORS, PRECEDENCE, RIGHT_ASSOCIATIVE } from \"./ast-types.js\";\n\n/**\n * 代码生成上下文\n * 用于在嵌套 lambda 中分配唯一参数名\n */\nexport interface GenerateContext {\n /** 当前已使用的参数名集合(用于嵌套 lambda 时避免冲突) */\n usedParamNames: Set<string>;\n /** 占位符 Symbol 到实际参数名的映射 */\n paramMapping: Map<symbol, string>;\n}\n\n/**\n * 创建新的生成上下文\n */\nexport function createGenerateContext(): GenerateContext {\n return {\n usedParamNames: new Set(),\n paramMapping: new Map(),\n };\n}\n\n/**\n * 从 AST 生成规范化的代码\n */\nexport function generate(node: ASTNode): string {\n const ctx = createGenerateContext();\n return generateWithContext(node, ctx);\n}\n\n/** 需要空格分隔的关键字运算符 */\nconst KEYWORD_BINARY_OPERATORS = new Set([\"in\", \"instanceof\"]);\nconst KEYWORD_UNARY_OPERATORS = new Set([\"typeof\", \"void\"]);\n\n/**\n * 带上下文的代码生成\n */\nexport function generateWithContext(node: ASTNode, ctx: GenerateContext): string {\n switch (node.type) {\n case \"NumberLiteral\":\n return node.raw;\n\n case \"StringLiteral\":\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 \"Placeholder\":\n return ctx.paramMapping.get(node.id) ?? `$$${node.id.description}$$`;\n\n case \"BinaryExpr\": {\n const left = wrapIfNeededWithContext(node.left, node, \"left\", ctx);\n const right = wrapIfNeededWithContext(node.right, node, \"right\", ctx);\n const sep = KEYWORD_BINARY_OPERATORS.has(node.operator) ? \" \" : \"\";\n return `${left}${sep}${node.operator}${sep}${right}`;\n }\n\n case \"UnaryExpr\": {\n if (!node.prefix) {\n return generateWithContext(node.argument, ctx) + node.operator;\n }\n const arg = wrapIfNeededWithContext(node.argument, node, \"argument\", ctx);\n const sep = KEYWORD_UNARY_OPERATORS.has(node.operator) ? \" \" : \"\";\n return `${node.operator}${sep}${arg}`;\n }\n\n case \"ConditionalExpr\": {\n const test = wrapIfNeededWithContext(node.test, node, \"test\", ctx);\n const consequent = wrapIfNeededWithContext(node.consequent, node, \"consequent\", ctx);\n const alternate = wrapIfNeededWithContext(node.alternate, node, \"alternate\", ctx);\n return `${test}?${consequent}:${alternate}`;\n }\n\n case \"MemberExpr\": {\n const object = wrapIfNeededWithContext(node.object, node, \"object\", ctx);\n const property = generateWithContext(node.property, ctx);\n const accessor = node.optional ? \"?.\" : node.computed ? \"\" : \".\";\n return node.computed ? `${object}${accessor}[${property}]` : `${object}${accessor}${property}`;\n }\n\n case \"CallExpr\": {\n const callee = wrapIfNeededWithContext(node.callee, node, \"callee\", ctx);\n const args = node.arguments.map((arg) => generateWithContext(arg, ctx)).join(\",\");\n const isNew = node.callee.type === \"Identifier\" && BUILTIN_CONSTRUCTORS.has(node.callee.name);\n const prefix = isNew ? \"new \" : \"\";\n const optional = node.optional ? \"?.\" : \"\";\n return `${prefix}${callee}${optional}(${args})`;\n }\n\n case \"ArrayExpr\":\n return `[${node.elements.map((el) => generateWithContext(el, ctx)).join(\",\")}]`;\n\n case \"ObjectExpr\": {\n const props = node.properties.map((prop) => {\n if (prop.shorthand) return generateWithContext(prop.key, ctx);\n const key = prop.computed ? `[${generateWithContext(prop.key, ctx)}]` : generateWithContext(prop.key, ctx);\n return `${key}:${generateWithContext(prop.value, ctx)}`;\n });\n return `{${props.join(\",\")}}`;\n }\n\n case \"ArrowFunctionExpr\":\n return generateArrowFunction(node, ctx);\n\n default: {\n const unknownNode = node as { type?: string };\n throw new Error(`Unknown node type: ${unknownNode.type ?? \"unknown\"}`);\n }\n }\n}\n\n/**\n * 生成箭头函数代码\n * 为 Placeholder 参数分配唯一名称,避免嵌套 lambda 冲突\n */\nfunction generateArrowFunction(\n node: {\n type: \"ArrowFunctionExpr\";\n params: ({ type: \"Identifier\"; name: string } | { type: \"Placeholder\"; id: symbol })[];\n body: ASTNode;\n },\n ctx: GenerateContext\n): string {\n const allocatedParams: { id: symbol; name: string }[] = [];\n const paramNames: string[] = [];\n\n for (const param of node.params) {\n if (param.type === \"Identifier\") {\n paramNames.push(param.name);\n } else {\n const name = allocateUniqueName(ctx.usedParamNames);\n paramNames.push(name);\n allocatedParams.push({ id: param.id, name });\n ctx.usedParamNames.add(name);\n ctx.paramMapping.set(param.id, name);\n }\n }\n\n const paramsStr = paramNames.length === 1 ? paramNames[0]! : `(${paramNames.join(\",\")})`;\n const bodyStr =\n node.body.type === \"ObjectExpr\" ? `(${generateWithContext(node.body, ctx)})` : generateWithContext(node.body, ctx);\n\n // 清理分配的参数名(退出作用域)\n for (const { id, name } of allocatedParams) {\n ctx.paramMapping.delete(id);\n ctx.usedParamNames.delete(name);\n }\n\n return `${paramsStr}=>${bodyStr}`;\n}\n\n/**\n * 分配一个未使用的参数名 (_0, _1, _2, ...)\n */\nfunction allocateUniqueName(usedNames: Set<string>): string {\n let index = 0;\n while (usedNames.has(`_${index}`)) {\n index++;\n }\n return `_${index}`;\n}\n\n/**\n * 判断是否需要括号包裹,并生成代码(带上下文版本)\n */\nexport function wrapIfNeededWithContext(\n child: ASTNode,\n parent: ASTNode,\n position: \"left\" | \"right\" | \"argument\" | \"object\" | \"callee\" | \"test\" | \"consequent\" | \"alternate\",\n ctx: GenerateContext\n): string {\n const code = generateWithContext(child, ctx);\n\n if (needsParens(child, parent, position)) {\n return `(${code})`;\n }\n return code;\n}\n\n/**\n * 判断子节点是否需要括号\n */\nexport function needsParens(child: ASTNode, parent: ASTNode, position: string): boolean {\n switch (parent.type) {\n case \"BinaryExpr\": {\n if (child.type === \"ConditionalExpr\" || child.type === \"UnaryExpr\") return true;\n if (child.type === \"BinaryExpr\") {\n const childPrec = PRECEDENCE[child.operator] ?? 0;\n const parentPrec = PRECEDENCE[parent.operator] ?? 0;\n if (childPrec < parentPrec) return true;\n if (childPrec === parentPrec && position === \"right\" && !RIGHT_ASSOCIATIVE.has(parent.operator)) return true;\n }\n return false;\n }\n\n case \"UnaryExpr\":\n return position === \"argument\" && (child.type === \"BinaryExpr\" || child.type === \"ConditionalExpr\");\n\n case \"MemberExpr\":\n case \"CallExpr\": {\n if (position !== \"object\" && position !== \"callee\") return false;\n if ([\"BinaryExpr\", \"ConditionalExpr\", \"UnaryExpr\", \"ArrowFunctionExpr\", \"ObjectExpr\"].includes(child.type)) {\n return true;\n }\n // 处理 (42).toString() 这种整数紧跟点号的情况\n if (child.type === \"NumberLiteral\" && parent.type === \"MemberExpr\" && !parent.computed) {\n return !child.raw.includes(\".\") && !child.raw.includes(\"e\") && !child.raw.includes(\"x\");\n }\n return false;\n }\n\n case \"ConditionalExpr\":\n return position === \"test\" && child.type === \"ConditionalExpr\";\n\n default:\n return false;\n }\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 \"Placeholder\":\n // Placeholder 不是 Identifier,保持不变\n return node;\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 // 箭头函数:只转换 Identifier 参数名,Placeholder 参数保持不变\n // 只转换函数体中的非参数标识符\n const paramNames = new Set(\n node.params.filter((p): p is { type: \"Identifier\"; name: string } => p.type === \"Identifier\").map((p) => p.name)\n );\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 * 回调函数接收 symbol,返回 Identifier 节点的名称\n * 如果返回 null/undefined,则保留原始 Placeholder 节点\n */\nexport function transformPlaceholders(node: ASTNode, transform: (id: symbol) => string | null | undefined): ASTNode {\n switch (node.type) {\n case \"Placeholder\": {\n const name = transform(node.id);\n return name != null ? { type: \"Identifier\", name } : node;\n }\n\n case \"Identifier\":\n return node;\n\n case \"BinaryExpr\":\n return {\n ...node,\n left: transformPlaceholders(node.left, transform),\n right: transformPlaceholders(node.right, transform),\n };\n\n case \"UnaryExpr\":\n return {\n ...node,\n argument: transformPlaceholders(node.argument, transform),\n };\n\n case \"ConditionalExpr\":\n return {\n ...node,\n test: transformPlaceholders(node.test, transform),\n consequent: transformPlaceholders(node.consequent, transform),\n alternate: transformPlaceholders(node.alternate, transform),\n };\n\n case \"MemberExpr\":\n return {\n ...node,\n object: transformPlaceholders(node.object, transform),\n property: node.computed ? transformPlaceholders(node.property, transform) : node.property,\n };\n\n case \"CallExpr\":\n return {\n ...node,\n callee: transformPlaceholders(node.callee, transform),\n arguments: node.arguments.map((arg) => transformPlaceholders(arg, transform)),\n };\n\n case \"ArrayExpr\":\n return {\n ...node,\n elements: node.elements.map((el) => transformPlaceholders(el, transform)),\n };\n\n case \"ObjectExpr\":\n return {\n ...node,\n properties: node.properties.map((prop) => ({\n ...prop,\n key: prop.computed ? transformPlaceholders(prop.key, transform) : prop.key,\n value: transformPlaceholders(prop.value, transform),\n })),\n };\n\n case \"ArrowFunctionExpr\": {\n // 箭头函数:参数保持不变(Placeholder 参数在代码生成时处理)\n // 函数体中的 Placeholder 需要转换,但要排除参数本身的 symbol\n const paramSymbols = new Set(node.params.filter((p) => p.type === \"Placeholder\").map((p) => p.id));\n return {\n ...node,\n body: transformPlaceholders(node.body, (id) => (paramSymbols.has(id) ? null : transform(id))),\n };\n }\n\n default:\n return node;\n }\n}\n\n/**\n * 收集 AST 中所有使用的标识符名称(自由变量)\n */\nexport function collectIdentifiers(node: ASTNode): Set<string> {\n switch (node.type) {\n case \"Identifier\":\n return new Set([node.name]);\n\n case \"BinaryExpr\":\n return union(collectIdentifiers(node.left), collectIdentifiers(node.right));\n\n case \"UnaryExpr\":\n return collectIdentifiers(node.argument);\n\n case \"ConditionalExpr\":\n return union(\n collectIdentifiers(node.test),\n collectIdentifiers(node.consequent),\n collectIdentifiers(node.alternate)\n );\n\n case \"MemberExpr\": {\n const result = collectIdentifiers(node.object);\n if (node.computed) {\n for (const id of collectIdentifiers(node.property)) {\n result.add(id);\n }\n }\n return result;\n }\n\n case \"CallExpr\": {\n const result = collectIdentifiers(node.callee);\n for (const arg of node.arguments) {\n for (const id of collectIdentifiers(arg)) {\n result.add(id);\n }\n }\n return result;\n }\n\n case \"ArrayExpr\": {\n const result = new Set<string>();\n for (const el of node.elements) {\n for (const id of collectIdentifiers(el)) {\n result.add(id);\n }\n }\n return result;\n }\n\n case \"ObjectExpr\": {\n const result = new Set<string>();\n for (const prop of node.properties) {\n if (prop.computed) {\n for (const id of collectIdentifiers(prop.key)) {\n result.add(id);\n }\n }\n for (const id of collectIdentifiers(prop.value)) {\n result.add(id);\n }\n }\n return result;\n }\n\n case \"ArrowFunctionExpr\": {\n // 收集自由变量:函数体中的标识符,排除参数名\n const paramNames = new Set(\n node.params.filter((p): p is { type: \"Identifier\"; name: string } => p.type === \"Identifier\").map((p) => p.name)\n );\n const bodyIds = collectIdentifiers(node.body);\n for (const name of paramNames) {\n bodyIds.delete(name);\n }\n return bodyIds;\n }\n\n default:\n return new Set();\n }\n}\n\n/** 合并多个 Set */\nfunction union<T>(...sets: Set<T>[]): Set<T> {\n const result = new Set<T>();\n for (const s of sets) {\n for (const item of s) {\n result.add(item);\n }\n }\n return result;\n}\n","// proxy-metadata.ts\nimport type { ASTNode } from \"./ast-types\";\n\n/**\n * Proxy 元数据接口\n */\nexport interface ProxyMetadata {\n type: \"variable\" | \"expression\";\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 Placeholder,\n StringLiteral,\n} from \"./ast-types\";\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\nconst 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/**\n * 创建占位符 AST 节点\n */\nfunction placeholder(id: symbol): Placeholder {\n return { type: \"Placeholder\", id };\n}\n\n/**\n * 创建标识符 AST 节点\n */\nfunction identifier(name: string): Identifier {\n return { type: \"Identifier\", name };\n}\n\n/**\n * 创建数字字面量 AST 节点\n */\nfunction numberLiteral(value: number): NumberLiteral {\n return { type: \"NumberLiteral\", value, raw: String(value) };\n}\n\n/**\n * 创建字符串字面量 AST 节点\n */\nfunction stringLiteral(value: string, quote: \"'\" | '\"' | \"`\" = '\"'): StringLiteral {\n return { type: \"StringLiteral\", value, quote };\n}\n\n/**\n * 创建成员表达式 AST 节点\n */\nfunction memberExpr(object: ASTNode, property: Identifier): MemberExpr {\n return { type: \"MemberExpr\", object, property, computed: false, optional: false };\n}\n\n/**\n * 创建调用表达式 AST 节点\n */\nfunction callExpr(callee: ASTNode, arguments_: ASTNode[]): CallExpr {\n return { type: \"CallExpr\", callee, arguments: arguments_, optional: false };\n}\n\n/**\n * 创建数组表达式 AST 节点\n */\nfunction arrayExpr(elements: ASTNode[]): ArrayExpr {\n return { type: \"ArrayExpr\", elements };\n}\n\n/**\n * 检查对象是否为 TypedArray 实例\n */\nfunction getTypedArrayConstructor(value: unknown): TypedArrayConstructor | null {\n for (const constructorName of typedArrayConstructors) {\n const Constructor = globalThis[constructorName as keyof typeof globalThis] as TypedArrayConstructor;\n if (Constructor && value instanceof Constructor) {\n return Constructor;\n }\n }\n return null;\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 placeholder(meta.rootVariable);\n }\n }\n }\n\n // 2. 数组递归处理\n if (Array.isArray(arg)) {\n return arrayExpr(arg.map(serializeArgumentToAST));\n }\n\n // 3. 特殊内置对象类型\n if (typeof arg === \"object\" && arg !== null) {\n // Date: new Date(timestamp)\n if (arg instanceof Date) {\n return callExpr(identifier(\"Date\"), [numberLiteral(arg.getTime())]);\n }\n\n // RegExp: new RegExp(source, flags)\n if (arg instanceof RegExp) {\n const args = [stringLiteral(arg.source)];\n if (arg.flags) args.push(stringLiteral(arg.flags));\n return callExpr(identifier(\"RegExp\"), args);\n }\n\n // URL: new URL(href)\n if (typeof URL !== \"undefined\" && arg instanceof URL) {\n return callExpr(identifier(\"URL\"), [stringLiteral(arg.href)]);\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(arrayExpr([stringLiteral(key), stringLiteral(value)]));\n });\n return callExpr(identifier(\"URLSearchParams\"), [arrayExpr(entries)]);\n }\n\n // Map: new Map(entries)\n if (arg instanceof Map) {\n const entries: ASTNode[] = [];\n arg.forEach((value, key) => {\n entries.push(arrayExpr([serializeArgumentToAST(key), serializeArgumentToAST(value)]));\n });\n return callExpr(identifier(\"Map\"), [arrayExpr(entries)]);\n }\n\n // Set: new Set(values)\n if (arg instanceof Set) {\n const values: ASTNode[] = [];\n arg.forEach((value) => values.push(serializeArgumentToAST(value)));\n return callExpr(identifier(\"Set\"), [arrayExpr(values)]);\n }\n\n // TypedArray: new Uint8Array([...])\n const typedArrayConstructor = getTypedArrayConstructor(arg);\n if (typedArrayConstructor) {\n const values = [...(arg as Iterable<unknown>)].map(serializeArgumentToAST);\n const constructorName = typedArrayConstructor.name;\n return callExpr(identifier(constructorName), [arrayExpr(values)]);\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(numberLiteral);\n return memberExpr(callExpr(identifier(\"Uint8Array\"), [arrayExpr(values)]), identifier(\"buffer\"));\n }\n\n // DataView: new DataView(buffer)\n if (arg instanceof DataView) {\n return callExpr(identifier(\"DataView\"), [serializeArgumentToAST(arg.buffer)]);\n }\n\n // 普通对象递归处理\n const properties = Object.entries(arg).map(([k, v]) => {\n const isValidIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(k);\n const key: ASTNode = isValidIdentifier ? identifier(k) : stringLiteral(k);\n return { key, value: serializeArgumentToAST(v), computed: false, shorthand: false };\n });\n return { type: \"ObjectExpr\", properties } as ObjectExpr;\n }\n\n // 4. 原始值\n if (arg === null) return { type: \"NullLiteral\" } as NullLiteral;\n if (arg === undefined) return identifier(\"undefined\");\n if (typeof arg === \"boolean\") return { type: \"BooleanLiteral\", value: arg } as BooleanLiteral;\n if (typeof arg === \"number\") return numberLiteral(arg);\n if (typeof arg === \"string\") return stringLiteral(arg);\n if (typeof arg === \"bigint\") return callExpr(identifier(\"BigInt\"), [stringLiteral(arg.toString())]);\n\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 * 创建 Proxy 的公共 handler\n */\nfunction createProxyHandler<T>(ast: ASTNode, deps: Set<symbol>): ProxyHandler<Proxify<T>> {\n return {\n get(_target, prop) {\n if (typeof prop === \"symbol\") return undefined;\n const newAst = memberExpr(ast, identifier(String(prop)));\n return createProxyExpressionWithAST<unknown>(newAst, deps);\n },\n apply(_target, _thisArg, args) {\n const callAst = callExpr(ast, args.map(serializeArgumentToAST));\n const newDeps = new Set(deps);\n collectDepsFromArgs(args, newDeps);\n return createProxyExpressionWithAST<T>(callAst, newDeps);\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 const ast = placeholder(id);\n\n const proxy = new Proxy(function () {} as unknown as Proxify<T>, createProxyHandler<T>(ast, deps));\n\n setProxyMetadata(proxy, {\n type: \"variable\",\n rootVariable: id,\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>, createProxyHandler<T>(ast, deps));\n\n setProxyMetadata(proxy, {\n type: \"expression\",\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","import type { ASTNode } from \"./ast-types\";\nimport { generate, transformIdentifiers, transformPlaceholders } from \"./generate\";\nimport { serializeArgumentToAST } from \"./proxy-variable\";\nimport type { BranchNode, CompiledData, CompiledExpression, ExprValue, JumpNode, 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: ExprValue<TResult>,\n variables: Record<string, unknown>,\n options: CompileOptions = {}\n): CompiledData {\n const { shortCircuit = true } = options;\n\n const ast = serializeArgumentToAST(expression);\n\n // 建立变量名到索引的映射,以及 symbol -> 变量名的映射\n const variableOrder: string[] = [];\n const variableToIndex = new Map<string, number>();\n const symbolToName = new Map<symbol, string>();\n\n for (const [name, value] of Object.entries(variables)) {\n if (!variableToIndex.has(name)) {\n variableToIndex.set(name, variableOrder.length);\n variableOrder.push(name);\n }\n const id = getVariableId(value);\n if (id) {\n symbolToName.set(id, name);\n }\n }\n\n // 第一步:转换 Placeholder 节点为 $N 格式的 Identifier\n // lambda 参数的 Placeholder 保留不转换(返回 null)\n const placeholderTransformed = transformPlaceholders(ast, (id) => {\n const name = symbolToName.get(id);\n if (!name) return null; // 不是变量占位符(可能是 lambda 参数),保留\n const index = variableToIndex.get(name);\n if (index === undefined) return null;\n return `$${index}`;\n });\n\n // 第二步:检查是否有未定义的 Identifier(非全局对象)\n const undefinedVars: string[] = [];\n const transformed = transformIdentifiers(placeholderTransformed, (name) => {\n // 已经转换为 $N 的跳过\n if (name.startsWith(\"$\") && /^\\$\\d+$/.test(name)) return name;\n\n const index = variableToIndex.get(name);\n if (index !== undefined) return `$${index}`;\n\n if (!ALLOWED_GLOBALS.has(name)) undefinedVars.push(name);\n return name;\n });\n\n if (undefinedVars.length > 0) {\n const uniqueVars = [...new Set(undefinedVars)];\n throw new Error(`Undefined variable(s): ${uniqueVars.join(\", \")}`);\n }\n\n // 生成编译后的表达式\n const expressions: CompiledExpression[] = [];\n\n if (shortCircuit) {\n let nextIndex = variableOrder.length;\n\n function compileAst(node: ASTNode): number {\n if (node.type === \"BinaryExpr\" && (node.operator === \"||\" || node.operator === \"&&\" || node.operator === \"??\")) {\n return compileShortCircuit(node);\n }\n if (node.type === \"ConditionalExpr\") {\n return compileConditional(node);\n }\n const exprStr = generate(node);\n expressions.push(exprStr);\n return nextIndex++;\n }\n\n function compileShortCircuit(node: ASTNode & { type: \"BinaryExpr\" }): number {\n const leftIdx = compileAst(node.left);\n\n const branchConditions: Record<string, string> = {\n \"||\": `$${leftIdx}`,\n \"&&\": `!$${leftIdx}`,\n \"??\": `$${leftIdx}!=null`,\n };\n\n const branchIdx = expressions.length;\n expressions.push([\"br\", branchConditions[node.operator], 0] as BranchNode);\n nextIndex++;\n\n compileAst(node.right);\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 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 = unknown>(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) throw new Error(\"No expressions to evaluate\");\n\n const lines = [\n ...Array.from({ length: variableCount }, (_, i) => `const $${i} = $values[${i}];`),\n ...expressions.map((expr, i) => {\n const idx = variableCount + i;\n return `const $${idx} = ${expr}; $values[${idx}] = $${idx};`;\n }),\n `return $values[$values.length - 1];`,\n ];\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) throw new Error(\"No expressions to evaluate\");\n\n const lines = [\n // 初始化变量\n ...Array.from({ length: variableCount }, (_, i) => `const $${i} = $values[${i}];`),\n \"let $pc = 0;\",\n \"let $lastValue;\",\n // 预先声明所有中间变量\n ...expressions.map((_, i) => `let $${variableCount + i};`),\n `while ($pc < ${expressions.length}) {`,\n \" switch ($pc) {\",\n ];\n\n expressions.forEach((expr, i) => {\n const idx = variableCount + i;\n lines.push(` case ${i}: {`);\n\n if (typeof expr === \"string\") {\n lines.push(` $${idx} = $lastValue = ${expr};`);\n lines.push(` $values[${idx}] = $${idx};`);\n lines.push(\" $pc++; break;\");\n } else {\n const [type] = expr;\n switch (type) {\n case \"br\":\n lines.push(` if (${expr[1]}) { $pc += ${expr[2] + 1}; } else { $pc++; } break;`);\n break;\n case \"jmp\":\n lines.push(` $pc += ${expr[1] + 1}; break;`);\n break;\n case \"phi\":\n lines.push(` $${idx} = $values[${idx}] = $lastValue; $pc++; break;`);\n break;\n }\n }\n lines.push(\" }\");\n });\n\n lines.push(\" }\", \"}\", \"return $values[$values.length - 1];\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * JavaScript 表达式解析器\n * 将表达式字符串解析为 AST,支持常见的运算符和语法\n */\n\nimport type {\n ASTNode,\n ArrayExpr,\n ArrowFunctionExpr,\n Identifier,\n NumberLiteral,\n ObjectExpr,\n ObjectProperty,\n StringLiteral,\n} from \"./ast-types\";\nimport { PRECEDENCE, RIGHT_ASSOCIATIVE } from \"./ast-types\";\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","import type { ASTNode, Placeholder } from \"./ast-types\";\nimport { transformIdentifiers } from \"./generate\";\nimport { parse } 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 } 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): string | ASTNode => {\n // 检查是否是 context 中的变量\n const id = nameToId.get(name);\n if (id) {\n // 返回占位符节点\n return { type: \"Placeholder\", id } satisfies Placeholder;\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 type { ASTNode } from \"./ast-types\";\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, 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. 创建参数代理和符号映射\n const paramCount = builder.length;\n const { params, paramSymbols } = createLambdaParams(paramCount);\n\n // 2. 调用 builder 获取函数体表达式\n const bodyExpr = builder(...(params as Parameters<LambdaBuilder<Args, R>>));\n\n // 3. 从 bodyExpr 中提取 AST 和依赖\n const { bodyAst, bodyDeps } = extractBodyAstAndDeps(bodyExpr);\n\n // 4. 构造完整的箭头函数 AST(参数名使用占位符,在代码生成时分配)\n // 注意:不再在此处转换参数占位符,而是保持占位符到代码生成时统一分配唯一参数名\n const arrowFunctionAst = createArrowFunctionAst(bodyAst, paramCount, paramSymbols);\n\n // 5. 过滤掉 lambda 参数依赖,只保留外部闭包变量\n const closureDeps = filterClosureDeps(bodyDeps, paramSymbols);\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);\n if (existingMeta) {\n setProxyMetadata(lambdaProxy, {\n ...existingMeta,\n type: \"expression\", // 保持为 expression,但 AST 包含箭头函数\n });\n }\n\n return lambdaProxy as Lambda<Args, R>;\n}\n\n/**\n * 创建 lambda 参数和符号映射\n */\nfunction createLambdaParams(paramCount: number) {\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);\n if (meta?.rootVariable) {\n paramSymbols.push(meta.rootVariable);\n }\n }\n\n return { params, paramSymbols };\n}\n\n/**\n * 从表达式中提取 AST 和依赖\n */\nfunction extractBodyAstAndDeps(bodyExpr: unknown): { bodyAst: ASTNode; bodyDeps: Set<symbol> } {\n const meta =\n (typeof bodyExpr === \"object\" || typeof bodyExpr === \"function\") && bodyExpr !== null\n ? getProxyMetadata(bodyExpr)\n : undefined;\n\n if (meta?.ast) {\n // Proxy 表达式:使用其 AST 和依赖\n return {\n bodyAst: meta.ast,\n bodyDeps: meta.dependencies ?? new Set<symbol>(),\n };\n } else {\n // 普通对象、数组或原始值:使用 serializeArgumentToAST 转换\n // 并收集其中可能包含的 Proxy 变量依赖\n const bodyDeps = new Set<symbol>();\n collectDepsFromArgs([bodyExpr], bodyDeps);\n return {\n bodyAst: serializeArgumentToAST(bodyExpr),\n bodyDeps,\n };\n }\n}\n\n/**\n * 创建箭头函数 AST\n * 使用 Placeholder 节点作为参数,在代码生成时再分配实际参数名\n */\nfunction createArrowFunctionAst(bodyAst: ASTNode, paramCount: number, paramSymbols: symbol[]): ASTNode {\n const paramPlaceholders = Array.from({ length: paramCount }, (_, i) => ({\n type: \"Placeholder\" as const,\n id: paramSymbols[i]!,\n }));\n\n return {\n type: \"ArrowFunctionExpr\",\n params: paramPlaceholders,\n body: bodyAst,\n };\n}\n\n/**\n * 过滤掉 lambda 参数依赖,只保留外部闭包变量\n */\nfunction filterClosureDeps(bodyDeps: Set<symbol>, paramSymbols: symbol[]): Set<symbol> {\n const closureDeps = new Set<symbol>();\n for (const dep of bodyDeps) {\n if (!paramSymbols.includes(dep)) {\n closureDeps.add(dep);\n }\n }\n return closureDeps;\n}\n","import type { ASTNode, BinaryExpr, StringLiteral } from \"./ast-types\";\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","import type { CompileOptions } from \"./compile\";\nimport { compile } from \"./compile\";\nimport { evaluate } from \"./evaluate\";\nimport type { ExprValue, UnproxyDeep, Variable } from \"./types\";\n\n/**\n * 从变量映射推导值类型\n * 例如: { x: Variable<number> } -> { x: number }\n */\ntype InferVariableValues<T extends Record<string, Variable<unknown>>> = {\n [K in keyof T]: T[K] extends Variable<infer U> ? U : never;\n};\n\n/**\n * 编译并求值表达式\n * 自动推导变量类型和返回类型\n *\n * @template TResult - 表达式求值结果类型\n * @template TVars - 变量映射类型\n * @param expr - 要编译的表达式\n * @param variables - 变量定义映射\n * @param values - 变量值映射\n * @returns 表达式求值结果\n *\n * @example\n * ```ts\n * const callback = variable<(f: (x: number) => number) => number>();\n * const result = compileAndEvaluate(\n * myExpr,\n * { callback },\n * { callback: (fn) => fn(5) }\n * );\n * ```\n */\nexport function compileAndEvaluate<\n TResult = unknown,\n TVars extends Record<string, Variable<unknown>> = Record<string, Variable<unknown>>,\n>(\n expr: ExprValue<TResult>,\n variables: TVars,\n values: InferVariableValues<TVars>,\n options?: CompileOptions\n): UnproxyDeep<TResult> {\n const compiled = compile(expr, variables, options);\n return evaluate<TResult>(compiled, values) as UnproxyDeep<TResult>;\n}\n","import { createProxyExpressionWithAST, serializeArgumentToAST } from \"./proxy-variable\";\nimport type { Proxify } from \"./types\";\n\n/**\n * 将静态值包装为 Proxy Expression\n * 返回的 Proxy 可以像 Variable 一样调用方法和访问属性\n *\n * @template T - 值的类型\n * @param value - 要包装的静态值(支持原始值、对象、数组、Date、RegExp 等)\n * @returns Proxy Expression,可以继续链式调用\n *\n * @example\n * ```ts\n * // 包装 RegExp\n * const pattern = wrap(/^[a-z]+$/i);\n * const input = variable<string>();\n * const result = pattern.match(input);\n *\n * // 包装 Date\n * const now = wrap(new Date());\n * const year = now.getFullYear();\n *\n * // 包装数组\n * const numbers = wrap([1, 2, 3, 4, 5]);\n * const doubled = numbers.map((x) => x * 2);\n * ```\n */\nexport function wrap<T>(value: T): Proxify<T> {\n // 将静态值序列化为 AST\n const ast = serializeArgumentToAST(value);\n\n // 创建没有依赖的 Proxy Expression\n const deps = new Set<symbol>();\n\n return createProxyExpressionWithAST<T>(ast, deps);\n}\n"],"mappings":"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"}
|