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.
- package/README.md +574 -542
- package/README.ru.md +979 -0
- package/dist/index.d.ts +19 -28
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -28
- package/dist/index.js.map +1 -1
- package/dist/react/createTrackingProxy.d.ts +27 -27
- package/dist/react/createTrackingProxy.d.ts.map +1 -1
- package/dist/react/createTrackingProxy.js +92 -42
- package/dist/react/createTrackingProxy.js.map +1 -1
- package/dist/react/useForm.d.ts +42 -43
- package/dist/react/useForm.d.ts.map +1 -1
- package/dist/react/useForm.js +38 -38
- package/dist/react/useForm.js.map +1 -1
- package/dist/react/usePersist.d.ts +14 -14
- package/dist/react/usePersist.js +18 -18
- package/dist/react/usePersist.js.map +1 -1
- package/dist/react/useStoreContext.d.ts +11 -11
- package/dist/react/useStoreContext.js +11 -11
- package/dist/react/useTranslator.d.ts +12 -12
- package/dist/react/useTranslator.js +12 -12
- package/dist/store/applyPatch/applyPatch.d.ts +8 -8
- package/dist/store/applyPatch/applyPatch.js +12 -12
- package/dist/store/applyPatch/applyPatch.js.map +1 -1
- package/dist/store/buildProxy/buildEntityProjectionProxy.js +6 -6
- package/dist/store/buildProxy/buildEntityProjectionProxy.js.map +1 -1
- package/dist/store/buildProxy/buildListProxy.d.ts +8 -8
- package/dist/store/buildProxy/buildListProxy.js +30 -30
- package/dist/store/buildProxy/buildListProxy.js.map +1 -1
- package/dist/store/buildProxy/buildProxy.d.ts +8 -8
- package/dist/store/buildProxy/buildProxy.d.ts.map +1 -1
- package/dist/store/buildProxy/buildProxy.js +84 -33
- package/dist/store/buildProxy/buildProxy.js.map +1 -1
- package/dist/store/buildProxy/computeProxyKeys.d.ts +8 -8
- package/dist/store/buildProxy/computeProxyKeys.d.ts.map +1 -1
- package/dist/store/buildProxy/computeProxyKeys.js +18 -13
- package/dist/store/buildProxy/computeProxyKeys.js.map +1 -1
- package/dist/store/buildProxy/handleLazyResolve.d.ts +3 -3
- package/dist/store/buildProxy/handleLazyResolve.js +3 -3
- package/dist/store/buildProxy/initProxyCaches.d.ts +5 -5
- package/dist/store/buildProxy/initProxyCaches.js +5 -5
- package/dist/store/compute/computeFieldState.d.ts +3 -3
- package/dist/store/compute/computeFieldState.js +8 -8
- package/dist/store/compute/computeFieldState.js.map +1 -1
- package/dist/store/compute/fieldStateChanged.d.ts +1 -1
- package/dist/store/compute/fieldStateChanged.js +1 -1
- package/dist/store/compute/recompute/collectGroupComputeNodes.d.ts +4 -4
- package/dist/store/compute/recompute/collectGroupComputeNodes.js +7 -7
- package/dist/store/compute/recompute/collectGroupComputeNodes.js.map +1 -1
- package/dist/store/compute/recompute/recomputeAndNotify.d.ts +3 -3
- package/dist/store/compute/recompute/recomputeAndNotify.js +3 -3
- package/dist/store/compute/recompute/recomputeLeaves.d.ts +11 -10
- package/dist/store/compute/recompute/recomputeLeaves.d.ts.map +1 -1
- package/dist/store/compute/recompute/recomputeLeaves.js +26 -27
- package/dist/store/compute/recompute/recomputeLeaves.js.map +1 -1
- package/dist/store/compute/recompute/recomputeTargeted.d.ts +7 -7
- package/dist/store/compute/recompute/recomputeTargeted.js +12 -12
- package/dist/store/compute/recompute/recomputeTargeted.js.map +1 -1
- package/dist/store/compute/recompute/topologicalSortComputed.d.ts +4 -4
- package/dist/store/compute/recompute/topologicalSortComputed.d.ts.map +1 -1
- package/dist/store/compute/recompute/topologicalSortComputed.js +11 -13
- package/dist/store/compute/recompute/topologicalSortComputed.js.map +1 -1
- package/dist/store/compute/recompute/types.d.ts +4 -4
- package/dist/store/compute/resolveFlag.d.ts +2 -2
- package/dist/store/compute/resolveFlag.js +2 -2
- package/dist/store/compute/resolveString.d.ts +5 -5
- package/dist/store/compute/resolveString.js +6 -6
- package/dist/store/compute/resolveString.js.map +1 -1
- package/dist/store/compute/types.d.ts +3 -3
- package/dist/store/constants.d.ts +57 -38
- package/dist/store/constants.d.ts.map +1 -1
- package/dist/store/constants.js +70 -35
- package/dist/store/constants.js.map +1 -1
- package/dist/store/defineFieldMapping.d.ts +21 -19
- package/dist/store/defineFieldMapping.d.ts.map +1 -1
- package/dist/store/defineFieldMapping.js +21 -19
- package/dist/store/defineFieldMapping.js.map +1 -1
- package/dist/store/dirtyTracking/collectInitialSnapshot.js +1 -1
- package/dist/store/dirtyTracking/collectInitialSnapshot.js.map +1 -1
- package/dist/store/dirtyTracking/recomputeDirtyTargeted.d.ts +3 -3
- package/dist/store/dirtyTracking/recomputeDirtyTargeted.js +11 -11
- package/dist/store/dirtyTracking/recomputeDirtyTargeted.js.map +1 -1
- package/dist/store/dirtyTracking/setGroupRevalidate.d.ts +6 -6
- package/dist/store/dirtyTracking/setGroupRevalidate.js +7 -7
- package/dist/store/dirtyTracking/setGroupRevalidate.js.map +1 -1
- package/dist/store/entityRegistry/entityRegistry.d.ts +72 -72
- package/dist/store/entityRegistry/entityRegistry.d.ts.map +1 -1
- package/dist/store/entityRegistry/entityRegistry.js +91 -91
- package/dist/store/entityRegistry/entityRegistry.js.map +1 -1
- package/dist/store/entityRegistry/generateId.d.ts +3 -3
- package/dist/store/entityRegistry/generateId.js +3 -3
- package/dist/store/entityRegistry/types.d.ts +17 -17
- package/dist/store/entityRegistry/types.d.ts.map +1 -1
- package/dist/store/flow/buildFlowStepsProxy.d.ts +17 -0
- package/dist/store/flow/buildFlowStepsProxy.d.ts.map +1 -0
- package/dist/store/flow/buildFlowStepsProxy.js +72 -0
- package/dist/store/flow/buildFlowStepsProxy.js.map +1 -0
- package/dist/store/flow/defineFlow.d.ts +92 -0
- package/dist/store/flow/defineFlow.d.ts.map +1 -0
- package/dist/store/flow/defineFlow.js +99 -0
- package/dist/store/flow/defineFlow.js.map +1 -0
- package/dist/store/flow/flowApi.d.ts +18 -0
- package/dist/store/flow/flowApi.d.ts.map +1 -0
- package/dist/store/flow/flowApi.js +18 -0
- package/dist/store/flow/flowApi.js.map +1 -0
- package/dist/store/flow/flowNavigation.d.ts +137 -0
- package/dist/store/flow/flowNavigation.d.ts.map +1 -0
- package/dist/store/flow/flowNavigation.js +384 -0
- package/dist/store/flow/flowNavigation.js.map +1 -0
- package/dist/store/flow/flowState.d.ts +41 -0
- package/dist/store/flow/flowState.d.ts.map +1 -0
- package/dist/store/flow/flowState.js +51 -0
- package/dist/store/flow/flowState.js.map +1 -0
- package/dist/store/flow/index.d.ts +10 -0
- package/dist/store/flow/index.d.ts.map +1 -0
- package/dist/store/flow/index.js +6 -0
- package/dist/store/flow/index.js.map +1 -0
- package/dist/store/groupDeps/createGroupDeps.d.ts +3 -3
- package/dist/store/groupDeps/createGroupDeps.js +6 -6
- package/dist/store/groupDeps/createGroupDeps.js.map +1 -1
- package/dist/store/groupDeps/createTrackingValues.d.ts +9 -9
- package/dist/store/groupDeps/createTrackingValues.js +11 -11
- package/dist/store/groupDeps/createTrackingValues.js.map +1 -1
- package/dist/store/groupDeps/getNodeGroupPath.d.ts +3 -3
- package/dist/store/groupDeps/getNodeGroupPath.js +5 -5
- package/dist/store/groupDeps/getNodeGroupPath.js.map +1 -1
- package/dist/store/groupDeps/getRecipientGroups.d.ts +1 -1
- package/dist/store/groupDeps/getRecipientGroups.js +1 -1
- package/dist/store/groupDeps/groupDeps.d.ts +7 -7
- package/dist/store/groupDeps/groupDeps.js +7 -7
- package/dist/store/groupDeps/pairKey.d.ts +3 -3
- package/dist/store/groupDeps/pairKey.d.ts.map +1 -1
- package/dist/store/groupDeps/pairKey.js +4 -4
- package/dist/store/groupDeps/pairKey.js.map +1 -1
- package/dist/store/groupDeps/resolveGroupByPath.d.ts +3 -3
- package/dist/store/groupDeps/resolveGroupByPath.js +3 -3
- package/dist/store/init/createNotificationHub.d.ts +31 -31
- package/dist/store/init/createNotificationHub.d.ts.map +1 -1
- package/dist/store/init/createNotificationHub.js +36 -37
- package/dist/store/init/createNotificationHub.js.map +1 -1
- package/dist/store/init/createResolveManager.d.ts +72 -69
- package/dist/store/init/createResolveManager.d.ts.map +1 -1
- package/dist/store/init/createResolveManager.js +101 -98
- package/dist/store/init/createResolveManager.js.map +1 -1
- package/dist/store/init/initGroupSubmitting.d.ts +2 -2
- package/dist/store/init/initGroupSubmitting.js +4 -4
- package/dist/store/init/initGroupSubmitting.js.map +1 -1
- package/dist/store/normalizeConfig.d.ts +20 -18
- package/dist/store/normalizeConfig.d.ts.map +1 -1
- package/dist/store/normalizeConfig.js +31 -29
- package/dist/store/normalizeConfig.js.map +1 -1
- package/dist/store/onChangePipeline/computeFieldKey.d.ts +2 -2
- package/dist/store/onChangePipeline/computeFieldKey.js +2 -2
- package/dist/store/onChangePipeline/findOnChangeAncestors.d.ts +2 -2
- package/dist/store/onChangePipeline/findOnChangeAncestors.js +4 -4
- package/dist/store/onChangePipeline/findOnChangeAncestors.js.map +1 -1
- package/dist/store/onChangePipeline/onChangePipeline.d.ts +13 -12
- package/dist/store/onChangePipeline/onChangePipeline.d.ts.map +1 -1
- package/dist/store/onChangePipeline/onChangePipeline.js +14 -13
- package/dist/store/onChangePipeline/onChangePipeline.js.map +1 -1
- package/dist/store/persist/drivers.d.ts +7 -7
- package/dist/store/persist/drivers.js +8 -8
- package/dist/store/persist/drivers.js.map +1 -1
- package/dist/store/persist/index.d.ts +1 -1
- package/dist/store/persist/persistManager.d.ts +23 -23
- package/dist/store/persist/persistManager.d.ts.map +1 -1
- package/dist/store/persist/persistManager.js +73 -42
- package/dist/store/persist/persistManager.js.map +1 -1
- package/dist/store/persist/types.d.ts +23 -23
- package/dist/store/persist/types.d.ts.map +1 -1
- package/dist/store/persist/types.js +4 -4
- package/dist/store/resetPipeline/buildResetPatch.d.ts +5 -5
- package/dist/store/resetPipeline/buildResetPatch.js +5 -5
- package/dist/store/resetPipeline/collectDefaults.d.ts +5 -5
- package/dist/store/resetPipeline/collectDefaults.js +6 -6
- package/dist/store/resetPipeline/collectDefaults.js.map +1 -1
- package/dist/store/resetPipeline/resetPipeline.d.ts +7 -7
- package/dist/store/resetPipeline/resetPipeline.d.ts.map +1 -1
- package/dist/store/resetPipeline/resetPipeline.js +17 -12
- package/dist/store/resetPipeline/resetPipeline.js.map +1 -1
- package/dist/store/resolvePipeline/applyPendingWrites.d.ts +10 -10
- package/dist/store/resolvePipeline/applyPendingWrites.d.ts.map +1 -1
- package/dist/store/resolvePipeline/applyPendingWrites.js +35 -38
- package/dist/store/resolvePipeline/applyPendingWrites.js.map +1 -1
- package/dist/store/resolvePipeline/createContextTrackingProxy.d.ts +8 -7
- package/dist/store/resolvePipeline/createContextTrackingProxy.d.ts.map +1 -1
- package/dist/store/resolvePipeline/createContextTrackingProxy.js +6 -5
- package/dist/store/resolvePipeline/createContextTrackingProxy.js.map +1 -1
- package/dist/store/resolvePipeline/createValuesTrackingProxy.d.ts +43 -43
- package/dist/store/resolvePipeline/createValuesTrackingProxy.d.ts.map +1 -1
- package/dist/store/resolvePipeline/createValuesTrackingProxy.js +70 -70
- package/dist/store/resolvePipeline/createValuesTrackingProxy.js.map +1 -1
- package/dist/store/resolvePipeline/executeListResolve.d.ts +14 -14
- package/dist/store/resolvePipeline/executeListResolve.js +27 -27
- package/dist/store/resolvePipeline/executeListResolve.js.map +1 -1
- package/dist/store/resolvePipeline/executeResolve.d.ts +15 -15
- package/dist/store/resolvePipeline/executeResolve.js +46 -46
- package/dist/store/resolvePipeline/executeResolve.js.map +1 -1
- package/dist/store/store/NodeRegistry/nodeRegistry.d.ts +69 -56
- package/dist/store/store/NodeRegistry/nodeRegistry.d.ts.map +1 -1
- package/dist/store/store/NodeRegistry/nodeRegistry.js +94 -78
- package/dist/store/store/NodeRegistry/nodeRegistry.js.map +1 -1
- package/dist/store/store/NodeRegistry/nodeUtils.d.ts +5 -5
- package/dist/store/store/NodeRegistry/nodeUtils.d.ts.map +1 -1
- package/dist/store/store/NodeRegistry/nodeUtils.js +5 -5
- package/dist/store/store/NodeRegistry/nodeUtils.js.map +1 -1
- package/dist/store/store/groupDepsMap.d.ts +23 -23
- package/dist/store/store/groupDepsMap.d.ts.map +1 -1
- package/dist/store/store/groupDepsMap.js +40 -34
- package/dist/store/store/groupDepsMap.js.map +1 -1
- package/dist/store/store/hasComputedProps.d.ts +2 -2
- package/dist/store/store/hasComputedProps.js +2 -2
- package/dist/store/store/nodeMap.d.ts +5 -5
- package/dist/store/store/nodeMap.js +7 -7
- package/dist/store/store/nodeMap.js.map +1 -1
- package/dist/store/store/palistor.d.ts +80 -80
- package/dist/store/store/palistor.d.ts.map +1 -1
- package/dist/store/store/palistor.js +151 -165
- package/dist/store/store/palistor.js.map +1 -1
- package/dist/store/store/registerNodes.d.ts +10 -10
- package/dist/store/store/registerNodes.d.ts.map +1 -1
- package/dist/store/store/registerNodes.js +33 -18
- package/dist/store/store/registerNodes.js.map +1 -1
- package/dist/store/store/serviceRegistry.d.ts +8 -8
- package/dist/store/store/serviceRegistry.d.ts.map +1 -1
- package/dist/store/store/serviceRegistry.js +8 -8
- package/dist/store/store/serviceRegistry.js.map +1 -1
- package/dist/store/store/types.d.ts +277 -223
- package/dist/store/store/types.d.ts.map +1 -1
- package/dist/store/submitPipeline/applyLeafBeforeSubmit.d.ts +2 -2
- package/dist/store/submitPipeline/applyLeafBeforeSubmit.js +2 -2
- package/dist/store/submitPipeline/collectLeafStates.d.ts +2 -2
- package/dist/store/submitPipeline/collectLeafStates.js +2 -2
- package/dist/store/submitPipeline/submitPipeline.d.ts +8 -8
- package/dist/store/submitPipeline/submitPipeline.d.ts.map +1 -1
- package/dist/store/submitPipeline/submitPipeline.js +15 -11
- package/dist/store/submitPipeline/submitPipeline.js.map +1 -1
- package/dist/store/submitPipeline/types.d.ts +1 -1
- package/dist/store/submitPipeline/types.d.ts.map +1 -1
- package/dist/store/traversal/nodeClassifier.d.ts +9 -9
- package/dist/store/traversal/nodeClassifier.d.ts.map +1 -1
- package/dist/store/traversal/nodeClassifier.js +11 -11
- package/dist/store/traversal/nodeClassifier.js.map +1 -1
- package/dist/store/traversal/walkFull.d.ts +14 -14
- package/dist/store/traversal/walkFull.js +2 -2
- package/dist/store/valuesCache/valuesCache.d.ts +9 -9
- package/dist/store/valuesCache/valuesCache.d.ts.map +1 -1
- package/dist/store/valuesCache/valuesCache.js +6 -6
- package/dist/store/writePipeline/formatPatch.d.ts +5 -5
- package/dist/store/writePipeline/formatPatch.js +7 -7
- package/dist/store/writePipeline/formatPatch.js.map +1 -1
- package/dist/store/writePipeline/formatValue.d.ts +5 -5
- package/dist/store/writePipeline/formatValue.js +5 -5
- package/dist/store/writePipeline/mergeChanged.d.ts +4 -4
- package/dist/store/writePipeline/mergeChanged.js +4 -4
- package/dist/store/writePipeline/runSetter.d.ts +6 -6
- package/dist/store/writePipeline/runSetter.js +8 -8
- package/dist/store/writePipeline/storeValue.d.ts +3 -3
- package/dist/store/writePipeline/storeValue.js +3 -3
- package/dist/store/writePipeline/types.d.ts +4 -4
- package/dist/store/writePipeline/types.d.ts.map +1 -1
- package/dist/store/writePipeline/writePipeline.d.ts +7 -7
- package/dist/store/writePipeline/writePipeline.d.ts.map +1 -1
- package/dist/store/writePipeline/writePipeline.js +15 -15
- package/dist/store/writePipeline/writePipeline.js.map +1 -1
- package/package.json +11 -4
- package/dist/store/compute/recompute/collectGroupLeafNodes.d.ts +0 -11
- package/dist/store/compute/recompute/collectGroupLeafNodes.d.ts.map +0 -1
- package/dist/store/compute/recompute/collectGroupLeafNodes.js +0 -26
- package/dist/store/compute/recompute/collectGroupLeafNodes.js.map +0 -1
- package/dist/store/fieldMapping.typecheck.d.ts +0 -2
- package/dist/store/fieldMapping.typecheck.d.ts.map +0 -1
- package/dist/store/fieldMapping.typecheck.js +0 -71
- package/dist/store/fieldMapping.typecheck.js.map +0 -1
- package/dist/store/submitPipeline/getSubValues.d.ts +0 -9
- package/dist/store/submitPipeline/getSubValues.d.ts.map +0 -1
- package/dist/store/submitPipeline/getSubValues.js +0 -26
- 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
|
-
*
|
|
3
|
+
* Create the dependency map with a self-dependency for every group.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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
|
-
*
|
|
4
|
+
* Create the dependency map with a self-dependency for every group.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
-
//
|
|
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,
|
|
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
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Wrapper for valuesCache.values that intercepts READ accesses
|
|
3
|
+
* and records cross-group dependencies into a Set.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* When a leaf value is read, the donor group is determined by the current
|
|
6
|
+
* nesting level. If donor ≠ recipient → the donor→recipient pair is recorded.
|
|
7
7
|
*
|
|
8
|
-
* @param 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
|