@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.
Files changed (162) hide show
  1. package/README.md +6 -0
  2. package/declarations/adapter/-private/build-url-mixin.d.ts +156 -0
  3. package/declarations/adapter/error.d.ts +385 -169
  4. package/declarations/adapter/json-api.d.ts +12 -1
  5. package/declarations/adapter/rest.d.ts +74 -0
  6. package/declarations/adapter.d.ts +6 -0
  7. package/declarations/compat/builders/find-all.d.ts +0 -1
  8. package/declarations/compat/extensions.d.ts +40 -0
  9. package/declarations/compat/legacy-network-handler/legacy-network-handler.d.ts +7 -0
  10. package/declarations/compat/legacy-network-handler/minimum-adapter-interface.d.ts +4 -0
  11. package/declarations/compat/legacy-network-handler/minimum-serializer-interface.d.ts +7 -0
  12. package/declarations/compat/utils.d.ts +11 -0
  13. package/declarations/compat.d.ts +32 -0
  14. package/declarations/index.d.ts +142 -0
  15. package/declarations/model/-private/attr.d.ts +21 -0
  16. package/declarations/model/-private/belongs-to.d.ts +21 -0
  17. package/declarations/model/-private/hooks.d.ts +26 -0
  18. package/declarations/model/-private/model.d.ts +55 -4
  19. package/declarations/model/-private/promise-many-array.d.ts +25 -1
  20. package/declarations/model/-private/schema-provider.d.ts +11 -1
  21. package/declarations/model/migration-support.d.ts +31 -5
  22. package/declarations/model-fragments/extensions/fragment-array.d.ts +38 -0
  23. package/declarations/model-fragments/extensions/fragment.d.ts +35 -0
  24. package/declarations/model-fragments/hooks/model-for.d.ts +7 -0
  25. package/declarations/model-fragments/index.d.ts +8 -0
  26. package/declarations/model-fragments/instance-initializers/fragment-extensions.d.ts +6 -0
  27. package/declarations/model-fragments/utilities/with-array-defaults.d.ts +30 -0
  28. package/declarations/model-fragments/utilities/with-fragment-array-defaults.d.ts +18 -0
  29. package/declarations/model-fragments/utilities/with-fragment-defaults.d.ts +15 -0
  30. package/declarations/model-fragments/utilities/with-legacy.d.ts +8 -0
  31. package/declarations/serializer/-private/transforms/boolean.d.ts +13 -0
  32. package/declarations/serializer/-private/transforms/date.d.ts +15 -1
  33. package/declarations/serializer/-private/transforms/number.d.ts +14 -1
  34. package/declarations/serializer/-private/transforms/string.d.ts +14 -1
  35. package/declarations/serializer/-private/utils.d.ts +24 -0
  36. package/declarations/serializer/json-api.d.ts +1 -1
  37. package/declarations/serializer.d.ts +4 -6
  38. package/declarations/store/-private.d.ts +2 -2
  39. package/declarations/store.d.ts +7 -0
  40. package/dist/adapter/error.js +386 -241
  41. package/dist/adapter/json-api.js +12 -0
  42. package/dist/adapter/rest.js +39 -3
  43. package/dist/adapter.js +23 -26
  44. package/dist/compat/builders.js +0 -1
  45. package/dist/compat/extensions.js +80 -3
  46. package/dist/compat/utils.js +14 -0
  47. package/dist/compat.js +17 -0
  48. package/dist/{errors-Cz5KrzBk.js → errors-DZKA206g.js} +24 -1
  49. package/dist/{hooks-D6diaM34.js → hooks-BvOqJBei.js} +33 -2
  50. package/dist/index.js +168 -13
  51. package/dist/{json-ChdEfB0X.js → json-DU8m1pGf.js} +83 -6
  52. package/dist/model/-private.js +1 -1
  53. package/dist/model/migration-support.js +15 -2
  54. package/dist/{unpkg/dev-deprecated/model-for-CqXsIKws.js → model-for-CXkJw59V.js} +77 -1
  55. package/dist/model-fragments.js +18 -2
  56. package/dist/model.js +12 -8
  57. package/dist/{schema-provider-DJCV_6AF.js → schema-provider-DtPOp0d7.js} +93 -6
  58. package/dist/serializer/json-api.js +8 -3
  59. package/dist/serializer/json.js +1 -1
  60. package/dist/serializer/rest.js +3 -4
  61. package/dist/serializer/transform.js +51 -3
  62. package/dist/serializer.js +4 -7
  63. package/dist/store.js +13 -7
  64. package/dist/unpkg/dev/adapter/error.js +386 -241
  65. package/dist/unpkg/dev/adapter/json-api.js +13 -1
  66. package/dist/unpkg/dev/adapter/rest.js +39 -3
  67. package/dist/unpkg/dev/adapter.js +23 -26
  68. package/dist/unpkg/dev/compat/builders.js +0 -1
  69. package/dist/unpkg/dev/compat/extensions.js +80 -3
  70. package/dist/unpkg/dev/compat/utils.js +14 -0
  71. package/dist/unpkg/dev/compat.js +34 -1
  72. package/dist/unpkg/dev/{errors-DmGGJr3T.js → errors-DngRU-If.js} +24 -1
  73. package/dist/unpkg/dev/{hooks-CkYiE6Ud.js → hooks-UuiLxWxS.js} +33 -2
  74. package/dist/unpkg/dev/index.js +171 -13
  75. package/dist/unpkg/dev/json-K2Y9z6MN.js +1333 -0
  76. package/dist/unpkg/dev/model/-private.js +1 -1
  77. package/dist/unpkg/dev/model/migration-support.js +16 -2
  78. package/dist/unpkg/{prod-deprecated/model-for-CqXsIKws.js → dev/model-for-CXkJw59V.js} +77 -1
  79. package/dist/unpkg/dev/model-fragments.js +18 -2
  80. package/dist/unpkg/dev/model.js +12 -8
  81. package/dist/unpkg/dev/{schema-provider-DDVYxmUV.js → schema-provider-0D7f-QOn.js} +92 -6
  82. package/dist/unpkg/dev/serializer/json-api.js +9 -4
  83. package/dist/unpkg/dev/serializer/json.js +1 -1
  84. package/dist/unpkg/dev/serializer/rest.js +3 -4
  85. package/dist/unpkg/dev/serializer/transform.js +51 -3
  86. package/dist/unpkg/dev/serializer.js +4 -7
  87. package/dist/unpkg/dev/store.js +21 -7
  88. package/dist/unpkg/dev-deprecated/adapter/error.js +386 -241
  89. package/dist/unpkg/dev-deprecated/adapter/json-api.js +13 -1
  90. package/dist/unpkg/dev-deprecated/adapter/rest.js +39 -3
  91. package/dist/unpkg/dev-deprecated/adapter.js +23 -26
  92. package/dist/unpkg/dev-deprecated/compat/builders.js +0 -1
  93. package/dist/unpkg/dev-deprecated/compat/extensions.js +80 -3
  94. package/dist/unpkg/dev-deprecated/compat/utils.js +14 -0
  95. package/dist/unpkg/dev-deprecated/compat.js +34 -1
  96. package/dist/unpkg/dev-deprecated/{errors-Spt6ubMd.js → errors-Bzidntpi.js} +24 -1
  97. package/dist/unpkg/dev-deprecated/{hooks-DOXegvhL.js → hooks-DVXhMW14.js} +33 -2
  98. package/dist/unpkg/dev-deprecated/index.js +171 -13
  99. package/dist/unpkg/{prod-deprecated/json-BWrZ5546.js → dev-deprecated/json-K2Y9z6MN.js} +96 -6
  100. package/dist/unpkg/dev-deprecated/model/-private.js +1 -1
  101. package/dist/unpkg/dev-deprecated/model/migration-support.js +16 -2
  102. package/dist/unpkg/{dev/model-for-CqXsIKws.js → dev-deprecated/model-for-CXkJw59V.js} +77 -1
  103. package/dist/unpkg/dev-deprecated/model-fragments.js +18 -2
  104. package/dist/unpkg/dev-deprecated/model.js +12 -8
  105. package/dist/unpkg/dev-deprecated/{schema-provider-BP6_8N-V.js → schema-provider-ZwO5_fZw.js} +84 -3
  106. package/dist/unpkg/dev-deprecated/serializer/json-api.js +9 -4
  107. package/dist/unpkg/dev-deprecated/serializer/json.js +1 -1
  108. package/dist/unpkg/dev-deprecated/serializer/rest.js +3 -4
  109. package/dist/unpkg/dev-deprecated/serializer/transform.js +51 -3
  110. package/dist/unpkg/dev-deprecated/serializer.js +4 -7
  111. package/dist/unpkg/dev-deprecated/store.js +21 -7
  112. package/dist/unpkg/prod/adapter/error.js +386 -241
  113. package/dist/unpkg/prod/adapter/json-api.js +13 -1
  114. package/dist/unpkg/prod/adapter/rest.js +39 -3
  115. package/dist/unpkg/prod/adapter.js +23 -26
  116. package/dist/unpkg/prod/compat/builders.js +0 -1
  117. package/dist/unpkg/prod/compat/extensions.js +70 -3
  118. package/dist/unpkg/prod/compat/utils.js +14 -0
  119. package/dist/unpkg/prod/compat.js +17 -0
  120. package/dist/unpkg/prod/{errors-BGVFCBmi.js → errors-B-PWeYlW.js} +24 -1
  121. package/dist/unpkg/prod/{hooks-BztVA_x0.js → hooks-Bx-zBziU.js} +32 -1
  122. package/dist/unpkg/prod/index.js +171 -5
  123. package/dist/unpkg/{dev/json-Cu1LNgmQ.js → prod/json-Qewu-UN9.js} +63 -19
  124. package/dist/unpkg/prod/model/-private.js +1 -1
  125. package/dist/unpkg/prod/model/migration-support.js +16 -2
  126. package/dist/unpkg/prod/model-for-CXkJw59V.js +297 -0
  127. package/dist/unpkg/prod/model-fragments.js +18 -2
  128. package/dist/unpkg/prod/model.js +12 -8
  129. package/dist/unpkg/prod/{schema-provider-DJtD_8jZ.js → schema-provider-BgRqk8i9.js} +96 -6
  130. package/dist/unpkg/prod/serializer/json-api.js +9 -4
  131. package/dist/unpkg/prod/serializer/json.js +1 -1
  132. package/dist/unpkg/prod/serializer/rest.js +3 -4
  133. package/dist/unpkg/prod/serializer/transform.js +51 -3
  134. package/dist/unpkg/prod/serializer.js +4 -7
  135. package/dist/unpkg/prod/store.js +21 -7
  136. package/dist/unpkg/prod-deprecated/adapter/error.js +386 -241
  137. package/dist/unpkg/prod-deprecated/adapter/json-api.js +13 -1
  138. package/dist/unpkg/prod-deprecated/adapter/rest.js +39 -3
  139. package/dist/unpkg/prod-deprecated/adapter.js +23 -26
  140. package/dist/unpkg/prod-deprecated/compat/builders.js +0 -1
  141. package/dist/unpkg/prod-deprecated/compat/extensions.js +70 -3
  142. package/dist/unpkg/prod-deprecated/compat/utils.js +14 -0
  143. package/dist/unpkg/prod-deprecated/compat.js +17 -0
  144. package/dist/unpkg/prod-deprecated/{errors-CdDaK81x.js → errors-Dl2J9d1D.js} +24 -1
  145. package/dist/unpkg/prod-deprecated/{hooks-yId87yyG.js → hooks-Cm60wWTf.js} +32 -1
  146. package/dist/unpkg/prod-deprecated/index.js +171 -5
  147. package/dist/unpkg/{dev-deprecated/json-Cu1LNgmQ.js → prod-deprecated/json-Qewu-UN9.js} +63 -19
  148. package/dist/unpkg/prod-deprecated/model/-private.js +1 -1
  149. package/dist/unpkg/prod-deprecated/model/migration-support.js +16 -2
  150. package/dist/{model-for-CqXsIKws.js → unpkg/prod-deprecated/model-for-CXkJw59V.js} +77 -1
  151. package/dist/unpkg/prod-deprecated/model-fragments.js +18 -2
  152. package/dist/unpkg/prod-deprecated/model.js +12 -8
  153. package/dist/unpkg/prod-deprecated/{schema-provider-CjX55uSY.js → schema-provider-Dh6tRqVI.js} +79 -3
  154. package/dist/unpkg/prod-deprecated/serializer/json-api.js +9 -4
  155. package/dist/unpkg/prod-deprecated/serializer/json.js +1 -1
  156. package/dist/unpkg/prod-deprecated/serializer/rest.js +3 -4
  157. package/dist/unpkg/prod-deprecated/serializer/transform.js +51 -3
  158. package/dist/unpkg/prod-deprecated/serializer.js +4 -7
  159. package/dist/unpkg/prod-deprecated/store.js +21 -7
  160. package/package.json +8 -8
  161. package/dist/unpkg/prod/json-BWrZ5546.js +0 -1243
  162. 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-DmGGJr3T.js";
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-DmGGJr3T.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-DDVYxmUV.js";
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
- } = this[Context];
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-CqXsIKws.js";
4
- export { c as Fragment, b as FragmentArray, m as modelFor } from "./model-for-CqXsIKws.js";
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);
@@ -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-DmGGJr3T.js";
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-DDVYxmUV.js";
9
- export { i as instantiateRecord, m as modelFor, t as teardownRecord } from "./hooks-CkYiE6Ud.js";
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 currentValue = cache.getAttr(identifier, key);
76
+ const cacheKey = meta.sourceKey ?? key;
77
+ const currentValue = cache.getAttr(identifier, cacheKey);
76
78
  if (currentValue !== value) {
77
- cache.setAttr(identifier, key, value);
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-DmGGJr3T.js";
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(`You cannot use reload() on a record when ENABLE_LEGACY_REQUEST_METHODS is false.`);
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(`You cannot use save() on a record when ENABLE_LEGACY_REQUEST_METHODS is false.`);
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(`You cannot use destroyRecord() on a record when ENABLE_LEGACY_REQUEST_METHODS is false.`);
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 modelClass = this.store.modelFor(type);
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-Cu1LNgmQ.js";
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 = new Array(documentHash.data.length);
139
+ const ret = [];
140
140
  for (let i = 0; i < documentHash.data.length; i++) {
141
141
  const data = documentHash.data[i];
142
- ret[i] = this._normalizeResourceHelper(data);
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,4 +1,4 @@
1
1
  import '@ember/application';
2
2
  import '@warp-drive/utilities/string';
3
3
  import '../serializer.js';
4
- export { J as JSONSerializer } from "../json-Cu1LNgmQ.js";
4
+ export { J as JSONSerializer } from "../json-K2Y9z6MN.js";
@@ -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-Cu1LNgmQ.js";
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 schema = this.store.modelFor(snapshot.modelName);
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 adapter passes in `includeId: true` when serializing
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