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
@@ -0,0 +1,384 @@
1
+ import { computeFieldState } from "../compute";
2
+ import { walkFull } from "../traversal";
3
+ import { resetResolveState } from "../resolvePipeline";
4
+ // ─── Derived state ────────────────────────────────────────────────────────────
5
+ /** Step status — derived from navigation state (not stored). */
6
+ export function getStepStatus(flowState, stepNode) {
7
+ const idx = flowState.stepNodes.indexOf(stepNode);
8
+ if (idx === -1)
9
+ return null;
10
+ if (idx === flowState.currentIndex)
11
+ return "active";
12
+ return flowState.visitedKeys.has(flowState.stepKeys[idx]) ? "completed" : null;
13
+ }
14
+ /** Step visibility — from the group's computed FieldState (isVisible is reactive). */
15
+ export function isStepVisible(kernel, stepNode) {
16
+ return kernel.nodes.nodeState.get(stepNode)?.isVisible !== false;
17
+ }
18
+ /** Composite flow loading: true when at least one step is resolving. */
19
+ export function flowLoading(kernel, flowState) {
20
+ for (const stepNode of flowState.stepNodes) {
21
+ if (kernel.nodes.nodeState.get(stepNode)?.loading === true)
22
+ return true;
23
+ }
24
+ return false;
25
+ }
26
+ // ─── Validation ───────────────────────────────────────────────────────────────
27
+ /**
28
+ * Collect leaf errors of a step's subtree. Validation is computed "live" via
29
+ * computeFieldState(revalidate=true) — independent of the group's revalidate
30
+ * flag (which only the submit pipeline sets). Hidden leaves are skipped.
31
+ * Lists inside a step are skipped (parity with collectLeafStates).
32
+ *
33
+ * `basePath` — prefix for error paths. The flow passes the step KEY: paths
34
+ * come out relative to the flow node ("welcome.name") — the same base the
35
+ * submit pipeline uses for errors on flow.submit() (collectLeafStates builds
36
+ * paths from the submitted node).
37
+ */
38
+ export function collectStepErrors(kernel, stepNode, basePath = "") {
39
+ const errors = [];
40
+ const { nodeState } = kernel.nodes;
41
+ const translate = kernel.services.translate;
42
+ walkFull(stepNode, {
43
+ onLeaf(leaf, _key, path) {
44
+ const state = nodeState.get(leaf);
45
+ if (!state || state.isVisible === false)
46
+ return;
47
+ const groupValues = kernel.values.nodeSlot.get(leaf)?.parent ?? kernel.values.values;
48
+ const computed = computeFieldState(leaf, state.value, groupValues, true, translate);
49
+ if (computed.isInvalid && computed.errorMessage) {
50
+ errors.push({ path, message: computed.errorMessage });
51
+ }
52
+ },
53
+ }, basePath);
54
+ return errors;
55
+ }
56
+ /** Live aggregate of step validity (flow.steps.x.isInvalid). */
57
+ export function stepIsInvalid(kernel, stepNode) {
58
+ return collectStepErrors(kernel, stepNode).length > 0;
59
+ }
60
+ /**
61
+ * Flow errors over visited visible steps (the scope of flow.validate()).
62
+ * Hidden steps are always excluded — an untaken branch must not block.
63
+ * Error paths are relative to the flow node ("stepKey.field") — same as
64
+ * SubmitResult on flow.submit().
65
+ */
66
+ export function collectFlowErrors(kernel, flowState) {
67
+ const errors = [];
68
+ for (let i = 0; i < flowState.stepNodes.length; i++) {
69
+ const stepNode = flowState.stepNodes[i];
70
+ if (!flowState.visitedKeys.has(flowState.stepKeys[i]))
71
+ continue;
72
+ if (!isStepVisible(kernel, stepNode))
73
+ continue;
74
+ errors.push(...collectStepErrors(kernel, stepNode, flowState.stepKeys[i]));
75
+ }
76
+ return errors;
77
+ }
78
+ /** Aggregate flow.isInvalid: any errors in visited visible steps. */
79
+ export function flowIsInvalid(kernel, flowState) {
80
+ return collectFlowErrors(kernel, flowState).length > 0;
81
+ }
82
+ /**
83
+ * flow.validate(): collect errors of the visited steps, write them into the
84
+ * reactive flow.errors and return them. Empty array = all valid.
85
+ */
86
+ export function flowValidate(kernel, flowState) {
87
+ const errors = collectFlowErrors(kernel, flowState);
88
+ flowState.errors = errors;
89
+ kernel.notifyChanged(new Set([flowState, flowState.flowNode]));
90
+ return errors;
91
+ }
92
+ /**
93
+ * Filter out submit-pipeline errors from leaves under HIDDEN steps of any
94
+ * flow: the base pipeline validates all leaves regardless of visibility, and
95
+ * without this filter an untaken branch with isRequired fields would block
96
+ * finalization forever.
97
+ *
98
+ * `submittedNode` — the node the submit ran for: pipeline error paths are
99
+ * RELATIVE to it (collectLeafStates builds paths from the submitted node),
100
+ * so the absolute paths of hidden steps are rebased to the same base.
101
+ */
102
+ export function filterHiddenFlowStepErrors(kernel, errors, submittedNode) {
103
+ const flows = kernel.nodes.allFlowStates;
104
+ if (flows.length === 0 || errors.length === 0)
105
+ return errors;
106
+ const basePath = submittedNode === kernel.rootConfig
107
+ ? ""
108
+ : kernel.nodes.nodePaths.get(submittedNode) ?? "";
109
+ const hiddenPrefixes = [];
110
+ for (const flowState of flows) {
111
+ for (const stepNode of flowState.stepNodes) {
112
+ if (isStepVisible(kernel, stepNode))
113
+ continue;
114
+ const stepPath = kernel.nodes.nodePaths.get(stepNode);
115
+ if (!stepPath)
116
+ continue;
117
+ if (basePath === "") {
118
+ hiddenPrefixes.push(stepPath + ".");
119
+ }
120
+ else if (stepPath.startsWith(basePath + ".")) {
121
+ hiddenPrefixes.push(stepPath.slice(basePath.length + 1) + ".");
122
+ }
123
+ // stepPath outside the submitted node's subtree — its leaves never appear in errors.
124
+ }
125
+ }
126
+ if (hiddenPrefixes.length === 0)
127
+ return errors;
128
+ return errors.filter((e) => !hiddenPrefixes.some((prefix) => e.path.startsWith(prefix)));
129
+ }
130
+ // ─── Submit (finalization) ────────────────────────────────────────────────────
131
+ /**
132
+ * flow.submit(): the standard group-submit pipeline over the flow node
133
+ * (submitting → beforeSubmit → validate → onSubmit → afterSubmit; leaves of
134
+ * hidden steps are filtered by the pipeline). Validation errors land in the
135
+ * reactive flow.errors; on success errors are cleared.
136
+ */
137
+ export async function flowSubmit(kernel, flowState) {
138
+ const result = await kernel.submitPipeline.execute(flowState.flowNode);
139
+ flowState.errors = result.success ? [] : result.errors;
140
+ kernel.notifyChanged(new Set([flowState, flowState.flowNode]));
141
+ return result;
142
+ }
143
+ // ─── Entry lifecycle ─────────────────────────────────────────────────────────
144
+ function fireCallback(cb, values, kernel) {
145
+ if (typeof cb !== "function")
146
+ return;
147
+ try {
148
+ void Promise.resolve(cb(values, kernel))
149
+ .catch(() => { });
150
+ }
151
+ catch {
152
+ /* synchronous throws are swallowed too */
153
+ }
154
+ }
155
+ /**
156
+ * Step entry lifecycle: onEnter → resolve (eager) → onReady.
157
+ *
158
+ * - `onEnter` / `onReady` receive FLOW-scoped values (all steps by key) —
159
+ * the flow's live groupSlot reference; fire-and-forget.
160
+ * - the step's resolve is a standard group resolve; the flow triggers it ON
161
+ * ENTRY (equivalent to first access). Already resolved/error (cached) — not
162
+ * re-run, and onReady is NOT invoked again.
163
+ * - Without resolve — onReady fires right after onEnter.
164
+ */
165
+ export function runEntryLifecycle(kernel, flowState, stepNode) {
166
+ const flowValues = kernel.values.groupSlot.get(flowState.flowNode) ?? kernel.values.values;
167
+ fireCallback(stepNode.onEnter, flowValues, kernel);
168
+ const onReady = stepNode.onReady;
169
+ const fireReady = () => fireCallback(onReady, flowValues, kernel);
170
+ const resolve = stepNode.resolve;
171
+ const hasResolve = !!resolve && typeof resolve.resolver === "function";
172
+ if (!hasResolve) {
173
+ fireReady();
174
+ return;
175
+ }
176
+ const state = kernel.resolveManager.getResolveState(stepNode);
177
+ if (state && state.status === "idle") {
178
+ kernel.resolveManager.triggerResolve(stepNode);
179
+ const after = kernel.resolveManager.getResolveState(stepNode);
180
+ if (after?.promise) {
181
+ void after.promise.then(fireReady).catch(() => { });
182
+ }
183
+ else {
184
+ fireReady();
185
+ }
186
+ }
187
+ // pending — the resolve was started by another entry (onReady attached there);
188
+ // resolved / error — cached: onReady is not re-run.
189
+ }
190
+ // ─── Navigation ──────────────────────────────────────────────────────────────
191
+ function notifyNavigation(kernel, flowState, prevNode, nextNode) {
192
+ const changed = new Set([
193
+ flowState,
194
+ flowState.flowNode,
195
+ prevNode,
196
+ nextNode,
197
+ ]);
198
+ kernel.notifyChanged(changed);
199
+ }
200
+ /**
201
+ * Common transition to step targetIndex.
202
+ * `push: true` — nextStep()/goTo() (the current key is pushed onto the stack);
203
+ * `push: false` — back() (the stack was already popped by the caller).
204
+ */
205
+ function enterStep(kernel, flowState, targetIndex, push) {
206
+ const prevIndex = flowState.currentIndex;
207
+ const prevKey = flowState.stepKeys[prevIndex];
208
+ const prevNode = flowState.stepNodes[prevIndex];
209
+ if (push)
210
+ flowState.visitStack.push(prevKey);
211
+ flowState.currentIndex = targetIndex;
212
+ const nextKey = flowState.stepKeys[targetIndex];
213
+ const nextNode = flowState.stepNodes[targetIndex];
214
+ // The previous step becomes visited (status → "completed"), the new one is active.
215
+ flowState.visitedKeys.add(prevKey);
216
+ flowState.visitedKeys.add(nextKey);
217
+ notifyNavigation(kernel, flowState, prevNode, nextNode);
218
+ runEntryLifecycle(kernel, flowState, nextNode);
219
+ }
220
+ /**
221
+ * nextStep(): the next VISIBLE step in array order; hidden ones are skipped.
222
+ * When no visible steps remain ahead — finalize via flow.submit() (on
223
+ * validation errors onSubmit is not called, errors land in flow.errors, the
224
+ * step does not change).
225
+ */
226
+ export function flowNextStep(kernel, flowState) {
227
+ for (let i = flowState.currentIndex + 1; i < flowState.stepNodes.length; i++) {
228
+ if (isStepVisible(kernel, flowState.stepNodes[i])) {
229
+ enterStep(kernel, flowState, i, true);
230
+ return;
231
+ }
232
+ }
233
+ void flowSubmit(kernel, flowState);
234
+ }
235
+ /** back(): go back along the visit stack. No-op when the stack is empty (canGoBack). */
236
+ export function flowBack(kernel, flowState) {
237
+ if (flowState.visitStack.length === 0)
238
+ return;
239
+ const targetKey = flowState.visitStack.pop();
240
+ const targetIndex = flowState.stepKeys.indexOf(targetKey);
241
+ if (targetIndex === -1)
242
+ return; // corrupted stack (hydrated against an older config)
243
+ enterStep(kernel, flowState, targetIndex, false);
244
+ }
245
+ /**
246
+ * goTo(keyOrIndex): arbitrary jump by key or index.
247
+ * Unknown key/index — throws (catches typos during development).
248
+ * Jumping to the current step is a no-op.
249
+ */
250
+ export function flowGoTo(kernel, flowState, keyOrIndex) {
251
+ let targetIndex;
252
+ if (typeof keyOrIndex === "number") {
253
+ if (!Number.isInteger(keyOrIndex) || keyOrIndex < 0 || keyOrIndex >= flowState.stepKeys.length) {
254
+ throw new Error(`[palistor] flow.goTo(${keyOrIndex}): step index out of range (0..${flowState.stepKeys.length - 1}).`);
255
+ }
256
+ targetIndex = keyOrIndex;
257
+ }
258
+ else {
259
+ targetIndex = flowState.stepKeys.indexOf(keyOrIndex);
260
+ if (targetIndex === -1) {
261
+ throw new Error(`[palistor] flow.goTo("${keyOrIndex}"): unknown step key. Steps: ${flowState.stepKeys.join(", ")}.`);
262
+ }
263
+ }
264
+ if (targetIndex === flowState.currentIndex)
265
+ return;
266
+ enterStep(kernel, flowState, targetIndex, true);
267
+ }
268
+ // ─── Reset ───────────────────────────────────────────────────────────────────
269
+ /**
270
+ * Reset flow navigation: the first step is active, the stack and visited set
271
+ * are cleared, step resolve states go back to idle. The first step's entry
272
+ * lifecycle (onEnter → resolve → onReady) runs anew — mirroring initialization.
273
+ */
274
+ export function resetFlowNav(kernel, flowState) {
275
+ flowState.currentIndex = 0;
276
+ flowState.visitStack = [];
277
+ flowState.visitedKeys = new Set([flowState.stepKeys[0]]);
278
+ flowState.errors = [];
279
+ const changed = new Set([flowState, flowState.flowNode]);
280
+ for (const stepNode of flowState.stepNodes) {
281
+ changed.add(stepNode);
282
+ const resolve = stepNode.resolve;
283
+ if (resolve && typeof resolve.resolver === "function") {
284
+ resetResolveState(stepNode, kernel.resolveManager.states);
285
+ }
286
+ }
287
+ kernel.notifyChanged(changed);
288
+ runEntryLifecycle(kernel, flowState, flowState.stepNodes[0]);
289
+ }
290
+ /**
291
+ * Reset navigation of all flows that fall into the reset subtree.
292
+ * Called from ResetPipeline (root reset → all flows; group reset → flows inside it).
293
+ */
294
+ export function resetFlowNavForSubtree(kernel, groupNode) {
295
+ const flows = kernel.nodes.allFlowStates;
296
+ if (flows.length === 0)
297
+ return;
298
+ const basePath = groupNode === kernel.rootConfig
299
+ ? ""
300
+ : kernel.nodes.nodePaths.get(groupNode);
301
+ if (basePath === undefined)
302
+ return;
303
+ for (const flowState of flows) {
304
+ const within = basePath === "" ||
305
+ flowState.path === basePath ||
306
+ flowState.path.startsWith(basePath + ".");
307
+ if (within)
308
+ resetFlowNav(kernel, flowState);
309
+ }
310
+ }
311
+ // ─── Init ────────────────────────────────────────────────────────────────────
312
+ /**
313
+ * Initialization lifecycle: the first step of every flow is "entered" at
314
+ * store creation (onEnter → resolve → onReady). Called from the Palistor
315
+ * constructor.
316
+ *
317
+ * Also pre-warms the proxyCache of flow nodes: a step's identity view reads
318
+ * parent.proxy from the cache on the first step.submit(), and the flow proxy
319
+ * must already exist by then — otherwise the step's onSubmit would receive
320
+ * undefined as its third argument.
321
+ */
322
+ export function initFlows(kernel) {
323
+ for (const flowState of kernel.nodes.allFlowStates) {
324
+ kernel.proxyBuilder.build(flowState.flowNode);
325
+ runEntryLifecycle(kernel, flowState, flowState.stepNodes[flowState.currentIndex]);
326
+ }
327
+ }
328
+ /**
329
+ * Serialize navigation of all flows for persist: key — the flow node's dot-path.
330
+ * Step statuses are not saved — they are derived from navigation on hydrate.
331
+ */
332
+ export function serializeFlowNav(kernel) {
333
+ const flows = kernel.nodes.allFlowStates;
334
+ if (flows.length === 0)
335
+ return null;
336
+ const out = {};
337
+ for (const flowState of flows) {
338
+ out[flowState.path] = {
339
+ currentStepKey: flowState.stepKeys[flowState.currentIndex],
340
+ visitStack: [...flowState.visitStack],
341
+ visitedKeys: [...flowState.visitedKeys],
342
+ };
343
+ }
344
+ return out;
345
+ }
346
+ /**
347
+ * Restore flow navigation from a persist snapshot. Unknown step keys (the
348
+ * config changed) are dropped; an incompatible currentStepKey leaves the flow
349
+ * in its current state. Returns the changed nodes for notify and the flows
350
+ * whose active step changed (for a repeated entry lifecycle).
351
+ */
352
+ export function restoreFlowNav(kernel, snapshots) {
353
+ const changed = new Set();
354
+ const entered = [];
355
+ for (const flowState of kernel.nodes.allFlowStates) {
356
+ const snap = snapshots[flowState.path];
357
+ if (!snap || typeof snap !== "object" || typeof snap.currentStepKey !== "string")
358
+ continue;
359
+ const targetIndex = flowState.stepKeys.indexOf(snap.currentStepKey);
360
+ if (targetIndex === -1)
361
+ continue;
362
+ const isKnownKey = (k) => typeof k === "string" && flowState.stepKeys.includes(k);
363
+ const prevIndex = flowState.currentIndex;
364
+ flowState.currentIndex = targetIndex;
365
+ flowState.visitStack = Array.isArray(snap.visitStack)
366
+ ? snap.visitStack.filter(isKnownKey)
367
+ : [];
368
+ flowState.visitedKeys = new Set(Array.isArray(snap.visitedKeys) ? snap.visitedKeys.filter(isKnownKey) : []);
369
+ flowState.visitedKeys.add(snap.currentStepKey);
370
+ flowState.errors = [];
371
+ changed.add(flowState);
372
+ changed.add(flowState.flowNode);
373
+ for (const stepNode of flowState.stepNodes)
374
+ changed.add(stepNode);
375
+ if (prevIndex !== targetIndex)
376
+ entered.push(flowState);
377
+ }
378
+ return { changed, entered };
379
+ }
380
+ /** Entry lifecycle of the current step (used by persist after hydration). */
381
+ export function runFlowEntryLifecycle(kernel, flowState) {
382
+ runEntryLifecycle(kernel, flowState, flowState.stepNodes[flowState.currentIndex]);
383
+ }
384
+ //# sourceMappingURL=flowNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flowNavigation.js","sourceRoot":"","sources":["../../../store/flow/flowNavigation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AASvD,iFAAiF;AAEjF,gEAAgE;AAChE,MAAM,UAAU,aAAa,CAAC,SAAoB,EAAE,QAAgB;IAClE,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,QAAyB,CAAC,CAAC;IACnE,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,GAAG,KAAK,SAAS,CAAC,YAAY;QAAE,OAAO,QAAQ,CAAC;IACpD,OAAO,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;AACjF,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,QAAgB;IAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,SAAS,KAAK,KAAK,CAAC;AACnE,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,SAAoB;IAC9D,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QAC3C,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,QAAkB,CAAC,EAAE,OAAO,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;IACpF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,iFAAiF;AAEjF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,QAAuB,EACvB,QAAQ,GAAG,EAAE;IAEb,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IACnC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAE5C,QAAQ,CAAC,QAAQ,EAAE;QACjB,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI;YACrB,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK;gBAAE,OAAO;YAChD,MAAM,WAAW,GACf,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YACnE,MAAM,QAAQ,GAAG,iBAAiB,CAChC,IAA2B,EAC3B,KAAK,CAAC,KAAK,EACX,WAAW,EACX,IAAI,EACJ,SAAS,CACV,CAAC;YACF,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;KACF,EAAE,QAAQ,CAAC,CAAC;IAEb,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,QAAuB;IACnE,OAAO,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,SAAoB;IACpE,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;QAChE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,QAAkB,CAAC;YAAE,SAAS;QACzD,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,SAAoB;IAChE,OAAO,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,SAAoB;IAC/D,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpD,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;IAC1B,MAAM,CAAC,aAAa,CAAC,IAAI,GAAG,CAAS,CAAC,SAA8B,EAAE,SAAS,CAAC,QAAkB,CAAC,CAAC,CAAC,CAAC;IACtG,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAAc,EACd,MAAgD,EAChD,aAA4B;IAE5B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAE7D,MAAM,QAAQ,GAAG,aAAa,KAAK,MAAM,CAAC,UAAU;QAClD,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,aAAuB,CAAC,IAAI,EAAE,CAAC;IAE9D,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;YAC3C,IAAI,aAAa,CAAC,MAAM,EAAE,QAAkB,CAAC;gBAAE,SAAS;YACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,QAAkB,CAAC,CAAC;YAChE,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACxB,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;gBACpB,cAAc,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;YACtC,CAAC;iBAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC;gBAC/C,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YACjE,CAAC;YACD,qFAAqF;QACvF,CAAC;IACH,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAE/C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,SAAoB;IACnE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACvE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IACvD,MAAM,CAAC,aAAa,CAAC,IAAI,GAAG,CAAS,CAAC,SAA8B,EAAE,SAAS,CAAC,QAAkB,CAAC,CAAC,CAAC,CAAC;IACtG,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gFAAgF;AAEhF,SAAS,YAAY,CAAC,EAAW,EAAE,MAA+B,EAAE,MAAc;IAChF,IAAI,OAAO,EAAE,KAAK,UAAU;QAAE,OAAO;IACrC,IAAI,CAAC;QACH,KAAK,OAAO,CAAC,OAAO,CAAE,EAA0D,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;aAC9F,KAAK,CAAC,GAAG,EAAE,GAAyD,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,SAAoB,EAAE,QAAuB;IAC7F,MAAM,UAAU,GACd,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,QAAkB,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IAEpF,YAAY,CAAE,QAAoC,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAEhF,MAAM,OAAO,GAAI,QAAoC,CAAC,OAAO,CAAC;IAC9D,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAElE,MAAM,OAAO,GAAI,QAAoC,CAAC,OAEzC,CAAC;IACd,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU,CAAC;IAEvE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC9D,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACrC,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;YACnB,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,SAAS,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IACD,+EAA+E;IAC/E,oDAAoD;AACtD,CAAC;AAED,gFAAgF;AAEhF,SAAS,gBAAgB,CAAC,MAAc,EAAE,SAAoB,EAAE,QAAgB,EAAE,QAAgB;IAChG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS;QAC9B,SAA8B;QAC9B,SAAS,CAAC,QAAkB;QAC5B,QAAQ;QACR,QAAQ;KACT,CAAC,CAAC;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,MAAc,EAAE,SAAoB,EAAE,WAAmB,EAAE,IAAa;IACzF,MAAM,SAAS,GAAG,SAAS,CAAC,YAAY,CAAC;IACzC,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,SAAS,CAAW,CAAC;IAE1D,IAAI,IAAI;QAAE,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE7C,SAAS,CAAC,YAAY,GAAG,WAAW,CAAC;IACrC,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAElD,mFAAmF;IACnF,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAEnC,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAkB,CAAC,CAAC;IAClE,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,SAAoB;IAC/D,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7E,IAAI,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAW,CAAC,EAAE,CAAC;YAC5D,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;IACH,CAAC;IACD,KAAK,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,SAAoB;IAC3D,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC9C,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,EAAG,CAAC;IAC9C,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,WAAW,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,qDAAqD;IACrF,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,SAAoB,EAAE,UAA2B;IACxF,IAAI,WAAmB,CAAC;IACxB,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC/F,MAAM,IAAI,KAAK,CAAC,wBAAwB,UAAU,kCAAkC,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;QACzH,CAAC;QACD,WAAW,GAAG,UAAU,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,yBAAyB,UAAU,gCAAgC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvH,CAAC;IACH,CAAC;IACD,IAAI,WAAW,KAAK,SAAS,CAAC,YAAY;QAAE,OAAO;IACnD,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,gFAAgF;AAEhF;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,SAAoB;IAC/D,SAAS,CAAC,YAAY,GAAG,CAAC,CAAC;IAC3B,SAAS,CAAC,UAAU,GAAG,EAAE,CAAC;IAC1B,SAAS,CAAC,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC;IAEtB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,SAA8B,EAAE,SAAS,CAAC,QAAkB,CAAC,CAAC,CAAC;IAChG,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,QAAkB,CAAC,CAAC;QAChC,MAAM,OAAO,GAAI,QAAoC,CAAC,OAA6C,CAAC;QACpG,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YACtD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9B,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,SAAwB;IAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE/B,MAAM,QAAQ,GAAG,SAAS,KAAK,MAAM,CAAC,UAAU;QAC9C,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,SAAmB,CAAC,CAAC;IACpD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO;IAEnC,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,MAAM,GACV,QAAQ,KAAK,EAAE;YACf,SAAS,CAAC,IAAI,KAAK,QAAQ;YAC3B,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;QAC5C,IAAI,MAAM;YAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACnD,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC9C,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;IACpF,CAAC;AACH,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,GAAG,GAAoC,EAAE,CAAC;IAChD,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG;YACpB,cAAc,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC;YAC1D,UAAU,EAAE,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC;YACrC,WAAW,EAAE,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC;SACxC,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,SAA0C;IAE1C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,OAAO,GAAgB,EAAE,CAAC;IAEhC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ;YAAE,SAAS;QAE3F,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpE,IAAI,WAAW,KAAK,CAAC,CAAC;YAAE,SAAS;QAEjC,MAAM,UAAU,GAAG,CAAC,CAAU,EAAe,EAAE,CAC7C,OAAO,CAAC,KAAK,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE1D,MAAM,SAAS,GAAG,SAAS,CAAC,YAAY,CAAC;QACzC,SAAS,CAAC,YAAY,GAAG,WAAW,CAAC;QACrC,SAAS,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;YACnD,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC;YACpC,CAAC,CAAC,EAAE,CAAC;QACP,SAAS,CAAC,WAAW,GAAG,IAAI,GAAG,CAC7B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAC3E,CAAC;QACF,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/C,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC;QAEtB,OAAO,CAAC,GAAG,CAAC,SAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,QAAkB,CAAC,CAAC;QAC1C,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,QAAkB,CAAC,CAAC;QAE5E,IAAI,SAAS,KAAK,WAAW;YAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,SAAoB;IACxE,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;AACpF,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { AnyConfigNode } from "../store/types";
2
+ import type { FlowError } from "./defineFlow";
3
+ /**
4
+ * Navigation state of a single flow — the SINGLE "flow" building block.
5
+ *
6
+ * Node identity for tracking is the `FlowState` object itself (hub key, like
7
+ * `ListState` for lists): navigation bumps its version via notifyChanged.
8
+ * Step statuses are NOT stored — derived from (currentIndex + visitedKeys).
9
+ */
10
+ export interface FlowState {
11
+ /** The flow's config node — key in flowStates. */
12
+ flowNode: AnyConfigNode;
13
+ /** Absolute dot-path of the flow node (for the persist snapshot and reset scope). */
14
+ path: string;
15
+ /** Ordered step keys (copy of FLOW_STEPS_PROP). */
16
+ stepKeys: string[];
17
+ /** Step config nodes in the same order. */
18
+ stepNodes: AnyConfigNode[];
19
+ /** Index of the active step. */
20
+ currentIndex: number;
21
+ /** Visit stack — popped by back(). */
22
+ visitStack: string[];
23
+ /** All steps ever visited (the stack is lossy — back() removes entries). */
24
+ visitedKeys: Set<string>;
25
+ /** Errors of the last validate()/finalize — reactive (flow.errors). */
26
+ errors: FlowError[];
27
+ }
28
+ /** Minimal registry interface for flow registration (NodeRegistry). */
29
+ export interface FlowRegistrySlice {
30
+ readonly flowStates: WeakMap<object, FlowState>;
31
+ readonly allFlowStates: FlowState[];
32
+ readonly stepToFlow: WeakMap<object, FlowState>;
33
+ readonly nodePaths: WeakMap<object, string>;
34
+ }
35
+ /**
36
+ * Walk the config tree and create a FlowState for every node carrying the
37
+ * {@link FLOW_STEPS_PROP} marker (stamped by defineFlow). Called from the
38
+ * NodeRegistry constructor AFTER buildNodeMaps — paths are already known.
39
+ */
40
+ export declare function collectFlowStates(root: AnyConfigNode, registry: FlowRegistrySlice): void;
41
+ //# sourceMappingURL=flowState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flowState.d.ts","sourceRoot":"","sources":["../../../store/flow/flowState.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,kDAAkD;IAClD,QAAQ,EAAE,aAAa,CAAC;IACxB,qFAAqF;IACrF,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,2CAA2C;IAC3C,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,4EAA4E;IAC5E,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,uEAAuE;IACvE,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,uEAAuE;AACvE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChD,QAAQ,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAwCxF"}
@@ -0,0 +1,51 @@
1
+ import { CONFIG_PROPS, FLOW_STEPS_PROP } from "../constants";
2
+ import { isGroupNode } from "../traversal";
3
+ /**
4
+ * Walk the config tree and create a FlowState for every node carrying the
5
+ * {@link FLOW_STEPS_PROP} marker (stamped by defineFlow). Called from the
6
+ * NodeRegistry constructor AFTER buildNodeMaps — paths are already known.
7
+ */
8
+ export function collectFlowStates(root, registry) {
9
+ walk(root);
10
+ function walk(node) {
11
+ const marker = node[FLOW_STEPS_PROP];
12
+ if (Array.isArray(marker)) {
13
+ const stepKeys = marker;
14
+ const stepNodes = [];
15
+ for (const key of stepKeys) {
16
+ const child = node[key];
17
+ if (!child || typeof child !== "object" || Array.isArray(child) || "value" in child) {
18
+ throw new Error(`[palistor] defineFlow: step "${key}" is not a group node in the flow config.`);
19
+ }
20
+ // An empty step ({} — read-only summary) would be marked "leaf" by the
21
+ // hasChildren heuristic in registerNodes; a step is by definition a group.
22
+ child.__kind = "group";
23
+ stepNodes.push(child);
24
+ }
25
+ const flowState = {
26
+ flowNode: node,
27
+ path: registry.nodePaths.get(node) ?? "",
28
+ stepKeys: [...stepKeys],
29
+ stepNodes,
30
+ currentIndex: 0,
31
+ visitStack: [],
32
+ visitedKeys: new Set([stepKeys[0]]),
33
+ errors: [],
34
+ };
35
+ registry.flowStates.set(node, flowState);
36
+ registry.allFlowStates.push(flowState);
37
+ for (const stepNode of stepNodes)
38
+ registry.stepToFlow.set(stepNode, flowState);
39
+ }
40
+ for (const key of Object.keys(node)) {
41
+ if (CONFIG_PROPS.has(key))
42
+ continue;
43
+ const child = node[key];
44
+ if (!child || typeof child !== "object" || Array.isArray(child))
45
+ continue;
46
+ if (isGroupNode(child))
47
+ walk(child);
48
+ }
49
+ }
50
+ }
51
+ //# sourceMappingURL=flowState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flowState.js","sourceRoot":"","sources":["../../../store/flow/flowState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAsC3C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAmB,EAAE,QAA2B;IAChF,IAAI,CAAC,IAAI,CAAC,CAAC;IAEX,SAAS,IAAI,CAAC,IAAmB;QAC/B,MAAM,MAAM,GAAI,IAAgC,CAAC,eAAe,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,MAAkB,CAAC;YACpC,MAAM,SAAS,GAAoB,EAAE,CAAC;YACtC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAI,IAAgC,CAAC,GAAG,CAAC,CAAC;gBACrD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;oBACpF,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,2CAA2C,CAAC,CAAC;gBAClG,CAAC;gBACD,uEAAuE;gBACvE,2EAA2E;gBAC1E,KAAiC,CAAC,MAAM,GAAG,OAAO,CAAC;gBACpD,SAAS,CAAC,IAAI,CAAC,KAAsB,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,SAAS,GAAc;gBAC3B,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,IAAc,CAAC,IAAI,EAAE;gBAClD,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC;gBACvB,SAAS;gBACT,YAAY,EAAE,CAAC;gBACf,UAAU,EAAE,EAAE;gBACd,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnC,MAAM,EAAE,EAAE;aACX,CAAC;YACF,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAc,EAAE,SAAS,CAAC,CAAC;YACnD,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvC,KAAK,MAAM,QAAQ,IAAI,SAAS;gBAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,QAAkB,EAAE,SAAS,CAAC,CAAC;QAC3F,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YACpC,MAAM,KAAK,GAAI,IAAgC,CAAC,GAAG,CAAC,CAAC;YACrD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC1E,IAAI,WAAW,CAAC,KAAe,CAAC;gBAAE,IAAI,CAAC,KAAsB,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { defineFlow, defineStep } from "./defineFlow";
2
+ export type { AnyFlowStep, DefineFlowOptions, FlowError, FlowNode, FlowStep, FlowValues, InferFlowSteps, StepStatus, } from "./defineFlow";
3
+ export type { FlowState } from "./flowState";
4
+ export { collectFlowStates } from "./flowState";
5
+ export { collectFlowErrors, collectStepErrors, filterHiddenFlowStepErrors, flowBack, flowGoTo, flowIsInvalid, flowLoading, flowNextStep, flowSubmit, flowValidate, getStepStatus, initFlows, isStepVisible, resetFlowNav, resetFlowNavForSubtree, restoreFlowNav, runFlowEntryLifecycle, serializeFlowNav, stepIsInvalid, } from "./flowNavigation";
6
+ export type { FlowNavSnapshot } from "./flowNavigation";
7
+ export { buildFlowStepsProxy } from "./buildFlowStepsProxy";
8
+ export { getFlowApi } from "./flowApi";
9
+ export type { FlowApi } from "./flowApi";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../store/flow/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,cAAc,EACd,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,0BAA0B,EAC1B,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EACT,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { defineFlow, defineStep } from "./defineFlow";
2
+ export { collectFlowStates } from "./flowState";
3
+ export { collectFlowErrors, collectStepErrors, filterHiddenFlowStepErrors, flowBack, flowGoTo, flowIsInvalid, flowLoading, flowNextStep, flowSubmit, flowValidate, getStepStatus, initFlows, isStepVisible, resetFlowNav, resetFlowNavForSubtree, restoreFlowNav, runFlowEntryLifecycle, serializeFlowNav, stepIsInvalid, } from "./flowNavigation";
4
+ export { buildFlowStepsProxy } from "./buildFlowStepsProxy";
5
+ export { getFlowApi } from "./flowApi";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../store/flow/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAatD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,0BAA0B,EAC1B,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EACT,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
@@ -1,9 +1,9 @@
1
1
  import { type AnyConfigNode } from "../store/types";
