palistor 0.0.24 → 0.0.26

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 (278) hide show
  1. package/README.md +574 -542
  2. package/README.ru.md +979 -0
  3. package/dist/index.d.ts +19 -28
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +21 -28
  6. package/dist/index.js.map +1 -1
  7. package/dist/react/createTrackingProxy.d.ts +27 -27
  8. package/dist/react/createTrackingProxy.d.ts.map +1 -1
  9. package/dist/react/createTrackingProxy.js +92 -42
  10. package/dist/react/createTrackingProxy.js.map +1 -1
  11. package/dist/react/useForm.d.ts +42 -43
  12. package/dist/react/useForm.d.ts.map +1 -1
  13. package/dist/react/useForm.js +38 -38
  14. package/dist/react/useForm.js.map +1 -1
  15. package/dist/react/usePersist.d.ts +14 -14
  16. package/dist/react/usePersist.js +18 -18
  17. package/dist/react/usePersist.js.map +1 -1
  18. package/dist/react/useStoreContext.d.ts +11 -11
  19. package/dist/react/useStoreContext.js +11 -11
  20. package/dist/react/useTranslator.d.ts +12 -12
  21. package/dist/react/useTranslator.js +12 -12
  22. package/dist/store/applyPatch/applyPatch.d.ts +8 -8
  23. package/dist/store/applyPatch/applyPatch.js +12 -12
  24. package/dist/store/applyPatch/applyPatch.js.map +1 -1
  25. package/dist/store/buildProxy/buildEntityProjectionProxy.js +6 -6
  26. package/dist/store/buildProxy/buildEntityProjectionProxy.js.map +1 -1
  27. package/dist/store/buildProxy/buildListProxy.d.ts +8 -8
  28. package/dist/store/buildProxy/buildListProxy.js +30 -30
  29. package/dist/store/buildProxy/buildListProxy.js.map +1 -1
  30. package/dist/store/buildProxy/buildProxy.d.ts +8 -8
  31. package/dist/store/buildProxy/buildProxy.d.ts.map +1 -1
  32. package/dist/store/buildProxy/buildProxy.js +84 -33
  33. package/dist/store/buildProxy/buildProxy.js.map +1 -1
  34. package/dist/store/buildProxy/computeProxyKeys.d.ts +8 -8
  35. package/dist/store/buildProxy/computeProxyKeys.d.ts.map +1 -1
  36. package/dist/store/buildProxy/computeProxyKeys.js +18 -13
  37. package/dist/store/buildProxy/computeProxyKeys.js.map +1 -1
  38. package/dist/store/buildProxy/handleLazyResolve.d.ts +3 -3
  39. package/dist/store/buildProxy/handleLazyResolve.js +3 -3
  40. package/dist/store/buildProxy/initProxyCaches.d.ts +5 -5
  41. package/dist/store/buildProxy/initProxyCaches.js +5 -5
  42. package/dist/store/compute/computeFieldState.d.ts +3 -3
  43. package/dist/store/compute/computeFieldState.js +8 -8
  44. package/dist/store/compute/computeFieldState.js.map +1 -1
  45. package/dist/store/compute/fieldStateChanged.d.ts +1 -1
  46. package/dist/store/compute/fieldStateChanged.js +1 -1
  47. package/dist/store/compute/recompute/collectGroupComputeNodes.d.ts +4 -4
  48. package/dist/store/compute/recompute/collectGroupComputeNodes.js +7 -7
  49. package/dist/store/compute/recompute/collectGroupComputeNodes.js.map +1 -1
  50. package/dist/store/compute/recompute/recomputeAndNotify.d.ts +3 -3
  51. package/dist/store/compute/recompute/recomputeAndNotify.js +3 -3
  52. package/dist/store/compute/recompute/recomputeLeaves.d.ts +11 -10
  53. package/dist/store/compute/recompute/recomputeLeaves.d.ts.map +1 -1
  54. package/dist/store/compute/recompute/recomputeLeaves.js +26 -27
  55. package/dist/store/compute/recompute/recomputeLeaves.js.map +1 -1
  56. package/dist/store/compute/recompute/recomputeTargeted.d.ts +7 -7
  57. package/dist/store/compute/recompute/recomputeTargeted.js +12 -12
  58. package/dist/store/compute/recompute/recomputeTargeted.js.map +1 -1
  59. package/dist/store/compute/recompute/topologicalSortComputed.d.ts +4 -4
  60. package/dist/store/compute/recompute/topologicalSortComputed.d.ts.map +1 -1
  61. package/dist/store/compute/recompute/topologicalSortComputed.js +11 -13
  62. package/dist/store/compute/recompute/topologicalSortComputed.js.map +1 -1
  63. package/dist/store/compute/recompute/types.d.ts +4 -4
  64. package/dist/store/compute/resolveFlag.d.ts +2 -2
  65. package/dist/store/compute/resolveFlag.js +2 -2
  66. package/dist/store/compute/resolveString.d.ts +5 -5
  67. package/dist/store/compute/resolveString.js +6 -6
  68. package/dist/store/compute/resolveString.js.map +1 -1
  69. package/dist/store/compute/types.d.ts +3 -3
  70. package/dist/store/constants.d.ts +57 -38
  71. package/dist/store/constants.d.ts.map +1 -1
  72. package/dist/store/constants.js +70 -35
  73. package/dist/store/constants.js.map +1 -1
  74. package/dist/store/defineFieldMapping.d.ts +21 -19
  75. package/dist/store/defineFieldMapping.d.ts.map +1 -1
  76. package/dist/store/defineFieldMapping.js +21 -19
  77. package/dist/store/defineFieldMapping.js.map +1 -1
  78. package/dist/store/dirtyTracking/collectInitialSnapshot.js +1 -1
  79. package/dist/store/dirtyTracking/collectInitialSnapshot.js.map +1 -1
  80. package/dist/store/dirtyTracking/recomputeDirtyTargeted.d.ts +3 -3
  81. package/dist/store/dirtyTracking/recomputeDirtyTargeted.js +11 -11
  82. package/dist/store/dirtyTracking/recomputeDirtyTargeted.js.map +1 -1
  83. package/dist/store/dirtyTracking/setGroupRevalidate.d.ts +6 -6
  84. package/dist/store/dirtyTracking/setGroupRevalidate.js +7 -7
  85. package/dist/store/dirtyTracking/setGroupRevalidate.js.map +1 -1
  86. package/dist/store/entityRegistry/entityRegistry.d.ts +72 -72
  87. package/dist/store/entityRegistry/entityRegistry.d.ts.map +1 -1
  88. package/dist/store/entityRegistry/entityRegistry.js +91 -91
  89. package/dist/store/entityRegistry/entityRegistry.js.map +1 -1
  90. package/dist/store/entityRegistry/generateId.d.ts +3 -3
  91. package/dist/store/entityRegistry/generateId.js +3 -3
  92. package/dist/store/entityRegistry/types.d.ts +17 -17
  93. package/dist/store/entityRegistry/types.d.ts.map +1 -1
  94. package/dist/store/flow/buildFlowStepsProxy.d.ts +17 -0
  95. package/dist/store/flow/buildFlowStepsProxy.d.ts.map +1 -0
  96. package/dist/store/flow/buildFlowStepsProxy.js +72 -0
  97. package/dist/store/flow/buildFlowStepsProxy.js.map +1 -0
  98. package/dist/store/flow/defineFlow.d.ts +92 -0
  99. package/dist/store/flow/defineFlow.d.ts.map +1 -0
  100. package/dist/store/flow/defineFlow.js +99 -0
  101. package/dist/store/flow/defineFlow.js.map +1 -0
  102. package/dist/store/flow/flowApi.d.ts +18 -0
  103. package/dist/store/flow/flowApi.d.ts.map +1 -0
  104. package/dist/store/flow/flowApi.js +18 -0
  105. package/dist/store/flow/flowApi.js.map +1 -0
  106. package/dist/store/flow/flowNavigation.d.ts +137 -0
  107. package/dist/store/flow/flowNavigation.d.ts.map +1 -0
  108. package/dist/store/flow/flowNavigation.js +384 -0
  109. package/dist/store/flow/flowNavigation.js.map +1 -0
  110. package/dist/store/flow/flowState.d.ts +41 -0
  111. package/dist/store/flow/flowState.d.ts.map +1 -0
  112. package/dist/store/flow/flowState.js +51 -0
  113. package/dist/store/flow/flowState.js.map +1 -0
  114. package/dist/store/flow/index.d.ts +10 -0
  115. package/dist/store/flow/index.d.ts.map +1 -0
  116. package/dist/store/flow/index.js +6 -0
  117. package/dist/store/flow/index.js.map +1 -0
  118. package/dist/store/groupDeps/createGroupDeps.d.ts +3 -3
  119. package/dist/store/groupDeps/createGroupDeps.js +6 -6
  120. package/dist/store/groupDeps/createGroupDeps.js.map +1 -1
  121. package/dist/store/groupDeps/createTrackingValues.d.ts +9 -9
  122. package/dist/store/groupDeps/createTrackingValues.js +11 -11
  123. package/dist/store/groupDeps/createTrackingValues.js.map +1 -1
  124. package/dist/store/groupDeps/getNodeGroupPath.d.ts +3 -3
  125. package/dist/store/groupDeps/getNodeGroupPath.js +5 -5
  126. package/dist/store/groupDeps/getNodeGroupPath.js.map +1 -1
  127. package/dist/store/groupDeps/getRecipientGroups.d.ts +1 -1
  128. package/dist/store/groupDeps/getRecipientGroups.js +1 -1
  129. package/dist/store/groupDeps/groupDeps.d.ts +7 -7
  130. package/dist/store/groupDeps/groupDeps.js +7 -7
  131. package/dist/store/groupDeps/pairKey.d.ts +3 -3
  132. package/dist/store/groupDeps/pairKey.d.ts.map +1 -1
  133. package/dist/store/groupDeps/pairKey.js +4 -4
  134. package/dist/store/groupDeps/pairKey.js.map +1 -1
  135. package/dist/store/groupDeps/resolveGroupByPath.d.ts +3 -3
  136. package/dist/store/groupDeps/resolveGroupByPath.js +3 -3
  137. package/dist/store/init/createNotificationHub.d.ts +31 -31
  138. package/dist/store/init/createNotificationHub.d.ts.map +1 -1
  139. package/dist/store/init/createNotificationHub.js +36 -37
  140. package/dist/store/init/createNotificationHub.js.map +1 -1
  141. package/dist/store/init/createResolveManager.d.ts +72 -69
  142. package/dist/store/init/createResolveManager.d.ts.map +1 -1
  143. package/dist/store/init/createResolveManager.js +101 -98
  144. package/dist/store/init/createResolveManager.js.map +1 -1
  145. package/dist/store/init/initGroupSubmitting.d.ts +2 -2
  146. package/dist/store/init/initGroupSubmitting.js +4 -4
  147. package/dist/store/init/initGroupSubmitting.js.map +1 -1
  148. package/dist/store/normalizeConfig.d.ts +20 -18
  149. package/dist/store/normalizeConfig.d.ts.map +1 -1
  150. package/dist/store/normalizeConfig.js +31 -29
  151. package/dist/store/normalizeConfig.js.map +1 -1
  152. package/dist/store/onChangePipeline/computeFieldKey.d.ts +2 -2
  153. package/dist/store/onChangePipeline/computeFieldKey.js +2 -2
  154. package/dist/store/onChangePipeline/findOnChangeAncestors.d.ts +2 -2
  155. package/dist/store/onChangePipeline/findOnChangeAncestors.js +4 -4
  156. package/dist/store/onChangePipeline/findOnChangeAncestors.js.map +1 -1
  157. package/dist/store/onChangePipeline/onChangePipeline.d.ts +13 -12
  158. package/dist/store/onChangePipeline/onChangePipeline.d.ts.map +1 -1
  159. package/dist/store/onChangePipeline/onChangePipeline.js +14 -13
  160. package/dist/store/onChangePipeline/onChangePipeline.js.map +1 -1
  161. package/dist/store/persist/drivers.d.ts +7 -7
  162. package/dist/store/persist/drivers.js +8 -8
  163. package/dist/store/persist/drivers.js.map +1 -1
  164. package/dist/store/persist/index.d.ts +1 -1
  165. package/dist/store/persist/persistManager.d.ts +23 -23
  166. package/dist/store/persist/persistManager.d.ts.map +1 -1
  167. package/dist/store/persist/persistManager.js +73 -42
  168. package/dist/store/persist/persistManager.js.map +1 -1
  169. package/dist/store/persist/types.d.ts +23 -23
  170. package/dist/store/persist/types.d.ts.map +1 -1
  171. package/dist/store/persist/types.js +4 -4
  172. package/dist/store/resetPipeline/buildResetPatch.d.ts +5 -5
  173. package/dist/store/resetPipeline/buildResetPatch.js +5 -5
  174. package/dist/store/resetPipeline/collectDefaults.d.ts +5 -5
  175. package/dist/store/resetPipeline/collectDefaults.js +6 -6
  176. package/dist/store/resetPipeline/collectDefaults.js.map +1 -1
  177. package/dist/store/resetPipeline/resetPipeline.d.ts +7 -7
  178. package/dist/store/resetPipeline/resetPipeline.d.ts.map +1 -1
  179. package/dist/store/resetPipeline/resetPipeline.js +17 -12
  180. package/dist/store/resetPipeline/resetPipeline.js.map +1 -1
  181. package/dist/store/resolvePipeline/applyPendingWrites.d.ts +10 -10
  182. package/dist/store/resolvePipeline/applyPendingWrites.d.ts.map +1 -1
  183. package/dist/store/resolvePipeline/applyPendingWrites.js +35 -38
  184. package/dist/store/resolvePipeline/applyPendingWrites.js.map +1 -1
  185. package/dist/store/resolvePipeline/createContextTrackingProxy.d.ts +8 -7
  186. package/dist/store/resolvePipeline/createContextTrackingProxy.d.ts.map +1 -1
  187. package/dist/store/resolvePipeline/createContextTrackingProxy.js +6 -5
  188. package/dist/store/resolvePipeline/createContextTrackingProxy.js.map +1 -1
  189. package/dist/store/resolvePipeline/createValuesTrackingProxy.d.ts +43 -43
  190. package/dist/store/resolvePipeline/createValuesTrackingProxy.d.ts.map +1 -1
  191. package/dist/store/resolvePipeline/createValuesTrackingProxy.js +70 -70
  192. package/dist/store/resolvePipeline/createValuesTrackingProxy.js.map +1 -1
  193. package/dist/store/resolvePipeline/executeListResolve.d.ts +14 -14
  194. package/dist/store/resolvePipeline/executeListResolve.js +27 -27
  195. package/dist/store/resolvePipeline/executeListResolve.js.map +1 -1
  196. package/dist/store/resolvePipeline/executeResolve.d.ts +15 -15
  197. package/dist/store/resolvePipeline/executeResolve.js +46 -46
  198. package/dist/store/resolvePipeline/executeResolve.js.map +1 -1
  199. package/dist/store/store/NodeRegistry/nodeRegistry.d.ts +69 -56
  200. package/dist/store/store/NodeRegistry/nodeRegistry.d.ts.map +1 -1
  201. package/dist/store/store/NodeRegistry/nodeRegistry.js +94 -78
  202. package/dist/store/store/NodeRegistry/nodeRegistry.js.map +1 -1
  203. package/dist/store/store/NodeRegistry/nodeUtils.d.ts +5 -5
  204. package/dist/store/store/NodeRegistry/nodeUtils.d.ts.map +1 -1
  205. package/dist/store/store/NodeRegistry/nodeUtils.js +5 -5
  206. package/dist/store/store/NodeRegistry/nodeUtils.js.map +1 -1
  207. package/dist/store/store/groupDepsMap.d.ts +23 -23
  208. package/dist/store/store/groupDepsMap.d.ts.map +1 -1
  209. package/dist/store/store/groupDepsMap.js +40 -34
  210. package/dist/store/store/groupDepsMap.js.map +1 -1
  211. package/dist/store/store/hasComputedProps.d.ts +2 -2
  212. package/dist/store/store/hasComputedProps.js +2 -2
  213. package/dist/store/store/nodeMap.d.ts +5 -5
  214. package/dist/store/store/nodeMap.js +7 -7
  215. package/dist/store/store/nodeMap.js.map +1 -1
  216. package/dist/store/store/palistor.d.ts +80 -80
  217. package/dist/store/store/palistor.d.ts.map +1 -1
  218. package/dist/store/store/palistor.js +151 -165
  219. package/dist/store/store/palistor.js.map +1 -1
  220. package/dist/store/store/registerNodes.d.ts +10 -10
  221. package/dist/store/store/registerNodes.d.ts.map +1 -1
  222. package/dist/store/store/registerNodes.js +33 -18
  223. package/dist/store/store/registerNodes.js.map +1 -1
  224. package/dist/store/store/serviceRegistry.d.ts +8 -8
  225. package/dist/store/store/serviceRegistry.d.ts.map +1 -1
  226. package/dist/store/store/serviceRegistry.js +8 -8
  227. package/dist/store/store/serviceRegistry.js.map +1 -1
  228. package/dist/store/store/types.d.ts +277 -223
  229. package/dist/store/store/types.d.ts.map +1 -1
  230. package/dist/store/submitPipeline/applyLeafBeforeSubmit.d.ts +2 -2
  231. package/dist/store/submitPipeline/applyLeafBeforeSubmit.js +2 -2
  232. package/dist/store/submitPipeline/collectLeafStates.d.ts +2 -2
  233. package/dist/store/submitPipeline/collectLeafStates.js +2 -2
  234. package/dist/store/submitPipeline/submitPipeline.d.ts +8 -8
  235. package/dist/store/submitPipeline/submitPipeline.d.ts.map +1 -1
  236. package/dist/store/submitPipeline/submitPipeline.js +15 -11
  237. package/dist/store/submitPipeline/submitPipeline.js.map +1 -1
  238. package/dist/store/submitPipeline/types.d.ts +1 -1
  239. package/dist/store/submitPipeline/types.d.ts.map +1 -1
  240. package/dist/store/traversal/nodeClassifier.d.ts +9 -9
  241. package/dist/store/traversal/nodeClassifier.d.ts.map +1 -1
  242. package/dist/store/traversal/nodeClassifier.js +11 -11
  243. package/dist/store/traversal/nodeClassifier.js.map +1 -1
  244. package/dist/store/traversal/walkFull.d.ts +14 -14
  245. package/dist/store/traversal/walkFull.js +2 -2
  246. package/dist/store/valuesCache/valuesCache.d.ts +9 -9
  247. package/dist/store/valuesCache/valuesCache.d.ts.map +1 -1
  248. package/dist/store/valuesCache/valuesCache.js +6 -6
  249. package/dist/store/writePipeline/formatPatch.d.ts +5 -5
  250. package/dist/store/writePipeline/formatPatch.js +7 -7
  251. package/dist/store/writePipeline/formatPatch.js.map +1 -1
  252. package/dist/store/writePipeline/formatValue.d.ts +5 -5
  253. package/dist/store/writePipeline/formatValue.js +5 -5
  254. package/dist/store/writePipeline/mergeChanged.d.ts +4 -4
  255. package/dist/store/writePipeline/mergeChanged.js +4 -4
  256. package/dist/store/writePipeline/runSetter.d.ts +6 -6
  257. package/dist/store/writePipeline/runSetter.js +8 -8
  258. package/dist/store/writePipeline/storeValue.d.ts +3 -3
  259. package/dist/store/writePipeline/storeValue.js +3 -3
  260. package/dist/store/writePipeline/types.d.ts +4 -4
  261. package/dist/store/writePipeline/types.d.ts.map +1 -1
  262. package/dist/store/writePipeline/writePipeline.d.ts +7 -7
  263. package/dist/store/writePipeline/writePipeline.d.ts.map +1 -1
  264. package/dist/store/writePipeline/writePipeline.js +15 -15
  265. package/dist/store/writePipeline/writePipeline.js.map +1 -1
  266. package/package.json +11 -4
  267. package/dist/store/compute/recompute/collectGroupLeafNodes.d.ts +0 -11
  268. package/dist/store/compute/recompute/collectGroupLeafNodes.d.ts.map +0 -1
  269. package/dist/store/compute/recompute/collectGroupLeafNodes.js +0 -26
  270. package/dist/store/compute/recompute/collectGroupLeafNodes.js.map +0 -1
  271. package/dist/store/fieldMapping.typecheck.d.ts +0 -2
  272. package/dist/store/fieldMapping.typecheck.d.ts.map +0 -1
  273. package/dist/store/fieldMapping.typecheck.js +0 -71
  274. package/dist/store/fieldMapping.typecheck.js.map +0 -1
  275. package/dist/store/submitPipeline/getSubValues.d.ts +0 -9
  276. package/dist/store/submitPipeline/getSubValues.d.ts.map +0 -1
  277. package/dist/store/submitPipeline/getSubValues.js +0 -26
  278. package/dist/store/submitPipeline/getSubValues.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"applyPendingWrites.d.ts","sourceRoot":"","sources":["../../../store/resolvePipeline/applyPendingWrites.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAiB9D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EAAE,EACtB,UAAU,EAAE,aAAa,EACzB,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,EACtC,WAAW,EAAE,WAAW,GACvB,GAAG,CAAC,MAAM,CAAC,CAkCb"}
