Package not found. Please check the package name and try again.

@codehz/json-expr 0.6.0 → 0.6.2

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 CHANGED
@@ -1,16 +1,28 @@
1
1
  //#region src/types.d.ts
2
+ declare const ProxyExpression: unique symbol;
2
3
  /**
3
4
  * Proxy Expression 类型标记(用于类型推导)
4
5
  * 这是一个 phantom type,实际运行时是 Proxy 对象
5
6
  */
6
7
  type ProxyExpression<T = unknown> = {
7
- readonly __proxyExpression: T;
8
+ readonly [ProxyExpression]: T;
8
9
  };
10
+ /**
11
+ * 特殊全局类型 - 这些类型作为参数时允许直接传入原始值
12
+ * 不需要递归展开其属性
13
+ */
14
+ type BuiltinObjects = Date | RegExp | Error | URL | URLSearchParams | ArrayBuffer | SharedArrayBuffer | DataView | Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array | BigInt64Array | BigUint64Array;
15
+ /**
16
+ * 将数组/元组类型的每个元素转换为 ProxifyArg
17
+ * 保留元组的结构信息
18
+ */
19
+ type ProxifyArgTuple<T extends readonly unknown[]> = T extends readonly [infer Head, ...infer Tail] ? [ProxifyArg<Head>, ...ProxifyArgTuple<Tail>] : T extends readonly [] ? [] : T extends readonly (infer E)[] ? readonly ProxifyArg<E>[] : never;
20
+ type ProxifyArg<T> = Proxify<T> | (T extends BuiltinObjects | string | number | boolean | bigint | undefined | null ? T : T extends readonly unknown[] ? ProxifyArgTuple<T> : T extends Map<infer K, infer V> ? Map<ProxifyArg<K>, ProxifyArg<V>> : T extends Set<infer E> ? Set<ProxifyArg<E>> : T extends WeakMap<infer K, infer V> ? WeakMap<ProxifyArg<K>, ProxifyArg<V>> : T extends WeakSet<infer E> ? WeakSet<ProxifyArg<E>> : T extends Promise<infer R> ? Promise<ProxifyArg<R>> : T extends ((...args: infer _A) => infer _R) ? never : { [K in keyof T]: ProxifyArg<T[K]> });
9
21
  /**
10
22
  * 处理函数参数的 Proxy 转换
11
23
  * 参数可以是原始值或对应的 Proxy
12
24
  */
13
- type ProxifyArgs<T extends unknown[]> = { [K in keyof T]: T[K] | Proxify<T[K]> };
25
+ type ProxifyArgs<T extends unknown[]> = { [K in keyof T]: ProxifyArg<T[K]> };
14
26
  /**
15
27
  * 需要保留泛型参数的数组方法名
16
28
  * 这些方法需要显式定义以保留类型推导
@@ -139,15 +151,6 @@ type CompiledExpression = string | ControlFlowNode | FnNode;
139
151
  * - 表达式可以是字符串或控制流节点(br/jmp/phi)
140
152
  */
141
153
  type CompiledData = [variableNames: string[], ...expressions: CompiledExpression[]];
142
- /**
143
- * 递归地去除 Proxify 包装
144
- * 处理嵌套的对象和数组中的所有 Proxy 类型
145
- * - 如果是 Proxify<T>,提取并返回 UnproxyDeep<T>
146
- * - 如果是对象,递归处理每个属性
147
- * - 如果是数组,递归处理元素
148
- * - 其他情况返回原值
149
- */
150
- 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;
151
154
  /**
152
155
  * Lambda 参数代理类型
153
156
  * 与普通 Proxify<T> 相同,但标记为 lambda 参数
@@ -190,55 +193,7 @@ type InferLambdaArgs<L> = L extends Lambda<infer Args, unknown> ? Args : never;
190
193
  */
191
194
  type InferLambdaReturn<L> = L extends Lambda<unknown[], infer R> ? R : never;
192
195
  //#endregion
