palistor 0.0.25 → 0.0.27
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 +609 -542
- package/README.ru.md +1015 -0
- package/dist/index.d.ts +16 -27
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -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 +54 -53
- 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.js +39 -39
- package/dist/store/buildProxy/buildProxy.js.map +1 -1
- package/dist/store/buildProxy/computeProxyKeys.d.ts +8 -8
- package/dist/store/buildProxy/computeProxyKeys.js +9 -9
- 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 +48 -48
- package/dist/store/constants.d.ts.map +1 -1
- package/dist/store/constants.js +45 -45
- 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 +9 -9
- package/dist/store/flow/buildFlowStepsProxy.js +13 -13
- package/dist/store/flow/buildFlowStepsProxy.js.map +1 -1
- package/dist/store/flow/defineFlow.d.ts +27 -25
- package/dist/store/flow/defineFlow.d.ts.map +1 -1
- package/dist/store/flow/defineFlow.js +15 -13
- package/dist/store/flow/defineFlow.js.map +1 -1
- package/dist/store/flow/flowApi.d.ts +3 -2
- package/dist/store/flow/flowApi.d.ts.map +1 -1
- package/dist/store/flow/flowApi.js +1 -1
- package/dist/store/flow/flowApi.js.map +1 -1
- package/dist/store/flow/flowNavigation.d.ts +65 -63
- package/dist/store/flow/flowNavigation.d.ts.map +1 -1
- package/dist/store/flow/flowNavigation.js +74 -72
- package/dist/store/flow/flowNavigation.js.map +1 -1
- package/dist/store/flow/flowState.d.ts +16 -16
- package/dist/store/flow/flowState.d.ts.map +1 -1
- package/dist/store/flow/flowState.js +5 -5
- package/dist/store/flow/flowState.js.map +1 -1
- 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 +51 -51
- 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.js +15 -15
- 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 +61 -61
- package/dist/store/store/NodeRegistry/nodeRegistry.d.ts.map +1 -1
- package/dist/store/store/NodeRegistry/nodeRegistry.js +85 -86
- 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 +35 -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 +149 -169
- package/dist/store/store/palistor.js.map +1 -1
- package/dist/store/store/registerNodes.d.ts +10 -10
- package/dist/store/store/registerNodes.js +15 -15
- 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 +236 -234
- 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.js +12 -12
- 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
|
@@ -1,123 +1,123 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* createValuesTrackingProxy —
|
|
3
|
-
* -
|
|
4
|
-
* -
|
|
2
|
+
* createValuesTrackingProxy — wraps the values tree in a Proxy that:
|
|
3
|
+
* - READS: tracks accessed paths (automatic dependencies for resolver re-runs)
|
|
4
|
+
* - WRITES: buffers side effects (batch mode, no intermediate re-renders)
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Used inside resolver execution: the resolver receives this proxy instead of
|
|
7
|
+
* the real object. After the resolver finishes, the accessed paths are stored
|
|
8
|
+
* for dependency tracking and the buffered writes are flushed in one batch.
|
|
9
9
|
*
|
|
10
|
-
* ───
|
|
10
|
+
* ─── HOW IT WORKS ────────────────────────────────────────────────────────────
|
|
11
11
|
*
|
|
12
|
-
*
|
|
12
|
+
* The values tree looks like a regular nested object:
|
|
13
13
|
* { user: { name: "Alice", vehicleExists: true }, payment: { amount: 100 } }
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
15
|
+
* When the resolver runs, it receives this proxy instead of the real object.
|
|
16
|
+
* The proxy intercepts every property access:
|
|
17
17
|
*
|
|
18
|
-
*
|
|
19
|
-
* →
|
|
20
|
-
* →
|
|
21
|
-
* →
|
|
18
|
+
* READ: values.user.name
|
|
19
|
+
* → the proxy returns a nested proxy for "user"
|
|
20
|
+
* → the nested proxy intercepts "name", records the path "user.name" in accessedPaths
|
|
21
|
+
* → returns the real value
|
|
22
22
|
*
|
|
23
|
-
*
|
|
24
|
-
* →
|
|
25
|
-
*
|
|
26
|
-
* →
|
|
23
|
+
* WRITE: values.user.vehicleExists = false
|
|
24
|
+
* → the proxy intercepts the assignment, records { path: "user.vehicleExists", value: false }
|
|
25
|
+
* into pendingWrites[]
|
|
26
|
+
* → the real values object is NOT touched — the write is deferred!
|
|
27
27
|
*
|
|
28
|
-
*
|
|
29
|
-
* 1. getAccessedPaths() →
|
|
30
|
-
* (
|
|
31
|
-
* 2. getPendingWrites() →
|
|
32
|
-
*
|
|
28
|
+
* After the resolver returns:
|
|
29
|
+
* 1. getAccessedPaths() → used to rebuild this resolver's dependency graph
|
|
30
|
+
* (the resolver re-runs the next time any of these paths changes)
|
|
31
|
+
* 2. getPendingWrites() → passed to applyPendingWrites(), which turns each
|
|
32
|
+
* path back into a nested patch and calls applyPatch() on the real store
|
|
33
33
|
*
|
|
34
|
-
*
|
|
35
|
-
* -
|
|
36
|
-
* -
|
|
37
|
-
* -
|
|
34
|
+
* WHY BUFFER WRITES instead of applying immediately?
|
|
35
|
+
* - Prevents cascading re-renders in the middle of a resolver run
|
|
36
|
+
* - All mutations are applied in one atomic batch → consistent state after every pipeline tick
|
|
37
|
+
* - Resolver A's writes don't accidentally trigger resolver B mid-run
|
|
38
38
|
*/
|
|
39
39
|
/**
|
|
40
|
-
*
|
|
40
|
+
* Creates a writable tracking proxy for the values tree.
|
|
41
41
|
*
|
|
42
|
-
* -
|
|
43
|
-
* -
|
|
44
|
-
* -
|
|
42
|
+
* - Reading a primitive records the full path (e.g. "user.id") in accessedPaths
|
|
43
|
+
* - Reading an object returns a nested proxy (recursively); not tracked until a leaf is read
|
|
44
|
+
* - Writing to ANY path buffers the assignment in pendingWrites[] without touching real data
|
|
45
45
|
*
|
|
46
|
-
* @param values —
|
|
46
|
+
* @param values — current values snapshot (from valuesCache.values), treated as read-only here
|
|
47
47
|
*/
|
|
48
48
|
export function createValuesTrackingProxy(values) {
|
|
49
|
-
//
|
|
50
|
-
//
|
|
49
|
+
// Collects every primitive path the resolver reads.
|
|
50
|
+
// Example after a resolver run: Set { "user.name", "user.vehicleExists" }
|
|
51
51
|
const accessedPaths = new Set();
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
//
|
|
52
|
+
// Collects every write the resolver performs, in order of appearance.
|
|
53
|
+
// None is applied until applyPendingWrites() runs after the resolver returns.
|
|
54
|
+
// Example: [{ path: "user.vehicleExists", value: false }, { path: "payment.amount", value: 200 }]
|
|
55
55
|
const pendingWrites = [];
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
//
|
|
56
|
+
// Caches nested proxies by their path prefix so repeated access to the same
|
|
57
|
+
// nested object returns the same proxy instance.
|
|
58
|
+
// Key: dot-separated path prefix (e.g. "user"), or "__root__" for the root level.
|
|
59
59
|
const proxyCache = new Map();
|
|
60
60
|
/**
|
|
61
|
-
*
|
|
61
|
+
* Recursively wraps `target` in a Proxy that tracks reads and buffers writes.
|
|
62
62
|
*
|
|
63
|
-
* @param target —
|
|
64
|
-
* @param parentPath —
|
|
63
|
+
* @param target — the real values object (or nested sub-object) to wrap
|
|
64
|
+
* @param parentPath — accumulated dot-path prefix, e.g. "" for the root or "user" for a nested one
|
|
65
65
|
*/
|
|
66
66
|
function buildValuesProxy(target, parentPath) {
|
|
67
|
-
//
|
|
68
|
-
//
|
|
67
|
+
// Return the cached proxy for this path so we don't create duplicate
|
|
68
|
+
// proxies for one node (matters for referential equality checks inside resolvers).
|
|
69
69
|
const cacheKey = parentPath || "__root__";
|
|
70
70
|
if (proxyCache.has(cacheKey))
|
|
71
71
|
return proxyCache.get(cacheKey);
|
|
72
72
|
const p = new Proxy(target, {
|
|
73
|
-
// ─── GET
|
|
74
|
-
//
|
|
75
|
-
// •
|
|
76
|
-
// (
|
|
77
|
-
// •
|
|
73
|
+
// ─── GET trap ─────────────────────────────────────────────────────────
|
|
74
|
+
// Intercepts every property read. Builds the full dot-path, then:
|
|
75
|
+
// • nested plain object → returns a nested proxy
|
|
76
|
+
// (intermediate paths are not tracked, only leaf reads)
|
|
77
|
+
// • primitive → records the path in accessedPaths and returns it
|
|
78
78
|
get(_t, key) {
|
|
79
|
-
//
|
|
80
|
-
//
|
|
79
|
+
// Ignore symbol keys (e.g. Symbol.toPrimitive, Symbol.iterator) —
|
|
80
|
+
// framework/runtime internals, not part of the values tree.
|
|
81
81
|
if (typeof key === "symbol")
|
|
82
82
|
return undefined;
|
|
83
|
-
//
|
|
83
|
+
// Full dot-path for this access, e.g. "user" + "." + "name" = "user.name"
|
|
84
84
|
const fullPath = parentPath ? `${parentPath}.${key}` : key;
|
|
85
85
|
const val = target[key];
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
//
|
|
86
|
+
// Plain objects are wrapped in another proxy to keep tracking deeper
|
|
87
|
+
// reads, e.g. values.user.address.city.
|
|
88
|
+
// Arrays and Dates are treated as leaf values (no recursion).
|
|
89
89
|
if (val !== null && typeof val === "object" && !Array.isArray(val) && !(val instanceof Date)) {
|
|
90
90
|
return buildValuesProxy(val, fullPath);
|
|
91
91
|
}
|
|
92
|
-
//
|
|
93
|
-
//
|
|
92
|
+
// Leaf read — record the path so the resolver can be re-triggered
|
|
93
|
+
// later when this specific value changes in the store.
|
|
94
94
|
accessedPaths.add(fullPath);
|
|
95
95
|
return val;
|
|
96
96
|
},
|
|
97
|
-
// ─── SET
|
|
98
|
-
//
|
|
99
|
-
//
|
|
97
|
+
// ─── SET trap ─────────────────────────────────────────────────────────
|
|
98
|
+
// Intercepts every assignment. Instead of mutating the real values
|
|
99
|
+
// object, pushes a PendingWrite descriptor into the buffer.
|
|
100
100
|
//
|
|
101
|
-
//
|
|
102
|
-
// 1.
|
|
103
|
-
// 2. applyPendingWrites()
|
|
104
|
-
//
|
|
105
|
-
// 3.
|
|
101
|
+
// Writes are deliberately deferred:
|
|
102
|
+
// 1. A resolver may perform several writes in a row; collect them all first.
|
|
103
|
+
// 2. applyPendingWrites() runs after the resolver returns, so all
|
|
104
|
+
// mutations are applied atomically in a single applyPatch() call.
|
|
105
|
+
// 3. The resolver cannot observe its own partially applied writes.
|
|
106
106
|
set(_t, key, newValue) {
|
|
107
107
|
if (typeof key === "symbol")
|
|
108
108
|
return false;
|
|
109
109
|
const fullPath = parentPath ? `${parentPath}.${key}` : key;
|
|
110
|
-
//
|
|
110
|
+
// Buffer the write — the real store is untouched for now.
|
|
111
111
|
pendingWrites.push({ path: fullPath, value: newValue });
|
|
112
|
-
//
|
|
113
|
-
// (
|
|
112
|
+
// Returning true tells the Proxy the assignment was "accepted"
|
|
113
|
+
// (prevents a strict-mode TypeError despite no real mutation happening).
|
|
114
114
|
return true;
|
|
115
115
|
},
|
|
116
116
|
});
|
|
117
117
|
proxyCache.set(cacheKey, p);
|
|
118
118
|
return p;
|
|
119
119
|
}
|
|
120
|
-
//
|
|
120
|
+
// Build the root-level proxy (parentPath = "" means no prefix).
|
|
121
121
|
const proxy = buildValuesProxy(values, "");
|
|
122
122
|
return {
|
|
123
123
|
proxy,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createValuesTrackingProxy.js","sourceRoot":"","sources":["../../../store/resolvePipeline/createValuesTrackingProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AA8BH;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAA+B;IAE/B,
|
|
1
|
+
{"version":3,"file":"createValuesTrackingProxy.js","sourceRoot":"","sources":["../../../store/resolvePipeline/createValuesTrackingProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AA8BH;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAA+B;IAE/B,oDAAoD;IACpD,0EAA0E;IAC1E,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,sEAAsE;IACtE,8EAA8E;IAC9E,kGAAkG;IAClG,MAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,4EAA4E;IAC5E,iDAAiD;IACjD,kFAAkF;IAClF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE9C;;;;;OAKG;IACH,SAAS,gBAAgB,CAAC,MAA+B,EAAE,UAAkB;QAC3E,qEAAqE;QACrE,mFAAmF;QACnF,MAAM,QAAQ,GAAG,UAAU,IAAI,UAAU,CAAC;QAC1C,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,UAAU,CAAC,GAAG,CAAC,QAAQ,CAA4B,CAAC;QAEzF,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE;YAC1B,yEAAyE;YACzE,kEAAkE;YAClE,mDAAmD;YACnD,4DAA4D;YAC5D,mEAAmE;YACnE,GAAG,CAAC,EAAE,EAAE,GAAoB;gBAC1B,kEAAkE;gBAClE,4DAA4D;gBAC5D,IAAI,OAAO,GAAG,KAAK,QAAQ;oBAAE,OAAO,SAAS,CAAC;gBAE9C,0EAA0E;gBAC1E,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAExB,qEAAqE;gBACrE,wCAAwC;gBACxC,8DAA8D;gBAC9D,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,YAAY,IAAI,CAAC,EAAE,CAAC;oBAC7F,OAAO,gBAAgB,CAAC,GAA8B,EAAE,QAAQ,CAAC,CAAC;gBACpE,CAAC;gBAED,kEAAkE;gBAClE,uDAAuD;gBACvD,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC5B,OAAO,GAAG,CAAC;YACb,CAAC;YAED,yEAAyE;YACzE,mEAAmE;YACnE,4DAA4D;YAC5D,EAAE;YACF,oCAAoC;YACpC,+EAA+E;YAC/E,oEAAoE;YACpE,uEAAuE;YACvE,qEAAqE;YACrE,GAAG,CAAC,EAAE,EAAE,GAAoB,EAAE,QAAiB;gBAC7C,IAAI,OAAO,GAAG,KAAK,QAAQ;oBAAE,OAAO,KAAK,CAAC;gBAE1C,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC3D,0DAA0D;gBAC1D,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACxD,+DAA+D;gBAC/D,yEAAyE;gBACzE,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC,CAAC;QAEH,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,CAA4B,CAAC;IACtC,CAAC;IAED,gEAAgE;IAChE,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE3C,OAAO;QACL,KAAK;QACL,gBAAgB,EAAE,GAAG,EAAE,CAAC,aAAa;QACrC,gBAAgB,EAAE,GAAG,EAAE,CAAC,aAAa;KACtC,CAAC;AACJ,CAAC"}
|
|
@@ -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
|