@contember/bindx 0.1.34 → 0.1.35
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/index.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export { ComponentBrand } from './brand/ComponentBrand.js';
|
|
|
11
11
|
export type { BackendAdapter, QueryOptions, Query, GetQuery, ListQuery, QueryResult, GetQueryResult, ListQueryResult, PersistResult, CreateResult, DeleteResult, MockDataStore, MockAdapterOptions, ContemberAdapterOptions, EntityUniqueWhere, UniqueWhereValue, TransactionMutation as AdapterTransactionMutation, TransactionMutationResult as AdapterTransactionMutationResult, TransactionResult as AdapterTransactionResult, } from './adapter/index.js';
|
|
12
12
|
export type { EntityLoadResult, EntityListLoadResult, LoadEntityOptions, LoadEntityListOptions, SelectionInput, FluentDefiner as CoreFluentDefiner, MutationDataCollector, } from './core/index.js';
|
|
13
13
|
export type { EntitySnapshot, FieldSnapshot, HasOneRelationSnapshot, HasManySnapshot, EntityState, LoadStatus, } from './store/snapshots.js';
|
|
14
|
-
export { scalar, hasOne, hasMany, defineSchema, entityDef, roleEntityDef, SchemaRegistry, ContemberSchema, SchemaLoader } from './schema/index.js';
|
|
14
|
+
export { scalar, enumScalar, hasOne, hasMany, defineSchema, entityDef, roleEntityDef, SchemaRegistry, ContemberSchema, SchemaLoader } from './schema/index.js';
|
|
15
15
|
export type { UnionToIntersection, RoleNames, CommonEntity, EntityForRoles, ResolveEntity, SingleRoleMap, DefaultRole, } from './schema/index.js';
|
|
16
16
|
export { DEFAULT_ROLE } from './schema/index.js';
|
|
17
17
|
export type { SchemaColumnType, SchemaColumn, SchemaRelationOrderBy, OwningRelation, InverseRelation, SchemaRelation, SchemaField, SchemaEntity, SchemaEnum, ContemberSchemaStore, RawContemberSchema, SchemaLoaderClient, } from './schema/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,YAAY,EACX,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,cAAc,GACd,MAAM,mBAAmB,CAAA;AAG1B,YAAY,EACX,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,cAAc,EACd,cAAc,EACd,SAAS,EACT,cAAc,EAEd,WAAW,EACX,aAAa,EACb,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,YAAY,GACZ,MAAM,sBAAsB,CAAA;AAG7B,YAAY,EACX,mBAAmB,EACnB,UAAU,EACV,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,UAAU,EACV,WAAW,EACX,UAAU,EACV,YAAY,EAEZ,QAAQ,EACR,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,SAAS,EACT,kBAAkB,EAElB,aAAa,EACb,eAAe,EACf,cAAc,EACd,cAAc,EAEd,uBAAuB,EACvB,wBAAwB,EACxB,cAAc,GACd,MAAM,oBAAoB,CAAA;AAG3B,YAAY,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAG1D,YAAY,EACX,cAAc,EACd,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,SAAS,EACT,WAAW,EACX,cAAc,EACd,eAAe,EACf,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,IAAI,0BAA0B,EACjD,yBAAyB,IAAI,gCAAgC,EAC7D,iBAAiB,IAAI,wBAAwB,GAC7C,MAAM,oBAAoB,CAAA;AAG3B,YAAY,EACX,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,aAAa,IAAI,iBAAiB,EAClC,qBAAqB,GACrB,MAAM,iBAAiB,CAAA;AAGxB,YAAY,EACX,cAAc,EACd,aAAa,EACb,sBAAsB,EACtB,eAAe,EACf,WAAW,EACX,UAAU,GACV,MAAM,sBAAsB,CAAA;AAO7B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -107,12 +107,37 @@ export declare class MutationCollector implements MutationDataCollector {
|
|
|
107
107
|
*/
|
|
108
108
|
private isExistingEntity;
|
|
109
109
|
/**
|
|
110
|
-
* Materializes
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
|
|
115
|
-
|
|
110
|
+
* Materializes all relation state into trackable store entities on the
|
|
111
|
+
* create path: placeholder-backed 'creating' hasOne relations AND embedded
|
|
112
|
+
* inline objects/arrays in the snapshot data. After this pass, the
|
|
113
|
+
* collection phase is a pure read over the store.
|
|
114
|
+
*
|
|
115
|
+
* Called recursively for every newly materialized temp entity (both from
|
|
116
|
+
* placeholder and embedded paths), since a newly-created entity can itself
|
|
117
|
+
* carry further embedded or placeholder data.
|
|
118
|
+
*/
|
|
119
|
+
private materializeForCreate;
|
|
120
|
+
/**
|
|
121
|
+
* Materializes placeholder-backed 'creating' hasOne relations only. Safe
|
|
122
|
+
* to call on existing (server-side) entities — never touches hasMany state
|
|
123
|
+
* or embedded snapshot data, because for an already-persisted parent the
|
|
124
|
+
* store-level hasMany/connected state is already authoritative.
|
|
125
|
+
*
|
|
126
|
+
* Newly created temp entities below still go through the full create-path
|
|
127
|
+
* materialization, since they have no server state yet.
|
|
128
|
+
*/
|
|
129
|
+
private materializeForUpdate;
|
|
130
|
+
/**
|
|
131
|
+
* Materializes a hasOne relation in the 'creating' state with non-empty
|
|
132
|
+
* placeholderData (PlaceholderHandle pattern). Creates a real store entity
|
|
133
|
+
* from the placeholder data and flips the relation to 'connected' with a
|
|
134
|
+
* temp ID, so subsequent collection goes through the standard
|
|
135
|
+
* tempId-inline-create branch and post-persist ID mapping works.
|
|
136
|
+
*
|
|
137
|
+
* Returns true if materialization happened (caller should skip embedded
|
|
138
|
+
* processing for this field).
|
|
139
|
+
*/
|
|
140
|
+
private materializePlaceholderHasOne;
|
|
116
141
|
/**
|
|
117
142
|
* Materializes an embedded hasMany array into store entities.
|
|
118
143
|
* Skips if the hasMany state already has store-managed entities.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MutationCollector.d.ts","sourceRoot":"","sources":["../../src/persistence/MutationCollector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAA2B,MAAM,2BAA2B,CAAA;AAEvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAGvD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,kDAAkD;IAClD,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACpC,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,YAAW,qBAAqB;IAO7D,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAPhC,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;IAC1D,oFAAoF;IACpF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAiC;gBAGlD,KAAK,EAAE,aAAa,EACpB,cAAc,EAAE,sBAAsB;IAGxD;;;;OAIG;IACH,mBAAmB,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI;IAMnD;;;;OAIG;IACH,kBAAkB,IAAI,WAAW,CAAC,MAAM,CAAC;IAIzC;;;OAGG;IACH,oBAAoB,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAMnD;;;OAGG;IACH,eAAe,CACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACd,oBAAoB,GAAG,IAAI;IAkD9B;;;OAGG;IACH,iBAAiB,CAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"MutationCollector.d.ts","sourceRoot":"","sources":["../../src/persistence/MutationCollector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAA2B,MAAM,2BAA2B,CAAA;AAEvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAGvD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,kDAAkD;IAClD,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACpC,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,YAAW,qBAAqB;IAO7D,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAPhC,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;IAC1D,oFAAoF;IACpF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAiC;gBAGlD,KAAK,EAAE,aAAa,EACpB,cAAc,EAAE,sBAAsB;IAGxD;;;;OAIG;IACH,mBAAmB,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI;IAMnD;;;;OAIG;IACH,kBAAkB,IAAI,WAAW,CAAC,MAAM,CAAC;IAIzC;;;OAGG;IACH,oBAAoB,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAMnD;;;OAGG;IACH,eAAe,CACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACd,oBAAoB,GAAG,IAAI;IAkD9B;;;OAGG;IACH,iBAAiB,CAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA2BjC;;;OAGG;IACH,iBAAiB,CAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAiDjC;;;OAGG;IACH,iBAAiB,CAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,SAAS,MAAM,EAAE,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA6CjC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAwB9B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAgF9B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA8BhC;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAuEhC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA+BjC;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAgDzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;;;;;;;OASG;IACH,OAAO,CAAC,oBAAoB;IA4B5B;;;;;;;;OAQG;IACH,OAAO,CAAC,oBAAoB;IAS5B;;;;;;;;;OASG;IACH,OAAO,CAAC,4BAA4B;IAwBpC;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IA0ClC;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IA8CjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAa1B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contember/bindx",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.35",
|
|
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.35",
|
|
21
21
|
"@contember/graphql-builder": "^2.1.0-beta.1",
|
|
22
22
|
"@contember/graphql-client": "^2.1.0-beta.1"
|
|
23
23
|
},
|
package/src/index.ts
CHANGED
|
@@ -126,7 +126,7 @@ export type {
|
|
|
126
126
|
// ============================================================================
|
|
127
127
|
|
|
128
128
|
// Schema utilities
|
|
129
|
-
export { scalar, hasOne, hasMany, defineSchema, entityDef, roleEntityDef, SchemaRegistry, ContemberSchema, SchemaLoader } from './schema/index.js'
|
|
129
|
+
export { scalar, enumScalar, hasOne, hasMany, defineSchema, entityDef, roleEntityDef, SchemaRegistry, ContemberSchema, SchemaLoader } from './schema/index.js'
|
|
130
130
|
|
|
131
131
|
// Role types
|
|
132
132
|
export type {
|
|
@@ -149,6 +149,12 @@ export class MutationCollector implements MutationDataCollector {
|
|
|
149
149
|
// Collect scalar field changes
|
|
150
150
|
this.collectScalarChanges(entityType, snapshot, mutation)
|
|
151
151
|
|
|
152
|
+
// Materialize placeholder-backed creating-state hasOne relations before
|
|
153
|
+
// collecting, so the collection phase can remain a pure read over the
|
|
154
|
+
// store. Embedded data is not materialized here — for existing
|
|
155
|
+
// (server-side) parents, hasMany state is already authoritative.
|
|
156
|
+
this.materializeForUpdate(entityType, entityId)
|
|
157
|
+
|
|
152
158
|
// Collect relation changes
|
|
153
159
|
this.collectRelationChanges(entityType, entityId, mutation)
|
|
154
160
|
|
|
@@ -188,7 +194,7 @@ export class MutationCollector implements MutationDataCollector {
|
|
|
188
194
|
|
|
189
195
|
// Materialize embedded relation data into store entities,
|
|
190
196
|
// then collect from store for consistent tracking and post-persist ID mapping
|
|
191
|
-
this.
|
|
197
|
+
this.materializeForCreate(entityType, entityId)
|
|
192
198
|
|
|
193
199
|
// Collect relation values from store
|
|
194
200
|
const relationFields = this.schemaProvider.getRelationFields(entityType)
|
|
@@ -378,12 +384,21 @@ export class MutationCollector implements MutationDataCollector {
|
|
|
378
384
|
return { delete: true }
|
|
379
385
|
|
|
380
386
|
case 'creating':
|
|
381
|
-
//
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
387
|
+
// Empty placeholderData is a legitimate no-op (user opened a create
|
|
388
|
+
// form but typed nothing). Non-empty placeholderData reaching this
|
|
389
|
+
// branch is an invariant violation — the materialization pass
|
|
390
|
+
// (materializeForCreate / materializeForUpdate) must run before
|
|
391
|
+
// collection and flip the relation to 'connected' with a tempId.
|
|
392
|
+
// Reaching here means a caller skipped materialization, which
|
|
393
|
+
// would produce a mutation the server accepts but whose returned
|
|
394
|
+
// ID we can't map back (see issue #23).
|
|
395
|
+
if (Object.keys(placeholderData).length === 0) {
|
|
396
|
+
return null
|
|
385
397
|
}
|
|
386
|
-
|
|
398
|
+
throw new Error(
|
|
399
|
+
`Invariant: hasOne relation ${entityType}.${fieldName} in 'creating' state ` +
|
|
400
|
+
`with non-empty placeholderData must be materialized before collection`,
|
|
401
|
+
)
|
|
387
402
|
|
|
388
403
|
default:
|
|
389
404
|
return null
|
|
@@ -592,15 +607,19 @@ export class MutationCollector implements MutationDataCollector {
|
|
|
592
607
|
return isPersistedId(id)
|
|
593
608
|
}
|
|
594
609
|
|
|
595
|
-
// ====================
|
|
610
|
+
// ==================== Materialization ====================
|
|
596
611
|
|
|
597
612
|
/**
|
|
598
|
-
* Materializes
|
|
599
|
-
*
|
|
600
|
-
*
|
|
601
|
-
*
|
|
613
|
+
* Materializes all relation state into trackable store entities on the
|
|
614
|
+
* create path: placeholder-backed 'creating' hasOne relations AND embedded
|
|
615
|
+
* inline objects/arrays in the snapshot data. After this pass, the
|
|
616
|
+
* collection phase is a pure read over the store.
|
|
617
|
+
*
|
|
618
|
+
* Called recursively for every newly materialized temp entity (both from
|
|
619
|
+
* placeholder and embedded paths), since a newly-created entity can itself
|
|
620
|
+
* carry further embedded or placeholder data.
|
|
602
621
|
*/
|
|
603
|
-
private
|
|
622
|
+
private materializeForCreate(entityType: string, entityId: string): void {
|
|
604
623
|
if (!this.schemaProvider.hasEntity(entityType)) return
|
|
605
624
|
|
|
606
625
|
const snapshot = this.store.getEntitySnapshot(entityType, entityId)
|
|
@@ -610,19 +629,76 @@ export class MutationCollector implements MutationDataCollector {
|
|
|
610
629
|
const relationFields = this.schemaProvider.getRelationFields(entityType)
|
|
611
630
|
|
|
612
631
|
for (const fieldName of relationFields) {
|
|
613
|
-
const value = data[fieldName]
|
|
614
|
-
if (value === null || value === undefined) continue
|
|
615
|
-
|
|
616
632
|
const relationType = this.schemaProvider.getRelationType(entityType, fieldName)
|
|
617
633
|
|
|
618
|
-
if (relationType === 'hasOne'
|
|
619
|
-
this.
|
|
620
|
-
|
|
621
|
-
|
|
634
|
+
if (relationType === 'hasOne') {
|
|
635
|
+
if (this.materializePlaceholderHasOne(entityType, entityId, fieldName)) continue
|
|
636
|
+
|
|
637
|
+
const value = data[fieldName]
|
|
638
|
+
if (value !== null && value !== undefined && typeof value === 'object' && !Array.isArray(value)) {
|
|
639
|
+
this.materializeEmbeddedHasOne(entityType, entityId, fieldName, value as Record<string, unknown>)
|
|
640
|
+
}
|
|
641
|
+
} else if (relationType === 'hasMany') {
|
|
642
|
+
const value = data[fieldName]
|
|
643
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
644
|
+
this.materializeEmbeddedHasMany(entityType, entityId, fieldName, value)
|
|
645
|
+
}
|
|
622
646
|
}
|
|
623
647
|
}
|
|
624
648
|
}
|
|
625
649
|
|
|
650
|
+
/**
|
|
651
|
+
* Materializes placeholder-backed 'creating' hasOne relations only. Safe
|
|
652
|
+
* to call on existing (server-side) entities — never touches hasMany state
|
|
653
|
+
* or embedded snapshot data, because for an already-persisted parent the
|
|
654
|
+
* store-level hasMany/connected state is already authoritative.
|
|
655
|
+
*
|
|
656
|
+
* Newly created temp entities below still go through the full create-path
|
|
657
|
+
* materialization, since they have no server state yet.
|
|
658
|
+
*/
|
|
659
|
+
private materializeForUpdate(entityType: string, entityId: string): void {
|
|
660
|
+
if (!this.schemaProvider.hasEntity(entityType)) return
|
|
661
|
+
|
|
662
|
+
for (const fieldName of this.schemaProvider.getRelationFields(entityType)) {
|
|
663
|
+
if (this.schemaProvider.getRelationType(entityType, fieldName) !== 'hasOne') continue
|
|
664
|
+
this.materializePlaceholderHasOne(entityType, entityId, fieldName)
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/**
|
|
669
|
+
* Materializes a hasOne relation in the 'creating' state with non-empty
|
|
670
|
+
* placeholderData (PlaceholderHandle pattern). Creates a real store entity
|
|
671
|
+
* from the placeholder data and flips the relation to 'connected' with a
|
|
672
|
+
* temp ID, so subsequent collection goes through the standard
|
|
673
|
+
* tempId-inline-create branch and post-persist ID mapping works.
|
|
674
|
+
*
|
|
675
|
+
* Returns true if materialization happened (caller should skip embedded
|
|
676
|
+
* processing for this field).
|
|
677
|
+
*/
|
|
678
|
+
private materializePlaceholderHasOne(
|
|
679
|
+
entityType: string,
|
|
680
|
+
entityId: string,
|
|
681
|
+
fieldName: string,
|
|
682
|
+
): boolean {
|
|
683
|
+
const relation = this.store.getRelation(entityType, entityId, fieldName)
|
|
684
|
+
if (!relation || relation.state !== 'creating') return false
|
|
685
|
+
if (Object.keys(relation.placeholderData).length === 0) return false
|
|
686
|
+
|
|
687
|
+
const targetType = this.schemaProvider.getRelationTarget(entityType, fieldName)
|
|
688
|
+
if (!targetType) return false
|
|
689
|
+
|
|
690
|
+
const tempId = this.store.createEntity(targetType, relation.placeholderData)
|
|
691
|
+
this.store.setRelation(entityType, entityId, fieldName, {
|
|
692
|
+
currentId: tempId,
|
|
693
|
+
state: 'connected',
|
|
694
|
+
placeholderData: {},
|
|
695
|
+
})
|
|
696
|
+
|
|
697
|
+
// Newly created temp entity — walk its embedded/placeholder data too.
|
|
698
|
+
this.materializeForCreate(targetType, tempId)
|
|
699
|
+
return true
|
|
700
|
+
}
|
|
701
|
+
|
|
626
702
|
/**
|
|
627
703
|
* Materializes an embedded hasMany array into store entities.
|
|
628
704
|
* Skips if the hasMany state already has store-managed entities.
|
|
@@ -662,7 +738,7 @@ export class MutationCollector implements MutationDataCollector {
|
|
|
662
738
|
this.store.addToHasMany(entityType, entityId, fieldName, tempId)
|
|
663
739
|
|
|
664
740
|
// Recursively materialize nested relations in the new entity
|
|
665
|
-
this.
|
|
741
|
+
this.materializeForCreate(targetType, tempId)
|
|
666
742
|
}
|
|
667
743
|
|
|
668
744
|
// Clear embedded array from parent snapshot
|
|
@@ -712,7 +788,7 @@ export class MutationCollector implements MutationDataCollector {
|
|
|
712
788
|
})
|
|
713
789
|
|
|
714
790
|
// Recursively materialize nested relations
|
|
715
|
-
this.
|
|
791
|
+
this.materializeForCreate(targetType, tempId)
|
|
716
792
|
}
|
|
717
793
|
|
|
718
794
|
// Clear embedded data from parent snapshot
|