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
|
@@ -2,31 +2,31 @@ import type { EntityData } from "../entityRegistry";
|
|
|
2
2
|
import type { ListResolveConfig, ListState } from "../store/types";
|
|
3
3
|
import type { ResolveDeps } from "./types";
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Extra dependencies for executeListResolve.
|
|
6
|
+
* Extends ResolveDeps with list-specific callbacks.
|
|
7
7
|
*/
|
|
8
8
|
export interface ListResolveDeps extends ResolveDeps {
|
|
9
9
|
/**
|
|
10
|
-
* Upsert entities
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
10
|
+
* Upsert entities into EntityRegistry + register leaf nodes.
|
|
11
|
+
* Does not call recompute/notifyChanged — those run afterwards.
|
|
12
|
+
* Returns the Set of changed leaf nodes.
|
|
13
|
+
* listNode is passed to trigger entity field resolves automatically.
|
|
14
14
|
*/
|
|
15
15
|
setEntitiesRaw: (items: EntityData[], listNode?: object) => Set<object>;
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
17
|
+
* Sync valuesCache with the list membership (single method, root + entity).
|
|
18
|
+
* Called after listState.itemIds is updated.
|
|
19
19
|
*/
|
|
20
20
|
syncListValuesCache: (listState: ListState) => void;
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
23
|
+
* Run resolve for a ListNode.
|
|
24
24
|
*
|
|
25
|
-
*
|
|
26
|
-
* - resolver
|
|
27
|
-
* -
|
|
28
|
-
* - initialItemIds
|
|
29
|
-
* - loading state
|
|
25
|
+
* Differs from executeResolve (for groups):
|
|
26
|
+
* - the resolver returns Array<EntityData> instead of Record<string, unknown>
|
|
27
|
+
* - the result → entity upserts + listState.itemIds update
|
|
28
|
+
* - initialItemIds is updated on success → dirty = false after resolve
|
|
29
|
+
* - loading state is kept in nodeState for the listNode (created on the fly)
|
|
30
30
|
*/
|
|
31
31
|
export declare function executeListResolve(listNode: object, resolve: ListResolveConfig, listState: ListState, deps: ListResolveDeps): Promise<unknown>;
|
|
32
32
|
//# sourceMappingURL=executeListResolve.d.ts.map
|
|
@@ -14,43 +14,43 @@ const DEFAULT_LIST_STATE = {
|
|
|
14
14
|
};
|
|
15
15
|
// ─── executeListResolve ──────────────────────────────────────────────────────
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
17
|
+
* Run resolve for a ListNode.
|
|
18
18
|
*
|
|
19
|
-
*
|
|
20
|
-
* - resolver
|
|
21
|
-
* -
|
|
22
|
-
* - initialItemIds
|
|
23
|
-
* - loading state
|
|
19
|
+
* Differs from executeResolve (for groups):
|
|
20
|
+
* - the resolver returns Array<EntityData> instead of Record<string, unknown>
|
|
21
|
+
* - the result → entity upserts + listState.itemIds update
|
|
22
|
+
* - initialItemIds is updated on success → dirty = false after resolve
|
|
23
|
+
* - loading state is kept in nodeState for the listNode (created on the fly)
|
|
24
24
|
*/
|
|
25
25
|
export function executeListResolve(listNode, resolve, listState, deps) {
|
|
26
26
|
const { nodeState, resolveStates, recompute, notifyChanged, notify, setEntitiesRaw, syncListValuesCache, store, } = deps;
|
|
27
27
|
const state = resolveStates.get(listNode);
|
|
28
28
|
if (!state)
|
|
29
29
|
return Promise.resolve();
|
|
30
|
-
//
|
|
30
|
+
// Deduplication
|
|
31
31
|
if (state.status === "pending" && state.promise) {
|
|
32
32
|
return state.promise;
|
|
33
33
|
}
|
|
34
34
|
state.status = "pending";
|
|
35
35
|
state.attempt = 0;
|
|
36
36
|
state.error = null;
|
|
37
|
-
//
|
|
37
|
+
// Set loading = true in nodeState for the listNode
|
|
38
38
|
const nodeSt = nodeState.get(listNode);
|
|
39
39
|
nodeState.set(listNode, { ...(nodeSt ?? DEFAULT_LIST_STATE), loading: true });
|
|
40
|
-
//
|
|
41
|
-
//
|
|
40
|
+
// Notify about loading: true.
|
|
41
|
+
// Bump both the ListState (the tracking key) and the listNode (bridge for tests).
|
|
42
42
|
const loadingChanged = new Set([listNode, listState]);
|
|
43
43
|
recomputeAndNotify(loadingChanged, recompute, notifyChanged);
|
|
44
44
|
const promise = (async () => {
|
|
45
45
|
let contextTracking = null;
|
|
46
46
|
let valuesTracking = null;
|
|
47
47
|
try {
|
|
48
|
-
//
|
|
49
|
-
//
|
|
48
|
+
// Call the resolver with a snapshot of current values through a tracking
|
|
49
|
+
// proxy, so dependencies (deps) are registered automatically
|
|
50
50
|
const { getValues } = deps;
|
|
51
51
|
const freshValues = getValues();
|
|
52
52
|
valuesTracking = createValuesTrackingProxy(freshValues);
|
|
53
|
-
//
|
|
53
|
+
// Wrap store.context in a tracking proxy for automatic context dependencies
|
|
54
54
|
contextTracking = createContextTrackingProxy(store.context);
|
|
55
55
|
const storeProxy = new Proxy(store, {
|
|
56
56
|
get(target, key) {
|
|
@@ -60,34 +60,34 @@ export function executeListResolve(listNode, resolve, listState, deps) {
|
|
|
60
60
|
},
|
|
61
61
|
});
|
|
62
62
|
const result = await resolve.resolver(valuesTracking.proxy, storeProxy);
|
|
63
|
-
//
|
|
63
|
+
// Abort when the status changed while awaiting (e.g. a reset)
|
|
64
64
|
if (state.status !== "pending")
|
|
65
65
|
return result;
|
|
66
66
|
// ── Success path ────────────────────────────────────────────────────
|
|
67
|
-
//
|
|
67
|
+
// ListState is the tracking key; listNode is the backward-compat bridge.
|
|
68
68
|
const changed = new Set([listNode, listState]);
|
|
69
69
|
if (Array.isArray(result) && result.length > 0) {
|
|
70
|
-
// Upsert
|
|
71
|
-
// Pass listNode so that entity field resolves are triggered automatically
|
|
70
|
+
// Upsert all entities (registers leaves, returns changed nodes).
|
|
71
|
+
// Pass listNode so that entity field resolves are triggered automatically.
|
|
72
72
|
const entityChanged = setEntitiesRaw(result, listNode);
|
|
73
73
|
for (const n of entityChanged)
|
|
74
74
|
changed.add(n);
|
|
75
|
-
//
|
|
75
|
+
// Update itemIds from the resolver result
|
|
76
76
|
listState.itemIds = result
|
|
77
77
|
.map((item) => item.id)
|
|
78
78
|
.filter((id) => typeof id === "string" && id !== "");
|
|
79
|
-
//
|
|
79
|
+
// Store as the initial snapshot for dirty tracking
|
|
80
80
|
listState.initialItemIds = [...listState.itemIds];
|
|
81
|
-
//
|
|
81
|
+
// Sync valuesCache.values[listKey]
|
|
82
82
|
syncListValuesCache(listState);
|
|
83
83
|
}
|
|
84
84
|
else if (Array.isArray(result) && result.length === 0) {
|
|
85
|
-
//
|
|
85
|
+
// Empty result — clear the list
|
|
86
86
|
listState.itemIds = [];
|
|
87
87
|
listState.initialItemIds = [];
|
|
88
88
|
syncListValuesCache(listState);
|
|
89
89
|
}
|
|
90
|
-
//
|
|
90
|
+
// Auto-dependencies: explicit deps + values tracking + context dependencies
|
|
91
91
|
const mergedDeps = new Set(resolve.deps ?? []);
|
|
92
92
|
for (const p of valuesTracking.getAccessedPaths())
|
|
93
93
|
mergedDeps.add(p);
|
|
@@ -97,13 +97,13 @@ export function executeListResolve(listNode, resolve, listState, deps) {
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
state.dependencies = mergedDeps;
|
|
100
|
-
//
|
|
100
|
+
// Update loading = false, status = resolved
|
|
101
101
|
const updatedSt = nodeState.get(listNode);
|
|
102
102
|
nodeState.set(listNode, { ...(updatedSt ?? DEFAULT_LIST_STATE), loading: false });
|
|
103
103
|
state.status = "resolved";
|
|
104
104
|
state.error = null;
|
|
105
105
|
recomputeAndNotify(changed, recompute, notifyChanged);
|
|
106
|
-
//
|
|
106
|
+
// If a dependency changed while pending — re-run immediately
|
|
107
107
|
if (state.pendingRetrigger) {
|
|
108
108
|
state.pendingRetrigger = false;
|
|
109
109
|
state.status = "idle";
|
|
@@ -120,7 +120,7 @@ export function executeListResolve(listNode, resolve, listState, deps) {
|
|
|
120
120
|
nodeState.set(listNode, { ...(updatedSt ?? DEFAULT_LIST_STATE), loading: false });
|
|
121
121
|
state.status = "error";
|
|
122
122
|
state.error = err;
|
|
123
|
-
//
|
|
123
|
+
// Store context dependencies even on the error path
|
|
124
124
|
{
|
|
125
125
|
const mergedDeps = new Set(resolve.deps ?? []);
|
|
126
126
|
if (valuesTracking) {
|
|
@@ -138,10 +138,10 @@ export function executeListResolve(listNode, resolve, listState, deps) {
|
|
|
138
138
|
resolve.onError?.(err, { notify });
|
|
139
139
|
}
|
|
140
140
|
catch {
|
|
141
|
-
// onError
|
|
141
|
+
// onError should not throw
|
|
142
142
|
}
|
|
143
143
|
recomputeAndNotify(new Set([listNode, listState]), recompute, notifyChanged);
|
|
144
|
-
//
|
|
144
|
+
// If a dependency changed while pending — re-run immediately
|
|
145
145
|
if (state.pendingRetrigger) {
|
|
146
146
|
state.pendingRetrigger = false;
|
|
147
147
|
state.status = "idle";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeListResolve.js","sourceRoot":"","sources":["../../../store/resolvePipeline/executeListResolve.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAyBxE,+EAA+E;AAE/E,MAAM,kBAAkB,GAAG;IACzB,KAAK,EAAE,SAAS;IAChB,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,KAAK;IACjB,UAAU,EAAE,KAAK;IACjB,UAAU,EAAE,KAAK;IACjB,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,KAAK;IACZ,UAAU,EAAE,KAAK;CACT,CAAC;AAEX,gFAAgF;AAEhF;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAgB,EAChB,OAA0B,EAC1B,SAAoB,EACpB,IAAqB;IAErB,MAAM,EACJ,SAAS,EACT,aAAa,EACb,SAAS,EACT,aAAa,EACb,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,KAAK,GACN,GAAG,IAAI,CAAC;IAET,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAErC,
|
|
1
|
+
{"version":3,"file":"executeListResolve.js","sourceRoot":"","sources":["../../../store/resolvePipeline/executeListResolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
import { type AnyConfigNode } from "../store/types";
|
|
2
2
|
import type { Resolve, ResolveDeps } from "./types";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Run resolve for a given node.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* 1.
|
|
8
|
-
* 2.
|
|
9
|
-
* 3.
|
|
10
|
-
* 4.
|
|
11
|
-
* 5.
|
|
12
|
-
* 6.
|
|
13
|
-
* 7.
|
|
14
|
-
* - applyPatch(result)
|
|
15
|
-
* -
|
|
6
|
+
* Pipeline:
|
|
7
|
+
* 1. Check status → if pending, return the existing promise (deduplication)
|
|
8
|
+
* 2. Set status = pending, loading = true
|
|
9
|
+
* 3. If there's an optimisticResolver → run it, apply the patch (no notify, batched)
|
|
10
|
+
* 4. Wrap values in a tracking write-proxy
|
|
11
|
+
* 5. Call resolver(trackedValues)
|
|
12
|
+
* 6. Retry logic: on error retry up to retry.attempts times
|
|
13
|
+
* 7. On success:
|
|
14
|
+
* - applyPatch(result) to the node's subtree
|
|
15
|
+
* - flush buffered writes (side effects)
|
|
16
16
|
* - loading = false, status = resolved
|
|
17
|
-
* - recomputeAll (
|
|
18
|
-
* - notifyChanged (
|
|
19
|
-
* 8.
|
|
17
|
+
* - recomputeAll (once)
|
|
18
|
+
* - notifyChanged (once)
|
|
19
|
+
* 8. On error (after all retries):
|
|
20
20
|
* - onError(error, { notify })
|
|
21
21
|
* - loading = false, status = error
|
|
22
22
|
* - recomputeAll + notifyChanged
|
|
23
|
-
* 9.
|
|
23
|
+
* 9. Store accessedPaths for auto-dependencies
|
|
24
24
|
*/
|
|
25
25
|
export declare function executeResolve(node: AnyConfigNode, resolve: Resolve, deps: ResolveDeps): Promise<unknown>;
|
|
26
26
|
//# sourceMappingURL=executeResolve.d.ts.map
|
|
@@ -6,41 +6,41 @@ import { recomputeAndNotify } from "../compute/recompute";
|
|
|
6
6
|
import { applyPendingWrites } from "./applyPendingWrites";
|
|
7
7
|
// ─── Core execution ──────────────────────────────────────────────────────────
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* Run resolve for a given node.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
* 1.
|
|
13
|
-
* 2.
|
|
14
|
-
* 3.
|
|
15
|
-
* 4.
|
|
16
|
-
* 5.
|
|
17
|
-
* 6.
|
|
18
|
-
* 7.
|
|
19
|
-
* - applyPatch(result)
|
|
20
|
-
* -
|
|
11
|
+
* Pipeline:
|
|
12
|
+
* 1. Check status → if pending, return the existing promise (deduplication)
|
|
13
|
+
* 2. Set status = pending, loading = true
|
|
14
|
+
* 3. If there's an optimisticResolver → run it, apply the patch (no notify, batched)
|
|
15
|
+
* 4. Wrap values in a tracking write-proxy
|
|
16
|
+
* 5. Call resolver(trackedValues)
|
|
17
|
+
* 6. Retry logic: on error retry up to retry.attempts times
|
|
18
|
+
* 7. On success:
|
|
19
|
+
* - applyPatch(result) to the node's subtree
|
|
20
|
+
* - flush buffered writes (side effects)
|
|
21
21
|
* - loading = false, status = resolved
|
|
22
|
-
* - recomputeAll (
|
|
23
|
-
* - notifyChanged (
|
|
24
|
-
* 8.
|
|
22
|
+
* - recomputeAll (once)
|
|
23
|
+
* - notifyChanged (once)
|
|
24
|
+
* 8. On error (after all retries):
|
|
25
25
|
* - onError(error, { notify })
|
|
26
26
|
* - loading = false, status = error
|
|
27
27
|
* - recomputeAll + notifyChanged
|
|
28
|
-
* 9.
|
|
28
|
+
* 9. Store accessedPaths for auto-dependencies
|
|
29
29
|
*/
|
|
30
30
|
export function executeResolve(node, resolve, deps) {
|
|
31
31
|
const { rootConfig, nodeState, resolveStates, recompute, notifyChanged, notify, getValues, initialValueMap, valuesCache, store } = deps;
|
|
32
32
|
const state = resolveStates.get(node);
|
|
33
33
|
if (!state)
|
|
34
34
|
return Promise.resolve();
|
|
35
|
-
//
|
|
35
|
+
// Deduplication: if already pending, return the same promise
|
|
36
36
|
if (state.status === "pending" && state.promise) {
|
|
37
37
|
return state.promise;
|
|
38
38
|
}
|
|
39
|
-
// ──
|
|
39
|
+
// ── Set loading state ──────────────────────────────────────────────────────
|
|
40
40
|
state.status = "pending";
|
|
41
41
|
state.attempt = 0;
|
|
42
42
|
state.error = null;
|
|
43
|
-
//
|
|
43
|
+
// Update loading in FieldState
|
|
44
44
|
const nodeSt = nodeState.get(node);
|
|
45
45
|
if (nodeSt) {
|
|
46
46
|
nodeState.set(node, { ...nodeSt, loading: true });
|
|
@@ -55,9 +55,9 @@ export function executeResolve(node, resolve, deps) {
|
|
|
55
55
|
loading: true,
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
|
-
// ──
|
|
58
|
+
// ── Optimistic resolver (synchronous) ──────────────────────────────────────
|
|
59
59
|
const allChanged = new Set();
|
|
60
|
-
allChanged.add(node); //
|
|
60
|
+
allChanged.add(node); // the node itself changed (loading: true)
|
|
61
61
|
if (resolve.optimisticResolver) {
|
|
62
62
|
try {
|
|
63
63
|
const values = getValues();
|
|
@@ -67,13 +67,13 @@ export function executeResolve(node, resolve, deps) {
|
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
catch (error) {
|
|
70
|
-
//
|
|
70
|
+
// An optimistic resolver error is non-critical — continue with the async resolver
|
|
71
71
|
console.warn('Error in optimistic resolver:', error);
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
|
-
//
|
|
74
|
+
// Notify about loading: true (and any optimistic data)
|
|
75
75
|
recomputeAndNotify(allChanged, recompute, notifyChanged);
|
|
76
|
-
// ──
|
|
76
|
+
// ── Async resolver execution ─────────────────────────────────────────────
|
|
77
77
|
const retryOpts = resolve.options?.retry ?? { attempts: 0, delay: 1000 };
|
|
78
78
|
const maxAttempts = retryOpts.attempts;
|
|
79
79
|
const retryDelay = retryOpts.delay ?? 1000;
|
|
@@ -83,18 +83,18 @@ export function executeResolve(node, resolve, deps) {
|
|
|
83
83
|
let contextTracking = null;
|
|
84
84
|
for (let attempt = 0; attempt <= maxAttempts; attempt++) {
|
|
85
85
|
state.attempt = attempt;
|
|
86
|
-
//
|
|
86
|
+
// Wait before retrying (except the first attempt)
|
|
87
87
|
if (attempt > 0) {
|
|
88
88
|
await new Promise((r) => setTimeout(r, retryDelay));
|
|
89
|
-
//
|
|
89
|
+
// Re-check: if the status changed meanwhile (e.g. a reset happened) — abort
|
|
90
90
|
if (state.status !== "pending")
|
|
91
91
|
return;
|
|
92
92
|
}
|
|
93
93
|
try {
|
|
94
|
-
//
|
|
94
|
+
// Create a tracking proxy over a fresh values snapshot
|
|
95
95
|
const freshValues = getValues();
|
|
96
96
|
const tracking = createValuesTrackingProxy(freshValues);
|
|
97
|
-
//
|
|
97
|
+
// Wrap store.context in a tracking proxy for automatic context dependencies
|
|
98
98
|
contextTracking = createContextTrackingProxy(store.context);
|
|
99
99
|
const storeProxy = new Proxy(store, {
|
|
100
100
|
get(target, key) {
|
|
@@ -104,45 +104,45 @@ export function executeResolve(node, resolve, deps) {
|
|
|
104
104
|
},
|
|
105
105
|
});
|
|
106
106
|
const result = await resolve.resolver(tracking.proxy, storeProxy);
|
|
107
|
-
//
|
|
107
|
+
// Re-check: if the status changed while awaiting — abort
|
|
108
108
|
if (state.status !== "pending")
|
|
109
109
|
return result;
|
|
110
|
-
// ──
|
|
110
|
+
// ── Success path ─────────────────────────────────────────────────
|
|
111
111
|
const changed = new Set();
|
|
112
112
|
changed.add(node);
|
|
113
|
-
// 1.
|
|
113
|
+
// 1. Apply the resolver result to the node's subtree
|
|
114
114
|
if (result && typeof result === "object") {
|
|
115
115
|
applyPatch(node, nodeState, result, changed, valuesCache);
|
|
116
|
-
//
|
|
116
|
+
// Update the initial snapshot for the affected leaves (resolver data = initial state)
|
|
117
117
|
mergeInitialValues(node, nodeState, initialValueMap, result);
|
|
118
118
|
}
|
|
119
|
-
// 2.
|
|
119
|
+
// 2. Flush buffered side effects
|
|
120
120
|
const writes = tracking.getPendingWrites();
|
|
121
121
|
if (writes.length > 0) {
|
|
122
122
|
const writeChanged = applyPendingWrites(writes, rootConfig, nodeState, valuesCache);
|
|
123
123
|
for (const n of writeChanged)
|
|
124
124
|
changed.add(n);
|
|
125
125
|
}
|
|
126
|
-
// 3.
|
|
126
|
+
// 3. Update loading / status
|
|
127
127
|
const updatedState = nodeState.get(node);
|
|
128
128
|
if (updatedState) {
|
|
129
129
|
nodeState.set(node, { ...updatedState, loading: false });
|
|
130
130
|
}
|
|
131
131
|
state.status = "resolved";
|
|
132
132
|
state.error = null;
|
|
133
|
-
// 4.
|
|
133
|
+
// 4. Store auto-dependencies (merged with explicit deps)
|
|
134
134
|
const accessedPaths = tracking.getAccessedPaths();
|
|
135
135
|
const mergedDeps = new Set(resolve.deps ?? []);
|
|
136
136
|
for (const p of accessedPaths)
|
|
137
137
|
mergedDeps.add(p);
|
|
138
|
-
//
|
|
138
|
+
// Add context dependencies with the $context. prefix
|
|
139
139
|
for (const key of contextTracking.getAccessedKeys()) {
|
|
140
140
|
mergedDeps.add(`$context.${key}`);
|
|
141
141
|
}
|
|
142
142
|
state.dependencies = mergedDeps;
|
|
143
|
-
// 5. Recompute + notify (
|
|
143
|
+
// 5. Recompute + notify (once)
|
|
144
144
|
recomputeAndNotify(changed, recompute, notifyChanged);
|
|
145
|
-
// 6.
|
|
145
|
+
// 6. If a dependency changed while pending — re-run immediately
|
|
146
146
|
if (state.pendingRetrigger) {
|
|
147
147
|
state.pendingRetrigger = false;
|
|
148
148
|
state.status = "idle";
|
|
@@ -153,23 +153,23 @@ export function executeResolve(node, resolve, deps) {
|
|
|
153
153
|
}
|
|
154
154
|
catch (err) {
|
|
155
155
|
lastError = err;
|
|
156
|
-
//
|
|
156
|
+
// Move on to the next attempt (if any)
|
|
157
157
|
}
|
|
158
158
|
}
|
|
159
|
-
// ──
|
|
159
|
+
// ── Error path (all attempts exhausted) ──────────────────────────────────
|
|
160
160
|
if (state.status !== "pending")
|
|
161
|
-
return; //
|
|
161
|
+
return; // aborted
|
|
162
162
|
const changed = new Set();
|
|
163
163
|
changed.add(node);
|
|
164
|
-
//
|
|
164
|
+
// Update loading / status / error
|
|
165
165
|
const updatedState = nodeState.get(node);
|
|
166
166
|
if (updatedState) {
|
|
167
167
|
nodeState.set(node, { ...updatedState, loading: false });
|
|
168
168
|
}
|
|
169
169
|
state.status = "error";
|
|
170
170
|
state.error = lastError;
|
|
171
|
-
//
|
|
172
|
-
// (
|
|
171
|
+
// Store context dependencies even on the error path
|
|
172
|
+
// (so setContext can re-trigger resolvers in the "error" status)
|
|
173
173
|
if (contextTracking && contextTracking.getAccessedKeys().size > 0) {
|
|
174
174
|
const mergedDeps = new Set(resolve.deps ?? []);
|
|
175
175
|
for (const key of contextTracking.getAccessedKeys()) {
|
|
@@ -177,16 +177,16 @@ export function executeResolve(node, resolve, deps) {
|
|
|
177
177
|
}
|
|
178
178
|
state.dependencies = mergedDeps;
|
|
179
179
|
}
|
|
180
|
-
//
|
|
180
|
+
// Invoke the onError handler
|
|
181
181
|
try {
|
|
182
182
|
resolve.onError(lastError, { notify });
|
|
183
183
|
}
|
|
184
184
|
catch {
|
|
185
|
-
// onError
|
|
185
|
+
// onError should not throw, but if it does — swallow
|
|
186
186
|
}
|
|
187
187
|
// Recompute + notify
|
|
188
188
|
recomputeAndNotify(changed, recompute, notifyChanged);
|
|
189
|
-
//
|
|
189
|
+
// If a dependency changed while pending — re-run immediately
|
|
190
190
|
if (state.pendingRetrigger) {
|
|
191
191
|
state.pendingRetrigger = false;
|
|
192
192
|
state.status = "idle";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeResolve.js","sourceRoot":"","sources":["../../../store/resolvePipeline/executeResolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAmB,EACnB,OAAgB,EAChB,IAAiB;IAEjB,MAAM,EACJ,UAAU,EAAE,SAAS,EACrB,aAAa,EAAE,SAAS,EACxB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,KAAK,EACnB,GAAG,IAAI,CAAC;IAET,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEtC,IAAI,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAErC,
|
|
1
|
+
{"version":3,"file":"executeResolve.js","sourceRoot":"","sources":["../../../store/resolvePipeline/executeResolve.ts"],"names":[],"mappings":"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"}
|