@contember/bindx 0.1.47 → 0.1.49
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/adapter/MockAdapter.d.ts +4 -1
- package/dist/adapter/MockAdapter.d.ts.map +1 -1
- package/dist/persistence/MutationCollector.d.ts +9 -0
- package/dist/persistence/MutationCollector.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/adapter/MockAdapter.ts +15 -5
- package/src/persistence/MutationCollector.ts +46 -11
|
@@ -57,7 +57,10 @@ export declare class MockAdapter implements BackendAdapter {
|
|
|
57
57
|
*/
|
|
58
58
|
private resolveRelatedEntity;
|
|
59
59
|
/**
|
|
60
|
-
* Creates a related entity with a generated ID
|
|
60
|
+
* Creates a related entity with a generated ID, materializing its own nested
|
|
61
|
+
* operations. The persister reconciles a create by reading server IDs out of
|
|
62
|
+
* the echoed node, so a nested create left as a raw `{ create: … }` operation
|
|
63
|
+
* reads as an unresolved ID and fails the whole persist.
|
|
61
64
|
*/
|
|
62
65
|
private createRelatedEntity;
|
|
63
66
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MockAdapter.d.ts","sourceRoot":"","sources":["../../src/adapter/MockAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAmC,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAG9J;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC3B,CAAC,UAAU,EAAE,MAAM,GAAG;QACrB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACrC,CAAA;CACD,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;;GAGG;AACH,qBAAa,WAAY,YAAW,cAAc;IAMhD,OAAO,CAAC,KAAK;IALd,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiB;gBAGpC,KAAK,EAAE,aAAa,EAC5B,OAAO,GAAE,kBAAuB;IAOjC;;OAEG;YACW,aAAa;IA0B3B;;OAEG;IACH,OAAO,CAAC,GAAG;IAML,KAAK,CAAC,OAAO,EAAE,SAAS,KAAK,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAetF,OAAO,CAAC,UAAU;IAiClB,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,YAAY;IAed,OAAO,CACZ,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"MockAdapter.d.ts","sourceRoot":"","sources":["../../src/adapter/MockAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAmC,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAG9J;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC3B,CAAC,UAAU,EAAE,MAAM,GAAG;QACrB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACrC,CAAA;CACD,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;;GAGG;AACH,qBAAa,WAAY,YAAW,cAAc;IAMhD,OAAO,CAAC,KAAK;IALd,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiB;gBAGpC,KAAK,EAAE,aAAa,EAC5B,OAAO,GAAE,kBAAuB;IAOjC;;OAEG;YACW,aAAa;IA0B3B;;OAEG;IACH,OAAO,CAAC,GAAG;IAML,KAAK,CAAC,OAAO,EAAE,SAAS,KAAK,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAetF,OAAO,CAAC,UAAU;IAiClB,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,YAAY;IAed,OAAO,CACZ,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,aAAa,CAAC;IA6BzB;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAuDpB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA0D9B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAM3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IASrB,MAAM,CACX,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,OAAO,CAAC,YAAY,CAAC;IAuBlB,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAYnE;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,QAAQ,IAAI,aAAa;IAIzB;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;CAGzC"}
|
|
@@ -108,6 +108,14 @@ export declare class MutationCollector implements MutationDataCollector {
|
|
|
108
108
|
private readonly _relationFields;
|
|
109
109
|
private readonly _nestedCreates;
|
|
110
110
|
private readonly _nestedUpdates;
|
|
111
|
+
/**
|
|
112
|
+
* Entities whose data collection is still on the stack. A schema may point two
|
|
113
|
+
* hasOne relations back at each other (`page.publishedRevision` ↔ `revision.page`),
|
|
114
|
+
* and once both sides are in the store the nested-update walk would recurse until
|
|
115
|
+
* the stack blows. Re-entering an entity means an ancestor frame already emits its
|
|
116
|
+
* changes, so the inner edge contributes nothing (see issue #88).
|
|
117
|
+
*/
|
|
118
|
+
private readonly _collecting;
|
|
111
119
|
constructor(store: SnapshotStore, schemaProvider: MutationSchemaProvider);
|
|
112
120
|
/** Creates an isolated collection session for one persist operation. */
|
|
113
121
|
forkSession(): MutationCollector;
|
|
@@ -168,6 +176,7 @@ export declare class MutationCollector implements MutationDataCollector {
|
|
|
168
176
|
* Returns the create data or null if empty.
|
|
169
177
|
*/
|
|
170
178
|
collectCreateData(entityType: string, entityId: string): Record<string, unknown> | null;
|
|
179
|
+
private buildCreateData;
|
|
171
180
|
/**
|
|
172
181
|
* Collects mutation data for specific fields only.
|
|
173
182
|
* Returns the mutation data containing only the specified fields.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MutationCollector.d.ts","sourceRoot":"","sources":["../../src/persistence/MutationCollector.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"MutationCollector.d.ts","sourceRoot":"","sources":["../../src/persistence/MutationCollector.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.49",
|
|
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.49",
|
|
21
21
|
"@contember/graphql-client": "^2.1.0-beta.1"
|
|
22
22
|
},
|
|
23
23
|
"repository": {
|
|
@@ -194,7 +194,9 @@ export class MockAdapter implements BackendAdapter {
|
|
|
194
194
|
this.applyChanges(entity, changes)
|
|
195
195
|
this.log('persist result', entity)
|
|
196
196
|
|
|
197
|
-
|
|
197
|
+
// Echo the mutated node — PersistResult.data is what the persister reads
|
|
198
|
+
// nested create IDs out of.
|
|
199
|
+
return { ok: true, data: entity }
|
|
198
200
|
}
|
|
199
201
|
|
|
200
202
|
/**
|
|
@@ -335,11 +337,15 @@ export class MockAdapter implements BackendAdapter {
|
|
|
335
337
|
}
|
|
336
338
|
|
|
337
339
|
/**
|
|
338
|
-
* Creates a related entity with a generated ID
|
|
340
|
+
* Creates a related entity with a generated ID, materializing its own nested
|
|
341
|
+
* operations. The persister reconciles a create by reading server IDs out of
|
|
342
|
+
* the echoed node, so a nested create left as a raw `{ create: … }` operation
|
|
343
|
+
* reads as an unresolved ID and fails the whole persist.
|
|
339
344
|
*/
|
|
340
345
|
private createRelatedEntity(data: Record<string, unknown>): Record<string, unknown> {
|
|
341
|
-
const
|
|
342
|
-
|
|
346
|
+
const entity: Record<string, unknown> = { id: this.generateId() }
|
|
347
|
+
this.applyChanges(entity, data)
|
|
348
|
+
return entity
|
|
343
349
|
}
|
|
344
350
|
|
|
345
351
|
/**
|
|
@@ -368,7 +374,11 @@ export class MockAdapter implements BackendAdapter {
|
|
|
368
374
|
|
|
369
375
|
// Generate ID if not provided
|
|
370
376
|
const id = (data['id'] as string) ?? this.generateId()
|
|
371
|
-
|
|
377
|
+
// Materialize relation operations so the echoed node carries the server IDs
|
|
378
|
+
// of every nested create — the persister reconciles against exactly that.
|
|
379
|
+
const entity: Record<string, unknown> = { id }
|
|
380
|
+
this.applyChanges(entity, data)
|
|
381
|
+
entity['id'] = id
|
|
372
382
|
|
|
373
383
|
this.store[entityType]![id] = entity
|
|
374
384
|
this.log('create result', entity)
|
|
@@ -102,6 +102,14 @@ export class MutationCollector implements MutationDataCollector {
|
|
|
102
102
|
private readonly _relationFields = new Map<string, CollectedRelationField>()
|
|
103
103
|
private readonly _nestedCreates: CollectedNestedCreate[] = []
|
|
104
104
|
private readonly _nestedUpdates: CollectedNestedUpdate[] = []
|
|
105
|
+
/**
|
|
106
|
+
* Entities whose data collection is still on the stack. A schema may point two
|
|
107
|
+
* hasOne relations back at each other (`page.publishedRevision` ↔ `revision.page`),
|
|
108
|
+
* and once both sides are in the store the nested-update walk would recurse until
|
|
109
|
+
* the stack blows. Re-entering an entity means an ancestor frame already emits its
|
|
110
|
+
* changes, so the inner edge contributes nothing (see issue #88).
|
|
111
|
+
*/
|
|
112
|
+
private readonly _collecting = new Set<string>()
|
|
105
113
|
|
|
106
114
|
constructor(
|
|
107
115
|
private readonly store: SnapshotStore,
|
|
@@ -133,6 +141,7 @@ export class MutationCollector implements MutationDataCollector {
|
|
|
133
141
|
this._relationFields.clear()
|
|
134
142
|
this._nestedCreates.length = 0
|
|
135
143
|
this._nestedUpdates.length = 0
|
|
144
|
+
this._collecting.clear()
|
|
136
145
|
}
|
|
137
146
|
|
|
138
147
|
setExcludedEntityKeys(keys: ReadonlySet<string>): void {
|
|
@@ -313,21 +322,30 @@ export class MutationCollector implements MutationDataCollector {
|
|
|
313
322
|
throw new Error(`Entity type '${entityType}' not found in schema`)
|
|
314
323
|
}
|
|
315
324
|
|
|
316
|
-
const
|
|
325
|
+
const key = this.entityKey(entityType, entityId)
|
|
326
|
+
if (this._collecting.has(key)) {
|
|
327
|
+
return null
|
|
328
|
+
}
|
|
329
|
+
this._collecting.add(key)
|
|
330
|
+
try {
|
|
331
|
+
const mutation: Record<string, unknown> = {}
|
|
317
332
|
|
|
318
|
-
|
|
319
|
-
|
|
333
|
+
// Collect scalar field changes
|
|
334
|
+
this.collectScalarChanges(entityType, snapshot, mutation)
|
|
320
335
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
336
|
+
// Materialize placeholder-backed creating-state hasOne relations before
|
|
337
|
+
// collecting, so the collection phase can remain a pure read over the
|
|
338
|
+
// store. Embedded data is not materialized here — for existing
|
|
339
|
+
// (server-side) parents, hasMany state is already authoritative.
|
|
340
|
+
this.materializeForUpdate(entityType, entityId)
|
|
326
341
|
|
|
327
|
-
|
|
328
|
-
|
|
342
|
+
// Collect relation changes
|
|
343
|
+
this.collectRelationChanges(entityType, entityId, mutation)
|
|
329
344
|
|
|
330
|
-
|
|
345
|
+
return Object.keys(mutation).length > 0 ? mutation : null
|
|
346
|
+
} finally {
|
|
347
|
+
this._collecting.delete(key)
|
|
348
|
+
}
|
|
331
349
|
}
|
|
332
350
|
|
|
333
351
|
/**
|
|
@@ -347,6 +365,23 @@ export class MutationCollector implements MutationDataCollector {
|
|
|
347
365
|
throw new Error(`Entity type '${entityType}' not found in schema`)
|
|
348
366
|
}
|
|
349
367
|
|
|
368
|
+
const key = this.entityKey(entityType, entityId)
|
|
369
|
+
if (this._collecting.has(key)) {
|
|
370
|
+
return null
|
|
371
|
+
}
|
|
372
|
+
this._collecting.add(key)
|
|
373
|
+
try {
|
|
374
|
+
return this.buildCreateData(entityType, entityId, snapshot)
|
|
375
|
+
} finally {
|
|
376
|
+
this._collecting.delete(key)
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
private buildCreateData(
|
|
381
|
+
entityType: string,
|
|
382
|
+
entityId: string,
|
|
383
|
+
snapshot: EntitySnapshot,
|
|
384
|
+
): Record<string, unknown> | null {
|
|
350
385
|
const data = snapshot.data as Record<string, unknown>
|
|
351
386
|
const createData: Record<string, unknown> = {}
|
|
352
387
|
|