@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":"create-context.d.ts","sourceRoot":"","sources":["../../src/runtime/create-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAA8B,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAMjH;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAEhD;;OAEG;IACH,OAAO,CAAC,EAAE,eAAe,CAAA;IAEzB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,CAAA;IAE3E;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE5C;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,OAAO,EAAE,CAAA;IAE7B;;OAEG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAA;CAChC;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAEhE,YAAY,GAAE,OAAO,CAAC,MAAM,CAAyB,EACrD,OAAO,GAAE,oBAAyB,GACjC,cAAc,CAAC,MAAM,CAAC,CAqDxB"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * RuntimeContext 创建工厂
3
+ *
4
+ * 实现要点:
5
+ * - 扁平化状态存储
6
+ * - 系统 API 保护($ 和 _ 前缀)
7
+ * - 命名冲突检测
8
+ * - Proxy 拦截防止覆盖系统 API
9
+ */
10
+ import { createProxy } from './proxy.js';
11
+ import { registerBuiltinMethods } from '../vm/handlers/index.js';
12
+ import { getPathValue as getPath, setPathValue as setPath } from './path.js';
13
+ import { invalidateCache } from '../expression/cache.js';
14
+ /**
15
+ * 创建运行时上下文
16
+ *
17
+ * @param initialState 初始状态(扁平化)
18
+ * @param options 配置选项
19
+ *
20
+ * @template TState 状态类型,从 initialState 推导
21
+ */
22
+ export function createRuntimeContext(initialState = {}, options = {}) {
23
+ // 1. 验证命名冲突
24
+ validateStateKeys(initialState);
25
+ const { onEmit, methods = {}, onStateChange, createObject = () => ({}), createArray = () => [], exprOptions } = options;
26
+ // 用于存储 proxied 引用,以便 _set 中的 onStateChange 能使用正确的引用
27
+ let proxiedRef = null;
28
+ // 2. 创建基础上下文对象
29
+ const ctx = {
30
+ ...initialState,
31
+ $emit: (event, data) => {
32
+ if (onEmit) {
33
+ onEmit(event, data);
34
+ }
35
+ },
36
+ $methods: methods,
37
+ $exprOptions: exprOptions,
38
+ _get: (path) => {
39
+ return getPath(ctx, path);
40
+ },
41
+ _set: (path, value, options) => {
42
+ setPath(ctx, path, value, {
43
+ createObject,
44
+ createArray
45
+ });
46
+ // 使缓存失效(使用 proxied 引用以确保缓存键一致)
47
+ invalidateCache(path, (proxiedRef || ctx));
48
+ // 触发状态变更钩子
49
+ if (onStateChange && !options?.skipCallback) {
50
+ onStateChange(path, value, (proxiedRef || ctx));
51
+ }
52
+ },
53
+ };
54
+ // 3. 自动注册内置指令到 $methods
55
+ registerBuiltinMethods(ctx);
56
+ // 4. 使用 Proxy 保护系统 API
57
+ const proxied = createProxy(ctx);
58
+ // 5. 保存 proxied 引用供 _set 使用
59
+ proxiedRef = proxied;
60
+ return proxied;
61
+ }
62
+ /**
63
+ * 验证状态键名,防止与系统 API 冲突
64
+ */
65
+ function validateStateKeys(state) {
66
+ for (const key in state) {
67
+ if (key.startsWith('$') || key.startsWith('_')) {
68
+ throw new Error(`Property name "${key}" conflicts with system API. ` +
69
+ `Properties starting with "$" or "_" are reserved. Use a different name.`);
70
+ }
71
+ }
72
+ }
73
+ //# sourceMappingURL=create-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-context.js","sourceRoot":"","sources":["../../src/runtime/create-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,EAAE,YAAY,IAAI,OAAO,EAAE,YAAY,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAsCxD;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAGlC,eAAgC,EAAqB,EACrD,UAAgC,EAAE;IAElC,YAAY;IACZ,iBAAiB,CAAC,YAAY,CAAC,CAAA;IAE/B,MAAM,EACJ,MAAM,EACN,OAAO,GAAG,EAAE,EACZ,aAAa,EACb,YAAY,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EACzB,WAAW,GAAG,GAAG,EAAE,CAAC,EAAE,EACtB,WAAW,EACZ,GAAG,OAAO,CAAA;IAEX,oDAAoD;IACpD,IAAI,UAAU,GAAkC,IAAI,CAAA;IAEpD,eAAe;IACf,MAAM,GAAG,GAAG;QACV,GAAG,YAAY;QACf,KAAK,EAAE,CAAC,KAAa,EAAE,IAAc,EAAE,EAAE;YACvC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YACrB,CAAC;QACH,CAAC;QACD,QAAQ,EAAE,OAA0B;QACpC,YAAY,EAAE,WAAW;QACzB,IAAI,EAAE,CAAuB,IAAW,EAA+B,EAAE;YACvE,OAAO,OAAO,CAAC,GAA8B,EAAE,IAAI,CAAgC,CAAA;QACrF,CAAC;QACD,IAAI,EAAE,CAAuB,IAAW,EAAE,KAAkC,EAAE,OAAoC,EAAQ,EAAE;YAC1H,OAAO,CAAC,GAA8B,EAAE,IAAI,EAAE,KAAK,EAAE;gBACnD,YAAY;gBACZ,WAAW;aACZ,CAAC,CAAA;YACF,+BAA+B;YAC/B,eAAe,CAAC,IAAI,EAAE,CAAC,UAAU,IAAI,GAAG,CAAmB,CAAC,CAAA;YAC5D,WAAW;YACX,IAAI,aAAa,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;gBAC5C,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,UAAU,IAAI,GAAG,CAAmB,CAAC,CAAA;YACnE,CAAC;QACH,CAAC;KACwB,CAAA;IAE3B,wBAAwB;IACxB,sBAAsB,CAAC,GAAqB,CAAC,CAAA;IAE7C,uBAAuB;IACvB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAgC,CAA2B,CAAA;IAEvF,4BAA4B;IAC5B,UAAU,GAAG,OAAO,CAAA;IAEpB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,KAA8B;IACvD,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CACb,kBAAkB,GAAG,+BAA+B;gBACpD,yEAAyE,CAC1E,CAAA;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Runtime 模块导出
3
+ */
4
+ export { createRuntimeContext } from './create-context.js';
5
+ export { createProxy } from './proxy.js';
6
+ export { createExpressionSandbox, isSafePropertyAccess } from './sandbox.js';
7
+ export { createLoopContext, releaseLoopContext, getLoopContextPool, clearLoopContextPool } from './loop-context-pool.js';
8
+ export type { RuntimeContext } from '../types.js';
9
+ export { parsePath, parsePathCached, clearPathCache, stringifyPath, getPathValue, setPathValue, matchPath, getParentPath, getLastSegment, type PathSegment } from './path.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,wBAAwB,CAAA;AAC/B,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAGjD,OAAO,EACL,SAAS,EACT,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,aAAa,EACb,cAAc,EACd,KAAK,WAAW,EACjB,MAAM,WAAW,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Runtime 模块导出
3
+ */
4
+ export { createRuntimeContext } from './create-context.js';
5
+ export { createProxy } from './proxy.js';
6
+ export { createExpressionSandbox, isSafePropertyAccess } from './sandbox.js';
7
+ export { createLoopContext, releaseLoopContext, getLoopContextPool, clearLoopContextPool } from './loop-context-pool.js';
8
+ // 路径工具(供框架集成层使用)
9
+ export { parsePath, parsePathCached, clearPathCache, stringifyPath, getPathValue, setPathValue, matchPath, getParentPath, getLastSegment } from './path.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,wBAAwB,CAAA;AAG/B,iBAAiB;AACjB,OAAO,EACL,SAAS,EACT,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,aAAa,EACb,cAAc,EAEf,MAAM,WAAW,CAAA"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 循环上下文对象池
3
+ *
4
+ * 功能:
5
+ * - 复用循环上下文对象,减少内存分配
6
+ * - 提升循环性能
7
+ * - 自动清理和重置
8
+ */
9
+ import type { RuntimeContext } from '../types.js';
10
+ /**
11
+ * 循环上下文对象池
12
+ */
13
+ declare class LoopContextPool {
14
+ private pool;
15
+ private maxSize;
16
+ constructor(maxSize?: number);
17
+ /**
18
+ * 获取一个循环上下文对象
19
+ */
20
+ acquire(): Partial<RuntimeContext>;
21
+ /**
22
+ * 释放循环上下文对象回池中
23
+ */
24
+ release(ctx: Partial<RuntimeContext>): void;
25
+ /**
26
+ * 清空对象池
27
+ */
28
+ clear(): void;
29
+ /**
30
+ * 获取池大小
31
+ */
32
+ get size(): number;
33
+ }
34
+ /**
35
+ * 获取全局循环上下文对象池
36
+ */
37
+ export declare function getLoopContextPool(): LoopContextPool;
38
+ /**
39
+ * 创建循环上下文(使用对象池)
40
+ *
41
+ * @param parentCtx 父上下文
42
+ * @param item 循环项
43
+ * @param index 循环索引
44
+ * @returns 循环上下文
45
+ */
46
+ export declare function createLoopContext(parentCtx: RuntimeContext, item: unknown, index: number): RuntimeContext;
47
+ /**
48
+ * 释放循环上下文(回收到对象池)
49
+ *
50
+ * @param loopCtx 循环上下文
51
+ */
52
+ export declare function releaseLoopContext(loopCtx: Partial<RuntimeContext>): void;
53
+ /**
54
+ * 清空对象池(用于测试或重置)
55
+ */
56
+ export declare function clearLoopContextPool(): void;
57
+ export {};
58
+ //# sourceMappingURL=loop-context-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-context-pool.d.ts","sourceRoot":"","sources":["../../src/runtime/loop-context-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;GAEG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,IAAI,CAAqC;IACjD,OAAO,CAAC,OAAO,CAAQ;gBAEX,OAAO,GAAE,MAAW;IAIhC;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC;IAOlC;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAsB3C;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAOD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,cAAc,EACzB,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,GACZ,cAAc,CAehB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAGzE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * 循环上下文对象池
3
+ *
4
+ * 功能:
5
+ * - 复用循环上下文对象,减少内存分配
6
+ * - 提升循环性能
7
+ * - 自动清理和重置
8
+ */
9
+ /**
10
+ * 循环上下文对象池
11
+ */
12
+ class LoopContextPool {
13
+ pool = [];
14
+ maxSize;
15
+ constructor(maxSize = 10) {
16
+ this.maxSize = maxSize;
17
+ }
18
+ /**
19
+ * 获取一个循环上下文对象
20
+ */
21
+ acquire() {
22
+ if (this.pool.length > 0) {
23
+ return this.pool.pop();
24
+ }
25
+ return {};
26
+ }
27
+ /**
28
+ * 释放循环上下文对象回池中
29
+ */
30
+ release(ctx) {
31
+ // 清理循环相关属性
32
+ if ('$item' in ctx)
33
+ delete ctx.$item;
34
+ if ('$index' in ctx)
35
+ delete ctx.$index;
36
+ // 清理动态添加的循环变量(保留系统 API)
37
+ const keysToDelete = [];
38
+ for (const key in ctx) {
39
+ if (!key.startsWith('$') && !key.startsWith('_')) {
40
+ keysToDelete.push(key);
41
+ }
42
+ }
43
+ for (const key of keysToDelete) {
44
+ delete ctx[key];
45
+ }
46
+ // 如果池未满,回收对象
47
+ if (this.pool.length < this.maxSize) {
48
+ this.pool.push(ctx);
49
+ }
50
+ }
51
+ /**
52
+ * 清空对象池
53
+ */
54
+ clear() {
55
+ this.pool.length = 0;
56
+ }
57
+ /**
58
+ * 获取池大小
59
+ */
60
+ get size() {
61
+ return this.pool.length;
62
+ }
63
+ }
64
+ /**
65
+ * 全局循环上下文对象池实例
66
+ */
67
+ let globalPool = null;
68
+ /**
69
+ * 获取全局循环上下文对象池
70
+ */
71
+ export function getLoopContextPool() {
72
+ if (!globalPool) {
73
+ globalPool = new LoopContextPool();
74
+ }
75
+ return globalPool;
76
+ }
77
+ /**
78
+ * 创建循环上下文(使用对象池)
79
+ *
80
+ * @param parentCtx 父上下文
81
+ * @param item 循环项
82
+ * @param index 循环索引
83
+ * @returns 循环上下文
84
+ */
85
+ export function createLoopContext(parentCtx, item, index) {
86
+ const pool = getLoopContextPool();
87
+ const baseCtx = pool.acquire();
88
+ // 创建循环上下文(浅拷贝父上下文 + 循环属性)
89
+ const loopCtx = Object.create(parentCtx);
90
+ // 复制基础对象池中的属性(如果有)
91
+ Object.assign(loopCtx, baseCtx);
92
+ // 设置循环相关属性
93
+ loopCtx.$item = item;
94
+ loopCtx.$index = index;
95
+ return loopCtx;
96
+ }
97
+ /**
98
+ * 释放循环上下文(回收到对象池)
99
+ *
100
+ * @param loopCtx 循环上下文
101
+ */
102
+ export function releaseLoopContext(loopCtx) {
103
+ const pool = getLoopContextPool();
104
+ pool.release(loopCtx);
105
+ }
106
+ /**
107
+ * 清空对象池(用于测试或重置)
108
+ */
109
+ export function clearLoopContextPool() {
110
+ if (globalPool) {
111
+ globalPool.clear();
112
+ }
113
+ }
114
+ //# sourceMappingURL=loop-context-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-context-pool.js","sourceRoot":"","sources":["../../src/runtime/loop-context-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,MAAM,eAAe;IACX,IAAI,GAAmC,EAAE,CAAA;IACzC,OAAO,CAAQ;IAEvB,YAAY,UAAkB,EAAE;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAG,CAAA;QACzB,CAAC;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,GAA4B;QAClC,WAAW;QACX,IAAI,OAAO,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC,KAAK,CAAA;QACpC,IAAI,QAAQ,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC,MAAM,CAAA;QAEtC,wBAAwB;QACxB,MAAM,YAAY,GAAa,EAAE,CAAA;QACjC,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjD,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACxB,CAAC;QACH,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,OAAO,GAAG,CAAC,GAAG,CAAC,CAAA;QACjB,CAAC;QAED,aAAa;QACb,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAA;IACzB,CAAC;CACF;AAED;;GAEG;AACH,IAAI,UAAU,GAA2B,IAAI,CAAA;AAE7C;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACpC,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAyB,EACzB,IAAa,EACb,KAAa;IAEb,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAA;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;IAE9B,0BAA0B;IAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAmB,CAAA;IAE1D,mBAAmB;IACnB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAE/B,WAAW;IACX,OAAO,CAAC,KAAK,GAAG,IAAI,CAAA;IACpB,OAAO,CAAC,MAAM,GAAG,KAAK,CAAA;IAEtB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgC;IACjE,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAA;IACjC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;AACH,CAAC"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * 路径解析工具模块
3
+ *
4
+ * 统一的路径解析逻辑,供 vario-core 和框架集成层使用
5
+ *
6
+ * 设计原则:
7
+ * - 单一职责:只处理路径解析,不涉及响应式
8
+ * - 可组合:提供原子操作,框架集成层可自由组合
9
+ * - 类型安全:尽可能提供类型推导
10
+ */
11
+ /**
12
+ * 路径段类型
13
+ */
14
+ export type PathSegment = string | number;
15
+ /**
16
+ * 解析路径字符串为段数组
17
+ *
18
+ * 支持两种语法:
19
+ * - 点语法:`user.name` → ['user', 'name']
20
+ * - 括号语法:`users[0].name` → ['users', 0, 'name']
21
+ * - 混合语法:`data.users[0].profile.tags[1]` → ['data', 'users', 0, 'profile', 'tags', 1]
22
+ * - 空括号:`users[].name` → ['users', -1, 'name'](-1 表示动态索引,由循环上下文填充)
23
+ *
24
+ * @param path 路径字符串
25
+ * @returns 路径段数组
26
+ *
27
+ * @example
28
+ * parsePath('user.name') // ['user', 'name']
29
+ * parsePath('items.0.text') // ['items', 0, 'text']
30
+ * parsePath('users[0].name') // ['users', 0, 'name']
31
+ * parsePath('users[].name') // ['users', -1, 'name']
32
+ */
33
+ export declare function parsePath(path: string): PathSegment[];
34
+ /**
35
+ * 解析路径(带缓存)
36
+ *
37
+ * @param path 点分隔的路径字符串
38
+ * @returns 路径段数组
39
+ */
40
+ export declare function parsePathCached(path: string): PathSegment[];
41
+ /**
42
+ * 清理路径缓存
43
+ */
44
+ export declare function clearPathCache(): void;
45
+ /**
46
+ * 将路径段数组转换为路径字符串
47
+ *
48
+ * @param segments 路径段数组
49
+ * @returns 点分隔的路径字符串
50
+ */
51
+ export declare function stringifyPath(segments: PathSegment[]): string;
52
+ /**
53
+ * 获取嵌套路径的值
54
+ *
55
+ * @param obj 目标对象
56
+ * @param path 路径字符串或路径段数组
57
+ * @returns 路径对应的值,不存在返回 undefined
58
+ */
59
+ export declare function getPathValue(obj: Record<string, unknown>, path: string | PathSegment[]): unknown;
60
+ /**
61
+ * 设置嵌套路径的值
62
+ *
63
+ * @param obj 目标对象
64
+ * @param path 路径字符串或路径段数组
65
+ * @param value 要设置的值
66
+ * @param options 配置选项
67
+ * @returns 是否设置成功
68
+ */
69
+ export declare function setPathValue(obj: Record<string, unknown>, path: string | PathSegment[], value: unknown, options?: {
70
+ /**
71
+ * 自动创建中间路径
72
+ * @default true
73
+ */
74
+ createIntermediate?: boolean;
75
+ /**
76
+ * 创建对象的工厂函数
77
+ * 用于框架集成层创建响应式对象
78
+ */
79
+ createObject?: () => Record<string, unknown>;
80
+ /**
81
+ * 创建数组的工厂函数
82
+ * 用于框架集成层创建响应式数组
83
+ */
84
+ createArray?: () => unknown[];
85
+ }): boolean;
86
+ /**
87
+ * 检查路径是否匹配(支持通配符)
88
+ *
89
+ * @param pattern 模式路径(支持 * 通配符)
90
+ * @param path 目标路径
91
+ * @returns 是否匹配
92
+ *
93
+ * @example
94
+ * matchPath('items.*', 'items.0') // true
95
+ * matchPath('items.*.name', 'items.0.name') // true
96
+ * matchPath('user.name', 'user.name') // true
97
+ * matchPath('user.name', 'user.age') // false
98
+ */
99
+ export declare function matchPath(pattern: string, path: string): boolean;
100
+ /**
101
+ * 提取路径的父路径
102
+ *
103
+ * @param path 路径字符串
104
+ * @returns 父路径,顶层路径返回空字符串
105
+ */
106
+ export declare function getParentPath(path: string): string;
107
+ /**
108
+ * 获取路径的最后一段
109
+ *
110
+ * @param path 路径字符串
111
+ * @returns 最后一段
112
+ */
113
+ export declare function getLastSegment(path: string): PathSegment | undefined;
114
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/runtime/path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAA;AAUzC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CA+DrD;AAaD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAa3D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAE7D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,GAC3B,OAAO,CA8BT;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,EAC5B,KAAK,EAAE,OAAO,EACd,OAAO,GAAE;IACP;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAE5B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE5C;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,OAAO,EAAE,CAAA;CACzB,GACL,OAAO,CA8ET;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAuBhE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAGpE"}