@variojs/core 0.0.1

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.
Files changed (150) hide show
  1. package/README.md +270 -0
  2. package/dist/errors.d.ts +100 -0
  3. package/dist/errors.d.ts.map +1 -0
  4. package/dist/errors.js +132 -0
  5. package/dist/errors.js.map +1 -0
  6. package/dist/expression/cache.d.ts +53 -0
  7. package/dist/expression/cache.d.ts.map +1 -0
  8. package/dist/expression/cache.js +158 -0
  9. package/dist/expression/cache.js.map +1 -0
  10. package/dist/expression/compiler.d.ts +34 -0
  11. package/dist/expression/compiler.d.ts.map +1 -0
  12. package/dist/expression/compiler.js +141 -0
  13. package/dist/expression/compiler.js.map +1 -0
  14. package/dist/expression/dependencies.d.ts +17 -0
  15. package/dist/expression/dependencies.d.ts.map +1 -0
  16. package/dist/expression/dependencies.js +106 -0
  17. package/dist/expression/dependencies.js.map +1 -0
  18. package/dist/expression/evaluate.d.ts +22 -0
  19. package/dist/expression/evaluate.d.ts.map +1 -0
  20. package/dist/expression/evaluate.js +75 -0
  21. package/dist/expression/evaluate.js.map +1 -0
  22. package/dist/expression/evaluator.d.ts +22 -0
  23. package/dist/expression/evaluator.d.ts.map +1 -0
  24. package/dist/expression/evaluator.js +533 -0
  25. package/dist/expression/evaluator.js.map +1 -0
  26. package/dist/expression/index.d.ts +12 -0
  27. package/dist/expression/index.d.ts.map +1 -0
  28. package/dist/expression/index.js +12 -0
  29. package/dist/expression/index.js.map +1 -0
  30. package/dist/expression/parser.d.ts +15 -0
  31. package/dist/expression/parser.d.ts.map +1 -0
  32. package/dist/expression/parser.js +42 -0
  33. package/dist/expression/parser.js.map +1 -0
  34. package/dist/expression/utils.d.ts +46 -0
  35. package/dist/expression/utils.d.ts.map +1 -0
  36. package/dist/expression/utils.js +78 -0
  37. package/dist/expression/utils.js.map +1 -0
  38. package/dist/expression/whitelist.d.ts +24 -0
  39. package/dist/expression/whitelist.d.ts.map +1 -0
  40. package/dist/expression/whitelist.js +198 -0
  41. package/dist/expression/whitelist.js.map +1 -0
  42. package/dist/index.d.ts +18 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +21 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/runtime/context.d.ts +8 -0
  47. package/dist/runtime/context.d.ts.map +1 -0
  48. package/dist/runtime/context.js +7 -0
  49. package/dist/runtime/context.js.map +1 -0
  50. package/dist/runtime/create-context.d.ts +20 -0
  51. package/dist/runtime/create-context.d.ts.map +1 -0
  52. package/dist/runtime/create-context.js +62 -0
  53. package/dist/runtime/create-context.js.map +1 -0
  54. package/dist/runtime/index.d.ts +10 -0
  55. package/dist/runtime/index.d.ts.map +1 -0
  56. package/dist/runtime/index.js +10 -0
  57. package/dist/runtime/index.js.map +1 -0
  58. package/dist/runtime/loop-context-pool.d.ts +58 -0
  59. package/dist/runtime/loop-context-pool.d.ts.map +1 -0
  60. package/dist/runtime/loop-context-pool.js +114 -0
  61. package/dist/runtime/loop-context-pool.js.map +1 -0
  62. package/dist/runtime/path.d.ts +114 -0
  63. package/dist/runtime/path.d.ts.map +1 -0
  64. package/dist/runtime/path.js +302 -0
  65. package/dist/runtime/path.js.map +1 -0
  66. package/dist/runtime/proxy.d.ts +18 -0
  67. package/dist/runtime/proxy.d.ts.map +1 -0
  68. package/dist/runtime/proxy.js +54 -0
  69. package/dist/runtime/proxy.js.map +1 -0
  70. package/dist/runtime/sandbox.d.ts +20 -0
  71. package/dist/runtime/sandbox.d.ts.map +1 -0
  72. package/dist/runtime/sandbox.js +32 -0
  73. package/dist/runtime/sandbox.js.map +1 -0
  74. package/dist/types.d.ts +191 -0
  75. package/dist/types.d.ts.map +1 -0
  76. package/dist/types.js +20 -0
  77. package/dist/types.js.map +1 -0
  78. package/dist/vm/errors.d.ts +5 -0
  79. package/dist/vm/errors.d.ts.map +1 -0
  80. package/dist/vm/errors.js +5 -0
  81. package/dist/vm/errors.js.map +1 -0
  82. package/dist/vm/executor.d.ts +35 -0
  83. package/dist/vm/executor.d.ts.map +1 -0
  84. package/dist/vm/executor.js +137 -0
  85. package/dist/vm/executor.js.map +1 -0
  86. package/dist/vm/handlers/array/pop.d.ts +12 -0
  87. package/dist/vm/handlers/array/pop.d.ts.map +1 -0
  88. package/dist/vm/handlers/array/pop.js +28 -0
  89. package/dist/vm/handlers/array/pop.js.map +1 -0
  90. package/dist/vm/handlers/array/push.d.ts +13 -0
  91. package/dist/vm/handlers/array/push.d.ts.map +1 -0
  92. package/dist/vm/handlers/array/push.js +42 -0
  93. package/dist/vm/handlers/array/push.js.map +1 -0
  94. package/dist/vm/handlers/array/shift.d.ts +12 -0
  95. package/dist/vm/handlers/array/shift.d.ts.map +1 -0
  96. package/dist/vm/handlers/array/shift.js +28 -0
  97. package/dist/vm/handlers/array/shift.js.map +1 -0
  98. package/dist/vm/handlers/array/splice.d.ts +12 -0
  99. package/dist/vm/handlers/array/splice.d.ts.map +1 -0
  100. package/dist/vm/handlers/array/splice.js +59 -0
  101. package/dist/vm/handlers/array/splice.js.map +1 -0
  102. package/dist/vm/handlers/array/unshift.d.ts +13 -0
  103. package/dist/vm/handlers/array/unshift.d.ts.map +1 -0
  104. package/dist/vm/handlers/array/unshift.js +42 -0
  105. package/dist/vm/handlers/array/unshift.js.map +1 -0
  106. package/dist/vm/handlers/array/utils.d.ts +10 -0
  107. package/dist/vm/handlers/array/utils.d.ts.map +1 -0
  108. package/dist/vm/handlers/array/utils.js +33 -0
  109. package/dist/vm/handlers/array/utils.js.map +1 -0
  110. package/dist/vm/handlers/batch.d.ts +12 -0
  111. package/dist/vm/handlers/batch.d.ts.map +1 -0
  112. package/dist/vm/handlers/batch.js +40 -0
  113. package/dist/vm/handlers/batch.js.map +1 -0
  114. package/dist/vm/handlers/call.d.ts +14 -0
  115. package/dist/vm/handlers/call.d.ts.map +1 -0
  116. package/dist/vm/handlers/call.js +65 -0
  117. package/dist/vm/handlers/call.js.map +1 -0
  118. package/dist/vm/handlers/emit.d.ts +12 -0
  119. package/dist/vm/handlers/emit.d.ts.map +1 -0
  120. package/dist/vm/handlers/emit.js +26 -0
  121. package/dist/vm/handlers/emit.js.map +1 -0
  122. package/dist/vm/handlers/if.d.ts +13 -0
  123. package/dist/vm/handlers/if.d.ts.map +1 -0
  124. package/dist/vm/handlers/if.js +35 -0
  125. package/dist/vm/handlers/if.js.map +1 -0
  126. package/dist/vm/handlers/index.d.ts +14 -0
  127. package/dist/vm/handlers/index.d.ts.map +1 -0
  128. package/dist/vm/handlers/index.js +55 -0
  129. package/dist/vm/handlers/index.js.map +1 -0
  130. package/dist/vm/handlers/log.d.ts +12 -0
  131. package/dist/vm/handlers/log.d.ts.map +1 -0
  132. package/dist/vm/handlers/log.js +41 -0
  133. package/dist/vm/handlers/log.js.map +1 -0
  134. package/dist/vm/handlers/loop.d.ts +12 -0
  135. package/dist/vm/handlers/loop.d.ts.map +1 -0
  136. package/dist/vm/handlers/loop.js +71 -0
  137. package/dist/vm/handlers/loop.js.map +1 -0
  138. package/dist/vm/handlers/navigate.d.ts +12 -0
  139. package/dist/vm/handlers/navigate.d.ts.map +1 -0
  140. package/dist/vm/handlers/navigate.js +43 -0
  141. package/dist/vm/handlers/navigate.js.map +1 -0
  142. package/dist/vm/handlers/set.d.ts +15 -0
  143. package/dist/vm/handlers/set.d.ts.map +1 -0
  144. package/dist/vm/handlers/set.js +30 -0
  145. package/dist/vm/handlers/set.js.map +1 -0
  146. package/dist/vm/index.d.ts +8 -0
  147. package/dist/vm/index.d.ts.map +1 -0
  148. package/dist/vm/index.js +7 -0
  149. package/dist/vm/index.js.map +1 -0
  150. package/package.json +38 -0
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Proxy 沙箱实现
3
+ *
4
+ * 功能:
5
+ * - 防止覆盖系统 API($ 和 _ 前缀保护)
6
+ * - 拦截属性设置操作
7
+ */
8
+ /**
9
+ * 创建受保护的 Proxy 上下文
10
+ * 禁止设置以 $ 或 _ 开头的属性
11
+ *
12
+ * @template T 上下文类型,必须是 RuntimeContext 的子类型
13
+ * @param ctx 运行时上下文对象
14
+ * @returns 受保护的 Proxy 包装的上下文
15
+ */
16
+ export function createProxy(ctx) {
17
+ // 允许设置和删除的特殊变量(循环/事件上下文变量)
18
+ // 注意:$methods 不在此列表中,不允许被整体覆盖
19
+ const allowedSpecialVars = ['$event', '$item', '$index'];
20
+ return new Proxy(ctx, {
21
+ set(target, prop, value) {
22
+ const propName = String(prop);
23
+ // 禁止覆盖系统 API
24
+ if (propName.startsWith('$') || propName.startsWith('_')) {
25
+ // 允许设置特殊变量
26
+ if (allowedSpecialVars.includes(propName)) {
27
+ return Reflect.set(target, prop, value);
28
+ }
29
+ throw new Error(`Cannot override system API: ${propName}. ` +
30
+ `Properties starting with "$" or "_" are protected.`);
31
+ }
32
+ return Reflect.set(target, prop, value);
33
+ },
34
+ get(target, prop) {
35
+ return Reflect.get(target, prop);
36
+ },
37
+ has(target, prop) {
38
+ return Reflect.has(target, prop);
39
+ },
40
+ deleteProperty(target, prop) {
41
+ const propName = String(prop);
42
+ // 禁止删除系统 API
43
+ if (propName.startsWith('$') || propName.startsWith('_')) {
44
+ // 允许删除特殊变量
45
+ if (allowedSpecialVars.includes(propName)) {
46
+ return Reflect.deleteProperty(target, prop);
47
+ }
48
+ throw new Error(`Cannot delete system API: ${propName}`);
49
+ }
50
+ return Reflect.deleteProperty(target, prop);
51
+ }
52
+ });
53
+ }
54
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/runtime/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAA2B,GAAM;IAC1D,2BAA2B;IAC3B,8BAA8B;IAC9B,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IAExD,OAAO,IAAI,KAAK,CAAC,GAAG,EAAE;QACpB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK;YACrB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;YAE7B,aAAa;YACb,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzD,WAAW;gBACX,IAAI,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;gBACzC,CAAC;gBAED,MAAM,IAAI,KAAK,CACb,+BAA+B,QAAQ,IAAI;oBAC3C,oDAAoD,CACrD,CAAA;YACH,CAAC;YAED,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QACzC,CAAC;QAED,GAAG,CAAC,MAAM,EAAE,IAAI;YACd,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAClC,CAAC;QAED,GAAG,CAAC,MAAM,EAAE,IAAI;YACd,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAClC,CAAC;QAED,cAAc,CAAC,MAAM,EAAE,IAAI;YACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;YAE7B,aAAa;YACb,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzD,WAAW;gBACX,IAAI,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1C,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;gBAC7C,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAA;YAC1D,CAAC;YAED,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAC7C,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 沙箱边界控制
3
+ *
4
+ * 功能:
5
+ * - 表达式层:严格沙箱,无法访问全局对象
6
+ * - 方法层:白名单控制,可访问全局对象
7
+ */
8
+ import type { RuntimeContext } from '../types.js';
9
+ /**
10
+ * 创建表达式沙箱上下文
11
+ * 移除全局对象访问能力
12
+ */
13
+ export declare function createExpressionSandbox(ctx: RuntimeContext): RuntimeContext;
14
+ /**
15
+ * 检查属性访问是否安全(用于表达式求值)
16
+ */
17
+ export declare function isSafePropertyAccess(prop: string, ctx: RuntimeContext, options?: {
18
+ allowGlobals?: boolean;
19
+ }): boolean;
20
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/runtime/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,CAQ3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,cAAc,EACnB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACvC,OAAO,CAWT"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * 沙箱边界控制
3
+ *
4
+ * 功能:
5
+ * - 表达式层:严格沙箱,无法访问全局对象
6
+ * - 方法层:白名单控制,可访问全局对象
7
+ */
8
+ /**
9
+ * 创建表达式沙箱上下文
10
+ * 移除全局对象访问能力
11
+ */
12
+ export function createExpressionSandbox(ctx) {
13
+ // 创建受限的上下文副本,移除全局对象
14
+ const sandbox = { ...ctx };
15
+ // 移除可能的全局对象引用
16
+ // 表达式求值时,只能访问状态属性和白名单函数
17
+ return sandbox;
18
+ }
19
+ /**
20
+ * 检查属性访问是否安全(用于表达式求值)
21
+ */
22
+ export function isSafePropertyAccess(prop, ctx, options = {}) {
23
+ const allowGlobals = options.allowGlobals ?? ctx.$exprOptions?.allowGlobals ?? false;
24
+ // 禁止访问全局对象(可通过 allowGlobals 开关控制)
25
+ const globalProps = ['window', 'document', 'global', 'globalThis', 'self'];
26
+ if (!allowGlobals && globalProps.includes(prop)) {
27
+ return false;
28
+ }
29
+ // 允许访问状态属性和系统 API
30
+ return true;
31
+ }
32
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/runtime/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAmB;IACzD,oBAAoB;IACpB,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,CAAA;IAE1B,cAAc;IACd,wBAAwB;IAExB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,GAAmB,EACnB,UAAsC,EAAE;IAExC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC,YAAY,EAAE,YAAY,IAAI,KAAK,CAAA;IAEpF,kCAAkC;IAClC,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAA;IAC1E,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,kBAAkB;IAClB,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Vario Core Types
3
+ *
4
+ * 复杂类型集中在此定义,便于推演类型关系、保持业务/运行时逻辑代码简洁。
5
+ * 核心:RuntimeContext、路径值推导(GetPathValue/SetPathValue)、上下文创建选项(CreateContextOptions)等。
6
+ */
7
+ /**
8
+ * 方法处理器类型
9
+ * 所有注册到 $methods 的方法必须符合此签名
10
+ *
11
+ * 注意:动作处理器也通过 $methods 注册,但它们的参数是 Action
12
+ */
13
+ export type MethodHandler<TParams = unknown, TResult = unknown> = (ctx: RuntimeContext, params: TParams) => Promise<TResult> | TResult;
14
+ /**
15
+ * 动作处理器类型(特殊的方法处理器)
16
+ */
17
+ export type ActionHandler = MethodHandler<Action, void>;
18
+ /**
19
+ * 方法注册表类型
20
+ * 支持普通方法和指令处理器
21
+ */
22
+ export type MethodsRegistry = Record<string, MethodHandler>;
23
+ /**
24
+ * 表达式求值选项
25
+ */
26
+ export interface ExpressionOptions {
27
+ /**
28
+ * 是否允许访问全局对象(默认 false)
29
+ */
30
+ allowGlobals?: boolean;
31
+ /**
32
+ * 最大求值步数
33
+ */
34
+ maxSteps?: number;
35
+ /**
36
+ * 求值超时(毫秒)
37
+ */
38
+ timeout?: number;
39
+ /**
40
+ * 最大嵌套深度(防止 DoS 攻击,默认 50)
41
+ */
42
+ maxNestingDepth?: number;
43
+ }
44
+ /**
45
+ * 运行时上下文接口
46
+ * 扁平化状态设计:直接属性访问,无 models. 前缀
47
+ *
48
+ * @template TState 状态类型,用于类型推导和约束
49
+ *
50
+ * 设计说明:
51
+ * - 使用接口 + 索引签名,既支持类型推导又支持动态属性
52
+ * - 状态属性通过 TState 泛型约束
53
+ * - 系统 API 使用具体类型定义,确保类型安全
54
+ */
55
+ /**
56
+ * 运行时上下文类型
57
+ * 使用交叉类型结合接口,既支持状态类型推导又支持动态属性
58
+ */
59
+ export type RuntimeContext<TState extends Record<string, unknown> = Record<string, unknown>> = TState & {
60
+ $emit: (event: string, data?: unknown) => void;
61
+ $methods: MethodsRegistry;
62
+ $exprOptions?: ExpressionOptions;
63
+ $event?: Event;
64
+ $item?: TState[keyof TState];
65
+ $index?: number;
66
+ _get: <TPath extends string>(path: TPath) => GetPathValue<TState, TPath>;
67
+ _set: <TPath extends string>(path: TPath, value: SetPathValue<TState, TPath>, options?: {
68
+ skipCallback?: boolean;
69
+ }) => void;
70
+ } & Record<string, unknown>;
71
+ /**
72
+ * 路径值类型推导工具
73
+ * 根据路径字符串推导对应的值类型,支持对象嵌套与数组索引
74
+ *
75
+ * @example
76
+ * GetPathValue<{ user: { name: string } }, 'user.name'> // string
77
+ * GetPathValue<{ items: number[] }, 'items.0'> // number
78
+ * GetPathValue<{ list: { id: number }[] }, 'list.0.id'> // number
79
+ */
80
+ export type GetPathValue<T, TPath extends string> = TPath extends `${infer Key}.${infer Rest}` ? Key extends keyof T ? T[Key] extends Record<string, unknown> ? GetPathValue<T[Key], Rest> : T[Key] extends readonly (infer E)[] ? Rest extends `${number}` ? E : Rest extends `${number}.${infer R}` ? GetPathValue<E, R> : unknown : unknown : unknown : TPath extends keyof T ? T[TPath] : unknown;
81
+ /**
82
+ * 路径设置值类型推导工具
83
+ * 根据路径字符串推导可以设置的值类型
84
+ */
85
+ export type SetPathValue<T, TPath extends string> = GetPathValue<T, TPath>;
86
+ /**
87
+ * 状态变更回调:path 与 value 类型联动,TPath 由 path 推导,value 为 GetPathValue<TState, TPath>
88
+ */
89
+ export type OnStateChangeCallback<TState extends Record<string, unknown>> = <TPath extends string>(path: TPath, value: GetPathValue<TState, TPath>, ctx: RuntimeContext<TState>) => void;
90
+ /**
91
+ * RuntimeContext 创建选项
92
+ * @template TState 与 context 一致的状态类型,供 onStateChange 等回调获得完整类型推导
93
+ */
94
+ export interface CreateContextOptions<TState extends Record<string, unknown> = Record<string, unknown>> {
95
+ onEmit?: (event: string, data?: unknown) => void;
96
+ methods?: MethodsRegistry;
97
+ /** 在 _set 调用后触发,value 类型随 path 推导 */
98
+ onStateChange?: OnStateChangeCallback<TState>;
99
+ createObject?: () => Record<string, unknown>;
100
+ createArray?: () => unknown[];
101
+ exprOptions?: ExpressionOptions;
102
+ }
103
+ /**
104
+ * 动作接口
105
+ * 使用泛型约束,根据 type 类型推导参数结构
106
+ */
107
+ export interface Action {
108
+ type: string;
109
+ [key: string]: unknown;
110
+ }
111
+ /**
112
+ * 动作类型映射
113
+ * 根据 type 值推导对应的动作参数类型
114
+ */
115
+ export type ActionMap = {
116
+ set: {
117
+ path: string;
118
+ value: string | unknown;
119
+ };
120
+ emit: {
121
+ event: string;
122
+ data?: string | unknown;
123
+ };
124
+ navigate: {
125
+ to: string;
126
+ };
127
+ log: {
128
+ level?: 'info' | 'warn' | 'error';
129
+ message: string;
130
+ };
131
+ if: {
132
+ cond: string;
133
+ then?: Action[];
134
+ else?: Action[];
135
+ };
136
+ loop: {
137
+ var: string;
138
+ in: string;
139
+ body: Action[];
140
+ };
141
+ call: {
142
+ method: string;
143
+ params?: Record<string, unknown>;
144
+ resultTo?: string;
145
+ };
146
+ batch: {
147
+ actions: Action[];
148
+ };
149
+ push: {
150
+ path: string;
151
+ value: string | unknown;
152
+ };
153
+ pop: {
154
+ path: string;
155
+ };
156
+ shift: {
157
+ path: string;
158
+ };
159
+ unshift: {
160
+ path: string;
161
+ value: string | unknown;
162
+ };
163
+ splice: {
164
+ path: string;
165
+ start: number | string;
166
+ deleteCount?: number | string;
167
+ items?: string | unknown[];
168
+ };
169
+ };
170
+ /**
171
+ * 类型守卫:检查动作是否符合特定类型
172
+ */
173
+ export declare function isActionOfType<T extends keyof ActionMap>(action: Action, actionType: T): action is Action & ActionMap[T];
174
+ /**
175
+ * 表达式缓存接口
176
+ * 结果类型使用 unknown,因为表达式求值结果类型无法静态推导
177
+ */
178
+ export interface ExpressionCache {
179
+ expr: string;
180
+ result: unknown;
181
+ dependencies: string[];
182
+ timestamp: number;
183
+ }
184
+ /**
185
+ * 错误类型定义
186
+ *
187
+ * @deprecated 使用 @variojs/core/errors 中的错误类
188
+ * 保留这些导出以保持向后兼容,但建议使用新的错误体系
189
+ */
190
+ export { ActionError, ExpressionError, ServiceError, BatchError, VarioError, ErrorCodes, type ErrorContext, type ErrorCode } from './errors.js';
191
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Vario Core Types
3
+ *
4
+ * 复杂类型集中在此定义,便于推演类型关系、保持业务/运行时逻辑代码简洁。
5
+ * 核心:RuntimeContext、路径值推导(GetPathValue/SetPathValue)、上下文创建选项(CreateContextOptions)等。
6
+ */
7
+ /**
8
+ * 类型守卫:检查动作是否符合特定类型
9
+ */
10
+ export function isActionOfType(action, actionType) {
11
+ return action.type === actionType;
12
+ }
13
+ /**
14
+ * 错误类型定义
15
+ *
16
+ * @deprecated 使用 @variojs/core/errors 中的错误类
17
+ * 保留这些导出以保持向后兼容,但建议使用新的错误体系
18
+ */
19
+ export { ActionError, ExpressionError, ServiceError, BatchError, VarioError, ErrorCodes } from './errors.js';
20
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyKH;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,UAAa;IAEb,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,CAAA;AACnC,CAAC;AAaD;;;;;GAKG;AACH,OAAO,EACL,WAAW,EACX,eAAe,EACf,YAAY,EACZ,UAAU,EACV,UAAU,EACV,UAAU,EAGX,MAAM,aAAa,CAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Action VM 错误类型
3
+ */
4
+ export { ActionError, ExpressionError, ServiceError, BatchError } from '../types.js';
5
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/vm/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,eAAe,EACf,YAAY,EACZ,UAAU,EACX,MAAM,aAAa,CAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Action VM 错误类型
3
+ */
4
+ export { ActionError, ExpressionError, ServiceError, BatchError } from '../types.js';
5
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/vm/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,eAAe,EACf,YAAY,EACZ,UAAU,EACX,MAAM,aAAa,CAAA"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Action VM 执行器
3
+ *
4
+ * 功能:
5
+ * - 执行动作序列
6
+ * - 通过 $methods 查找动作处理器
7
+ * - 错误处理和堆栈跟踪
8
+ * - 超时保护(防止无限循环)
9
+ *
10
+ * 参考架构图:vario-core/vm - Action VM
11
+ */
12
+ import type { RuntimeContext, Action } from '../types.js';
13
+ /**
14
+ * 执行动作序列的选项
15
+ */
16
+ export interface ExecuteOptions {
17
+ /**
18
+ * 超时时间(毫秒),默认 5000ms
19
+ */
20
+ timeout?: number;
21
+ /**
22
+ * 最大执行步数,默认 10000
23
+ * 每执行一个动作计为一步
24
+ */
25
+ maxSteps?: number;
26
+ }
27
+ /**
28
+ * 执行动作序列
29
+ *
30
+ * @param actions 动作数组
31
+ * @param ctx 运行时上下文
32
+ * @param options 执行选项
33
+ */
34
+ export declare function execute(actions: Action[], ctx: RuntimeContext, options?: ExecuteOptions): Promise<void>;
35
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/vm/executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGzD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EAAE,EACjB,GAAG,EAAE,cAAc,EACnB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAwGf"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Action VM 执行器
3
+ *
4
+ * 功能:
5
+ * - 执行动作序列
6
+ * - 通过 $methods 查找动作处理器
7
+ * - 错误处理和堆栈跟踪
8
+ * - 超时保护(防止无限循环)
9
+ *
10
+ * 参考架构图:vario-core/vm - Action VM
11
+ */
12
+ import { ActionError, ServiceError, ErrorCodes } from '../errors.js';
13
+ /**
14
+ * 执行动作序列
15
+ *
16
+ * @param actions 动作数组
17
+ * @param ctx 运行时上下文
18
+ * @param options 执行选项
19
+ */
20
+ export async function execute(actions, ctx, options = {}) {
21
+ const timeout = options.timeout ?? 5000;
22
+ const maxSteps = options.maxSteps ?? 10000;
23
+ const startTime = Date.now();
24
+ let stepCount = 0;
25
+ // 创建 AbortController 用于超时中断(如果支持)
26
+ let abortController = null;
27
+ if (typeof AbortController !== 'undefined') {
28
+ abortController = new AbortController();
29
+ // 设置超时定时器
30
+ const timeoutId = setTimeout(() => {
31
+ abortController?.abort();
32
+ }, timeout);
33
+ // 清理定时器(如果执行完成)
34
+ const cleanup = () => clearTimeout(timeoutId);
35
+ try {
36
+ await executeActions(actions, ctx, abortController.signal, maxSteps, () => {
37
+ stepCount++;
38
+ if (stepCount > maxSteps) {
39
+ throw new ActionError(actions[actions.length - 1] || { type: 'unknown' }, `Action execution exceeded max steps (${maxSteps})`, ErrorCodes.ACTION_MAX_STEPS_EXCEEDED, {
40
+ metadata: {
41
+ maxSteps,
42
+ currentSteps: stepCount
43
+ }
44
+ });
45
+ }
46
+ // 检查超时
47
+ if (Date.now() - startTime > timeout) {
48
+ throw new ActionError(actions[actions.length - 1] || { type: 'unknown' }, `Action execution exceeded timeout (${timeout}ms)`, ErrorCodes.ACTION_TIMEOUT, {
49
+ metadata: {
50
+ timeout,
51
+ elapsedTime: Date.now() - startTime
52
+ }
53
+ });
54
+ }
55
+ });
56
+ cleanup();
57
+ }
58
+ catch (error) {
59
+ cleanup();
60
+ throw error;
61
+ }
62
+ }
63
+ else {
64
+ // 不支持 AbortController 的环境,使用时间检查
65
+ await executeActions(actions, ctx, null, maxSteps, () => {
66
+ stepCount++;
67
+ if (stepCount > maxSteps) {
68
+ throw new ActionError(actions[actions.length - 1] || { type: 'unknown' }, `Action execution exceeded max steps (${maxSteps})`, ErrorCodes.ACTION_MAX_STEPS_EXCEEDED, {
69
+ metadata: {
70
+ maxSteps,
71
+ currentSteps: stepCount
72
+ }
73
+ });
74
+ }
75
+ // 检查超时
76
+ if (Date.now() - startTime > timeout) {
77
+ throw new ActionError(actions[actions.length - 1] || { type: 'unknown' }, `Action execution exceeded timeout (${timeout}ms)`, ErrorCodes.ACTION_TIMEOUT, {
78
+ metadata: {
79
+ timeout,
80
+ elapsedTime: Date.now() - startTime
81
+ }
82
+ });
83
+ }
84
+ });
85
+ }
86
+ // 最终检查超时(即使有 AbortController,也做双重检查)
87
+ if (Date.now() - startTime > timeout) {
88
+ throw new ActionError(actions[actions.length - 1] || { type: 'unknown' }, `Action execution exceeded timeout (${timeout}ms)`, ErrorCodes.ACTION_TIMEOUT, {
89
+ metadata: {
90
+ timeout,
91
+ elapsedTime: Date.now() - startTime,
92
+ actionCount: actions.length
93
+ }
94
+ });
95
+ }
96
+ }
97
+ /**
98
+ * 执行动作序列(内部实现)
99
+ */
100
+ async function executeActions(actions, ctx, signal, _maxSteps, // 用于类型,实际限制在 checkLimits 中检查
101
+ checkLimits) {
102
+ for (const action of actions) {
103
+ // 检查中断信号
104
+ if (signal?.aborted) {
105
+ throw new ActionError(action, 'Action execution was aborted', ErrorCodes.ACTION_ABORTED);
106
+ }
107
+ // 检查步数和超时限制
108
+ checkLimits();
109
+ // 所有动作(包括内置动作)统一通过 $methods 注册
110
+ const handler = ctx.$methods[action.type];
111
+ if (!handler) {
112
+ throw new ActionError(action, `Unknown action type: ${action.type}. Make sure the action is registered in $methods`, ErrorCodes.ACTION_UNKNOWN_TYPE);
113
+ }
114
+ try {
115
+ await handler(ctx, action);
116
+ }
117
+ catch (error) {
118
+ // 如果已经是 ActionError,直接抛出
119
+ if (error instanceof ActionError) {
120
+ throw error;
121
+ }
122
+ // 如果已经是 ServiceError,直接抛出
123
+ if (error instanceof ServiceError) {
124
+ throw error;
125
+ }
126
+ // 包装为 ActionError,收集上下文信息
127
+ const errorMessage = error instanceof Error ? error.message : String(error);
128
+ throw new ActionError(action, `Action execution failed: ${errorMessage}`, ErrorCodes.ACTION_EXECUTION_ERROR, {
129
+ metadata: {
130
+ originalError: error instanceof Error ? error.name : 'Unknown',
131
+ stack: error instanceof Error ? error.stack?.split('\n').slice(0, 5) : undefined
132
+ }
133
+ });
134
+ }
135
+ }
136
+ }
137
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/vm/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * pop 动作处理器
3
+ *
4
+ * 功能:删除数组末尾元素
5
+ * 示例:{ "type": "pop", "path": "items" }
6
+ */
7
+ import type { RuntimeContext, Action } from '../../../types.js';
8
+ /**
9
+ * 处理 pop 动作
10
+ */
11
+ export declare function handlePop(ctx: RuntimeContext, action: Action): Promise<void>;
12
+ //# sourceMappingURL=pop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pop.d.ts","sourceRoot":"","sources":["../../../../src/vm/handlers/array/pop.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAIxD;;GAEG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * pop 动作处理器
3
+ *
4
+ * 功能:删除数组末尾元素
5
+ * 示例:{ "type": "pop", "path": "items" }
6
+ */
7
+ import { ActionError, ErrorCodes } from '../../../errors.js';
8
+ import { invalidateCache } from '../../../expression/cache.js';
9
+ /**
10
+ * 处理 pop 动作
11
+ */
12
+ export async function handlePop(ctx, action) {
13
+ const { path } = action;
14
+ if (!path || typeof path !== 'string') {
15
+ throw new ActionError(action, 'pop action requires "path" parameter', ErrorCodes.ACTION_MISSING_PARAM, { metadata: { param: 'path' } });
16
+ }
17
+ // 获取数组
18
+ const array = ctx._get(path);
19
+ if (!Array.isArray(array)) {
20
+ throw new ActionError(action, `Path "${path}" does not point to an array`, ErrorCodes.ACTION_INVALID_PARAM, { metadata: { param: 'path', path, actualType: typeof array } });
21
+ }
22
+ // 删除末尾元素
23
+ array.pop();
24
+ // 使相关缓存失效
25
+ invalidateCache(path, ctx);
26
+ invalidateCache(`${path}.*`, ctx);
27
+ }
28
+ //# sourceMappingURL=pop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pop.js","sourceRoot":"","sources":["../../../../src/vm/handlers/array/pop.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAmB,EACnB,MAAc;IAEd,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IAEvB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,WAAW,CACnB,MAAM,EACN,sCAAsC,EACtC,UAAU,CAAC,oBAAoB,EAC/B,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAChC,CAAA;IACH,CAAC;IAED,OAAO;IACP,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,WAAW,CACnB,MAAM,EACN,SAAS,IAAI,8BAA8B,EAC3C,UAAU,CAAC,oBAAoB,EAC/B,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,KAAK,EAAE,EAAE,CAChE,CAAA;IACH,CAAC;IAED,SAAS;IACT,KAAK,CAAC,GAAG,EAAE,CAAA;IAEX,UAAU;IACV,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC1B,eAAe,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,CAAA;AACnC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * push 动作处理器
3
+ *
4
+ * 功能:添加元素到数组末尾
5
+ * 示例:{ "type": "push", "path": "items", "value": "{{ newItem }}" }
6
+ * 示例:{ "type": "push", "path": "todos", "items": [{ text: "{{ newTodo }}", done: false }] }
7
+ */
8
+ import type { RuntimeContext, Action } from '../../../types.js';
9
+ /**
10
+ * 处理 push 动作
11
+ */
12
+ export declare function handlePush(ctx: RuntimeContext, action: Action): Promise<void>;
13
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../../src/vm/handlers/array/push.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAKxD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAgDf"}