@variojs/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/__tests__/README.md +101 -0
  2. package/__tests__/errors.test.ts +139 -0
  3. package/__tests__/expression/cache.test.ts +118 -0
  4. package/__tests__/expression/compiler.test.ts +111 -0
  5. package/__tests__/expression/evaluate.test.ts +95 -0
  6. package/__tests__/expression/parser.test.ts +57 -0
  7. package/__tests__/expression/whitelist.test.ts +59 -0
  8. package/__tests__/performance.test.ts +379 -0
  9. package/__tests__/runtime/create-context.test.ts +78 -0
  10. package/__tests__/runtime/loop-context-pool.test.ts +74 -0
  11. package/__tests__/runtime/path.test.ts +128 -0
  12. package/__tests__/vm/executor-timeout.test.ts +117 -0
  13. package/__tests__/vm/executor.test.ts +173 -0
  14. package/__tests__/vm/handlers/array.test.ts +113 -0
  15. package/__tests__/vm/handlers/call.test.ts +93 -0
  16. package/dist/errors.d.ts +100 -0
  17. package/dist/errors.d.ts.map +1 -0
  18. package/dist/errors.js +132 -0
  19. package/dist/errors.js.map +1 -0
  20. package/dist/expression/cache.d.ts +53 -0
  21. package/dist/expression/cache.d.ts.map +1 -0
  22. package/dist/expression/cache.js +158 -0
  23. package/dist/expression/cache.js.map +1 -0
  24. package/dist/expression/compiler.d.ts +34 -0
  25. package/dist/expression/compiler.d.ts.map +1 -0
  26. package/dist/expression/compiler.js +123 -0
  27. package/dist/expression/compiler.js.map +1 -0
  28. package/dist/expression/dependencies.d.ts +17 -0
  29. package/dist/expression/dependencies.d.ts.map +1 -0
  30. package/dist/expression/dependencies.js +106 -0
  31. package/dist/expression/dependencies.js.map +1 -0
  32. package/dist/expression/evaluate.d.ts +22 -0
  33. package/dist/expression/evaluate.d.ts.map +1 -0
  34. package/dist/expression/evaluate.js +75 -0
  35. package/dist/expression/evaluate.js.map +1 -0
  36. package/dist/expression/evaluator.d.ts +22 -0
  37. package/dist/expression/evaluator.d.ts.map +1 -0
  38. package/dist/expression/evaluator.js +506 -0
  39. package/dist/expression/evaluator.js.map +1 -0
  40. package/dist/expression/index.d.ts +12 -0
  41. package/dist/expression/index.d.ts.map +1 -0
  42. package/dist/expression/index.js +12 -0
  43. package/dist/expression/index.js.map +1 -0
  44. package/dist/expression/parser.d.ts +15 -0
  45. package/dist/expression/parser.d.ts.map +1 -0
  46. package/dist/expression/parser.js +42 -0
  47. package/dist/expression/parser.js.map +1 -0
  48. package/dist/expression/utils.d.ts +46 -0
  49. package/dist/expression/utils.d.ts.map +1 -0
  50. package/dist/expression/utils.js +78 -0
  51. package/dist/expression/utils.js.map +1 -0
  52. package/dist/expression/whitelist.d.ts +24 -0
  53. package/dist/expression/whitelist.d.ts.map +1 -0
  54. package/dist/expression/whitelist.js +198 -0
  55. package/dist/expression/whitelist.js.map +1 -0
  56. package/dist/index.d.ts +19 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +21 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/runtime/context.d.ts +8 -0
  61. package/dist/runtime/context.d.ts.map +1 -0
  62. package/dist/runtime/context.js +7 -0
  63. package/dist/runtime/context.js.map +1 -0
  64. package/dist/runtime/create-context.d.ts +50 -0
  65. package/dist/runtime/create-context.d.ts.map +1 -0
  66. package/dist/runtime/create-context.js +73 -0
  67. package/dist/runtime/create-context.js.map +1 -0
  68. package/dist/runtime/index.d.ts +10 -0
  69. package/dist/runtime/index.d.ts.map +1 -0
  70. package/dist/runtime/index.js +10 -0
  71. package/dist/runtime/index.js.map +1 -0
  72. package/dist/runtime/loop-context-pool.d.ts +58 -0
  73. package/dist/runtime/loop-context-pool.d.ts.map +1 -0
  74. package/dist/runtime/loop-context-pool.js +114 -0
  75. package/dist/runtime/loop-context-pool.js.map +1 -0
  76. package/dist/runtime/path.d.ts +114 -0
  77. package/dist/runtime/path.d.ts.map +1 -0
  78. package/dist/runtime/path.js +302 -0
  79. package/dist/runtime/path.js.map +1 -0
  80. package/dist/runtime/proxy.d.ts +18 -0
  81. package/dist/runtime/proxy.d.ts.map +1 -0
  82. package/dist/runtime/proxy.js +53 -0
  83. package/dist/runtime/proxy.js.map +1 -0
  84. package/dist/runtime/sandbox.d.ts +20 -0
  85. package/dist/runtime/sandbox.d.ts.map +1 -0
  86. package/dist/runtime/sandbox.js +32 -0
  87. package/dist/runtime/sandbox.js.map +1 -0
  88. package/dist/types.d.ts +175 -0
  89. package/dist/types.d.ts.map +1 -0
  90. package/dist/types.js +22 -0
  91. package/dist/types.js.map +1 -0
  92. package/dist/vm/action.d.ts +11 -0
  93. package/dist/vm/action.d.ts.map +1 -0
  94. package/dist/vm/action.js +10 -0
  95. package/dist/vm/action.js.map +1 -0
  96. package/dist/vm/errors.d.ts +5 -0
  97. package/dist/vm/errors.d.ts.map +1 -0
  98. package/dist/vm/errors.js +5 -0
  99. package/dist/vm/errors.js.map +1 -0
  100. package/dist/vm/executor.d.ts +35 -0
  101. package/dist/vm/executor.d.ts.map +1 -0
  102. package/dist/vm/executor.js +137 -0
  103. package/dist/vm/executor.js.map +1 -0
  104. package/dist/vm/handlers/array/pop.d.ts +12 -0
  105. package/dist/vm/handlers/array/pop.d.ts.map +1 -0
  106. package/dist/vm/handlers/array/pop.js +28 -0
  107. package/dist/vm/handlers/array/pop.js.map +1 -0
  108. package/dist/vm/handlers/array/push.d.ts +13 -0
  109. package/dist/vm/handlers/array/push.d.ts.map +1 -0
  110. package/dist/vm/handlers/array/push.js +42 -0
  111. package/dist/vm/handlers/array/push.js.map +1 -0
  112. package/dist/vm/handlers/array/shift.d.ts +12 -0
  113. package/dist/vm/handlers/array/shift.d.ts.map +1 -0
  114. package/dist/vm/handlers/array/shift.js +28 -0
  115. package/dist/vm/handlers/array/shift.js.map +1 -0
  116. package/dist/vm/handlers/array/splice.d.ts +12 -0
  117. package/dist/vm/handlers/array/splice.d.ts.map +1 -0
  118. package/dist/vm/handlers/array/splice.js +59 -0
  119. package/dist/vm/handlers/array/splice.js.map +1 -0
  120. package/dist/vm/handlers/array/unshift.d.ts +13 -0
  121. package/dist/vm/handlers/array/unshift.d.ts.map +1 -0
  122. package/dist/vm/handlers/array/unshift.js +42 -0
  123. package/dist/vm/handlers/array/unshift.js.map +1 -0
  124. package/dist/vm/handlers/array/utils.d.ts +10 -0
  125. package/dist/vm/handlers/array/utils.d.ts.map +1 -0
  126. package/dist/vm/handlers/array/utils.js +33 -0
  127. package/dist/vm/handlers/array/utils.js.map +1 -0
  128. package/dist/vm/handlers/batch.d.ts +12 -0
  129. package/dist/vm/handlers/batch.d.ts.map +1 -0
  130. package/dist/vm/handlers/batch.js +40 -0
  131. package/dist/vm/handlers/batch.js.map +1 -0
  132. package/dist/vm/handlers/call.d.ts +14 -0
  133. package/dist/vm/handlers/call.d.ts.map +1 -0
  134. package/dist/vm/handlers/call.js +65 -0
  135. package/dist/vm/handlers/call.js.map +1 -0
  136. package/dist/vm/handlers/emit.d.ts +12 -0
  137. package/dist/vm/handlers/emit.d.ts.map +1 -0
  138. package/dist/vm/handlers/emit.js +26 -0
  139. package/dist/vm/handlers/emit.js.map +1 -0
  140. package/dist/vm/handlers/if.d.ts +13 -0
  141. package/dist/vm/handlers/if.d.ts.map +1 -0
  142. package/dist/vm/handlers/if.js +35 -0
  143. package/dist/vm/handlers/if.js.map +1 -0
  144. package/dist/vm/handlers/index.d.ts +11 -0
  145. package/dist/vm/handlers/index.d.ts.map +1 -0
  146. package/dist/vm/handlers/index.js +46 -0
  147. package/dist/vm/handlers/index.js.map +1 -0
  148. package/dist/vm/handlers/log.d.ts +12 -0
  149. package/dist/vm/handlers/log.d.ts.map +1 -0
  150. package/dist/vm/handlers/log.js +41 -0
  151. package/dist/vm/handlers/log.js.map +1 -0
  152. package/dist/vm/handlers/loop.d.ts +12 -0
  153. package/dist/vm/handlers/loop.d.ts.map +1 -0
  154. package/dist/vm/handlers/loop.js +71 -0
  155. package/dist/vm/handlers/loop.js.map +1 -0
  156. package/dist/vm/handlers/navigate.d.ts +12 -0
  157. package/dist/vm/handlers/navigate.d.ts.map +1 -0
  158. package/dist/vm/handlers/navigate.js +43 -0
  159. package/dist/vm/handlers/navigate.js.map +1 -0
  160. package/dist/vm/handlers/set.d.ts +15 -0
  161. package/dist/vm/handlers/set.d.ts.map +1 -0
  162. package/dist/vm/handlers/set.js +30 -0
  163. package/dist/vm/handlers/set.js.map +1 -0
  164. package/dist/vm/index.d.ts +8 -0
  165. package/dist/vm/index.d.ts.map +1 -0
  166. package/dist/vm/index.js +7 -0
  167. package/dist/vm/index.js.map +1 -0
  168. package/package.json +34 -0
  169. package/src/errors.ts +194 -0
  170. package/src/expression/README.md +192 -0
  171. package/src/expression/cache.ts +199 -0
  172. package/src/expression/compiler.ts +144 -0
  173. package/src/expression/dependencies.ts +116 -0
  174. package/src/expression/evaluate.ts +95 -0
  175. package/src/expression/evaluator.ts +640 -0
  176. package/src/expression/index.ts +27 -0
  177. package/src/expression/parser.ts +54 -0
  178. package/src/expression/utils.ts +89 -0
  179. package/src/expression/whitelist.ts +224 -0
  180. package/src/globals.d.ts +10 -0
  181. package/src/index.ts +72 -0
  182. package/src/runtime/context.ts +8 -0
  183. package/src/runtime/create-context.ts +133 -0
  184. package/src/runtime/index.ts +28 -0
  185. package/src/runtime/loop-context-pool.ts +134 -0
  186. package/src/runtime/path.ts +372 -0
  187. package/src/runtime/proxy.ts +66 -0
  188. package/src/runtime/sandbox.ts +43 -0
  189. package/src/types.ts +177 -0
  190. package/src/vm/errors.ts +10 -0
  191. package/src/vm/executor.ts +210 -0
  192. package/src/vm/handlers/array/pop.ts +47 -0
  193. package/src/vm/handlers/array/push.ts +68 -0
  194. package/src/vm/handlers/array/shift.ts +47 -0
  195. package/src/vm/handlers/array/splice.ts +78 -0
  196. package/src/vm/handlers/array/unshift.ts +68 -0
  197. package/src/vm/handlers/array/utils.ts +41 -0
  198. package/src/vm/handlers/batch.ts +57 -0
  199. package/src/vm/handlers/call.ts +92 -0
  200. package/src/vm/handlers/emit.ts +39 -0
  201. package/src/vm/handlers/if.ts +48 -0
  202. package/src/vm/handlers/index.ts +52 -0
  203. package/src/vm/handlers/log.ts +54 -0
  204. package/src/vm/handlers/loop.ts +102 -0
  205. package/src/vm/handlers/navigate.ts +64 -0
  206. package/src/vm/handlers/set.ts +43 -0
  207. package/src/vm/index.ts +8 -0
  208. package/tsconfig.json +17 -0
  209. package/vitest.config.ts +30 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/vm/action.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGhD,YAAY,EAAE,aAAa,EAAE,CAAA;AAG7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 动作注册与分发
