@warp-drive/legacy 5.9.0-alpha.2 → 5.9.0-alpha.21
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 +6 -0
- package/declarations/adapter/-private/build-url-mixin.d.ts +156 -0
- package/declarations/adapter/error.d.ts +385 -169
- package/declarations/adapter/json-api.d.ts +12 -1
- package/declarations/adapter/rest.d.ts +74 -0
- package/declarations/adapter.d.ts +6 -0
- package/declarations/compat/builders/find-all.d.ts +0 -1
- package/declarations/compat/extensions.d.ts +40 -0
- package/declarations/compat/legacy-network-handler/legacy-network-handler.d.ts +7 -0
- package/declarations/compat/legacy-network-handler/minimum-adapter-interface.d.ts +4 -0
- package/declarations/compat/legacy-network-handler/minimum-serializer-interface.d.ts +7 -0
- package/declarations/compat/utils.d.ts +11 -0
- package/declarations/compat.d.ts +32 -0
- package/declarations/index.d.ts +142 -0
- package/declarations/model/-private/attr.d.ts +21 -0
- package/declarations/model/-private/belongs-to.d.ts +21 -0
- package/declarations/model/-private/hooks.d.ts +26 -0
- package/declarations/model/-private/model.d.ts +55 -4
- package/declarations/model/-private/promise-many-array.d.ts +25 -1
- package/declarations/model/-private/schema-provider.d.ts +11 -1
- package/declarations/model/migration-support.d.ts +31 -5
- package/declarations/model-fragments/extensions/fragment-array.d.ts +38 -0
- package/declarations/model-fragments/extensions/fragment.d.ts +35 -0
- package/declarations/model-fragments/hooks/model-for.d.ts +7 -0
- package/declarations/model-fragments/index.d.ts +8 -0
- package/declarations/model-fragments/instance-initializers/fragment-extensions.d.ts +6 -0
- package/declarations/model-fragments/utilities/with-array-defaults.d.ts +30 -0
- package/declarations/model-fragments/utilities/with-fragment-array-defaults.d.ts +18 -0
- package/declarations/model-fragments/utilities/with-fragment-defaults.d.ts +15 -0
- package/declarations/model-fragments/utilities/with-legacy.d.ts +8 -0
- package/declarations/serializer/-private/transforms/boolean.d.ts +13 -0
- package/declarations/serializer/-private/transforms/date.d.ts +15 -1
- package/declarations/serializer/-private/transforms/number.d.ts +14 -1
- package/declarations/serializer/-private/transforms/string.d.ts +14 -1
- package/declarations/serializer/-private/utils.d.ts +24 -0
- package/declarations/serializer/json-api.d.ts +1 -1
- package/declarations/serializer.d.ts +4 -6
- package/declarations/store/-private.d.ts +2 -2
- package/declarations/store.d.ts +7 -0
- package/dist/adapter/error.js +386 -241
- package/dist/adapter/json-api.js +12 -0
- package/dist/adapter/rest.js +39 -3
- package/dist/adapter.js +23 -26
- package/dist/compat/builders.js +0 -1
- package/dist/compat/extensions.js +80 -3
- package/dist/compat/utils.js +14 -0
- package/dist/compat.js +17 -0
- package/dist/{errors-Cz5KrzBk.js → errors-DZKA206g.js} +24 -1
- package/dist/{hooks-D6diaM34.js → hooks-BvOqJBei.js} +33 -2
- package/dist/index.js +168 -13
- package/dist/{json-ChdEfB0X.js → json-DU8m1pGf.js} +83 -6
- package/dist/model/-private.js +1 -1
- package/dist/model/migration-support.js +15 -2
- package/dist/{unpkg/dev-deprecated/model-for-CqXsIKws.js → model-for-CXkJw59V.js} +77 -1
- package/dist/model-fragments.js +18 -2
- package/dist/model.js +12 -8
- package/dist/{schema-provider-DJCV_6AF.js → schema-provider-DtPOp0d7.js} +93 -6
- package/dist/serializer/json-api.js +8 -3
- package/dist/serializer/json.js +1 -1
- package/dist/serializer/rest.js +3 -4
- package/dist/serializer/transform.js +51 -3
- package/dist/serializer.js +4 -7
- package/dist/store.js +13 -7
- package/dist/unpkg/dev/adapter/error.js +386 -241
- package/dist/unpkg/dev/adapter/json-api.js +13 -1
- package/dist/unpkg/dev/adapter/rest.js +39 -3
- package/dist/unpkg/dev/adapter.js +23 -26
- package/dist/unpkg/dev/compat/builders.js +0 -1
- package/dist/unpkg/dev/compat/extensions.js +80 -3
- package/dist/unpkg/dev/compat/utils.js +14 -0
- package/dist/unpkg/dev/compat.js +34 -1
- package/dist/unpkg/dev/{errors-DmGGJr3T.js → errors-DngRU-If.js} +24 -1
- package/dist/unpkg/dev/{hooks-CkYiE6Ud.js → hooks-UuiLxWxS.js} +33 -2
- package/dist/unpkg/dev/index.js +171 -13
- package/dist/unpkg/dev/json-K2Y9z6MN.js +1333 -0
- package/dist/unpkg/dev/model/-private.js +1 -1
- package/dist/unpkg/dev/model/migration-support.js +16 -2
- package/dist/unpkg/{prod-deprecated/model-for-CqXsIKws.js → dev/model-for-CXkJw59V.js} +77 -1
- package/dist/unpkg/dev/model-fragments.js +18 -2
- package/dist/unpkg/dev/model.js +12 -8
- package/dist/unpkg/dev/{schema-provider-DDVYxmUV.js → schema-provider-0D7f-QOn.js} +92 -6
- package/dist/unpkg/dev/serializer/json-api.js +9 -4
- package/dist/unpkg/dev/serializer/json.js +1 -1
- package/dist/unpkg/dev/serializer/rest.js +3 -4
- package/dist/unpkg/dev/serializer/transform.js +51 -3
- package/dist/unpkg/dev/serializer.js +4 -7
- package/dist/unpkg/dev/store.js +21 -7
- package/dist/unpkg/dev-deprecated/adapter/error.js +386 -241
- package/dist/unpkg/dev-deprecated/adapter/json-api.js +13 -1
- package/dist/unpkg/dev-deprecated/adapter/rest.js +39 -3
- package/dist/unpkg/dev-deprecated/adapter.js +23 -26
- package/dist/unpkg/dev-deprecated/compat/builders.js +0 -1
- package/dist/unpkg/dev-deprecated/compat/extensions.js +80 -3
- package/dist/unpkg/dev-deprecated/compat/utils.js +14 -0
- package/dist/unpkg/dev-deprecated/compat.js +34 -1
- package/dist/unpkg/dev-deprecated/{errors-Spt6ubMd.js → errors-Bzidntpi.js} +24 -1
- package/dist/unpkg/dev-deprecated/{hooks-DOXegvhL.js → hooks-DVXhMW14.js} +33 -2
- package/dist/unpkg/dev-deprecated/index.js +171 -13
- package/dist/unpkg/{prod-deprecated/json-BWrZ5546.js → dev-deprecated/json-K2Y9z6MN.js} +96 -6
- package/dist/unpkg/dev-deprecated/model/-private.js +1 -1
- package/dist/unpkg/dev-deprecated/model/migration-support.js +16 -2
- package/dist/unpkg/{dev/model-for-CqXsIKws.js → dev-deprecated/model-for-CXkJw59V.js} +77 -1
- package/dist/unpkg/dev-deprecated/model-fragments.js +18 -2
- package/dist/unpkg/dev-deprecated/model.js +12 -8
- package/dist/unpkg/dev-deprecated/{schema-provider-BP6_8N-V.js → schema-provider-ZwO5_fZw.js} +84 -3
- package/dist/unpkg/dev-deprecated/serializer/json-api.js +9 -4
- package/dist/unpkg/dev-deprecated/serializer/json.js +1 -1
- package/dist/unpkg/dev-deprecated/serializer/rest.js +3 -4
- package/dist/unpkg/dev-deprecated/serializer/transform.js +51 -3
- package/dist/unpkg/dev-deprecated/serializer.js +4 -7
- package/dist/unpkg/dev-deprecated/store.js +21 -7
- package/dist/unpkg/prod/adapter/error.js +386 -241
- package/dist/unpkg/prod/adapter/json-api.js +13 -1
- package/dist/unpkg/prod/adapter/rest.js +39 -3
- package/dist/unpkg/prod/adapter.js +23 -26
- package/dist/unpkg/prod/compat/builders.js +0 -1
- package/dist/unpkg/prod/compat/extensions.js +70 -3
- package/dist/unpkg/prod/compat/utils.js +14 -0
- package/dist/unpkg/prod/compat.js +17 -0
- package/dist/unpkg/prod/{errors-BGVFCBmi.js → errors-B-PWeYlW.js} +24 -1
- package/dist/unpkg/prod/{hooks-BztVA_x0.js → hooks-Bx-zBziU.js} +32 -1
- package/dist/unpkg/prod/index.js +171 -5
- package/dist/unpkg/{dev/json-Cu1LNgmQ.js → prod/json-Qewu-UN9.js} +63 -19
- package/dist/unpkg/prod/model/-private.js +1 -1
- package/dist/unpkg/prod/model/migration-support.js +16 -2
- package/dist/unpkg/prod/model-for-CXkJw59V.js +297 -0
- package/dist/unpkg/prod/model-fragments.js +18 -2
- package/dist/unpkg/prod/model.js +12 -8
- package/dist/unpkg/prod/{schema-provider-DJtD_8jZ.js → schema-provider-BgRqk8i9.js} +96 -6
- package/dist/unpkg/prod/serializer/json-api.js +9 -4
- package/dist/unpkg/prod/serializer/json.js +1 -1
- package/dist/unpkg/prod/serializer/rest.js +3 -4
- package/dist/unpkg/prod/serializer/transform.js +51 -3
- package/dist/unpkg/prod/serializer.js +4 -7
- package/dist/unpkg/prod/store.js +21 -7
- package/dist/unpkg/prod-deprecated/adapter/error.js +386 -241
- package/dist/unpkg/prod-deprecated/adapter/json-api.js +13 -1
- package/dist/unpkg/prod-deprecated/adapter/rest.js +39 -3
- package/dist/unpkg/prod-deprecated/adapter.js +23 -26
- package/dist/unpkg/prod-deprecated/compat/builders.js +0 -1
- package/dist/unpkg/prod-deprecated/compat/extensions.js +70 -3
- package/dist/unpkg/prod-deprecated/compat/utils.js +14 -0
- package/dist/unpkg/prod-deprecated/compat.js +17 -0
- package/dist/unpkg/prod-deprecated/{errors-CdDaK81x.js → errors-Dl2J9d1D.js} +24 -1
- package/dist/unpkg/prod-deprecated/{hooks-yId87yyG.js → hooks-Cm60wWTf.js} +32 -1
- package/dist/unpkg/prod-deprecated/index.js +171 -5
- package/dist/unpkg/{dev-deprecated/json-Cu1LNgmQ.js → prod-deprecated/json-Qewu-UN9.js} +63 -19
- package/dist/unpkg/prod-deprecated/model/-private.js +1 -1
- package/dist/unpkg/prod-deprecated/model/migration-support.js +16 -2
- package/dist/{model-for-CqXsIKws.js → unpkg/prod-deprecated/model-for-CXkJw59V.js} +77 -1
- package/dist/unpkg/prod-deprecated/model-fragments.js +18 -2
- package/dist/unpkg/prod-deprecated/model.js +12 -8
- package/dist/unpkg/prod-deprecated/{schema-provider-CjX55uSY.js → schema-provider-Dh6tRqVI.js} +79 -3
- package/dist/unpkg/prod-deprecated/serializer/json-api.js +9 -4
- package/dist/unpkg/prod-deprecated/serializer/json.js +1 -1
- package/dist/unpkg/prod-deprecated/serializer/rest.js +3 -4
- package/dist/unpkg/prod-deprecated/serializer/transform.js +51 -3
- package/dist/unpkg/prod-deprecated/serializer.js +4 -7
- package/dist/unpkg/prod-deprecated/store.js +21 -7
- package/package.json +8 -8
- package/dist/unpkg/prod/json-BWrZ5546.js +0 -1243
- package/dist/unpkg/prod/model-for-CqXsIKws.js +0 -221
|
@@ -1 +1 @@
|
|
|
1
|
-
export { E as Errors, L as LEGACY_SUPPORT, P as PromiseBelongsTo, a as PromiseManyArray, l as lookupLegacySupport } from "../errors-
|
|
1
|
+
export { E as Errors, L as LEGACY_SUPPORT, P as PromiseBelongsTo, a as PromiseManyArray, l as lookupLegacySupport } from "../errors-DngRU-If.js";
|
|
@@ -4,8 +4,8 @@ import { notifyInternalSignal } from '@warp-drive/core/signals/-leaked';
|
|
|
4
4
|
import { assertPrivateStore } from '@warp-drive/core/store/-private';
|
|
5
5
|
import { getOrSetGlobal } from '@warp-drive/core/types/-private';
|
|
6
6
|
import { Type } from '@warp-drive/core/types/symbols';
|
|
7
|
-
import { l as lookupLegacySupport, E as Errors } from "../errors-
|
|
8
|
-
import { b as buildSchema, u as unloadRecord, s as serialize, _ as _save, a as save, r as rollbackAttributes, c as _reload, d as reload, h as hasMany, e as _destroyRecord, f as destroyRecord, i as deleteRecord, R as RecordState, j as changedAttributes, k as belongsTo, l as createSnapshot } from "../schema-provider-
|
|
7
|
+
import { l as lookupLegacySupport, E as Errors } from "../errors-DngRU-If.js";
|
|
8
|
+
import { b as buildSchema, u as unloadRecord, s as serialize, _ as _save, a as save, r as rollbackAttributes, c as _reload, d as reload, h as hasMany, e as _destroyRecord, f as destroyRecord, i as deleteRecord, R as RecordState, j as changedAttributes, k as belongsTo, l as createSnapshot } from "../schema-provider-0D7f-QOn.js";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* This module provides support for migrating away from @warp-drive/legacy/model
|
|
@@ -27,6 +27,12 @@ import { b as buildSchema, u as unloadRecord, s as serialize, _ as _save, a as s
|
|
|
27
27
|
* @module
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
|
+
/**
|
|
31
|
+
* Adds the `Model`-style `belongsTo`/`hasMany` reference methods to a
|
|
32
|
+
* {@link TypedRecordInstance}, for use when migrating a resource from
|
|
33
|
+
* `Model` to a schema-based record while preserving these APIs.
|
|
34
|
+
*/
|
|
35
|
+
|
|
30
36
|
// 'isDestroying', 'isDestroyed'
|
|
31
37
|
const LegacyFields = ['_createSnapshot', 'adapterError', 'belongsTo', 'changedAttributes', 'constructor', 'currentState', 'deleteRecord', 'destroyRecord', 'dirtyType', 'errors', 'hasDirtyAttributes', 'hasMany', 'isDeleted', 'isEmpty', 'isError', 'isLoaded', 'isLoading', 'isNew', 'isSaving', 'isValid', 'reload', 'rollbackAttributes', 'save', 'serialize', 'unloadRecord'];
|
|
32
38
|
|
|
@@ -423,6 +429,9 @@ function registerDerivations(schema) {
|
|
|
423
429
|
* @public
|
|
424
430
|
*/
|
|
425
431
|
|
|
432
|
+
/**
|
|
433
|
+
* See the {@link DelegatingSchemaService | class documentation above} for usage.
|
|
434
|
+
*/
|
|
426
435
|
class DelegatingSchemaService {
|
|
427
436
|
/** @internal */
|
|
428
437
|
_preferred;
|
|
@@ -432,6 +441,11 @@ class DelegatingSchemaService {
|
|
|
432
441
|
this._preferred = schema;
|
|
433
442
|
this._secondary = buildSchema(store);
|
|
434
443
|
}
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* Whether the given resource's schema is being served by the fallback
|
|
447
|
+
* (legacy Model-derived) schema service rather than the primary one.
|
|
448
|
+
*/
|
|
435
449
|
isDelegated(resource) {
|
|
436
450
|
return !this._preferred.hasResource(resource) && this._secondary.hasResource(resource);
|
|
437
451
|
}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { tracked, cached } from '@glimmer/tracking';
|
|
2
2
|
import { Context } from '@warp-drive/core/reactive/-private';
|
|
3
3
|
import { a as decorateFieldV2, i as initializeDeferredDecorator, d as decorateMethodV2 } from "./runtime-BPCpkOf1-BKOwiRJp.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The features added to an object resource by {@link FragmentExtension}, providing
|
|
7
|
+
* a subset of the legacy `ModelFragments` fragment API for migrated resources.
|
|
8
|
+
*/
|
|
4
9
|
class Fragment {
|
|
5
10
|
static {
|
|
6
11
|
decorateFieldV2(this.prototype, "isDestroying", [tracked], function () {
|
|
@@ -8,12 +13,21 @@ class Fragment {
|
|
|
8
13
|
});
|
|
9
14
|
}
|
|
10
15
|
#isDestroying = (initializeDeferredDecorator(this, "isDestroying"), void 0); // We might want to check the parent values once we move this code to warp-drive.
|
|
16
|
+
/**
|
|
17
|
+
* Whether this fragment is in the process of being destroyed.
|
|
18
|
+
*/
|
|
11
19
|
static {
|
|
12
20
|
decorateFieldV2(this.prototype, "isDestroyed", [tracked], function () {
|
|
13
21
|
return false;
|
|
14
22
|
});
|
|
15
23
|
}
|
|
16
24
|
#isDestroyed = (initializeDeferredDecorator(this, "isDestroyed"), void 0);
|
|
25
|
+
/**
|
|
26
|
+
* Whether this fragment has been destroyed.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Whether this fragment (or the attribute it is rooted at) has uncommitted changes.
|
|
30
|
+
*/
|
|
17
31
|
get hasDirtyAttributes() {
|
|
18
32
|
const {
|
|
19
33
|
path,
|
|
@@ -27,18 +41,30 @@ class Fragment {
|
|
|
27
41
|
}
|
|
28
42
|
return false;
|
|
29
43
|
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Always `true`. Used to distinguish fragments from other resources.
|
|
47
|
+
*/
|
|
30
48
|
static {
|
|
31
49
|
decorateMethodV2(this.prototype, "hasDirtyAttributes", [cached]);
|
|
32
50
|
}
|
|
33
51
|
get isFragment() {
|
|
34
52
|
return true;
|
|
35
53
|
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The resource type of this fragment, if known.
|
|
57
|
+
*/
|
|
36
58
|
get $type() {
|
|
37
59
|
const {
|
|
38
60
|
field
|
|
39
61
|
} = this[Context];
|
|
40
62
|
return field?.type;
|
|
41
63
|
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Reverts this fragment's attribute back to its last known remote value.
|
|
67
|
+
*/
|
|
42
68
|
rollbackAttributes() {
|
|
43
69
|
const {
|
|
44
70
|
path,
|
|
@@ -51,11 +77,21 @@ class Fragment {
|
|
|
51
77
|
}
|
|
52
78
|
}
|
|
53
79
|
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* A schema extension that adds the {@link Fragment} API to migrated
|
|
83
|
+
* `ModelFragments` object resources.
|
|
84
|
+
*/
|
|
54
85
|
const FragmentExtension = {
|
|
55
86
|
kind: 'object',
|
|
56
87
|
name: 'fragment',
|
|
57
88
|
features: Fragment
|
|
58
89
|
};
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* The features added to an array resource by {@link FragmentArrayExtension}, providing
|
|
93
|
+
* a subset of the legacy `ModelFragments` fragment-array API for migrated resources.
|
|
94
|
+
*/
|
|
59
95
|
class FragmentArray {
|
|
60
96
|
static {
|
|
61
97
|
decorateFieldV2(this.prototype, "isDestroying", [tracked], function () {
|
|
@@ -63,18 +99,29 @@ class FragmentArray {
|
|
|
63
99
|
});
|
|
64
100
|
}
|
|
65
101
|
#isDestroying = (initializeDeferredDecorator(this, "isDestroying"), void 0); // We might want to check the parent values once we move this code to warp-drive.
|
|
102
|
+
/**
|
|
103
|
+
* Whether this fragment array is in the process of being destroyed.
|
|
104
|
+
*/
|
|
66
105
|
static {
|
|
67
106
|
decorateFieldV2(this.prototype, "isDestroyed", [tracked], function () {
|
|
68
107
|
return false;
|
|
69
108
|
});
|
|
70
109
|
}
|
|
71
110
|
#isDestroyed = (initializeDeferredDecorator(this, "isDestroyed"), void 0);
|
|
111
|
+
/**
|
|
112
|
+
* Whether this fragment array has been destroyed.
|
|
113
|
+
*/
|
|
114
|
+
/**
|
|
115
|
+
* Whether this fragment array (or any of its members) has uncommitted changes.
|
|
116
|
+
*/
|
|
72
117
|
get hasDirtyAttributes() {
|
|
118
|
+
const array = this;
|
|
119
|
+
const context = array[Context];
|
|
73
120
|
const {
|
|
74
121
|
path,
|
|
75
122
|
resourceKey,
|
|
76
123
|
store
|
|
77
|
-
} =
|
|
124
|
+
} = context;
|
|
78
125
|
const record = store.peekRecord(resourceKey);
|
|
79
126
|
if (record.hasDirtyAttributes && path) {
|
|
80
127
|
const root = path.at(0);
|
|
@@ -82,6 +129,10 @@ class FragmentArray {
|
|
|
82
129
|
}
|
|
83
130
|
return false;
|
|
84
131
|
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Adds an existing fragment to this array, if one was given.
|
|
135
|
+
*/
|
|
85
136
|
static {
|
|
86
137
|
decorateMethodV2(this.prototype, "hasDirtyAttributes", [cached]);
|
|
87
138
|
}
|
|
@@ -91,12 +142,20 @@ class FragmentArray {
|
|
|
91
142
|
}
|
|
92
143
|
return this.addObject(fragment);
|
|
93
144
|
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Appends a new fragment to the end of this array, if one was given.
|
|
148
|
+
*/
|
|
94
149
|
createFragment(fragment) {
|
|
95
150
|
if (!fragment) {
|
|
96
151
|
return;
|
|
97
152
|
}
|
|
98
153
|
return this.pushObject(fragment);
|
|
99
154
|
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Removes the given fragment from this array, if present.
|
|
158
|
+
*/
|
|
100
159
|
removeFragment(fragment) {
|
|
101
160
|
if (!fragment) {
|
|
102
161
|
return;
|
|
@@ -106,6 +165,10 @@ class FragmentArray {
|
|
|
106
165
|
this.splice(index, 1);
|
|
107
166
|
}
|
|
108
167
|
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Reverts each member fragment's attribute back to its last known remote value.
|
|
171
|
+
*/
|
|
109
172
|
rollbackAttributes() {
|
|
110
173
|
for (const fragment of this) {
|
|
111
174
|
// @ts-expect-error TODO: fix these types
|
|
@@ -113,6 +176,11 @@ class FragmentArray {
|
|
|
113
176
|
}
|
|
114
177
|
}
|
|
115
178
|
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* A schema extension that adds the {@link FragmentArray} API to migrated
|
|
182
|
+
* `ModelFragments` array resources.
|
|
183
|
+
*/
|
|
116
184
|
const FragmentArrayExtension = {
|
|
117
185
|
kind: 'array',
|
|
118
186
|
name: 'fragment-array',
|
|
@@ -217,5 +285,13 @@ class ShimModelClass {
|
|
|
217
285
|
function fragmentsModelFor(modelName) {
|
|
218
286
|
return getShimClass(this, modelName);
|
|
219
287
|
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* The `modelFor` fallback used to construct a `ShimModelClass` schema for a
|
|
291
|
+
* type when ModelFragments support is enabled and no real `Model` subclass
|
|
292
|
+
* is registered for that type.
|
|
293
|
+
*
|
|
294
|
+
* @public
|
|
295
|
+
*/
|
|
220
296
|
const modelFor = fragmentsModelFor;
|
|
221
297
|
export { FragmentExtension as F, FragmentArrayExtension as a, FragmentArray as b, Fragment as c, fragmentsModelFor as f, modelFor as m };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { pluralize, singularize } from '@warp-drive/utilities/string';
|
|
2
2
|
import { withDefaults } from './model/migration-support.js';
|
|
3
|
-
import { F as FragmentExtension, a as FragmentArrayExtension } from "./model-for-
|
|
4
|
-
export { c as Fragment, b as FragmentArray, m as modelFor } from "./model-for-
|
|
3
|
+
import { F as FragmentExtension, a as FragmentArrayExtension } from "./model-for-CXkJw59V.js";
|
|
4
|
+
export { c as Fragment, b as FragmentArray, m as modelFor } from "./model-for-CXkJw59V.js";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Used as a helper to setup the relevant parts of an array
|
|
@@ -62,6 +62,15 @@ function withFragmentArrayDefaults(fragmentArrayType, fragmentArrayName) {
|
|
|
62
62
|
}
|
|
63
63
|
};
|
|
64
64
|
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Used as a helper to setup the relevant parts of a legacy resource schema
|
|
68
|
+
* migrated from `Model`, applying the `ember-object` and `fragment` object
|
|
69
|
+
* extensions and a default `@id` identity field.
|
|
70
|
+
*
|
|
71
|
+
* @param schema the partial legacy resource schema to complete
|
|
72
|
+
* @returns the completed resource schema
|
|
73
|
+
*/
|
|
65
74
|
function withLegacy(schema) {
|
|
66
75
|
return withDefaults({
|
|
67
76
|
...schema,
|
|
@@ -72,6 +81,13 @@ function withLegacy(schema) {
|
|
|
72
81
|
objectExtensions: ['ember-object', 'fragment']
|
|
73
82
|
});
|
|
74
83
|
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Registers the {@link FragmentExtension}/{@link FragmentArrayExtension} schema
|
|
87
|
+
* extensions on the given `SchemaService`, enabling ModelFragments migration support.
|
|
88
|
+
*
|
|
89
|
+
* @public
|
|
90
|
+
*/
|
|
75
91
|
function registerFragmentExtensions(schema) {
|
|
76
92
|
schema.CAUTION_MEGA_DANGER_ZONE_registerExtension?.(FragmentExtension);
|
|
77
93
|
schema.CAUTION_MEGA_DANGER_ZONE_registerExtension?.(FragmentArrayExtension);
|
package/dist/unpkg/dev/model.js
CHANGED
|
@@ -3,10 +3,10 @@ import { recordIdentifierFor } from '@warp-drive/core';
|
|
|
3
3
|
import { RecordStore } from '@warp-drive/core/types/symbols';
|
|
4
4
|
import { i as isElementDescriptor, n as normalizeModelName } from "./util-DvanW33H.js";
|
|
5
5
|
import { assertPrivateStore } from '@warp-drive/core/store/-private';
|
|
6
|
-
import { l as lookupLegacySupport } from "./errors-
|
|
6
|
+
import { l as lookupLegacySupport } from "./errors-DngRU-If.js";
|
|
7
7
|
import '@warp-drive/utilities/string';
|
|
8
|
-
export { M as Model, b as buildSchema, M as default, m as restoreDeprecatedModelRequestBehaviors } from "./schema-provider-
|
|
9
|
-
export { i as instantiateRecord, m as modelFor, t as teardownRecord } from "./hooks-
|
|
8
|
+
export { M as Model, b as buildSchema, M as default, m as restoreDeprecatedModelRequestBehaviors } from "./schema-provider-0D7f-QOn.js";
|
|
9
|
+
export { i as instantiateRecord, m as modelFor, t as teardownRecord } from "./hooks-UuiLxWxS.js";
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Options provided to the attr decorator are
|
|
@@ -44,6 +44,7 @@ function _attr(type, options) {
|
|
|
44
44
|
kind: 'attribute',
|
|
45
45
|
isAttribute: true,
|
|
46
46
|
options: options,
|
|
47
|
+
sourceKey: options.sourceKey,
|
|
47
48
|
key: null
|
|
48
49
|
};
|
|
49
50
|
return computed({
|
|
@@ -57,7 +58,7 @@ function _attr(type, options) {
|
|
|
57
58
|
return;
|
|
58
59
|
}
|
|
59
60
|
const cache = this[RecordStore].cache;
|
|
60
|
-
return cache.getAttr(recordIdentifierFor(this), key);
|
|
61
|
+
return cache.getAttr(recordIdentifierFor(this), meta.sourceKey ?? key);
|
|
61
62
|
},
|
|
62
63
|
set(key, value) {
|
|
63
64
|
{
|
|
@@ -72,9 +73,10 @@ function _attr(type, options) {
|
|
|
72
73
|
}
|
|
73
74
|
})(!this.currentState.isDeleted);
|
|
74
75
|
const cache = this[RecordStore].cache;
|
|
75
|
-
const
|
|
76
|
+
const cacheKey = meta.sourceKey ?? key;
|
|
77
|
+
const currentValue = cache.getAttr(identifier, cacheKey);
|
|
76
78
|
if (currentValue !== value) {
|
|
77
|
-
cache.setAttr(identifier,
|
|
79
|
+
cache.setAttr(identifier, cacheKey, value);
|
|
78
80
|
if (!this.isValid) {
|
|
79
81
|
const {
|
|
80
82
|
errors
|
|
@@ -226,7 +228,8 @@ function _belongsTo(type, options) {
|
|
|
226
228
|
type: normalizeModelName(type),
|
|
227
229
|
options: options,
|
|
228
230
|
kind: 'belongsTo',
|
|
229
|
-
name: '<Unknown BelongsTo>'
|
|
231
|
+
name: '<Unknown BelongsTo>',
|
|
232
|
+
sourceKey: options.sourceKey
|
|
230
233
|
};
|
|
231
234
|
return computed({
|
|
232
235
|
get(key) {
|
|
@@ -467,7 +470,8 @@ function _hasMany(type, options) {
|
|
|
467
470
|
type: normalizeType(type),
|
|
468
471
|
options,
|
|
469
472
|
kind: 'hasMany',
|
|
470
|
-
name: '<Unknown BelongsTo>'
|
|
473
|
+
name: '<Unknown BelongsTo>',
|
|
474
|
+
sourceKey: options.sourceKey
|
|
471
475
|
};
|
|
472
476
|
return computed({
|
|
473
477
|
get(key) {
|
|
@@ -4,7 +4,7 @@ import { recordIdentifierFor, storeFor } from '@warp-drive/core';
|
|
|
4
4
|
import { notifyInternalSignal, peekInternalSignal, withSignalStore, gate, memoized, defineSignal, entangleSignal, defineGate } from '@warp-drive/core/signals/-leaked';
|
|
5
5
|
import { assertPrivateStore, recordIdentifierFor as recordIdentifierFor$1, coerceId } from '@warp-drive/core/store/-private';
|
|
6
6
|
import { RecordStore } from '@warp-drive/core/types/symbols';
|
|
7
|
-
import { l as lookupLegacySupport, L as LEGACY_SUPPORT, E as Errors } from "./errors-
|
|
7
|
+
import { l as lookupLegacySupport, L as LEGACY_SUPPORT, E as Errors } from "./errors-DngRU-If.js";
|
|
8
8
|
import { u as upgradeStore, F as FetchManager } from "./-private-DtjBbEgy.js";
|
|
9
9
|
import { cacheFor } from '@ember/object/internals';
|
|
10
10
|
import { Context } from '@warp-drive/core/reactive/-private';
|
|
@@ -42,11 +42,13 @@ function hasMany(prop) {
|
|
|
42
42
|
}
|
|
43
43
|
function reload(options = {}) {
|
|
44
44
|
{
|
|
45
|
+
const message = `You cannot use reload() on a record when ENABLE_LEGACY_REQUEST_METHODS is false.`;
|
|
45
46
|
(test => {
|
|
46
47
|
{
|
|
47
|
-
throw new Error(
|
|
48
|
+
throw new Error(message);
|
|
48
49
|
}
|
|
49
50
|
})();
|
|
51
|
+
return Promise.reject(new Error(message));
|
|
50
52
|
}
|
|
51
53
|
}
|
|
52
54
|
function _reload(options = {}) {
|
|
@@ -88,11 +90,13 @@ function deleteRecord() {
|
|
|
88
90
|
}
|
|
89
91
|
function save(options) {
|
|
90
92
|
{
|
|
93
|
+
const message = `You cannot use save() on a record when ENABLE_LEGACY_REQUEST_METHODS is false.`;
|
|
91
94
|
(test => {
|
|
92
95
|
{
|
|
93
|
-
throw new Error(
|
|
96
|
+
throw new Error(message);
|
|
94
97
|
}
|
|
95
98
|
})();
|
|
99
|
+
return Promise.reject(new Error(message));
|
|
96
100
|
}
|
|
97
101
|
}
|
|
98
102
|
function _save(options) {
|
|
@@ -107,11 +111,13 @@ function _save(options) {
|
|
|
107
111
|
}
|
|
108
112
|
function destroyRecord(options) {
|
|
109
113
|
{
|
|
114
|
+
const message = `You cannot use destroyRecord() on a record when ENABLE_LEGACY_REQUEST_METHODS is false.`;
|
|
110
115
|
(test => {
|
|
111
116
|
{
|
|
112
|
-
throw new Error(
|
|
117
|
+
throw new Error(message);
|
|
113
118
|
}
|
|
114
119
|
})();
|
|
120
|
+
return Promise.reject(new Error(message));
|
|
115
121
|
}
|
|
116
122
|
}
|
|
117
123
|
function _destroyRecord(options) {
|
|
@@ -939,6 +945,9 @@ class Model extends EmberObject {
|
|
|
939
945
|
get isError() {
|
|
940
946
|
return this.currentState.isError;
|
|
941
947
|
}
|
|
948
|
+
/**
|
|
949
|
+
* `isError` is read-only and cannot be set directly.
|
|
950
|
+
*/
|
|
942
951
|
static {
|
|
943
952
|
decorateMethodV2(this.prototype, "isError", [memoized]);
|
|
944
953
|
}
|
|
@@ -986,6 +995,10 @@ class Model extends EmberObject {
|
|
|
986
995
|
}
|
|
987
996
|
return recordIdentifierFor(this).id;
|
|
988
997
|
}
|
|
998
|
+
/**
|
|
999
|
+
* Assigns the resource's primary key. Typically only used internally
|
|
1000
|
+
* when a client-created record is assigned an id upon being saved.
|
|
1001
|
+
*/
|
|
989
1002
|
static {
|
|
990
1003
|
decorateMethodV2(this.prototype, "id", [gate]);
|
|
991
1004
|
}
|
|
@@ -1021,6 +1034,9 @@ class Model extends EmberObject {
|
|
|
1021
1034
|
|
|
1022
1035
|
return this.___recordState;
|
|
1023
1036
|
}
|
|
1037
|
+
/**
|
|
1038
|
+
* `currentState` is read-only and cannot be set directly.
|
|
1039
|
+
*/
|
|
1024
1040
|
static {
|
|
1025
1041
|
decorateMethodV2(this.prototype, "currentState", [gate]);
|
|
1026
1042
|
}
|
|
@@ -1094,6 +1110,9 @@ class Model extends EmberObject {
|
|
|
1094
1110
|
get adapterError() {
|
|
1095
1111
|
return this.currentState.adapterError;
|
|
1096
1112
|
}
|
|
1113
|
+
/**
|
|
1114
|
+
* `adapterError` is read-only and cannot be set directly.
|
|
1115
|
+
*/
|
|
1097
1116
|
static {
|
|
1098
1117
|
decorateMethodV2(this.prototype, "adapterError", [memoized]);
|
|
1099
1118
|
}
|
|
@@ -1167,12 +1186,29 @@ class Model extends EmberObject {
|
|
|
1167
1186
|
eachRelationship(callback, binding) {
|
|
1168
1187
|
this.constructor.eachRelationship(callback, binding);
|
|
1169
1188
|
}
|
|
1189
|
+
|
|
1190
|
+
/**
|
|
1191
|
+
* Returns the relationship schema for the given relationship name, if any.
|
|
1192
|
+
*/
|
|
1170
1193
|
relationshipFor(name) {
|
|
1171
1194
|
return this.constructor.relationshipsByName.get(name);
|
|
1172
1195
|
}
|
|
1196
|
+
|
|
1197
|
+
/**
|
|
1198
|
+
* Returns the inverse relationship schema for the given relationship
|
|
1199
|
+
* name, if one exists. See {@link Model.inverseFor | the static inverseFor}.
|
|
1200
|
+
*/
|
|
1173
1201
|
inverseFor(name) {
|
|
1174
1202
|
return this.constructor.inverseFor(name, storeFor(this, false));
|
|
1175
1203
|
}
|
|
1204
|
+
|
|
1205
|
+
/**
|
|
1206
|
+
* Iterates over the attributes defined on this record's class, calling
|
|
1207
|
+
* `callback` for each one. See {@link Model.eachAttribute | the static eachAttribute}.
|
|
1208
|
+
*
|
|
1209
|
+
* @param callback the callback to invoke
|
|
1210
|
+
* @param binding the value to which the callback's `this` should be bound
|
|
1211
|
+
*/
|
|
1176
1212
|
eachAttribute(callback, binding) {
|
|
1177
1213
|
this.constructor.eachAttribute(callback, binding);
|
|
1178
1214
|
}
|
|
@@ -1244,6 +1280,11 @@ class Model extends EmberObject {
|
|
|
1244
1280
|
const relationship = this.relationshipsByName.get(name);
|
|
1245
1281
|
return relationship && store.modelFor(relationship.type);
|
|
1246
1282
|
}
|
|
1283
|
+
|
|
1284
|
+
/**
|
|
1285
|
+
* A cache of resolved inverse relationships by name, populated lazily by
|
|
1286
|
+
* {@link Model.inverseFor | inverseFor}.
|
|
1287
|
+
*/
|
|
1247
1288
|
static get inverseMap() {
|
|
1248
1289
|
(test => {
|
|
1249
1290
|
if (!test) {
|
|
@@ -1296,6 +1337,9 @@ class Model extends EmberObject {
|
|
|
1296
1337
|
}
|
|
1297
1338
|
}
|
|
1298
1339
|
|
|
1340
|
+
/**
|
|
1341
|
+
* @private
|
|
1342
|
+
*/
|
|
1299
1343
|
//Calculate the inverse, ignoring the cache
|
|
1300
1344
|
static _findInverseFor(name, store) {
|
|
1301
1345
|
(test => {
|
|
@@ -1526,6 +1570,12 @@ class Model extends EmberObject {
|
|
|
1526
1570
|
}
|
|
1527
1571
|
return map;
|
|
1528
1572
|
}
|
|
1573
|
+
|
|
1574
|
+
/**
|
|
1575
|
+
* A hash of the model's relationship schemas keyed by relationship name.
|
|
1576
|
+
* See also {@link Model.relationshipsByName | relationshipsByName}, which
|
|
1577
|
+
* provides the same information as a `Map`.
|
|
1578
|
+
*/
|
|
1529
1579
|
static {
|
|
1530
1580
|
decorateMethodV2(this, "relationshipsByName", [computeOnce]);
|
|
1531
1581
|
}
|
|
@@ -1903,6 +1953,13 @@ defineGate(Model.prototype, 'isReloading', {
|
|
|
1903
1953
|
// @ts-expect-error specially handled prop
|
|
1904
1954
|
isLocal: true
|
|
1905
1955
|
});
|
|
1956
|
+
|
|
1957
|
+
/**
|
|
1958
|
+
* Restores the pre-`RequestManager` implementations of `save`,
|
|
1959
|
+
* `destroyRecord`, and `reload` onto the given `Model` subclass, for
|
|
1960
|
+
* apps that have not yet migrated off of the deprecated
|
|
1961
|
+
* `ENABLE_LEGACY_REQUEST_METHODS` behaviors.
|
|
1962
|
+
*/
|
|
1906
1963
|
function restoreDeprecatedModelRequestBehaviors(ModelKlass) {
|
|
1907
1964
|
// @ts-expect-error TS doesn't know how to do `this` function overloads
|
|
1908
1965
|
ModelKlass.prototype.save = _save;
|
|
@@ -2096,7 +2153,11 @@ class ModelSchemaProvider {
|
|
|
2096
2153
|
}
|
|
2097
2154
|
/** @internal */
|
|
2098
2155
|
_loadModelSchema(type) {
|
|
2099
|
-
const
|
|
2156
|
+
const factory = getModelFactory(this.store, type);
|
|
2157
|
+
if (!factory) {
|
|
2158
|
+
throw new Error(`No model was found for '${type}'`);
|
|
2159
|
+
}
|
|
2160
|
+
const modelClass = factory.class;
|
|
2100
2161
|
const attributeMap = modelClass.attributes;
|
|
2101
2162
|
const attributes = Object.create(null);
|
|
2102
2163
|
attributeMap.forEach((meta, name) => attributes[name] = meta);
|
|
@@ -2117,11 +2178,22 @@ class ModelSchemaProvider {
|
|
|
2117
2178
|
type,
|
|
2118
2179
|
fields: Array.from(fields.values())
|
|
2119
2180
|
};
|
|
2181
|
+
const cacheFields = new Map();
|
|
2182
|
+
for (const field of fields.values()) {
|
|
2183
|
+
const cacheKey = field.sourceKey ?? field.name;
|
|
2184
|
+
(test => {
|
|
2185
|
+
if (!test) {
|
|
2186
|
+
throw new Error(`The sourceKey '${field.sourceKey}' for the field '${field.name}' on '${type}' is invalid because it matches the name of an existing field`);
|
|
2187
|
+
}
|
|
2188
|
+
})(!field.sourceKey || field.sourceKey === field.name || !fields.has(field.sourceKey));
|
|
2189
|
+
cacheFields.set(cacheKey, field);
|
|
2190
|
+
}
|
|
2120
2191
|
const internalSchema = {
|
|
2121
2192
|
schema,
|
|
2122
2193
|
attributes,
|
|
2123
2194
|
relationships,
|
|
2124
|
-
fields
|
|
2195
|
+
fields,
|
|
2196
|
+
cacheFields
|
|
2125
2197
|
};
|
|
2126
2198
|
this._schemas.set(type, internalSchema);
|
|
2127
2199
|
return internalSchema;
|
|
@@ -2133,6 +2205,13 @@ class ModelSchemaProvider {
|
|
|
2133
2205
|
}
|
|
2134
2206
|
return this._schemas.get(type).fields;
|
|
2135
2207
|
}
|
|
2208
|
+
cacheFields(resource) {
|
|
2209
|
+
const type = normalizeModelName(resource.type);
|
|
2210
|
+
if (!this._schemas.has(type)) {
|
|
2211
|
+
this._loadModelSchema(type);
|
|
2212
|
+
}
|
|
2213
|
+
return this._schemas.get(type).cacheFields;
|
|
2214
|
+
}
|
|
2136
2215
|
hasResource(resource) {
|
|
2137
2216
|
const type = normalizeModelName(resource.type);
|
|
2138
2217
|
if (this._schemas.has(type)) {
|
|
@@ -2150,6 +2229,13 @@ class ModelSchemaProvider {
|
|
|
2150
2229
|
return true;
|
|
2151
2230
|
}
|
|
2152
2231
|
}
|
|
2232
|
+
/**
|
|
2233
|
+
* The `createSchemaService` implementation for use with `Model`. Pass
|
|
2234
|
+
* the result of this to your store's `createSchemaService` method when
|
|
2235
|
+
* configuring the store to use `Model` for schema information.
|
|
2236
|
+
*
|
|
2237
|
+
* @public
|
|
2238
|
+
*/
|
|
2153
2239
|
function buildSchema(store) {
|
|
2154
2240
|
return new ModelSchemaProvider(store);
|
|
2155
2241
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { dasherize, pluralize, singularize } from '@warp-drive/utilities/string';
|
|
2
|
-
import { J as JSONSerializer } from "../json-
|
|
2
|
+
import { J as JSONSerializer } from "../json-K2Y9z6MN.js";
|
|
3
3
|
|
|
4
4
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
5
5
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
@@ -102,7 +102,7 @@ import { J as JSONSerializer } from "../json-Cu1LNgmQ.js";
|
|
|
102
102
|
`extractRelationship`.
|
|
103
103
|
|
|
104
104
|
```js [app/serializers/application.js]
|
|
105
|
-
import JSONAPISerializer from '@warp-drive/legacy/serializer/json-api';
|
|
105
|
+
import { JSONAPISerializer } from '@warp-drive/legacy/serializer/json-api';
|
|
106
106
|
|
|
107
107
|
export default class ApplicationSerializer extends JSONAPISerializer {
|
|
108
108
|
normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {
|
|
@@ -136,10 +136,15 @@ const JSONAPISerializer = JSONSerializer.extend({
|
|
|
136
136
|
*/
|
|
137
137
|
_normalizeDocumentHelper(documentHash) {
|
|
138
138
|
if (Array.isArray(documentHash.data)) {
|
|
139
|
-
const ret =
|
|
139
|
+
const ret = [];
|
|
140
140
|
for (let i = 0; i < documentHash.data.length; i++) {
|
|
141
141
|
const data = documentHash.data[i];
|
|
142
|
-
|
|
142
|
+
const normalized = this._normalizeResourceHelper(data);
|
|
143
|
+
if (normalized !== null) {
|
|
144
|
+
// @ts-expect-error untyped
|
|
145
|
+
// can be null when unknown type is encountered
|
|
146
|
+
ret.push(normalized);
|
|
147
|
+
}
|
|
143
148
|
}
|
|
144
149
|
documentHash.data = ret;
|
|
145
150
|
} else if (documentHash.data && typeof documentHash.data === 'object') {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { camelize, dasherize, singularize } from '@warp-drive/utilities/string';
|
|
2
|
-
import { J as JSONSerializer, c as coerceId } from "../json-
|
|
2
|
+
import { i as inverseForRelationship, J as JSONSerializer, c as coerceId } from "../json-K2Y9z6MN.js";
|
|
3
3
|
import Mixin from '@ember/object/mixin';
|
|
4
4
|
|
|
5
5
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
@@ -420,8 +420,7 @@ const EmbeddedRecordsMixin = Mixin.create({
|
|
|
420
420
|
*/
|
|
421
421
|
removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, json) {
|
|
422
422
|
if (relationship.kind === 'belongsTo') {
|
|
423
|
-
const
|
|
424
|
-
const parentRecord = schema.inverseFor(relationship.name, this.store);
|
|
423
|
+
const parentRecord = inverseForRelationship(this.store, snapshot.modelName, relationship.name);
|
|
425
424
|
if (parentRecord) {
|
|
426
425
|
const name = parentRecord.name;
|
|
427
426
|
const embeddedSerializer = this.store.serializerFor(embeddedSnapshot.modelName);
|
|
@@ -1024,7 +1023,7 @@ const RESTSerializer = JSONSerializer.extend({
|
|
|
1024
1023
|
`serialize` takes an options hash with a single option:
|
|
1025
1024
|
`includeId`. If this option is `true`, `serialize` will,
|
|
1026
1025
|
by default include the ID in the JSON object it builds.
|
|
1027
|
-
The
|
|
1026
|
+
The RESTAdapter passes in `includeId: true` when serializing
|
|
1028
1027
|
a record for `createRecord`, but not for `updateRecord`.
|
|
1029
1028
|
## Customization
|
|
1030
1029
|
Your server may expect a different JSON format than the
|