2
2
  /**
3
- * Создать карту зависимостей с self-зависимостью для каждой группы.
3
+ * Create the dependency map with a self-dependency for every group.
4
4
  *
5
- * Группа любой узел конфига без "value".
6
- * Root-группа обозначается пустой строкой "".
5
+ * A group is any config node without "value".
6
+ * The root group is denoted by the empty string "".
7
7
  */
8
8
  export declare function createGroupDeps(rootConfig: AnyConfigNode, nodePaths: WeakMap<object, string>): Set<string>;
9
9
  //# sourceMappingURL=createGroupDeps.d.ts.map
@@ -1,23 +1,23 @@
1
1
  import { configKeys, isLeafNode } from "../traversal";
2
2
  import { pairKey } from "./pairKey";
3
3
  /**
4
- * Создать карту зависимостей с self-зависимостью для каждой группы.
4
+ * Create the dependency map with a self-dependency for every group.
5
5
  *
6
- * Группа любой узел конфига без "value".
7
- * Root-группа обозначается пустой строкой "".
6
+ * A group is any config node without "value".
7
+ * The root group is denoted by the empty string "".
8
8
  */
9
9
  export function createGroupDeps(rootConfig, nodePaths) {
10
10
  const deps = new Set();
11
- // Self-зависимость корня
11
+ // Root self-dependency
12
12
  deps.add(pairKey("", ""));
13
- // Self-зависимости вложенных групп
13
+ // Self-dependencies of nested groups
14
14
  function walk(node) {
15
15
  for (const key of configKeys(node)) {
16
16
  const child = node[key];
17
17
  if (!child || typeof child !== "object")
18
18
  continue;
19
19
  if (isLeafNode(child))
20
- continue; // лист не группа
20
+ continue; // a leaf is not a group
21
21
  const path = nodePaths.get(child) ?? "";
22
22
  deps.add(pairKey(path, path));
23
23
  walk(child);
@@ -1 +1 @@
1
- {"version":3,"file":"createGroupDeps.js","sourceRoot":"","sources":["../../../store/groupDeps/createGroupDeps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,UAAyB,EACzB,SAAkC;IAElC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,yBAAyB;IACzB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAE1B,mCAAmC;IACnC,SAAS,IAAI,CAAC,IAAmB;QAC/B,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,IAA+B,CAAC,EAAE,CAAC;YAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAkB,CAAC;YACzC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,SAAS;YAClD,IAAI,UAAU,CAAC,KAAK,CAAC;gBAAE,SAAS,CAAC,mBAAmB;YACpD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,CAAC;IACjB,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"createGroupDeps.js","sourceRoot":"","sources":["../../../store/groupDeps/createGroupDeps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,UAAyB,EACzB,SAAkC;IAElC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,uBAAuB;IACvB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAE1B,qCAAqC;IACrC,SAAS,IAAI,CAAC,IAAmB;QAC/B,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,IAA+B,CAAC,EAAE,CAAC;YAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAkB,CAAC;YACzC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,SAAS;YAClD,IAAI,UAAU,CAAC,KAAK,CAAC;gBAAE,SAAS,CAAC,wBAAwB;YACzD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,CAAC;IACjB,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,15 +1,15 @@
1
1
  /**
2
- * Обёртка для valuesCache.values, которая перехватывает READ-доступы
3
- * и записывает кросс-групповые зависимости в Set.
2
+ * Wrapper for valuesCache.values that intercepts READ accesses
3
+ * and records cross-group dependencies into a Set.
4
4
  *
5
- * При чтении leaf-значения определяется группа-донор (по текущему уровню вложенности).
6
- * Если донорреципиентзаписываем пару donor→recipient.
5
+ * When a leaf value is read, the donor group is determined by the current
6
+ * nesting level. If donor recipientthe donor→recipient pair is recorded.
7
7
  *
8
- * @param values — плоский объект значений из valuesCache.values
9
- * @param recipientGroupPath — путь группы, для которой сейчас идёт вычисление
10
- * @param deps — Set для записи обнаруженных зависимостей
11
- * @param currentGroupPath — текущий уровень вложенности в дереве значений (начинается с "")
12
- * @param subProxyCache — WeakMap для мемоизации суб-прокси в рамках одного вызова
8
+ * @param values — flat values object from valuesCache.values
9
+ * @param recipientGroupPath — path of the group currently being computed
10
+ * @param deps — Set that collects discovered dependencies
11
+ * @param currentGroupPath — current nesting level in the values tree (starts as "")
12
+ * @param subProxyCache — WeakMap memoizing sub-proxies within one call
13
13
  */
14
14
  export declare function createTrackingValues(values: Record<string, unknown>, recipientGroupPath: string, deps: Set<string>, currentGroupPath?: string, subProxyCache?: WeakMap<object, Record<string, unknown>>): Record<string, unknown>;
15
15
  //# sourceMappingURL=createTrackingValues.d.ts.map