1
+ {"version":3,"file":"applyPendingWrites.d.ts","sourceRoot":"","sources":["../../../store/resolvePipeline/applyPendingWrites.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAiB9D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EAAE,EACtB,UAAU,EAAE,aAAa,EACzB,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,EACtC,WAAW,EAAE,WAAW,GACvB,GAAG,CAAC,MAAM,CAAC,CA+Bb"}
@@ -1,68 +1,65 @@
1
1
  import { applyPatch } from "../applyPatch/applyPatch";
2
- // ─── Применение буферизированных записей ────────────────────────────────────
2
+ // ─── Applying buffered writes ────────────────────────────────────────────────
3
3
  //
4
- // Это вторая половина пайплайна отложенных записей.
4
+ // This is the second half of the deferred-write pipeline.
5
5
  //
6
- // КРАТКОЕ ОПИСАНИЕ ПОТОКА:
7
- // 1. Резолвер запускается с прокси из createValuesTrackingProxy().
8
- // 2. Каждое `values.x.y = z` внутри резолвера перехватывается и сохраняется как
9
- // PendingWrite { path: "x.y", value: z } — ничего не мутируется.
10
- // 3. После возврата резолвера вызывается applyPendingWrites() со
11
- // собранным списком PendingWrite-записей.
12
- // 4. Для каждой записи восстанавливаем вложенный патч-объект, который ожидает applyPatch(),
13
- // затем вызываем applyPatch() для реальной записи в хранилище.
14
- // 5. applyPatch() фиксирует узлы конфига, которые изменились, в множество `changed`.
15
- // 6. Вызывающий код использует `changed`, чтобы решить, какие зависимые резолверы перезапустить.
6
+ // FLOW OVERVIEW:
7
+ // 1. The resolver runs with the proxy from createValuesTrackingProxy().
8
+ // 2. Every `values.x.y = z` inside the resolver is intercepted and stored as
9
+ // PendingWrite { path: "x.y", value: z } — nothing is mutated.
10
+ // 3. After the resolver returns, applyPendingWrites() is called with the
11
+ // collected PendingWrite list.
12
+ // 4. For each write, the nested patch object applyPatch() expects is rebuilt,
13
+ // then applyPatch() performs the real store write.
14
+ // 5. applyPatch() records the config nodes that changed into the `changed` set.
15
+ // 6. The caller uses `changed` to decide which dependent resolvers to re-run.
16
16
  /**
17
- * Сбрасывает все буферизированные записи из одного запуска резолвера в реальное хранилище.
17
+ * Flushes all writes buffered during one resolver run into the real store.
18
18
  *
19
- * Преобразует каждый плоский путь (через точку) обратно во вложенную структуру патча,
20
- * которую понимает applyPatch(), затем применяет его.
19
+ * Converts each flat (dot-separated) path back into the nested patch
20
+ * structure applyPatch() understands, then applies it.
21
21
  *
22
- * Пример:
22
+ * Example:
23
23
  * PendingWrite { path: "user.vehicleExists", value: false }
24
24
  * → patch = { user: { vehicleExists: false } }
25
25
  * → applyPatch(rootConfig, nodeState, patch, changed, valuesCache)
26
26
  *
27
- * Несколько уровней вложенности работают аналогично:
27
+ * Deeper nesting works the same way:
28
28
  * path: "a.b.c" → patch = { a: { b: { c: value } } }
29
29
  *
30
- * @param writes — записи, буферизированные createValuesTrackingProxy во время выполнения резолвера
31
- * @param rootConfig — корень дерева конфига полей (используется applyPatch для поиска узлов)
32
- * @param nodeState — состояние узлов в рантайме (флаги dirty, ошибки и т.д.)
33
- * @param valuesCache — изменяемый кэш значений, который applyPatch обновляет на месте
34
- * @returns — множество узлов конфига, значение которых реально изменилось (для отслеживания зависимостей)
30
+ * @param writes — writes buffered by createValuesTrackingProxy during the resolver run
31
+ * @param rootConfig — root of the field config tree (used by applyPatch to find nodes)
32
+ * @param nodeState — runtime node state (dirty flags, errors, etc.)
33
+ * @param valuesCache — mutable values cache that applyPatch updates in place
34
+ * @returns — set of config nodes whose value actually changed (for dependency tracking)
35
35
  */
36
36
  export function applyPendingWrites(writes, rootConfig, nodeState, valuesCache) {
37
- // Накапливает все узлы конфига, значение которых реально изменилось в ходе этого сброса.
38
- // Возвращается вызывающему коду, чтобы тот мог запланировать повторный запуск зависимых резолверов.
37
+ // Accumulates all config nodes whose value actually changed during this flush.
38
+ // Returned to the caller so it can schedule re-runs of dependent resolvers.
39
39
  const changed = new Set();
40
40
  for (const { path, value } of writes) {
41
- // ── Восстанавливаем вложенный патч из пути через точку ──────────────────
42
- // applyPatch() ожидает вложенный объект, зеркалирующий дерево конфига, а не плоский путь.
43
- // Строим его вручную, обходя сегменты пути и вкладывая объекты друг в друга.
41
+ // ── Rebuild the nested patch from the dot-path ───────────────────────────
42
+ // applyPatch() expects a nested object mirroring the config tree, not a
43
+ // flat path. Build it manually by nesting objects along the path segments.
44
44
  //
45
- // Пример: path = "user.vehicleExists"
45
+ // Example: path = "user.vehicleExists"
46
46
  // parts = ["user", "vehicleExists"]
47
- // После цикла: patch = { user: { vehicleExists: <value> } }
47
+ // After the loop: patch = { user: { vehicleExists: <value> } }
48
48
  const parts = path.split(".");
49
49
  let patch = {};
50
- let current = patch; // курсор `current` идёт вглубь строящегося вложенного объекта
50
+ let current = patch; // the `current` cursor descends into the nested object being built
51
51
  for (let i = 0; i < parts.length - 1; i++) {
52
- // Создаём промежуточный пустой объект для каждого сегмента пути, кроме последнего.
53
52
  current[parts[i]] = {};
54
53
  current = current[parts[i]];
55
54
  }
56
- // Помещаем реальное значение на листе (последний сегмент).
55
+ // Place the actual value at the leaf (the last segment).
57
56
  current[parts[parts.length - 1]] = value;
58
- // ── Применяем патч к реальному хранилищу ────────────────────────────────
59
- // applyPatch обходит rootConfig по форме патча, записывает значения в
60
- // valuesCache, обновляет nodeState (флаги dirty и т.д.) и фиксирует
61
- // в `changed` все узлы, значение которых изменилось.
57
+ // ── Apply the patch to the real store ────────────────────────────────────
58
+ // applyPatch walks rootConfig following the patch shape, writes values into
59
+ // valuesCache, updates nodeState (dirty flags etc.) and records every node
60
+ // whose value changed into `changed`.
62
61
  applyPatch(rootConfig, nodeState, patch, changed, valuesCache);
63
62
  }
64
- // Возвращаем множество изменённых узлов, чтобы пайплайн резолвов мог
65
- // запланировать повторные запуски для всего, что зависело от этих значений.
66
63
  return changed;
67
64
  }
68
65
  //# sourceMappingURL=applyPendingWrites.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"applyPendingWrites.js","sourceRoot":"","sources":["../../../store/resolvePipeline/applyPendingWrites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAMtD,+EAA+E;AAC/E,EAAE;AACF,oDAAoD;AACpD,EAAE;AACF,2BAA2B;AAC3B,qEAAqE;AACrE,kFAAkF;AAClF,sEAAsE;AACtE,mEAAmE;AACnE,+CAA+C;AAC/C,8FAA8F;AAC9F,oEAAoE;AACpE,uFAAuF;AACvF,mGAAmG;AAEnG;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAsB,EACtB,UAAyB,EACzB,SAAsC,EACtC,WAAwB;IAExB,yFAAyF;IACzF,oGAAoG;IACpG,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC;QACrC,2EAA2E;QAC3E,0FAA0F;QAC1F,6EAA6E;QAC7E,EAAE;QACF,sCAAsC;QACtC,sCAAsC;QACtC,8DAA8D;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,GAA4B,EAAE,CAAC;QACxC,IAAI,OAAO,GAAG,KAAK,CAAC,CAAC,8DAA8D;QACnF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,mFAAmF;YACnF,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACvB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAA4B,CAAC;QACzD,CAAC;QACD,2DAA2D;QAC3D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAEzC,2EAA2E;QAC3E,sEAAsE;QACtE,oEAAoE;QACpE,qDAAqD;QACrD,UAAU,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACjE,CAAC;IAED,qEAAqE;IACrE,4EAA4E;IAC5E,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"applyPendingWrites.js","sourceRoot":"","sources":["../../../store/resolvePipeline/applyPendingWrites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAMtD,gFAAgF;AAChF,EAAE;AACF,0DAA0D;AAC1D,EAAE;AACF,iBAAiB;AACjB,0EAA0E;AAC1E,+EAA+E;AAC/E,oEAAoE;AACpE,2EAA2E;AAC3E,oCAAoC;AACpC,gFAAgF;AAChF,wDAAwD;AACxD,kFAAkF;AAClF,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAsB,EACtB,UAAyB,EACzB,SAAsC,EACtC,WAAwB;IAExB,+EAA+E;IAC/E,4EAA4E;IAC5E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC;QACrC,4EAA4E;QAC5E,wEAAwE;QACxE,2EAA2E;QAC3E,EAAE;QACF,uCAAuC;QACvC,sCAAsC;QACtC,iEAAiE;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,GAA4B,EAAE,CAAC;QACxC,IAAI,OAAO,GAAG,KAAK,CAAC,CAAC,mEAAmE;QACxF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACvB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAA4B,CAAC;QACzD,CAAC;QACD,yDAAyD;QACzD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAEzC,4EAA4E;QAC5E,4EAA4E;QAC5E,2EAA2E;QAC3E,sCAAsC;QACtC,UAAU,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,15 +1,16 @@
1
1
  /**
2
- * createContextTrackingProxy — оборачивает плоский объект контекста в read-only Proxy,
3
- * который записывает ключи, к которым обращался резолвер.
2
+ * createContextTrackingProxy — wraps the flat context object in a read-only
3
+ * Proxy that records the keys the resolver accessed.
4
4
  *
5
- * Используется в executeResolve для автоматического определения контекстных зависимостей:
6
- * если резолвер читает `store.context.accountId`, то `$context.accountId` добавляется
7
- * в auto-deps, и резолвер перезапустится при изменении этого ключа через `setContext`.
5
+ * Used in executeResolve to detect context dependencies automatically:
6
+ * when a resolver reads `store.context.accountId`, `$context.accountId` is
7
+ * added to the auto-deps, and the resolver re-runs when that key changes via
8
+ * `setContext`.
8
9
  */
9
10
  export interface ContextTrackingResult {
10
- /** Прокси над context — передаётся внутри storeProxy в resolver */
11
+ /** Proxy over the context — handed to the resolver inside storeProxy */
11
12
  proxy: Record<string, unknown>;
12
- /** Ключи контекста, к которым обратился резолвер */
13
+ /** Context keys the resolver accessed */
13
14
  getAccessedKeys: () => Set<string>;
14
15
  }
15
16
  export declare function createContextTrackingProxy(context: Record<string, unknown>): ContextTrackingResult;
@@ -1 +1 @@
1
- {"version":3,"file":"createContextTrackingProxy.d.ts","sourceRoot":"","sources":["../../../store/resolvePipeline/createContextTrackingProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,qBAAqB;IACpC,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,oDAAoD;IACpD,eAAe,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;CACpC;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,qBAAqB,CAoBvB"}
1
+ {"version":3,"file":"createContextTrackingProxy.d.ts","sourceRoot":"","sources":["../../../store/resolvePipeline/createContextTrackingProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,qBAAqB;IACpC,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,yCAAyC;IACzC,eAAe,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;CACpC;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,qBAAqB,CAoBvB"}
@@ -1,10 +1,11 @@
1
1
  /**
2
- * createContextTrackingProxy — оборачивает плоский объект контекста в read-only Proxy,
3
- * который записывает ключи, к которым обращался резолвер.
2
+ * createContextTrackingProxy — wraps the flat context object in a read-only
3
+ * Proxy that records the keys the resolver accessed.
4
4
  *
5
- * Используется в executeResolve для автоматического определения контекстных зависимостей:
6
- * если резолвер читает `store.context.accountId`, то `$context.accountId` добавляется
7
- * в auto-deps, и резолвер перезапустится при изменении этого ключа через `setContext`.
5
+ * Used in executeResolve to detect context dependencies automatically:
6
+ * when a resolver reads `store.context.accountId`, `$context.accountId` is
7
+ * added to the auto-deps, and the resolver re-runs when that key changes via
8
+ * `setContext`.
8
9
  */
9
10
  export function createContextTrackingProxy(context) {
10
11
  const accessedKeys = new Set();
@@ -1 +1 @@
1
- {"version":3,"file":"createContextTrackingProxy.js","sourceRoot":"","sources":["../../../store/resolvePipeline/createContextTrackingProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,MAAM,UAAU,0BAA0B,CACxC,OAAgC;IAEhC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE;QAC/B,GAAG,CAAC,OAAO,EAAE,GAAG;YACd,8DAA8D;YAC9D,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC9D,YAAY,CAAC,GAAG,CAAC,GAAa,CAAC,CAAC;YAChC,OAAO,OAAO,CAAC,GAAa,CAAC,CAAC;QAChC,CAAC;QACD,GAAG;YACD,wCAAwC;YACxC,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC;QACtE,CAAC;KACF,CAAC,CAAC;IAEH,OAAO;QACL,KAAK;QACL,eAAe,EAAE,GAAG,EAAE,CAAC,YAAY;KACpC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"createContextTrackingProxy.js","sourceRoot":"","sources":["../../../store/resolvePipeline/createContextTrackingProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,MAAM,UAAU,0BAA0B,CACxC,OAAgC;IAEhC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE;QAC/B,GAAG,CAAC,OAAO,EAAE,GAAG;YACd,8DAA8D;YAC9D,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC9D,YAAY,CAAC,GAAG,CAAC,GAAa,CAAC,CAAC;YAChC,OAAO,OAAO,CAAC,GAAa,CAAC,CAAC;QAChC,CAAC;QACD,GAAG;YACD,wCAAwC;YACxC,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC;QACtE,CAAC;KACF,CAAC,CAAC;IAEH,OAAO;QACL,KAAK;QACL,eAAe,EAAE,GAAG,EAAE,CAAC,YAAY;KACpC,CAAC;AACJ,CAAC"}
@@ -1,75 +1,75 @@
1
1
  /**
2
- * createValuesTrackingProxy — оборачивает дерево значений в Proxy, который:
3
- * - ЧТЕНИЕ: отслеживает обращённые пути (автоматические зависимости для повторного запуска резолвера)
4
- * - ЗАПИСЬ: буферизирует побочные эффекты (пакетный режим, без промежуточных ре-рендеров)
2
+ * createValuesTrackingProxy — wraps the values tree in a Proxy that:
3
+ * - READS: tracks accessed paths (automatic dependencies for resolver re-runs)
4
+ * - WRITES: buffers side effects (batch mode, no intermediate re-renders)
5
5
  *
6
- * Используется внутри выполнения резолвера: резолвер получает этот прокси вместо реального объекта.
7
- * После завершения резолвера обращённые пути сохраняются для отслеживания зависимостей,
8
- * а буферизированные записи сбрасываются одним пакетом.
6
+ * Used inside resolver execution: the resolver receives this proxy instead of
7
+ * the real object. After the resolver finishes, the accessed paths are stored
8
+ * for dependency tracking and the buffered writes are flushed in one batch.
9
9
  *
10
- * ─── КАК ЭТО РАБОТАЕТ ────────────────────────────────────────────────────────
10
+ * ─── HOW IT WORKS ────────────────────────────────────────────────────────────
11
11
  *
12
- * Дерево значений выглядит как обычный вложенный объект:
12
+ * The values tree looks like a regular nested object:
13
13
  * { user: { name: "Alice", vehicleExists: true }, payment: { amount: 100 } }
14
14
  *
15
- * Когда резолвер запускается, он получает этот прокси вместо реального объекта.
16
- * Прокси перехватывает каждое обращение к свойству:
15
+ * When the resolver runs, it receives this proxy instead of the real object.
16
+ * The proxy intercepts every property access:
17
17
  *
18
- * ЧТЕНИЕ: values.user.name
19
- * → прокси возвращает вложенный прокси для "user"
20
- * → вложенный прокси перехватывает "name", записывает путь "user.name" в accessedPaths
21
- * → возвращает реальное значение
18
+ * READ: values.user.name
19
+ * → the proxy returns a nested proxy for "user"
20
+ * → the nested proxy intercepts "name", records the path "user.name" in accessedPaths
21
+ * → returns the real value
22
22
  *
23
- * ЗАПИСЬ: values.user.vehicleExists = false
24
- * → прокси перехватывает присваивание, записывает { path: "user.vehicleExists", value: false }
25
- * в pendingWrites[]
26
- * → НЕ трогает реальный объект значенийзапись отложена!
23
+ * WRITE: values.user.vehicleExists = false
24
+ * → the proxy intercepts the assignment, records { path: "user.vehicleExists", value: false }
25
+ * into pendingWrites[]
26
+ * → the real values object is NOT touched the write is deferred!
27
27
  *
28
- * После возврата резолвера:
29
- * 1. getAccessedPaths() → используется для перестройки графа зависимостей этого резолвера
30
- * (при следующем изменении любого из этих путей резолвер запустится снова)
31
- * 2. getPendingWrites() → передаётся в applyPendingWrites(), который превращает каждый
32
- * путь обратно во вложенный патч и вызывает applyPatch() на реальном хранилище
28
+ * After the resolver returns:
29
+ * 1. getAccessedPaths() → used to rebuild this resolver's dependency graph
30
+ * (the resolver re-runs the next time any of these paths changes)
31
+ * 2. getPendingWrites() → passed to applyPendingWrites(), which turns each
32
+ * path back into a nested patch and calls applyPatch() on the real store
33
33
  *
34
- * ЗАЧЕМ БУФЕРИЗИРОВАТЬ ЗАПИСИ вместо немедленного применения?
35
- * - Предотвращает каскадные ре-рендеры в середине работы резолвера
36
- * - Все мутации применяются одним атомарным пакетомсогласованное состояние после каждого тика пайплайна
37
- * - Записи резолвера A случайно не запускают резолвер B в процессе его выполнения
34
+ * WHY BUFFER WRITES instead of applying immediately?
35
+ * - Prevents cascading re-renders in the middle of a resolver run
36
+ * - All mutations are applied in one atomic batch consistent state after every pipeline tick
37
+ * - Resolver A's writes don't accidentally trigger resolver B mid-run
38
38
  */
39
39
  export interface PendingWrite {
40
40
  /**
41
- * Путь в дереве значений, разделённый точками, например "user.vehicleExists" или "payment.amount".
42
- * Отражает структуру объекта values (аналогично valuesCache.values).
43
- * applyPendingWrites() разбивает этот путь по "." для построения вложенного патч-объекта.
41
+ * Dot-separated path in the values tree, e.g. "user.vehicleExists" or "payment.amount".
42
+ * Mirrors the structure of the values object (like valuesCache.values).
43
+ * applyPendingWrites() splits this path on "." to build a nested patch object.
44
44
  */
45
45
  path: string;
46
- /** Новое значение, которое резолвер хочет записать по этому пути. */
46
+ /** The new value the resolver wants to write at this path. */
47
47
  value: unknown;
48
48
  }
49
49
  export interface ValuesTrackingResult {
50
- /** Отслеживающий прокси с поддержкой записи для передачи резолверу. Чтения трекаются, записи буферизируются. */
50
+ /** Writable tracking proxy handed to the resolver. Reads are tracked, writes buffered. */
51
51
  proxy: Record<string, unknown>;
52
52
  /**
53
- * Возвращает все пути (через точку), которые были ПРОЧИТАНЫ в ходе выполнения резолвера.
54
- * Используется после возврата резолвера для обновления графа зависимостей:
55
- * резолвер повторно запустится при изменении любого из этих путей.
53
+ * Returns all (dot-separated) paths that were READ during the resolver run.
54
+ * Used after the resolver returns to update the dependency graph:
55
+ * the resolver re-runs when any of these paths changes.
56
56
  */
57
57
  getAccessedPaths: () => Set<string>;
58
58
  /**
59
- * Возвращает все операции записи, буферизированные во время выполнения резолвера.
60
- * Ни одна из этих записей ещё не применена к реальному хранилищу
61
- * они сбрасываются одним пакетом через applyPendingWrites() после возврата резолвера.
59
+ * Returns all write operations buffered during the resolver run.
60
+ * None of these writes has been applied to the real store yet
61
+ * they are flushed in one batch via applyPendingWrites() after the resolver returns.
62
62
  */
63
63
  getPendingWrites: () => PendingWrite[];
64
64
  }
65
65
  /**
66
- * Создаёт отслеживающий прокси с поддержкой записи для дерева значений.
66
+ * Creates a writable tracking proxy for the values tree.
67
67
  *
68
- * - Чтение примитива записывает полный путь (например "user.id") в accessedPaths
69
- * - Чтение объекта возвращает вложенный прокси (рекурсивно), не трекается до обращения к листу
70
- * - Запись по ЛЮБОМУ пути буферизирует присваивание в pendingWrites[], не затрагивая реальные данные
68
+ * - Reading a primitive records the full path (e.g. "user.id") in accessedPaths
69
+ * - Reading an object returns a nested proxy (recursively); not tracked until a leaf is read
70
+ * - Writing to ANY path buffers the assignment in pendingWrites[] without touching real data
71
71
  *
72
- * @param values — текущий снапшот значений (из valuesCache.values), здесь считается только для чтения
72
+ * @param values — current values snapshot (from valuesCache.values), treated as read-only here
73
73
  */
74
74
  export declare function createValuesTrackingProxy(values: Record<string, unknown>): ValuesTrackingResult;
75
75
  //# sourceMappingURL=createValuesTrackingProxy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createValuesTrackingProxy.d.ts","sourceRoot":"","sources":["../../../store/resolvePipeline/createValuesTrackingProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,gHAAgH;IAChH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,YAAY,EAAE,CAAC;CACxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,oBAAoB,CAwFtB"}
1
+ {"version":3,"file":"createValuesTrackingProxy.d.ts","sourceRoot":"","sources":["../../../store/resolvePipeline/createValuesTrackingProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,0FAA0F;IAC1F,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,YAAY,EAAE,CAAC;CACxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,oBAAoB,CAwFtB"}
@@ -1,123 +1,123 @@
1
1
  /**
2
- * createValuesTrackingProxy — оборачивает дерево значений в Proxy, который:
3
- * - ЧТЕНИЕ: отслеживает обращённые пути (автоматические зависимости для повторного запуска резолвера)
4
- * - ЗАПИСЬ: буферизирует побочные эффекты (пакетный режим, без промежуточных ре-рендеров)
2
+ * createValuesTrackingProxy — wraps the values tree in a Proxy that:
3
+ * - READS: tracks accessed paths (automatic dependencies for resolver re-runs)
4
+ * - WRITES: buffers side effects (batch mode, no intermediate re-renders)
5
5
  *
6
- * Используется внутри выполнения резолвера: резолвер получает этот прокси вместо реального объекта.
7
- * После завершения резолвера обращённые пути сохраняются для отслеживания зависимостей,
8
- * а буферизированные записи сбрасываются одним пакетом.
6
+ * Used inside resolver execution: the resolver receives this proxy instead of
7
+ * the real object. After the resolver finishes, the accessed paths are stored
8
+ * for dependency tracking and the buffered writes are flushed in one batch.
9
9
  *
10
- * ─── КАК ЭТО РАБОТАЕТ ────────────────────────────────────────────────────────
10
+ * ─── HOW IT WORKS ────────────────────────────────────────────────────────────
11
11
  *
12
- * Дерево значений выглядит как обычный вложенный объект:
12
+ * The values tree looks like a regular nested object:
13
13
  * { user: { name: "Alice", vehicleExists: true }, payment: { amount: 100 } }
14
14
  *
15
- * Когда резолвер запускается, он получает этот прокси вместо реального объекта.
16
- * Прокси перехватывает каждое обращение к свойству:
15
+ * When the resolver runs, it receives this proxy instead of the real object.
16
+ * The proxy intercepts every property access:
17
17
  *
18
- * ЧТЕНИЕ: values.user.name
19
- * → прокси возвращает вложенный прокси для "user"
20
- * → вложенный прокси перехватывает "name", записывает путь "user.name" в accessedPaths
21
- * → возвращает реальное значение
18
+ * READ: values.user.name
19
+ * → the proxy returns a nested proxy for "user"
20
+ * → the nested proxy intercepts "name", records the path "user.name" in accessedPaths
21
+ * → returns the real value
22
22
  *
23
- * ЗАПИСЬ: values.user.vehicleExists = false
24
- * → прокси перехватывает присваивание, записывает { path: "user.vehicleExists", value: false }
25
- * в pendingWrites[]
26
- * → НЕ трогает реальный объект значенийзапись отложена!
23
+ * WRITE: values.user.vehicleExists = false
24
+ * → the proxy intercepts the assignment, records { path: "user.vehicleExists", value: false }
25
+ * into pendingWrites[]
26
+ * → the real values object is NOT touched the write is deferred!
27
27
  *
28
- * После возврата резолвера:
29
- * 1. getAccessedPaths() → используется для перестройки графа зависимостей этого резолвера
30
- * (при следующем изменении любого из этих путей резолвер запустится снова)
31
- * 2. getPendingWrites() → передаётся в applyPendingWrites(), который превращает каждый
32
- * путь обратно во вложенный патч и вызывает applyPatch() на реальном хранилище
28
+ * After the resolver returns:
29
+ * 1. getAccessedPaths() → used to rebuild this resolver's dependency graph
30
+ * (the resolver re-runs the next time any of these paths changes)
31
+ * 2. getPendingWrites() → passed to applyPendingWrites(), which turns each
32
+ * path back into a nested patch and calls applyPatch() on the real store
33
33
  *
34
- * ЗАЧЕМ БУФЕРИЗИРОВАТЬ ЗАПИСИ вместо немедленного применения?
35
- * - Предотвращает каскадные ре-рендеры в середине работы резолвера
36
- * - Все мутации применяются одним атомарным пакетомсогласованное состояние после каждого тика пайплайна
37
- * - Записи резолвера A случайно не запускают резолвер B в процессе его выполнения
34
+ * WHY BUFFER WRITES instead of applying immediately?
35
+ * - Prevents cascading re-renders in the middle of a resolver run
36
+ * - All mutations are applied in one atomic batch consistent state after every pipeline tick
37
+ * - Resolver A's writes don't accidentally trigger resolver B mid-run
38
38
  */
39
39
  /**
40
- * Создаёт отслеживающий прокси с поддержкой записи для дерева значений.
40
+ * Creates a writable tracking proxy for the values tree.
41
41
  *
42
- * - Чтение примитива записывает полный путь (например "user.id") в accessedPaths
43
- * - Чтение объекта возвращает вложенный прокси (рекурсивно), не трекается до обращения к листу
44
- * - Запись по ЛЮБОМУ пути буферизирует присваивание в pendingWrites[], не затрагивая реальные данные
42
+ * - Reading a primitive records the full path (e.g. "user.id") in accessedPaths
43
+ * - Reading an object returns a nested proxy (recursively); not tracked until a leaf is read
44
+ * - Writing to ANY path buffers the assignment in pendingWrites[] without touching real data
45
45
  *
46
- * @param values — текущий снапшот значений (из valuesCache.values), здесь считается только для чтения
46
+ * @param values — current values snapshot (from valuesCache.values), treated as read-only here
47
47
  */
48
48
  export function createValuesTrackingProxy(values) {
49
- // Собирает все пути к примитивам, которые резолвер читает.
50
- // Пример после работы резолвера: Set { "user.name", "user.vehicleExists" }
49
+ // Collects every primitive path the resolver reads.
50
+ // Example after a resolver run: Set { "user.name", "user.vehicleExists" }
51
51
  const accessedPaths = new Set();
52
- // Собирает все записи, которые резолвер выполняет, в порядке их появления.
53
- // Ни одна не применяется до вызова applyPendingWrites() после возврата резолвера.
54
- // Пример: [{ path: "user.vehicleExists", value: false }, { path: "payment.amount", value: 200 }]
52
+ // Collects every write the resolver performs, in order of appearance.
53
+ // None is applied until applyPendingWrites() runs after the resolver returns.
54
+ // Example: [{ path: "user.vehicleExists", value: false }, { path: "payment.amount", value: 200 }]
55
55
  const pendingWrites = [];
56
- // Кэширует вложенные прокси по их префиксу пути, чтобы при повторном обращении
57
- // к одному и тому же вложенному объекту возвращался тот же экземпляр прокси.
58
- // Ключ: префикс пути через точку (например "user"), или "__root__" для корневого уровня.
56
+ // Caches nested proxies by their path prefix so repeated access to the same
57
+ // nested object returns the same proxy instance.
58
+ // Key: dot-separated path prefix (e.g. "user"), or "__root__" for the root level.
59
59
  const proxyCache = new Map();
60
60
  /**
61
- * Рекурсивно оборачивает `target` в Proxy, который отслеживает чтения и буферизирует записи.
61
+ * Recursively wraps `target` in a Proxy that tracks reads and buffers writes.
62
62
  *
63
- * @param target — реальный объект значений (или вложенный подобъект) для обёртки
64
- * @param parentPath — накопленный префикс пути через точку, например "" для корня или "user" для вложенного
63
+ * @param target — the real values object (or nested sub-object) to wrap
64
+ * @param parentPath — accumulated dot-path prefix, e.g. "" for the root or "user" for a nested one
65
65
  */
66
66
  function buildValuesProxy(target, parentPath) {
67
- // Возвращаем закэшированный прокси для данного пути, чтобы не создавать дублирующие прокси
68
- // для одного узла (важно для проверок ссылочного равенства внутри резолверов).
67
+ // Return the cached proxy for this path so we don't create duplicate
68
+ // proxies for one node (matters for referential equality checks inside resolvers).
69
69
  const cacheKey = parentPath || "__root__";
70
70
  if (proxyCache.has(cacheKey))
71
71
  return proxyCache.get(cacheKey);
72
72
  const p = new Proxy(target, {
73
- // ─── GET-ловушка ──────────────────────────────────────────────────────
74
- // Перехватывает каждое чтение свойства. Строит полный путь через точку, затем:
75
- // • если значение вложенный простой объект возвращает вложенный прокси
76
- // (промежуточные пути не трекаем, только чтения листьев)
77
- // • если значение примитив записывает путь в accessedPaths и возвращает его
73
+ // ─── GET trap ─────────────────────────────────────────────────────────
74
+ // Intercepts every property read. Builds the full dot-path, then:
75
+ // • nested plain object returns a nested proxy
76
+ // (intermediate paths are not tracked, only leaf reads)
77
+ // • primitive records the path in accessedPaths and returns it
78
78
  get(_t, key) {
79
- // Игнорируем символьные ключи (например Symbol.toPrimitive, Symbol.iterator) —
80
- // это внутренние ключи фреймворка/рантайма, не часть дерева значений.
79
+ // Ignore symbol keys (e.g. Symbol.toPrimitive, Symbol.iterator) —
80
+ // framework/runtime internals, not part of the values tree.
81
81
  if (typeof key === "symbol")
82
82
  return undefined;
83
- // Формируем полный путь через точку для данного обращения, например "user" + "." + "name" = "user.name"
83
+ // Full dot-path for this access, e.g. "user" + "." + "name" = "user.name"
84
84
  const fullPath = parentPath ? `${parentPath}.${key}` : key;
85
85
  const val = target[key];
86
- // Если значение простой объект, оборачиваем его в ещё один прокси, чтобы
87
- // продолжать отслеживать более глубокие чтения, например values.user.address.city.
88
- // Массивы и Date считаются листовыми значениями (не рекурсируем).
86
+ // Plain objects are wrapped in another proxy to keep tracking deeper
87
+ // reads, e.g. values.user.address.city.
88
+ // Arrays and Dates are treated as leaf values (no recursion).
89
89
  if (val !== null && typeof val === "object" && !Array.isArray(val) && !(val instanceof Date)) {
90
90
  return buildValuesProxy(val, fullPath);
91
91
  }
92
- // Чтение листазаписываем путь, чтобы резолвер мог быть перезапущен позже,
93
- // когда это конкретное значение изменится в хранилище.
92
+ // Leaf readrecord the path so the resolver can be re-triggered
93
+ // later when this specific value changes in the store.
94
94
  accessedPaths.add(fullPath);
95
95
  return val;
96
96
  },
97
- // ─── SET-ловушка ──────────────────────────────────────────────────────
98
- // Перехватывает каждое присваивание. Вместо мутации реального объекта значений
99
- // помещаем дескриптор PendingWrite в буфер.
97
+ // ─── SET trap ─────────────────────────────────────────────────────────
98
+ // Intercepts every assignment. Instead of mutating the real values
99
+ // object, pushes a PendingWrite descriptor into the buffer.
100
100
  //
101
- // Запись намеренно откладывается:
102
- // 1. Резолвер может выполнить несколько записей подряд; сначала собираем все.
103
- // 2. applyPendingWrites() вызывается после возврата резолвера, поэтому все
104
- // мутации применяются атомарно за один вызов applyPatch().
105
- // 3. Это не позволяет резолверу наблюдать собственные частично применённые записи.
101
+ // Writes are deliberately deferred:
102
+ // 1. A resolver may perform several writes in a row; collect them all first.
103
+ // 2. applyPendingWrites() runs after the resolver returns, so all
104
+ // mutations are applied atomically in a single applyPatch() call.
105
+ // 3. The resolver cannot observe its own partially applied writes.
106
106
  set(_t, key, newValue) {
107
107
  if (typeof key === "symbol")
108
108
  return false;
109
109
  const fullPath = parentPath ? `${parentPath}.${key}` : key;
110
- // Буферизируем записьреальное хранилище пока не трогаем.
110
+ // Buffer the write the real store is untouched for now.
111
111
  pendingWrites.push({ path: fullPath, value: newValue });
112
- // Возврат true сообщает Proxy, что присваивание «принято»
113
- // (предотвращает TypeError в strict-режиме, несмотря на отсутствие реальной мутации).
112
+ // Returning true tells the Proxy the assignment was "accepted"
113
+ // (prevents a strict-mode TypeError despite no real mutation happening).
114
114
  return true;
115
115
  },
116
116
  });
117
117
  proxyCache.set(cacheKey, p);
118
118
  return p;
119
119
  }
120
- // Строим прокси корневого уровня (parentPath = "" означает отсутствие префикса).
120
+ // Build the root-level proxy (parentPath = "" means no prefix).
121
121
  const proxy = buildValuesProxy(values, "");
122
122
  return {
123
123
  proxy,
@@ -1 +1 @@
1
- {"version":3,"file":"createValuesTrackingProxy.js","sourceRoot":"","sources":["../../../store/resolvePipeline/createValuesTrackingProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AA8BH;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAA+B;IAE/B,2DAA2D;IAC3D,2EAA2E;IAC3E,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,2EAA2E;IAC3E,kFAAkF;IAClF,iGAAiG;IACjG,MAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,+EAA+E;IAC/E,6EAA6E;IAC7E,yFAAyF;IACzF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE9C;;;;;OAKG;IACH,SAAS,gBAAgB,CAAC,MAA+B,EAAE,UAAkB;QAC3E,2FAA2F;QAC3F,+EAA+E;QAC/E,MAAM,QAAQ,GAAG,UAAU,IAAI,UAAU,CAAC;QAC1C,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,UAAU,CAAC,GAAG,CAAC,QAAQ,CAA4B,CAAC;QAEzF,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE;YAC1B,yEAAyE;YACzE,+EAA+E;YAC/E,6EAA6E;YAC7E,6DAA6D;YAC7D,kFAAkF;YAClF,GAAG,CAAC,EAAE,EAAE,GAAoB;gBAC1B,+EAA+E;gBAC/E,sEAAsE;gBACtE,IAAI,OAAO,GAAG,KAAK,QAAQ;oBAAE,OAAO,SAAS,CAAC;gBAE9C,wGAAwG;gBACxG,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAExB,2EAA2E;gBAC3E,mFAAmF;gBACnF,kEAAkE;gBAClE,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,YAAY,IAAI,CAAC,EAAE,CAAC;oBAC7F,OAAO,gBAAgB,CAAC,GAA8B,EAAE,QAAQ,CAAC,CAAC;gBACpE,CAAC;gBAED,6EAA6E;gBAC7E,uDAAuD;gBACvD,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC5B,OAAO,GAAG,CAAC;YACb,CAAC;YAED,yEAAyE;YACzE,+EAA+E;YAC/E,4CAA4C;YAC5C,EAAE;YACF,kCAAkC;YAClC,gFAAgF;YAChF,6EAA6E;YAC7E,gEAAgE;YAChE,qFAAqF;YACrF,GAAG,CAAC,EAAE,EAAE,GAAoB,EAAE,QAAiB;gBAC7C,IAAI,OAAO,GAAG,KAAK,QAAQ;oBAAE,OAAO,KAAK,CAAC;gBAE1C,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC3D,4DAA4D;gBAC5D,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACxD,0DAA0D;gBAC1D,sFAAsF;gBACtF,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC,CAAC;QAEH,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,CAA4B,CAAC;IACtC,CAAC;IAED,iFAAiF;IACjF,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE3C,OAAO;QACL,KAAK;QACL,gBAAgB,EAAE,GAAG,EAAE,CAAC,aAAa;QACrC,gBAAgB,EAAE,GAAG,EAAE,CAAC,aAAa;KACtC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"createValuesTrackingProxy.js","sourceRoot":"","sources":["../../../store/resolvePipeline/createValuesTrackingProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AA8BH;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAA+B;IAE/B,oDAAoD;IACpD,0EAA0E;IAC1E,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,sEAAsE;IACtE,8EAA8E;IAC9E,kGAAkG;IAClG,MAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,4EAA4E;IAC5E,iDAAiD;IACjD,kFAAkF;IAClF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE9C;;;;;OAKG;IACH,SAAS,gBAAgB,CAAC,MAA+B,EAAE,UAAkB;QAC3E,qEAAqE;QACrE,mFAAmF;QACnF,MAAM,QAAQ,GAAG,UAAU,IAAI,UAAU,CAAC;QAC1C,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,UAAU,CAAC,GAAG,CAAC,QAAQ,CAA4B,CAAC;QAEzF,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE;YAC1B,yEAAyE;YACzE,kEAAkE;YAClE,mDAAmD;YACnD,4DAA4D;YAC5D,mEAAmE;YACnE,GAAG,CAAC,EAAE,EAAE,GAAoB;gBAC1B,kEAAkE;gBAClE,4DAA4D;gBAC5D,IAAI,OAAO,GAAG,KAAK,QAAQ;oBAAE,OAAO,SAAS,CAAC;gBAE9C,0EAA0E;gBAC1E,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAExB,qEAAqE;gBACrE,wCAAwC;gBACxC,8DAA8D;gBAC9D,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,YAAY,IAAI,CAAC,EAAE,CAAC;oBAC7F,OAAO,gBAAgB,CAAC,GAA8B,EAAE,QAAQ,CAAC,CAAC;gBACpE,CAAC;gBAED,kEAAkE;gBAClE,uDAAuD;gBACvD,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC5B,OAAO,GAAG,CAAC;YACb,CAAC;YAED,yEAAyE;YACzE,mEAAmE;YACnE,4DAA4D;YAC5D,EAAE;YACF,oCAAoC;YACpC,+EAA+E;YAC/E,oEAAoE;YACpE,uEAAuE;YACvE,qEAAqE;YACrE,GAAG,CAAC,EAAE,EAAE,GAAoB,EAAE,QAAiB;gBAC7C,IAAI,OAAO,GAAG,KAAK,QAAQ;oBAAE,OAAO,KAAK,CAAC;gBAE1C,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC3D,0DAA0D;gBAC1D,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACxD,+DAA+D;gBAC/D,yEAAyE;gBACzE,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC,CAAC;QAEH,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,CAA4B,CAAC;IACtC,CAAC;IAED,gEAAgE;IAChE,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE3C,OAAO;QACL,KAAK;QACL,gBAAgB,EAAE,GAAG,EAAE,CAAC,aAAa;QACrC,gBAAgB,EAAE,GAAG,EAAE,CAAC,aAAa;KACtC,CAAC;AACJ,CAAC"}