193
- //#region src/compile.d.ts
194
- /**
195
- * 编译选项
196
- */
197
- interface CompileOptions {}
198
- /**
199
- * 将 Proxy Expression 编译为可序列化的 JSON 结构
200
- *
201
- * @template TResult - 表达式结果类型
202
- * @param expression - Proxy Expression,或包含 Proxy 的对象/数组/原始值
203
- * @param variables - 所有使用的变量定义
204
- * @param options - 编译选项
205
- * @returns 编译后的数据结构 [变量名列表, 表达式1, 表达式2, ...]
206
- *
207
- * @throws 如果传入无效的表达式或未定义的变量引用
208
- *
209
- * @example
210
- * ```ts
211
- * const x = variable<number>()
212
- * const y = variable<number>()
213
- * const sum = expr({ x, y })("x + y")
214
- * const result = expr({ sum, x })("sum * x")
215
- * const compiled = compile(result, { x, y })
216
- * // => [["x", "y"], "($[0]+$[1])*$[0]"]
217
- * ```
218
- */
219
- declare function compile<TResult>(expression: ExprValue<TResult>, variables: Record<string, unknown>, _options?: CompileOptions): CompiledData;
220
- //#endregion
221
- //#region src/evaluate.d.ts
222
- /**
223
- * 执行编译后的表达式
224
- *
225
- * @template TResult - 表达式结果类型
226
- * @param data - 编译后的数据结构 [变量名列表, 表达式1, 表达式2, ...]
227
- * @param values - 变量值映射,按变量名提供值
228
- * @returns 最后一个表达式的求值结果
229
- *
230
- * @throws 如果运行时类型验证失败或表达式执行出错
231
- *
232
- * @example
233
- * ```ts
234
- * const compiled = [["x", "y"], "$[0]+$[1]", "$[1]*2"]
235
- * const result = evaluate<number>(compiled, { x: 2, y: 3 })
236
- * // => 6 (3 * 2)
237
- * ```
238
- */
239
- declare function evaluate<TResult = unknown>(data: CompiledData, values: Record<string, unknown>): TResult;
240
- //#endregion
241
- //#region src/type-parser.d.ts
196
+ //#region src/types/type-parser/utils.d.ts
242
197
  /** 去除字符串两端空白 */
243
198
  type TrimStart<S extends string> = S extends ` ${infer Rest}` | `\t${infer Rest}` | `\n${infer Rest}` ? TrimStart<Rest> : S;
244
199
  /** 是否是字母或下划线 */
@@ -247,18 +202,47 @@ type IsIdentifierStart<C extends string> = C extends "a" | "b" | "c" | "d" | "e"
247
202
  type IsIdentifierChar<C extends string> = IsIdentifierStart<C> extends true ? true : C extends "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ? true : false;
248
203
  /** 是否是数字 */
249
204
  type IsDigit<C extends string> = C extends "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ? true : false;
205
+ /** 全局类型映射 */
206
+ interface GlobalTypeMap {
207
+ Math: Math;
208
+ JSON: JSON;
209
+ Number: NumberConstructor;
210
+ String: StringConstructor;
211
+ Boolean: BooleanConstructor;
212
+ Array: ArrayConstructor;
213
+ Object: ObjectConstructor;
214
+ Date: DateConstructor;
215
+ RegExp: RegExpConstructor;
216
+ undefined: undefined;
217
+ NaN: number;
218
+ Infinity: number;
219
+ parseInt: typeof globalThis.parseInt;
220
+ parseFloat: typeof globalThis.parseFloat;
221
+ isNaN: typeof globalThis.isNaN;
222
+ isFinite: typeof globalThis.isFinite;
223
+ }
250
224
  /** JS保留字和全局对象 */
251
225
  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;
226
+ //#endregion
227
+ //#region src/types/type-parser/context.d.ts
228
+ /** 从 Variable 提取值类型 */
229
+ type ExtractType<T> = T extends ProxyExpression<infer V> ? V : T extends Variable<infer V> ? V : never;
230
+ /** 从上下文对象构建类型映射 */
231
+ type ContextTypeMap<TContext> = { [K in keyof TContext]: ExtractType<TContext[K]> };
232
+ /** 找出未定义的标识符 */
233
+ type FindUndefinedIdentifiers<Ids extends string, ContextKeys extends string> = Ids extends ContextKeys ? never : Ids;
234
+ //#endregion
235
+ //#region src/types/type-parser/identifiers.d.ts
252
236
  /** 解析一个标识符,返回 [标识符, 剩余字符串] */
253
237
  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];
254
238
  /** 跳过数字字面量 */