3
+ *
4
+ * 功能:
5
+ * - 内置动作注册到 $methods
6
+ * - 动作处理器管理
7
+ */
8
+ // 重新导出 registerBuiltinMethods,实际实现在 handlers/index.ts
9
+ export { registerBuiltinMethods } from './handlers/index.js';
10
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/vm/action.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,sDAAsD;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,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"}
@@ -0,0 +1,42 @@
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 { ActionError, ErrorCodes } from '../../../errors.js';
9
+ import { invalidateCache } from '../../../expression/cache.js';
10
+ import { evaluateExpressionsRecursively } from './utils.js';
11
+ /**
12
+ * 处理 push 动作
13
+ */
14
+ export async function handlePush(ctx, action) {
15
+ const { path, value, items } = action;
16
+ if (!path || typeof path !== 'string') {
17
+ throw new ActionError(action, 'push action requires "path" parameter', ErrorCodes.ACTION_MISSING_PARAM, { metadata: { param: 'path' } });
18
+ }
19
+ // 获取数组
20
+ const array = ctx._get(path);
21
+ if (!Array.isArray(array)) {
22
+ throw new ActionError(action, `Path "${path}" does not point to an array`, ErrorCodes.ACTION_INVALID_PARAM, { metadata: { param: 'path', path, actualType: typeof array } });
23
+ }
24
+ // 支持 items 作为 value 的别名
25
+ const inputValue = items !== undefined ? items : value;
26
+ if (inputValue === undefined) {
27
+ throw new ActionError(action, 'push action requires "value" or "items" parameter', ErrorCodes.ACTION_MISSING_PARAM, { metadata: { param: 'value|items' } });
28
+ }
29
+ // 递归求值表达式(支持对象/数组中的表达式)
30
+ const finalValue = evaluateExpressionsRecursively(inputValue, ctx);
31
+ // 如果是数组,展开添加
32
+ if (Array.isArray(finalValue)) {
33
+ array.push(...finalValue);
34
+ }
35
+ else {
36
+ array.push(finalValue);
37
+ }
38
+ // 使相关缓存失效
39
+ invalidateCache(path, ctx);
40
+ invalidateCache(`${path}.*`, ctx);
41
+ }
42
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../../../src/vm/handlers/array/push.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAA;AAE3D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAmB,EACnB,MAAc;IAEd,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,CAAA;IAErC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,WAAW,CACnB,MAAM,EACN,uCAAuC,EACvC,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,wBAAwB;IACxB,MAAM,UAAU,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;IAEtD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,WAAW,CACnB,MAAM,EACN,mDAAmD,EACnD,UAAU,CAAC,oBAAoB,EAC/B,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,CACvC,CAAA;IACH,CAAC;IAED,wBAAwB;IACxB,MAAM,UAAU,GAAG,8BAA8B,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;IAElE,aAAa;IACb,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAA;IAC3B,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACxB,CAAC;IAED,UAAU;IACV,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC1B,eAAe,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,CAAA;AACnC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * shift 动作处理器
3
+ *
4
+ * 功能:删除数组首元素
5
+ * 示例:{ "type": "shift", "path": "items" }
6
+ */
7
+ import type { RuntimeContext, Action } from '../../../types.js';
8
+ /**
9
+ * 处理 shift 动作
10
+ */
11
+ export declare function handleShift(ctx: RuntimeContext, action: Action): Promise<void>;
12
+ //# sourceMappingURL=shift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shift.d.ts","sourceRoot":"","sources":["../../../../src/vm/handlers/array/shift.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAIxD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * shift 动作处理器
3
+ *
4
+ * 功能:删除数组首元素
5
+ * 示例:{ "type": "shift", "path": "items" }
6
+ */
7
+ import { ActionError, ErrorCodes } from '../../../errors.js';
8
+ import { invalidateCache } from '../../../expression/cache.js';
9
+ /**
10
+ * 处理 shift 动作
11
+ */
12
+ export async function handleShift(ctx, action) {
13
+ const { path } = action;
14
+ if (!path || typeof path !== 'string') {
15
+ throw new ActionError(action, 'shift 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.shift();
24
+ // 使相关缓存失效
25
+ invalidateCache(path, ctx);
26
+ invalidateCache(`${path}.*`, ctx);
27
+ }
28
+ //# sourceMappingURL=shift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shift.js","sourceRoot":"","sources":["../../../../src/vm/handlers/array/shift.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,WAAW,CAC/B,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,wCAAwC,EACxC,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,QAAQ;IACR,KAAK,CAAC,KAAK,EAAE,CAAA;IAEb,UAAU;IACV,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC1B,eAAe,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,CAAA;AACnC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * splice 动作处理器
3
+ *
4
+ * 功能:删除或替换数组元素
5
+ * 示例:{ "type": "splice", "path": "items", "start": 0, "deleteCount": 1, "items": "{{ newItem }}" }
6
+ */
7
+ import type { RuntimeContext, Action } from '../../../types.js';
8
+ /**
9
+ * 处理 splice 动作
10
+ */
11
+ export declare function handleSplice(ctx: RuntimeContext, action: Action): Promise<void>;
12
+ //# sourceMappingURL=splice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splice.d.ts","sourceRoot":"","sources":["../../../../src/vm/handlers/array/splice.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAMxD;;GAEG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CA0Df"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * splice 动作处理器
3
+ *
4
+ * 功能:删除或替换数组元素
5
+ * 示例:{ "type": "splice", "path": "items", "start": 0, "deleteCount": 1, "items": "{{ newItem }}" }
6
+ */
7
+ import { ActionError, ErrorCodes } from '../../../errors.js';
8
+ import { evaluate } from '../../../expression/evaluate.js';
9
+ import { invalidateCache } from '../../../expression/cache.js';
10
+ import { evaluateExpressionsRecursively } from './utils.js';
11
+ /**
12
+ * 处理 splice 动作
13
+ */
14
+ export async function handleSplice(ctx, action) {
15
+ const { path, start, deleteCount = 0, items } = action;
16
+ if (!path || typeof path !== 'string') {
17
+ throw new ActionError(action, 'splice action requires "path" parameter', ErrorCodes.ACTION_MISSING_PARAM, { metadata: { param: 'path' } });
18
+ }
19
+ // 获取数组
20
+ const array = ctx._get(path);
21
+ if (!Array.isArray(array)) {
22
+ throw new ActionError(action, `Path "${path}" does not point to an array`, ErrorCodes.ACTION_INVALID_PARAM, { metadata: { param: 'path', path, actualType: typeof array } });
23
+ }
24
+ // 求值 start(支持表达式)
25
+ let finalStart;
26
+ if (typeof start === 'string' && start.startsWith('{{') && start.endsWith('}}')) {
27
+ const expr = start.slice(2, -2).trim();
28
+ finalStart = Number(evaluate(expr, ctx));
29
+ }
30
+ else {
31
+ finalStart = Number(start);
32
+ }
33
+ // 求值 deleteCount(支持表达式)
34
+ let finalDeleteCount;
35
+ if (typeof deleteCount === 'string' && deleteCount.startsWith('{{') && deleteCount.endsWith('}}')) {
36
+ const expr = deleteCount.slice(2, -2).trim();
37
+ finalDeleteCount = Number(evaluate(expr, ctx));
38
+ }
39
+ else {
40
+ finalDeleteCount = Number(deleteCount);
41
+ }
42
+ // 求值 items(支持递归表达式)
43
+ let finalItems = [];
44
+ if (items != null) {
45
+ const evaluated = evaluateExpressionsRecursively(items, ctx);
46
+ if (Array.isArray(evaluated)) {
47
+ finalItems = evaluated;
48
+ }
49
+ else {
50
+ finalItems = [evaluated];
51
+ }
52
+ }
53
+ // 执行 splice
54
+ array.splice(finalStart, finalDeleteCount, ...finalItems);
55
+ // 使相关缓存失效
56
+ invalidateCache(path, ctx);
57
+ invalidateCache(`${path}.*`, ctx);
58
+ }
59
+ //# sourceMappingURL=splice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splice.js","sourceRoot":"","sources":["../../../../src/vm/handlers/array/splice.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAA;AAE3D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAmB,EACnB,MAAc;IAEd,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,CAAA;IAEtD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,WAAW,CACnB,MAAM,EACN,yCAAyC,EACzC,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,kBAAkB;IAClB,IAAI,UAAkB,CAAA;IACtB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChF,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACtC,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAW,CAAC,CAAA;IACpD,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,MAAM,CAAC,KAAe,CAAC,CAAA;IACtC,CAAC;IAED,wBAAwB;IACxB,IAAI,gBAAwB,CAAA;IAC5B,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAClG,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC5C,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAW,CAAC,CAAA;IAC1D,CAAC;SAAM,CAAC;QACN,gBAAgB,GAAG,MAAM,CAAC,WAAqB,CAAC,CAAA;IAClD,CAAC;IAED,oBAAoB;IACpB,IAAI,UAAU,GAAc,EAAE,CAAA;IAC9B,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,MAAM,SAAS,GAAG,8BAA8B,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,UAAU,GAAG,SAAS,CAAA;QACxB,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,CAAC,SAAS,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;IAED,YAAY;IACZ,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC,CAAA;IAEzD,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
+ * unshift 动作处理器
3
+ *
4
+ * 功能:添加元素到数组开头
5
+ * 示例:{ "type": "unshift", "path": "items", "value": "{{ firstItem }}" }
6
+ * 示例:{ "type": "unshift", "path": "todos", "items": [{ text: "{{ newTodo }}", done: false }] }
7
+ */
8
+ import type { RuntimeContext, Action } from '../../../types.js';
9
+ /**
10
+ * 处理 unshift 动作
11
+ */
12
+ export declare function handleUnshift(ctx: RuntimeContext, action: Action): Promise<void>;
13
+ //# sourceMappingURL=unshift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unshift.d.ts","sourceRoot":"","sources":["../../../../src/vm/handlers/array/unshift.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAKxD;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAgDf"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * unshift 动作处理器
3
+ *
4
+ * 功能:添加元素到数组开头
5
+ * 示例:{ "type": "unshift", "path": "items", "value": "{{ firstItem }}" }
6
+ * 示例:{ "type": "unshift", "path": "todos", "items": [{ text: "{{ newTodo }}", done: false }] }
7
+ */
8
+ import { ActionError, ErrorCodes } from '../../../errors.js';
9
+ import { invalidateCache } from '../../../expression/cache.js';
10
+ import { evaluateExpressionsRecursively } from './utils.js';
11
+ /**
12
+ * 处理 unshift 动作
13
+ */
14
+ export async function handleUnshift(ctx, action) {
15
+ const { path, value, items } = action;
16
+ if (!path || typeof path !== 'string') {
17
+ throw new ActionError(action, 'unshift action requires "path" parameter', ErrorCodes.ACTION_MISSING_PARAM, { metadata: { param: 'path' } });
18
+ }
19
+ // 获取数组
20
+ const array = ctx._get(path);
21
+ if (!Array.isArray(array)) {
22
+ throw new ActionError(action, `Path "${path}" does not point to an array`, ErrorCodes.ACTION_INVALID_PARAM, { metadata: { param: 'path', path, actualType: typeof array } });
23
+ }
24
+ // 支持 items 作为 value 的别名
25
+ const inputValue = items !== undefined ? items : value;
26
+ if (inputValue === undefined) {
27
+ throw new ActionError(action, 'unshift action requires "value" or "items" parameter', ErrorCodes.ACTION_MISSING_PARAM, { metadata: { param: 'value|items' } });
28
+ }
29
+ // 递归求值表达式(支持对象/数组中的表达式)
30
+ const finalValue = evaluateExpressionsRecursively(inputValue, ctx);
31
+ // 如果是数组,展开添加
32
+ if (Array.isArray(finalValue)) {
33
+ array.unshift(...finalValue);
34
+ }
35
+ else {
36
+ array.unshift(finalValue);
37
+ }
38
+ // 使相关缓存失效
39
+ invalidateCache(path, ctx);
40
+ invalidateCache(`${path}.*`, ctx);
41
+ }
42
+ //# sourceMappingURL=unshift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unshift.js","sourceRoot":"","sources":["../../../../src/vm/handlers/array/unshift.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAA;AAE3D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAmB,EACnB,MAAc;IAEd,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,CAAA;IAErC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,WAAW,CACnB,MAAM,EACN,0CAA0C,EAC1C,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,wBAAwB;IACxB,MAAM,UAAU,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;IAEtD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,WAAW,CACnB,MAAM,EACN,sDAAsD,EACtD,UAAU,CAAC,oBAAoB,EAC/B,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,CACvC,CAAA;IACH,CAAC;IAED,wBAAwB;IACxB,MAAM,UAAU,GAAG,8BAA8B,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;IAElE,aAAa;IACb,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,CAAA;IAC9B,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAC3B,CAAC;IAED,UAAU;IACV,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC1B,eAAe,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,CAAA;AACnC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 数组指令工具函数
3
+ */
4
+ import type { RuntimeContext } from '../../../types.js';
5
+ /**
6
+ * 递归求值对象/数组中的表达式
7
+ * 支持在对象属性和数组元素中使用 {{ expression }} 格式
8
+ */
9
+ export declare function evaluateExpressionsRecursively(value: any, ctx: RuntimeContext): any;
10
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/vm/handlers/array/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAGhD;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,GAAG,EACV,GAAG,EAAE,cAAc,GAClB,GAAG,CA0BL"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * 数组指令工具函数
3
+ */
4
+ import { evaluate } from '../../../expression/evaluate.js';
5
+ /**
6
+ * 递归求值对象/数组中的表达式
7
+ * 支持在对象属性和数组元素中使用 {{ expression }} 格式
8
+ */
9
+ export function evaluateExpressionsRecursively(value, ctx) {
10
+ // 字符串:检查是否为表达式
11
+ if (typeof value === 'string') {
12
+ if (value.startsWith('{{') && value.endsWith('}}')) {
13
+ const expr = value.slice(2, -2).trim();
14
+ return evaluate(expr, ctx);
15
+ }
16
+ return value;
17
+ }
18
+ // 数组:递归处理每个元素
19
+ if (Array.isArray(value)) {
20
+ return value.map(item => evaluateExpressionsRecursively(item, ctx));
21
+ }
22
+ // 对象:递归处理每个属性值
23
+ if (value && typeof value === 'object') {
24
+ const result = {};
25
+ for (const [key, val] of Object.entries(value)) {
26
+ result[key] = evaluateExpressionsRecursively(val, ctx);
27
+ }
28
+ return result;
29
+ }
30
+ // 其他类型:直接返回
31
+ return value;
32
+ }
33
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/vm/handlers/array/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEnD;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAC5C,KAAU,EACV,GAAmB;IAEnB,eAAe;IACf,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YACtC,OAAO,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC5B,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,cAAc;IACd,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,8BAA8B,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;IACrE,CAAC;IAED,eAAe;IACf,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,MAAM,GAAwB,EAAE,CAAA;QACtC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,8BAA8B,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACxD,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,YAAY;IACZ,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * batch 动作处理器
3
+ *
4
+ * 功能:批量执行动作(保证原子性)
5
+ * 示例:{ "type": "batch", "actions": [...] }
6
+ */
7
+ import type { RuntimeContext, Action } from '../../types.js';
8
+ /**
9
+ * 处理 batch 动作
10
+ */
11
+ export declare function handleBatch(ctx: RuntimeContext, action: Action): Promise<void>;
12
+ //# sourceMappingURL=batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../../src/vm/handlers/batch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAIxD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAuCf"}