@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 +184 -177
- package/dist/index.mjs +1362 -1143
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -11
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
|
|
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]:
|
|
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/
|
|
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
|
-
|
|
271
|
-
type
|
|
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
|
-
|
|
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/
|
|
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
|
-
|
|
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
|