255
239
  type SkipNumber<S extends string> = S extends `${infer C}${infer Rest}` ? C extends "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "." ? SkipNumber<Rest> : S : S;
256
240
  /** 跳过字符串字面量(单引号) */
257
- type SkipSingleQuoteString<S extends string> = S extends `'${infer Rest}` ? SkipSingleQuoteStringContent<Rest> : S;
258
- type SkipSingleQuoteStringContent<S extends string> = S extends `\\'${infer Rest}` ? SkipSingleQuoteStringContent<Rest> : S extends `'${infer Rest}` ? Rest : S extends `${string}${infer Rest}` ? SkipSingleQuoteStringContent<Rest> : S;
241
+ type SkipSingleQuoteString<S extends string> = S extends `'${infer Rest}` ? SkipSingleQuoteStringContent$1<Rest> : S;
242
+ type SkipSingleQuoteStringContent$1<S extends string> = S extends `\\'${infer Rest}` ? SkipSingleQuoteStringContent$1<Rest> : S extends `'${infer Rest}` ? Rest : S extends `${string}${infer Rest}` ? SkipSingleQuoteStringContent$1<Rest> : S;
259
243
  /** 跳过字符串字面量(双引号) */
260
- type SkipDoubleQuoteString<S extends string> = S extends `"${infer Rest}` ? SkipDoubleQuoteStringContent<Rest> : S;
261
- type SkipDoubleQuoteStringContent<S extends string> = S extends `\\"${infer Rest}` ? SkipDoubleQuoteStringContent<Rest> : S extends `"${infer Rest}` ? Rest : S extends `${string}${infer Rest}` ? SkipDoubleQuoteStringContent<Rest> : S;
244
+ type SkipDoubleQuoteString<S extends string> = S extends `"${infer Rest}` ? SkipDoubleQuoteStringContent$1<Rest> : S;
245
+ type SkipDoubleQuoteStringContent$1<S extends string> = S extends `\\"${infer Rest}` ? SkipDoubleQuoteStringContent$1<Rest> : S extends `"${infer Rest}` ? Rest : S extends `${string}${infer Rest}` ? SkipDoubleQuoteStringContent$1<Rest> : S;
262
246
  /** 跳过模板字符串 */
263
247
  type SkipTemplateString<S extends string> = S extends `\`${infer Rest}` ? SkipTemplateStringContent<Rest> : S;
264
248
  type SkipTemplateStringContent<S extends string> = S extends `\\\`${infer Rest}` ? SkipTemplateStringContent<Rest> : S extends `\`${infer Rest}` ? Rest : S extends `${string}${infer Rest}` ? SkipTemplateStringContent<Rest> : S;
@@ -267,12 +251,8 @@ type SkipTemplateStringContent<S extends string> = S extends `\\\`${infer Rest}`
267
251
  * 返回标识符的联合类型
268
252
  */
269
253
  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;
270
- /** 从 Variable 提取值类型 */
271
- type ExtractType<T> = T extends ProxyExpression<infer V> ? V : T extends Variable<infer V> ? V : never;
272
- /** 从上下文对象构建类型映射 */
273
- type ContextTypeMap<TContext> = { [K in keyof TContext]: ExtractType<TContext[K]> };
274
- /** 找出未定义的标识符 */
275
- type FindUndefinedIdentifiers<Ids extends string, ContextKeys extends string> = Ids extends ContextKeys ? never : Ids;
254
+ //#endregion
255
+ //#region src/types/type-parser/ast-types.d.ts
276
256
  interface ASTNumber {
277
257
  type: "number";
278
258
  }
@@ -333,7 +313,6 @@ interface ASTObject<Props extends Record<string, unknown> = Record<string, unkno
333
313
  type: "object";
334
314
  properties: Props;
335
315
  }
336
- /** 运算符优先级(从低到高) */
337
316
  /** 解析结果:[AST, 剩余字符串] */
