@contember/bindx 0.1.31 → 0.1.32
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/dist/handles/BaseHandle.d.ts +5 -0
- package/dist/handles/BaseHandle.d.ts.map +1 -1
- package/dist/handles/HasManyListHandle.d.ts +1 -0
- package/dist/handles/HasManyListHandle.d.ts.map +1 -1
- package/dist/handles/HasOneHandle.d.ts.map +1 -1
- package/dist/store/RelationStore.d.ts.map +1 -1
- package/dist/store/SnapshotStore.d.ts +24 -0
- package/dist/store/SnapshotStore.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/handles/BaseHandle.ts +16 -0
- package/src/handles/HasManyListHandle.ts +34 -19
- package/src/handles/HasOneHandle.ts +20 -7
- package/src/store/RelationStore.ts +20 -1
- package/src/store/SnapshotStore.ts +55 -1
|
@@ -61,4 +61,9 @@ export declare abstract class EntityRelatedHandle extends BaseHandle {
|
|
|
61
61
|
*/
|
|
62
62
|
protected getServerData(): Record<string, unknown> | undefined;
|
|
63
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Shallow comparison of embedded data keys against existing snapshot data.
|
|
66
|
+
* Returns true if all keys in embedded data match the snapshot.
|
|
67
|
+
*/
|
|
68
|
+
export declare function embeddedDataMatchesSnapshot(embedded: Record<string, unknown>, snapshot: Record<string, unknown>): boolean;
|
|
64
69
|
//# sourceMappingURL=BaseHandle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseHandle.d.ts","sourceRoot":"","sources":["../../src/handles/BaseHandle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,uBAAuB,CAAA;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D;;;;;;;;GAQG;AACH,8BAAsB,UAAW,YAAW,UAAU;IAIpD,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa;IACvC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,gBAAgB;IAJhD,SAAS,CAAC,SAAS,UAAQ;gBAGP,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,gBAAgB;IAGhD;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAEpD;;OAEG;IACH,QAAQ,CAAC,UAAU,IAAI,MAAM;IAE7B;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;OAEG;IACH,SAAS,CAAC,iBAAiB,IAAI,IAAI;CAKnC;AAED;;;GAGG;AACH,8BAAsB,mBAAoB,SAAQ,UAAU;IAE1D,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM;IACrC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM;gBADhB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EACnC,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,gBAAgB;IAK7B;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAI3C;;OAEG;IACH,UAAU,IAAI,MAAM;IAKpB;;OAEG;IACH,SAAS,CAAC,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAK9D;;OAEG;IACH,SAAS,CAAC,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;CAI9D"}
|
|
1
|
+
{"version":3,"file":"BaseHandle.d.ts","sourceRoot":"","sources":["../../src/handles/BaseHandle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,uBAAuB,CAAA;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D;;;;;;;;GAQG;AACH,8BAAsB,UAAW,YAAW,UAAU;IAIpD,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa;IACvC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,gBAAgB;IAJhD,SAAS,CAAC,SAAS,UAAQ;gBAGP,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,gBAAgB;IAGhD;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAEpD;;OAEG;IACH,QAAQ,CAAC,UAAU,IAAI,MAAM;IAE7B;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;OAEG;IACH,SAAS,CAAC,iBAAiB,IAAI,IAAI;CAKnC;AAED;;;GAGG;AACH,8BAAsB,mBAAoB,SAAQ,UAAU;IAE1D,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM;IACrC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM;gBADhB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EACnC,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,gBAAgB;IAK7B;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAI3C;;OAEG;IACH,UAAU,IAAI,MAAM;IAKpB;;OAEG;IACH,SAAS,CAAC,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAK9D;;OAEG;IACH,SAAS,CAAC,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;CAI9D;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAC1C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAOT"}
|
|
@@ -54,6 +54,7 @@ export declare class HasManyListHandle<TEntity extends object = object, TSelecte
|
|
|
54
54
|
get items(): EntityAccessor<TEntity, TSelected>[];
|
|
55
55
|
/**
|
|
56
56
|
* Ensures snapshots exist for embedded has-many items.
|
|
57
|
+
* Only called when parent's embedded data has changed (re-fetch detected).
|
|
57
58
|
*/
|
|
58
59
|
private ensureItemSnapshots;
|
|
59
60
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HasManyListHandle.d.ts","sourceRoot":"","sources":["../../src/handles/HasManyListHandle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"HasManyListHandle.d.ts","sourceRoot":"","sources":["../../src/handles/HasManyListHandle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAA+B,MAAM,iBAAiB,CAAA;AAElF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAS1D,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAC3H,OAAO,EAAqB,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACxF,OAAO,KAAK,EACX,aAAa,EACb,WAAW,EACX,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,yBAAyB,EACzB,MAAM,oBAAoB,CAAA;AAG3B;;;;;;GAMG;AACH,qBAAa,iBAAiB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,SAAS,GAAG,OAAO,CAAE,SAAQ,mBAAmB;IAiC9G,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAGzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAGvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAvC5B,OAAO,CAAC,kBAAkB,CAAsD;IAChF,OAAO,CAAC,oBAAoB,CAAwD;IAEpF,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAE/B;;;OAGG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;;OAGG;IACH,IAAI,QAAQ,IAAI,SAAS,CAExB;IAED;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAE9B,OAAO;IAiBP,MAAM,CAAC,MAAM,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,SAAS,GAAG,OAAO,EACjE,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,cAAc,EACtB,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACpB,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,aAAa,GACvB,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC;IAItC;;;OAGG;IACH,IAAI,CAAC,cAAc,CAAC,IAAI,YAAY,CAUnC;IAED;;;;;OAKG;IACH,IAAI,KAAK,IAAI,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAgDhD;IAED;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA2B3B;;;OAGG;IACH,OAAO,CAAC,YAAY;IA0BpB;;;;OAIG;IACH,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CASnC;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC;IAqBjE;;;;OAIG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC;IAIvD;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAgBrB;IAED;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE;IAI/E;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAO7B;;;;OAIG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOhC;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAO5B;;;;OAIG;IACH,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM;IAcpC;;;;;;;;OAQG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAO5B;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;;;OAIG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAO9C;;;OAGG;IACH,KAAK,IAAI,IAAI;IAUb;;OAEG;IACM,OAAO,IAAI,IAAI;IAUxB;;;OAGG;IACH,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,SAAS,UAAU,EAAE,CAElC;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAOjC;;OAEG;IACH,WAAW,IAAI,IAAI;IASnB;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,aAAa,CAAC,qBAAqB,CAAC,GAAG,WAAW;IAW5E;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,aAAa,CAAC,wBAAwB,CAAC,GAAG,WAAW;IAWlF;;OAEG;IACH,uBAAuB,CAAC,WAAW,EAAE,WAAW,CAAC,sBAAsB,CAAC,GAAG,WAAW;IAWtF;;OAEG;IACH,0BAA0B,CAAC,WAAW,EAAE,WAAW,CAAC,yBAAyB,CAAC,GAAG,WAAW;CAW5F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HasOneHandle.d.ts","sourceRoot":"","sources":["../../src/handles/HasOneHandle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"HasOneHandle.d.ts","sourceRoot":"","sources":["../../src/handles/HasOneHandle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RelationStore.d.ts","sourceRoot":"","sources":["../../src/store/RelationStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"RelationStore.d.ts","sourceRoot":"","sources":["../../src/store/RelationStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,6 +32,13 @@ export declare class SnapshotStore implements SnapshotVersionBumper {
|
|
|
32
32
|
private readonly meta;
|
|
33
33
|
private readonly touched;
|
|
34
34
|
private readonly dirtyTracker;
|
|
35
|
+
/**
|
|
36
|
+
* Tracks the last embedded data reference propagated from parent to child.
|
|
37
|
+
* Used to detect whether the parent was re-fetched (new reference) vs. stale
|
|
38
|
+
* embedded data that should not overwrite committed child state.
|
|
39
|
+
* Keyed by "parentType:parentId:fieldName".
|
|
40
|
+
*/
|
|
41
|
+
private readonly lastPropagatedData;
|
|
35
42
|
constructor();
|
|
36
43
|
/** Maps temp ID entity keys to their persisted ID entity keys for transparent resolution */
|
|
37
44
|
private readonly rekeyedEntities;
|
|
@@ -44,6 +51,23 @@ export declare class SnapshotStore implements SnapshotVersionBumper {
|
|
|
44
51
|
bumpEntitySnapshotVersion(key: string): void;
|
|
45
52
|
private notifyEntitySubscribers;
|
|
46
53
|
private notifyRelationSubscribers;
|
|
54
|
+
/**
|
|
55
|
+
* Returns true if the embedded data reference differs from what was last propagated.
|
|
56
|
+
* Uses reference identity — a new reference means the parent was re-fetched.
|
|
57
|
+
*/
|
|
58
|
+
hasEmbeddedDataChanged(parentType: string, parentId: string, fieldName: string, currentData: unknown): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Records the embedded data reference that was propagated to the child.
|
|
61
|
+
*/
|
|
62
|
+
markEmbeddedDataPropagated(parentType: string, parentId: string, fieldName: string, data: unknown): void;
|
|
63
|
+
/**
|
|
64
|
+
* Removes all propagation tracking entries for a given parent entity.
|
|
65
|
+
*/
|
|
66
|
+
clearPropagatedDataForEntity(parentType: string, parentId: string): void;
|
|
67
|
+
/**
|
|
68
|
+
* Rekeys propagation tracking entries when a temp ID is replaced by a persisted ID.
|
|
69
|
+
*/
|
|
70
|
+
private rekeyPropagatedData;
|
|
47
71
|
getEntitySnapshot<T extends object>(entityType: string, id: string): EntitySnapshot<T> | undefined;
|
|
48
72
|
hasEntity(entityType: string, id: string): boolean;
|
|
49
73
|
setEntityData<T extends object>(entityType: string, id: string, data: T, isServerData?: boolean, skipNotify?: boolean): EntitySnapshot<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SnapshotStore.d.ts","sourceRoot":"","sources":["../../src/store/SnapshotStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAuB,KAAK,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAE1F,OAAO,EAEN,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAMvE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACrG,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAE/F,KAAK,UAAU,GAAG,MAAM,IAAI,CAAA;AAE5B;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,aAAc,YAAW,qBAAqB;IAC1D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAC5D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4B;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;;
|
|
1
|
+
{"version":3,"file":"SnapshotStore.d.ts","sourceRoot":"","sources":["../../src/store/SnapshotStore.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contember/bindx",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.32",
|
|
4
4
|
"description": "Type-safe data binding framework (core)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./src/index.ts",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
],
|
|
18
18
|
"license": "MIT",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@contember/bindx-client": "0.1.
|
|
20
|
+
"@contember/bindx-client": "0.1.32",
|
|
21
21
|
"@contember/graphql-builder": "^2.1.0-beta.1",
|
|
22
22
|
"@contember/graphql-client": "^2.1.0-beta.1"
|
|
23
23
|
},
|
|
@@ -98,3 +98,19 @@ export abstract class EntityRelatedHandle extends BaseHandle {
|
|
|
98
98
|
return snapshot?.serverData as Record<string, unknown> | undefined
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Shallow comparison of embedded data keys against existing snapshot data.
|
|
104
|
+
* Returns true if all keys in embedded data match the snapshot.
|
|
105
|
+
*/
|
|
106
|
+
export function embeddedDataMatchesSnapshot(
|
|
107
|
+
embedded: Record<string, unknown>,
|
|
108
|
+
snapshot: Record<string, unknown>,
|
|
109
|
+
): boolean {
|
|
110
|
+
for (const key of Object.keys(embedded)) {
|
|
111
|
+
if (embedded[key] !== snapshot[key]) {
|
|
112
|
+
return false
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return true
|
|
116
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EntityRelatedHandle } from './BaseHandle.js'
|
|
1
|
+
import { EntityRelatedHandle, embeddedDataMatchesSnapshot } from './BaseHandle.js'
|
|
2
2
|
import { EntityHandle } from './EntityHandle.js'
|
|
3
3
|
import type { ActionDispatcher } from '../core/ActionDispatcher.js'
|
|
4
4
|
import type { SnapshotStore } from '../store/SnapshotStore.js'
|
|
@@ -124,23 +124,36 @@ export class HasManyListHandle<TEntity extends object = object, TSelected = TEnt
|
|
|
124
124
|
const listData = this.extractItems(rawData)
|
|
125
125
|
if (!listData) return []
|
|
126
126
|
|
|
127
|
-
|
|
128
|
-
this.ensureItemSnapshots(listData)
|
|
127
|
+
const fieldKey = this.alias ?? this.fieldName
|
|
129
128
|
|
|
130
|
-
//
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
129
|
+
// Only propagate embedded data when the parent's reference changed (re-fetch).
|
|
130
|
+
// Same reference means the embedded data is stale and must not overwrite
|
|
131
|
+
// child state that may have been updated by a local commit.
|
|
132
|
+
if (this.store.hasEmbeddedDataChanged(this.entityType, this.entityId, fieldKey, rawData)) {
|
|
133
|
+
this.ensureItemSnapshots(listData)
|
|
134
134
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
this.
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
135
|
+
const serverIds = listData
|
|
136
|
+
.map((item) => item['id'] as string | undefined)
|
|
137
|
+
.filter((id): id is string => id !== undefined)
|
|
138
|
+
|
|
139
|
+
this.store.getOrCreateHasMany(
|
|
140
|
+
this.entityType,
|
|
141
|
+
this.entityId,
|
|
142
|
+
this.fieldName,
|
|
143
|
+
serverIds,
|
|
144
|
+
this.alias,
|
|
145
|
+
)
|
|
146
|
+
this.store.markEmbeddedDataPropagated(this.entityType, this.entityId, fieldKey, rawData)
|
|
147
|
+
} else {
|
|
148
|
+
// Ensure has-many state exists (without updating serverIds)
|
|
149
|
+
this.store.getOrCreateHasMany(
|
|
150
|
+
this.entityType,
|
|
151
|
+
this.entityId,
|
|
152
|
+
this.fieldName,
|
|
153
|
+
undefined,
|
|
154
|
+
this.alias,
|
|
155
|
+
)
|
|
156
|
+
}
|
|
144
157
|
|
|
145
158
|
// Use ordered IDs from store (handles removals, connections, and ordering)
|
|
146
159
|
const orderedIds = this.store.getHasManyOrderedIds(
|
|
@@ -155,6 +168,7 @@ export class HasManyListHandle<TEntity extends object = object, TSelected = TEnt
|
|
|
155
168
|
|
|
156
169
|
/**
|
|
157
170
|
* Ensures snapshots exist for embedded has-many items.
|
|
171
|
+
* Only called when parent's embedded data has changed (re-fetch detected).
|
|
158
172
|
*/
|
|
159
173
|
private ensureItemSnapshots(listData: Array<Record<string, unknown>>): void {
|
|
160
174
|
for (const itemData of listData) {
|
|
@@ -165,12 +179,13 @@ export class HasManyListHandle<TEntity extends object = object, TSelected = TEnt
|
|
|
165
179
|
// This needs to happen even if the snapshot already exists
|
|
166
180
|
this.store.registerParentChild(this.entityType, this.entityId, this.itemType, itemId)
|
|
167
181
|
|
|
168
|
-
//
|
|
169
|
-
|
|
182
|
+
// Optimization: skip if item data matches existing snapshot
|
|
183
|
+
const existing = this.store.getEntitySnapshot(this.itemType, itemId)
|
|
184
|
+
if (existing?.serverData && embeddedDataMatchesSnapshot(itemData, existing.serverData as Record<string, unknown>)) {
|
|
170
185
|
continue
|
|
171
186
|
}
|
|
172
187
|
|
|
173
|
-
// Create snapshot from embedded data
|
|
188
|
+
// Create or update snapshot from embedded data
|
|
174
189
|
// Skip notification to avoid triggering React state updates during render
|
|
175
190
|
this.store.setEntityData(
|
|
176
191
|
this.itemType,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EntityRelatedHandle } from './BaseHandle.js'
|
|
1
|
+
import { EntityRelatedHandle, embeddedDataMatchesSnapshot } from './BaseHandle.js'
|
|
2
2
|
import type { ActionDispatcher } from '../core/ActionDispatcher.js'
|
|
3
3
|
import type { SnapshotStore } from '../store/SnapshotStore.js'
|
|
4
4
|
import type { SchemaRegistry } from '../schema/SchemaRegistry.js'
|
|
@@ -283,11 +283,6 @@ export class HasOneHandle<TEntity extends object = object, TSelected = TEntity>
|
|
|
283
283
|
// This needs to happen even if the snapshot already exists
|
|
284
284
|
this.store.registerParentChild(this.entityType, this.entityId, this.targetType, id)
|
|
285
285
|
|
|
286
|
-
// Check if snapshot already exists
|
|
287
|
-
if (this.store.hasEntity(this.targetType, id)) {
|
|
288
|
-
return
|
|
289
|
-
}
|
|
290
|
-
|
|
291
286
|
// Get embedded data from parent entity
|
|
292
287
|
const parentSnapshot = this.store.getEntitySnapshot(this.entityType, this.entityId)
|
|
293
288
|
if (!parentSnapshot?.data) {
|
|
@@ -308,7 +303,24 @@ export class HasOneHandle<TEntity extends object = object, TSelected = TEntity>
|
|
|
308
303
|
return
|
|
309
304
|
}
|
|
310
305
|
|
|
311
|
-
//
|
|
306
|
+
// Skip if parent's embedded data reference hasn't changed since last propagation.
|
|
307
|
+
// A new reference means the parent was re-fetched from the server.
|
|
308
|
+
// Same reference means the embedded data is stale and must not overwrite
|
|
309
|
+
// child state that may have been updated by a local commit.
|
|
310
|
+
if (!this.store.hasEmbeddedDataChanged(this.entityType, this.entityId, this.fieldName, embeddedData)) {
|
|
311
|
+
return
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Skip if embedded data values match existing serverData — avoids overwriting
|
|
315
|
+
// unpersisted local mutations when a re-fetch returns the same server data
|
|
316
|
+
// (e.g. polling). A new reference with identical values means no actual change.
|
|
317
|
+
const existing = this.store.getEntitySnapshot(this.targetType, id)
|
|
318
|
+
if (existing?.serverData && embeddedDataMatchesSnapshot(embeddedData as Record<string, unknown>, existing.serverData as Record<string, unknown>)) {
|
|
319
|
+
this.store.markEmbeddedDataPropagated(this.entityType, this.entityId, this.fieldName, embeddedData)
|
|
320
|
+
return
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Create or update snapshot from embedded data
|
|
312
324
|
// Skip notification to avoid triggering React state updates during render
|
|
313
325
|
this.store.setEntityData(
|
|
314
326
|
this.targetType,
|
|
@@ -317,6 +329,7 @@ export class HasOneHandle<TEntity extends object = object, TSelected = TEntity>
|
|
|
317
329
|
true, // isServerData
|
|
318
330
|
true, // skipNotify - called during render, data already exists embedded in parent
|
|
319
331
|
)
|
|
332
|
+
this.store.markEmbeddedDataPropagated(this.entityType, this.entityId, this.fieldName, embeddedData)
|
|
320
333
|
}
|
|
321
334
|
|
|
322
335
|
/**
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import type { HasOneRelationState } from '../handles/types.js'
|
|
2
2
|
import type { EntitySnapshot } from './snapshots.js'
|
|
3
3
|
|
|
4
|
+
function setsEqual<T>(a: Set<T>, b: Set<T>): boolean {
|
|
5
|
+
if (a.size !== b.size) return false
|
|
6
|
+
for (const item of a) {
|
|
7
|
+
if (!b.has(item)) return false
|
|
8
|
+
}
|
|
9
|
+
return true
|
|
10
|
+
}
|
|
11
|
+
|
|
4
12
|
/**
|
|
5
13
|
* Removal type for has-many items
|
|
6
14
|
*/
|
|
@@ -150,7 +158,8 @@ export class RelationStore {
|
|
|
150
158
|
* Gets or creates has-many list state.
|
|
151
159
|
*/
|
|
152
160
|
getOrCreateHasMany(key: string, serverIds?: string[]): StoredHasManyState {
|
|
153
|
-
|
|
161
|
+
const existing = this.hasManyStates.get(key)
|
|
162
|
+
if (!existing) {
|
|
154
163
|
this.hasManyStates.set(key, {
|
|
155
164
|
serverIds: new Set(serverIds ?? []),
|
|
156
165
|
orderedIds: null,
|
|
@@ -159,6 +168,16 @@ export class RelationStore {
|
|
|
159
168
|
createdEntities: new Set(),
|
|
160
169
|
version: 0,
|
|
161
170
|
})
|
|
171
|
+
} else if (serverIds !== undefined) {
|
|
172
|
+
const newServerIds = new Set(serverIds)
|
|
173
|
+
if (!setsEqual(existing.serverIds, newServerIds)) {
|
|
174
|
+
this.hasManyStates.set(key, {
|
|
175
|
+
...existing,
|
|
176
|
+
serverIds: newServerIds,
|
|
177
|
+
orderedIds: null,
|
|
178
|
+
version: existing.version + 1,
|
|
179
|
+
})
|
|
180
|
+
}
|
|
162
181
|
}
|
|
163
182
|
|
|
164
183
|
return this.hasManyStates.get(key)!
|
|
@@ -46,6 +46,14 @@ export class SnapshotStore implements SnapshotVersionBumper {
|
|
|
46
46
|
private readonly touched = new TouchedStore()
|
|
47
47
|
private readonly dirtyTracker: DirtyTracker
|
|
48
48
|
|
|
49
|
+
/**
|
|
50
|
+
* Tracks the last embedded data reference propagated from parent to child.
|
|
51
|
+
* Used to detect whether the parent was re-fetched (new reference) vs. stale
|
|
52
|
+
* embedded data that should not overwrite committed child state.
|
|
53
|
+
* Keyed by "parentType:parentId:fieldName".
|
|
54
|
+
*/
|
|
55
|
+
private readonly lastPropagatedData = new Map<string, unknown>()
|
|
56
|
+
|
|
49
57
|
constructor() {
|
|
50
58
|
this.dirtyTracker = new DirtyTracker(this.entitySnapshots, this.meta, this.relations)
|
|
51
59
|
}
|
|
@@ -98,6 +106,49 @@ export class SnapshotStore implements SnapshotVersionBumper {
|
|
|
98
106
|
}
|
|
99
107
|
}
|
|
100
108
|
|
|
109
|
+
// ==================== Embedded Data Propagation Tracking ====================
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Returns true if the embedded data reference differs from what was last propagated.
|
|
113
|
+
* Uses reference identity — a new reference means the parent was re-fetched.
|
|
114
|
+
*/
|
|
115
|
+
hasEmbeddedDataChanged(parentType: string, parentId: string, fieldName: string, currentData: unknown): boolean {
|
|
116
|
+
const key = this.getRelationKey(parentType, parentId, fieldName)
|
|
117
|
+
return this.lastPropagatedData.get(key) !== currentData
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Records the embedded data reference that was propagated to the child.
|
|
122
|
+
*/
|
|
123
|
+
markEmbeddedDataPropagated(parentType: string, parentId: string, fieldName: string, data: unknown): void {
|
|
124
|
+
const key = this.getRelationKey(parentType, parentId, fieldName)
|
|
125
|
+
this.lastPropagatedData.set(key, data)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Removes all propagation tracking entries for a given parent entity.
|
|
130
|
+
*/
|
|
131
|
+
clearPropagatedDataForEntity(parentType: string, parentId: string): void {
|
|
132
|
+
const prefix = `${parentType}:${this.resolveId(parentType, parentId)}:`
|
|
133
|
+
for (const key of this.lastPropagatedData.keys()) {
|
|
134
|
+
if (key.startsWith(prefix)) {
|
|
135
|
+
this.lastPropagatedData.delete(key)
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Rekeys propagation tracking entries when a temp ID is replaced by a persisted ID.
|
|
142
|
+
*/
|
|
143
|
+
private rekeyPropagatedData(oldPrefix: string, newPrefix: string): void {
|
|
144
|
+
for (const [key, value] of this.lastPropagatedData) {
|
|
145
|
+
if (key.startsWith(oldPrefix)) {
|
|
146
|
+
this.lastPropagatedData.delete(key)
|
|
147
|
+
this.lastPropagatedData.set(newPrefix + key.slice(oldPrefix.length), value)
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
101
152
|
// ==================== Entity Snapshots ====================
|
|
102
153
|
|
|
103
154
|
getEntitySnapshot<T extends object>(entityType: string, id: string): EntitySnapshot<T> | undefined {
|
|
@@ -172,6 +223,7 @@ export class SnapshotStore implements SnapshotVersionBumper {
|
|
|
172
223
|
const key = this.getEntityKey(entityType, id)
|
|
173
224
|
this.entitySnapshots.remove(key)
|
|
174
225
|
this.meta.clearLoadState(key)
|
|
226
|
+
this.clearPropagatedDataForEntity(entityType, id)
|
|
175
227
|
this.notifyEntitySubscribers(key)
|
|
176
228
|
}
|
|
177
229
|
|
|
@@ -261,9 +313,10 @@ export class SnapshotStore implements SnapshotVersionBumper {
|
|
|
261
313
|
// Replace tempId with persistedId in all relation/hasMany VALUE references
|
|
262
314
|
this.relations.replaceEntityId(tempId, persistedId)
|
|
263
315
|
|
|
264
|
-
// Rekey errors and
|
|
316
|
+
// Rekey errors, touched state, and propagation tracking
|
|
265
317
|
this.errors.rekey(oldKey, newKey, oldKeyPrefix, newKeyPrefix)
|
|
266
318
|
this.touched.rekey(oldKeyPrefix, newKeyPrefix)
|
|
319
|
+
this.rekeyPropagatedData(oldKeyPrefix, newKeyPrefix)
|
|
267
320
|
|
|
268
321
|
// Notify on the NEW key so React picks up the change
|
|
269
322
|
this.notifyEntitySubscribers(newKey)
|
|
@@ -817,6 +870,7 @@ export class SnapshotStore implements SnapshotVersionBumper {
|
|
|
817
870
|
this.relations.clear()
|
|
818
871
|
this.errors.clear()
|
|
819
872
|
this.touched.clear()
|
|
873
|
+
this.lastPropagatedData.clear()
|
|
820
874
|
|
|
821
875
|
this.subscriptions.notify()
|
|
822
876
|
}
|