338
317
  type ParseResult<T, Rest extends string> = {
339
318
  ast: T;
@@ -342,6 +321,82 @@ type ParseResult<T, Rest extends string> = {
342
321
  type ParseError = {
343
322
  error: true;
344
323
  };
324
+ //#endregion
325
+ //#region src/types/type-parser/expression-parser.d.ts
326
+ /** 解析数字字面量,返回 [数字字符串, 剩余] */
327
+ 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];
328
+ /** 解析字符串字面量 */
329
+ type ParseStringLiteral<S extends string> = S extends `'${infer __}` ? {
330
+ rest: SkipSingleQuoteString<S>;
331
+ } : S extends `"${infer __}` ? {
332
+ rest: SkipDoubleQuoteString<S>;
333
+ } : S extends `\`${infer __}` ? {
334
+ rest: SkipTemplateString<S>;
335
+ } : never;
336
+ /** 解析数组字面量 */
337
+ 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;
338
+ /** 解析对象属性键 */
339
+ 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}` ? {
340
+ key: Key;
341
+ rest: Rest;
342
+ } : never : never : TrimStart<S> extends `"${infer _}` ? SkipDoubleQuoteStringContent<TrimStart<S> extends `"${infer Rest}` ? Rest : never> extends `${infer Rest}` ? TrimStart<S> extends `"${infer Key}"${infer _Rest}` ? {
343
+ key: Key;
344
+ rest: Rest;
345
+ } : never : never : ParseIdentifier<TrimStart<S>> extends [infer Key extends string, infer Rest extends string] ? Key extends "" ? never : {
346
+ key: Key;
347
+ rest: Rest;
348
+ } : never;
349
+ type SkipSingleQuoteStringContent<S extends string> = S extends `\\'${infer Rest}` ? SkipSingleQuoteStringContent<Rest> : S extends `'${infer Rest}` ? Rest : S extends `${string}${infer Rest}` ? SkipSingleQuoteStringContent<Rest> : S;
350
+ type SkipDoubleQuoteStringContent<S extends string> = S extends `\\"${infer Rest}` ? SkipDoubleQuoteStringContent<Rest> : S extends `"${infer Rest}` ? Rest : S extends `${string}${infer Rest}` ? SkipDoubleQuoteStringContent<Rest> : S;
351
+ /** 解析对象字面量 */
352
+ type ParseObjectLiteral<S extends string, Props extends Record<string, unknown> = {}> = TrimStart<S> extends `}${infer Rest}` ? ParseResult<ASTObject<Props>, Rest> : ParseObjectKey<S> extends {
353
+ key: infer Key extends string;
354
+ rest: infer Rest1 extends string;
355
+ } ? 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;
356
+ /** 解析标识符主表达式 */
357
+ 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;
358
+ /** 解析主表达式 */
359
+ 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 {
360
+ rest: infer Rest2 extends string;
361
+ } ? ParseResult<ASTString, Rest2> : ParseError : IsIdentifierStart<C> extends true ? ParseIdentifierPrimary<S> : ParseError : ParseError;
362
+ /** 解析后缀运算符入口 */
363
+ type ParsePostfix<S extends string> = ParsePrimary<TrimStart<S>> extends ParseResult<infer Base, infer Rest> ? ParsePostfixTail<Base, Rest> : ParseError;
364
+ /** 解析后缀运算符尾部 */
365
+ 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 {
366
+ args: infer Args extends unknown[];
367
+ rest: infer Rest2 extends string;
368
+ } ? ParsePostfixTail<ASTCall<Base, Args>, Rest2> : ParseResult<Base, S> : ParseResult<Base, S>;
369
+ /** 解析函数调用参数 */
370
+ type ParseCallArgs<S extends string, Args extends unknown[] = []> = TrimStart<S> extends `)${infer Rest}` ? {
371
+ args: Args;
372
+ rest: Rest;
373
+ } : ParseTernary<S> extends ParseResult<infer Arg, infer Rest> ? TrimStart<Rest> extends `,${infer Rest2}` ? ParseCallArgs<Rest2, [...Args, Arg]> : TrimStart<Rest> extends `)${infer Rest2}` ? {
374
+ args: [...Args, Arg];
375
+ rest: Rest2;
376
+ } : {
377
+ args: Args;
378
+ rest: S;
379
+ } : {
380
+ args: Args;
381
+ rest: S;
382
+ };
383
+ /** 运算符优先级(从低到高):
384
+ * Level 1: ?: (三元)
385
+ * Level 2: ?? (空值合并)
386
+ * Level 3: || (逻辑或)
387
+ * Level 4: && (逻辑与)
388
+ * Level 5: | (位或)
389
+ * Level 6: ^ (位异或)
390
+ * Level 7: & (位与)
391
+ * Level 8: ==, !=, ===, !== (相等)
392
+ * Level 9: <, >, <=, >= (比较)
393
+ * Level 10: <<, >>, >>> (位移)
394
+ * Level 11: +, - (加减)
395
+ * Level 12: *, /, % (乘除)
396
+ * Level 13: ** (幂运算,右结合)
397
+ * Level 14: 一元运算符
398
+ * Level 15: 成员访问、函数调用
399
+ */
345
400
  /** 解析三元表达式(最低优先级)- 右结合 */
346
401
  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;
347
402
  /** 解析逻辑或 || */
@@ -382,60 +437,10 @@ type ParseExponentiation<S extends string> = ParseUnary<TrimStart<S>> extends Pa
382
437
  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>;
383
438
  /** 解析一元运算符 */
384
439
  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>;
385
- /** 解析后缀运算符(成员访问、函数调用) */
386
- type ParsePostfix<S extends string> = ParsePrimary<TrimStart<S>> extends ParseResult<infer Base, infer Rest> ? ParsePostfixTail<Base, Rest> : ParseError;
387
- 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 {
388
- args: infer Args extends unknown[];
389
- rest: infer Rest2 extends string;
390
- } ? ParsePostfixTail<ASTCall<Base, Args>, Rest2> : ParseResult<Base, S> : ParseResult<Base, S>;
391
- /** 解析函数调用参数 */
392
- type ParseCallArgs<S extends string, Args extends unknown[] = []> = TrimStart<S> extends `)${infer Rest}` ? {
393
- args: Args;
394
- rest: Rest;
395
- } : ParseTernary<S> extends ParseResult<infer Arg, infer Rest> ? TrimStart<Rest> extends `,${infer Rest2}` ? ParseCallArgs<Rest2, [...Args, Arg]> : TrimStart<Rest> extends `)${infer Rest2}` ? {
396
- args: [...Args, Arg];
397
- rest: Rest2;
398
- } : {
399
- args: Args;
400
- rest: S;
401
- } : {
402
- args: Args;
403
- rest: S;
404
- };
405
- /** 解析数字字面量,返回 [数字字符串, 剩余] */
406
- 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];
407
- /** 解析数组字面量 */
408
- 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;
409
- /** 解析对象属性键 */
410
- 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}` ? {
411
- key: Key;
412
- rest: Rest;
413
- } : never : never : TrimStart<S> extends `"${infer _}` ? SkipDoubleQuoteStringContent<TrimStart<S> extends `"${infer Rest}` ? Rest : never> extends `${infer Rest}` ? TrimStart<S> extends `"${infer Key}"${infer _Rest}` ? {
414
- key: Key;
415
- rest: Rest;
416
- } : never : never : ParseIdentifier<TrimStart<S>> extends [infer Key extends string, infer Rest extends string] ? Key extends "" ? never : {
417
- key: Key;
418
- rest: Rest;
419
- } : never;
420
- /** 解析对象字面量 */
421
- type ParseObjectLiteral<S extends string, Props extends Record<string, unknown> = {}> = TrimStart<S> extends `}${infer Rest}` ? ParseResult<ASTObject<Props>, Rest> : ParseObjectKey<S> extends {
422
- key: infer Key extends string;
423
- rest: infer Rest1 extends string;
424
- } ? 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;
425
- /** 解析主表达式 */
426
- 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 {
427
- rest: infer Rest2 extends string;
428
- } ? ParseResult<ASTString, Rest2> : ParseError : IsIdentifierStart<C> extends true ? ParseIdentifierPrimary<S> : ParseError : ParseError;
429
- 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;
430
- type ParseStringLiteral<S extends string> = S extends `'${infer __}` ? {
431
- rest: SkipSingleQuoteString<S>;
432
- } : S extends `"${infer __}` ? {
433
- rest: SkipDoubleQuoteString<S>;
434
- } : S extends `\`${infer __}` ? {
435
- rest: SkipTemplateString<S>;
436
- } : never;
437
440
  /** 解析表达式入口 */
438
441
  type ParseExpression<S extends string> = ParseTernary<S> extends ParseResult<infer AST, infer Rest> ? TrimStart<Rest> extends "" ? AST : ASTUnknown : ASTUnknown;
442
+ //#endregion
443
+ //#region src/types/type-parser/type-inference.d.ts
439
444
  /** 推导数组元素类型 */
440
445
  type InferArrayElements<Elements extends unknown[], TypeMap, Result extends unknown[] = []> = Elements extends [infer First, ...infer Rest] ? InferArrayElements<Rest, TypeMap, [...Result, InferTypeFromAST<First, TypeMap>]> : Result;
441
446
  /** 推导对象属性类型 */
@@ -454,25 +459,8 @@ type InferComputedMemberType<Obj> = Obj extends readonly (infer T)[] ? T : Obj e
454
459
  } ? T : Obj extends Record<string, infer V> ? V : unknown;
455
460
  /** 函数调用类型推导 */
456
461
  type InferCallType<Callee> = Callee extends ((...args: any[]) => infer R) ? R : unknown;
457
- /** 全局类型映射 */
458
- interface GlobalTypeMap {
459
- Math: Math;
460
- JSON: JSON;
461
- Number: NumberConstructor;
462
- String: StringConstructor;
463
- Boolean: BooleanConstructor;
464
- Array: ArrayConstructor;
465
- Object: ObjectConstructor;
466
- Date: DateConstructor;
467
- RegExp: RegExpConstructor;
468
- undefined: undefined;
469
- NaN: number;
470
- Infinity: number;
471
- parseInt: typeof globalThis.parseInt;
472
- parseFloat: typeof globalThis.parseFloat;
473
- isNaN: typeof globalThis.isNaN;
474
- isFinite: typeof globalThis.isFinite;
475
- }
462
+ //#endregion
463
+ //#region src/types/type-parser/index.d.ts
476
464
  /** 表达式验证结果 */
477
465
  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 : {
478
466
  error: "undefined_identifiers";
@@ -485,7 +473,7 @@ type ValidateExpression<Source extends string, TContext> = ExtractIdentifiers<So
485
473
  /** 从表达式推导返回类型 */
486
474
  type InferExpressionResult<Source extends string, TContext> = InferTypeFromAST<ParseExpression<Source>, ContextTypeMap<TContext>>;
487
475
  //#endregion
488
- //#region src/expr.d.ts
476
+ //#region src/api/expr.d.ts
489
477
  /**
490
478
  * 创建表达式
491
479
  * 返回 Proxy Expression,可以继续链式调用
@@ -515,7 +503,7 @@ type InferExpressionResult<Source extends string, TContext> = InferTypeFromAST<P
515
503
  */
516
504
  declare function expr<TContext extends Record<string, unknown>>(context: TContext): <TSource extends string>(source: ValidateExpression<TSource, TContext> extends never ? never : TSource) => Proxify<InferExpressionResult<TSource, TContext>>;
517
505
  //#endregion
518
- //#region src/lambda.d.ts
506
+ //#region src/api/lambda.d.ts
519
507
  /**
520
508
  * 创建类型安全的 lambda 表达式
521
509
  *
@@ -536,7 +524,7 @@ declare function expr<TContext extends Record<string, unknown>>(context: TContex
536
524
  */
537
525
  declare function lambda<Args extends unknown[], R>(builder: LambdaBuilder<Args, R>): Lambda<Args, R>;
538
526
  //#endregion
539
- //#region src/template.d.ts
527
+ //#region src/api/template.d.ts
540
528
  /**
541
529
  * Tagged template 函数,用于创建包含变量的字符串表达式
542
530
  *
@@ -554,36 +542,7 @@ declare function lambda<Args extends unknown[], R>(builder: LambdaBuilder<Args,
554
542
  */
555
543
  declare function t(strings: TemplateStringsArray, ...values: unknown[]): Proxify<string>;
556
544
  //#endregion
557
- //#region src/test-helper.d.ts
558
- /**
559
- * 从变量映射推导值类型
560
- * 例如: { x: Variable<number> } -> { x: number }
561
- */
562
- type InferVariableValues<T extends Record<string, Variable<unknown>>> = { [K in keyof T]: T[K] extends Variable<infer U> ? U : never };
563
- /**
564
- * 编译并求值表达式
565
- * 自动推导变量类型和返回类型
566
- *
567
- * @template TResult - 表达式求值结果类型
568
- * @template TVars - 变量映射类型
569
- * @param expr - 要编译的表达式
570
- * @param variables - 变量定义映射
571
- * @param values - 变量值映射
572
- * @returns 表达式求值结果
573
- *
574
- * @example
575
- * ```ts
576
- * const callback = variable<(f: (x: number) => number) => number>();
577
- * const result = compileAndEvaluate(
578
- * myExpr,
579
- * { callback },
580
- * { callback: (fn) => fn(5) }
581
- * );
582
- * ```
583
- */
584
- 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>;
585
- //#endregion
586
- //#region src/variable.d.ts
545
+ //#region src/api/variable.d.ts
587
546
  /**
588
547
  * 创建一个类型化变量
589
548
  * 返回 Proxy 对象,支持链式属性访问和方法调用
@@ -597,7 +556,7 @@ declare function compileAndEvaluate<TResult = unknown, TVars extends Record<stri
597
556
  */
598
557
  declare function variable<T>(): Variable<T>;
599
558
  //#endregion
600
- //#region src/wrap.d.ts
559
+ //#region src/api/wrap.d.ts
601
560
  /**
602
561
  * 将静态值包装为 Proxy Expression
603
562
  * 返回的 Proxy 可以像 Variable 一样调用方法和访问属性
@@ -624,5 +583,53 @@ declare function variable<T>(): Variable<T>;
624
583
  */
625
584
  declare function wrap<T>(value: T): Proxify<T>;
626
585
  //#endregion
627
- export { type CompileOptions, type CompiledData, type CompiledExpression, type ExprValue, type FnNode, type InferLambdaArgs, type InferLambdaReturn, type Lambda, type LambdaBuilder, type Proxify, type ProxyExpression, type Variable, compile, compileAndEvaluate, evaluate, expr, lambda, t, variable, wrap };
586
+ //#region src/core/compile.d.ts
587
+ /**
588
+ * 编译选项
589
+ */
590
+ interface CompileOptions {}
591
+ /**
592
+ * 将 Proxy Expression 编译为可序列化的 JSON 结构
593
+ *
594
+ * @template TResult - 表达式结果类型
595
+ * @param expression - Proxy Expression,或包含 Proxy 的对象/数组/原始值
596
+ * @param variables - 所有使用的变量定义
597
+ * @param options - 编译选项
598
+ * @returns 编译后的数据结构 [变量名列表, 表达式1, 表达式2, ...]
599
+ *
600
+ * @throws 如果传入无效的表达式或未定义的变量引用
601
+ *
602
+ * @example
603
+ * ```ts
604
+ * const x = variable<number>()
605
+ * const y = variable<number>()
606
+ * const sum = expr({ x, y })("x + y")
607
+ * const result = expr({ sum, x })("sum * x")
608
+ * const compiled = compile(result, { x, y })
609
+ * // => [["x", "y"], "($[0]+$[1])*$[0]"]
610
+ * ```
611
+ */
612
+ declare function compile<TResult>(expression: ExprValue<TResult>, variables: Record<string, unknown>, _options?: CompileOptions): CompiledData;
613
+ //#endregion
614
+ //#region src/core/evaluate.d.ts
615
+ /**
616
+ * 执行编译后的表达式
617
+ *
618
+ * @template TResult - 表达式结果类型
619
+ * @param data - 编译后的数据结构 [变量名列表, 表达式1, 表达式2, ...]
620
+ * @param values - 变量值映射,按变量名提供值
621
+ * @returns 最后一个表达式的求值结果
622
+ *
623
+ * @throws 如果运行时类型验证失败或表达式执行出错
624
+ *
625
+ * @example
626
+ * ```ts
627
+ * const compiled = [["x", "y"], "$[0]+$[1]", "$[1]*2"]
628
+ * const result = evaluate<number>(compiled, { x: 2, y: 3 })
629
+ * // => 6 (3 * 2)
630
+ * ```
631
+ */
632
+ declare function evaluate<TResult = unknown>(data: CompiledData, values: Record<string, unknown>): TResult;
633
+ //#endregion
634
+ export { type CompileOptions, type CompiledData, type CompiledExpression, type ExprValue, type FnNode, type InferLambdaArgs, type InferLambdaReturn, type Lambda, type LambdaBuilder, type Proxify, type ProxyExpression, type Variable, compile, evaluate, expr, lambda, t, variable, wrap };
628
635
  //# sourceMappingURL=index.d.mts.map