@warp-drive/core 5.6.0-beta.1 → 5.6.0-beta.3

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 (123) hide show
  1. package/declarations/graph/-private/-diff.d.ts +7 -20
  2. package/declarations/graph/-private/-edge-definition.d.ts +3 -12
  3. package/declarations/graph/-private/-state.d.ts +0 -87
  4. package/declarations/graph/-private/-utils.d.ts +5 -11
  5. package/declarations/graph/-private/coerce-id.d.ts +0 -6
  6. package/declarations/graph/-private/debug/assert-polymorphic-type.d.ts +2 -14
  7. package/declarations/graph/-private/edges/collection.d.ts +10 -10
  8. package/declarations/graph/-private/edges/implicit.d.ts +5 -5
  9. package/declarations/graph/-private/edges/resource.d.ts +6 -7
  10. package/declarations/graph/-private/graph.d.ts +17 -51
  11. package/declarations/graph/-private/normalize-link.d.ts +0 -6
  12. package/declarations/graph/-private/operations/replace-related-records.d.ts +4 -59
  13. package/declarations/graph/-private/operations/update-relationship.d.ts +3 -7
  14. package/declarations/index.d.ts +1 -1
  15. package/declarations/reactive/-private/default-mode.d.ts +73 -0
  16. package/declarations/reactive/-private/document.d.ts +11 -27
  17. package/declarations/reactive/-private/fields/get-field-key.d.ts +8 -0
  18. package/declarations/reactive/-private/fields/managed-array.d.ts +7 -11
  19. package/declarations/reactive/-private/fields/managed-object.d.ts +7 -11
  20. package/declarations/reactive/-private/fields/many-array-manager.d.ts +2 -2
  21. package/declarations/reactive/-private/hooks.d.ts +2 -2
  22. package/declarations/reactive/-private/kind/alias-field.d.ts +4 -0
  23. package/declarations/reactive/-private/kind/array-field.d.ts +4 -0
  24. package/declarations/reactive/-private/kind/attribute-field.d.ts +4 -0
  25. package/declarations/reactive/-private/kind/belongs-to-field.d.ts +4 -0
  26. package/declarations/reactive/-private/kind/collection-field.d.ts +4 -0
  27. package/declarations/reactive/-private/kind/derived-field.d.ts +4 -0
  28. package/declarations/reactive/-private/kind/generic-field.d.ts +4 -0
  29. package/declarations/reactive/-private/kind/has-many-field.d.ts +4 -0
  30. package/declarations/reactive/-private/kind/hash-field.d.ts +4 -0
  31. package/declarations/reactive/-private/kind/identity-field.d.ts +4 -0
  32. package/declarations/reactive/-private/kind/local-field.d.ts +4 -0
  33. package/declarations/reactive/-private/kind/object-field.d.ts +4 -0
  34. package/declarations/reactive/-private/kind/resource-field.d.ts +4 -0
  35. package/declarations/reactive/-private/kind/schema-array-field.d.ts +4 -0
  36. package/declarations/reactive/-private/kind/schema-object-field.d.ts +4 -0
  37. package/declarations/reactive/-private/record.d.ts +44 -34
  38. package/declarations/reactive/-private/schema.d.ts +50 -68
  39. package/declarations/reactive/-private/symbols.d.ts +2 -33
  40. package/declarations/reactive/-private.d.ts +1 -1
  41. package/declarations/reactive.d.ts +278 -1
  42. package/declarations/request/-private/context.d.ts +3 -5
  43. package/declarations/request/-private/fetch.d.ts +2 -0
  44. package/declarations/request/-private/manager.d.ts +24 -28
  45. package/declarations/request/-private/types.d.ts +22 -24
  46. package/declarations/request/-private/utils.d.ts +44 -2
  47. package/declarations/store/-private/cache-handler/handler.d.ts +2 -8
  48. package/declarations/store/-private/cache-handler/types.d.ts +10 -10
  49. package/declarations/store/-private/cache-handler/utils.d.ts +4 -5
  50. package/declarations/store/-private/caches/instance-cache.d.ts +22 -28
  51. package/declarations/store/-private/debug/utils.d.ts +1 -0
  52. package/declarations/store/-private/default-cache-policy.d.ts +25 -40
  53. package/declarations/store/-private/managers/cache-capabilities-manager.d.ts +24 -15
  54. package/declarations/store/-private/{caches/identifier-cache.d.ts → managers/cache-key-manager.d.ts} +35 -53
  55. package/declarations/store/-private/managers/cache-manager.d.ts +46 -111
  56. package/declarations/store/-private/managers/notification-manager.d.ts +30 -45
  57. package/declarations/store/-private/managers/record-array-manager.d.ts +44 -41
  58. package/declarations/store/-private/network/request-cache.d.ts +21 -25
  59. package/declarations/store/-private/new-core-tmp/expensive-subscription.d.ts +24 -0
  60. package/declarations/store/-private/new-core-tmp/reactivity/configure.d.ts +3 -41
  61. package/declarations/store/-private/new-core-tmp/reactivity/internal.d.ts +14 -29
  62. package/declarations/store/-private/new-core-tmp/reactivity/signal.d.ts +24 -3
  63. package/declarations/store/-private/new-core-tmp/request-state.d.ts +132 -37
  64. package/declarations/store/-private/new-core-tmp/request-subscription.d.ts +51 -135
  65. package/declarations/store/-private/record-arrays/-utils.d.ts +80 -0
  66. package/declarations/store/-private/record-arrays/legacy-live-array.d.ts +81 -0
  67. package/declarations/store/-private/record-arrays/legacy-many-array.d.ts +133 -0
  68. package/declarations/store/-private/record-arrays/legacy-query.d.ts +81 -0
  69. package/declarations/store/-private/record-arrays/native-proxy-type-fix.d.ts +1 -124
  70. package/declarations/store/-private/record-arrays/resource-array.d.ts +67 -0
  71. package/declarations/store/-private/store-service.d.ts +167 -877
  72. package/declarations/store/-private/utils/coerce-id.d.ts +0 -6
  73. package/declarations/store/-private.d.ts +13 -14
  74. package/declarations/store/-types/q/cache-capabilities-manager.d.ts +15 -24
  75. package/declarations/store/-types/q/identifier.d.ts +9 -6
  76. package/declarations/store/-types/q/record-instance.d.ts +0 -1
  77. package/declarations/store/-types/q/schema-service.d.ts +64 -40
  78. package/declarations/store/-types/q/store.d.ts +6 -7
  79. package/declarations/store/deprecated/-private.d.ts +223 -0
  80. package/declarations/store/deprecated/store.d.ts +783 -0
  81. package/declarations/types/-private.d.ts +1 -1
  82. package/declarations/types/cache/aliases.d.ts +0 -11
  83. package/declarations/types/cache/change.d.ts +2 -2
  84. package/declarations/types/cache/mutations.d.ts +13 -37
  85. package/declarations/types/cache/operations.d.ts +115 -32
  86. package/declarations/types/cache/relationship.d.ts +4 -7
  87. package/declarations/types/cache.d.ts +51 -127
  88. package/declarations/types/graph.d.ts +12 -12
  89. package/declarations/types/identifier.d.ts +52 -78
  90. package/declarations/types/params.d.ts +2 -3
  91. package/declarations/types/request.d.ts +66 -42
  92. package/declarations/types/schema/concepts.d.ts +2 -2
  93. package/declarations/types/schema/fields.d.ts +391 -14
  94. package/declarations/types/spec/document.d.ts +6 -10
  95. package/declarations/types/spec/json-api-raw.d.ts +6 -9
  96. package/declarations/types.d.ts +1 -1
  97. package/declarations/utils/string.d.ts +2 -3
  98. package/dist/{configure-B48bFHOl.js → configure-C3x8YXzL.js} +5 -5
  99. package/dist/configure.js +1 -1
  100. package/dist/{context-COmAnXUQ.js → context-C_7OLieY.js} +48 -6
  101. package/dist/graph/-private.js +137 -144
  102. package/dist/index.js +25 -14
  103. package/dist/reactive/-private.js +1 -1
  104. package/dist/reactive.js +337 -1422
  105. package/dist/{request-state-CjLph1LP.js → request-state-C955e0AL.js} +8352 -5912
  106. package/dist/request.js +1 -1
  107. package/dist/store/-private.js +2 -3
  108. package/dist/store.js +32 -44
  109. package/dist/{symbols-SIstXMLI.js → symbols-sql1_mdx.js} +3 -8
  110. package/dist/types/-private.js +1 -1
  111. package/dist/types/identifier.js +19 -45
  112. package/dist/types/request.js +45 -3
  113. package/dist/types/schema/fields.js +23 -2
  114. package/dist/utils/string.js +2 -2
  115. package/package.json +11 -11
  116. package/declarations/reactive/-private/fields/compute.d.ts +0 -43
  117. package/declarations/store/-private/caches/cache-utils.d.ts +0 -12
  118. package/declarations/store/-private/legacy-model-support/record-reference.d.ts +0 -159
  119. package/declarations/store/-private/legacy-model-support/shim-model-class.d.ts +0 -17
  120. package/declarations/store/-private/record-arrays/identifier-array.d.ts +0 -147
  121. package/declarations/store/-private/record-arrays/many-array.d.ts +0 -197
  122. package/declarations/store/-types/q/ds-model.d.ts +0 -21
  123. package/dist/handler-C2T-IyJK.js +0 -339
@@ -0,0 +1,783 @@
1
+ import type { TypeFromInstance } from "../../types/record.js";
2
+ import type { ResourceIdentifierObject } from "../../types/spec/json-api-raw.js";
3
+ import type { LegacyLiveArray, LegacyQueryArray } from "../-private.js";
4
+ import { Store } from "../-private/store-service.js";
5
+ import type { FindAllOptions, FindRecordOptions, LegacyResourceQuery, ModelSchema, QueryOptions } from "./-private.js";
6
+ import { RecordReference } from "./-private.js";
7
+ declare module "../-private/store-service" {
8
+ interface Store {
9
+ /**
10
+ This method returns a record for a given identifier or type and id combination.
11
+
12
+ The `findRecord` method will always resolve its promise with the same
13
+ object for a given identifier or type and `id`.
14
+
15
+ The `findRecord` method will always return a **promise** that will be
16
+ resolved with the record.
17
+
18
+ **Example 1**
19
+
20
+ ```js [app/routes/post.js]
21
+ export default class PostRoute extends Route {
22
+ model({ post_id }) {
23
+ return this.store.findRecord('post', post_id);
24
+ }
25
+ }
26
+ ```
27
+
28
+ **Example 2**
29
+
30
+ `findRecord` can be called with a single identifier argument instead of the combination
31
+ of `type` (modelName) and `id` as separate arguments. You may recognize this combo as
32
+ the typical pairing from [JSON:API](https://jsonapi.org/format/#document-resource-object-identification)
33
+
34
+ ```js [app/routes/post.js]
35
+ export default class PostRoute extends Route {
36
+ model({ post_id: id }) {
37
+ return this.store.findRecord({ type: 'post', id });
38
+ }
39
+ }
40
+ ```
41
+
42
+ **Example 3**
43
+
44
+ If you have previously received an lid via an Identifier for this record, and the record
45
+ has already been assigned an id, you can find the record again using just the lid.
46
+
47
+ ```js [app/routes/post.js]
48
+ store.findRecord({ lid });
49
+ ```
50
+
51
+ If the record is not yet available, the store will ask the adapter's `findRecord`
52
+ method to retrieve and supply the necessary data. If the record is already present
53
+ in the store, it depends on the reload behavior _when_ the returned promise
54
+ resolves.
55
+
56
+ ### Preloading
57
+
58
+ You can optionally `preload` specific attributes and relationships that you know of
59
+ by passing them via the passed `options`.
60
+
61
+ For example, if your Ember route looks like `/posts/1/comments/2` and your API route
62
+ for the comment also looks like `/posts/1/comments/2` if you want to fetch the comment
63
+ without also fetching the post you can pass in the post to the `findRecord` call:
64
+
65
+ ```js [app/routes/post-comments.js]
66
+ export default class PostRoute extends Route {
67
+ model({ post_id, comment_id: id }) {
68
+ return this.store.findRecord({ type: 'comment', id, { preload: { post: post_id }} });
69
+ }
70
+ }
71
+ ```
72
+
73
+ In your adapter you can then access this id without triggering a network request via the
74
+ snapshot:
75
+
76
+ ```js [app/adapters/application.js]
77
+ export default class Adapter {
78
+
79
+ findRecord(store, schema, id, snapshot) {
80
+ let type = schema.modelName;
81
+
82
+ if (type === 'comment')
83
+ let postId = snapshot.belongsTo('post', { id: true });
84
+
85
+ return fetch(`./posts/${postId}/comments/${id}`)
86
+ .then(response => response.json())
87
+ }
88
+ }
89
+
90
+ static create() {
91
+ return new this();
92
+ }
93
+ }
94
+ ```
95
+
96
+ This could also be achieved by supplying the post id to the adapter via the adapterOptions
97
+ property on the options hash.
98
+
99
+ ```js [app/routes/post-comments.js]
100
+ export default class PostRoute extends Route {
101
+ model({ post_id, comment_id: id }) {
102
+ return this.store.findRecord({ type: 'comment', id, { adapterOptions: { post: post_id }} });
103
+ }
104
+ }
105
+ ```
106
+
107
+ ```js [app/adapters/application.js]
108
+ export default class Adapter {
109
+ findRecord(store, schema, id, snapshot) {
110
+ let type = schema.modelName;
111
+
112
+ if (type === 'comment')
113
+ let postId = snapshot.adapterOptions.post;
114
+
115
+ return fetch(`./posts/${postId}/comments/${id}`)
116
+ .then(response => response.json())
117
+ }
118
+ }
119
+
120
+ static create() {
121
+ return new this();
122
+ }
123
+ }
124
+ ```
125
+
126
+ If you have access to the post model you can also pass the model itself to preload:
127
+
128
+ ```javascript
129
+ let post = await store.findRecord('post', '1');
130
+ let comment = await store.findRecord('comment', '2', { post: myPostModel });
131
+ ```
132
+
133
+ ### Reloading
134
+
135
+ The reload behavior is configured either via the passed `options` hash or
136
+ the result of the adapter's `shouldReloadRecord`.
137
+
138
+ If `{ reload: true }` is passed or `adapter.shouldReloadRecord` evaluates
139
+ to `true`, then the returned promise resolves once the adapter returns
140
+ data, regardless if the requested record is already in the store:
141
+
142
+ ```js
143
+ store.push({
144
+ data: {
145
+ id: 1,
146
+ type: 'post',
147
+ revision: 1
148
+ }
149
+ });
150
+
151
+ // adapter#findRecord resolves with
152
+ // [
153
+ // {
154
+ // id: 1,
155
+ // type: 'post',
156
+ // revision: 2
157
+ // }
158
+ // ]
159
+ store.findRecord('post', '1', { reload: true }).then(function(post) {
160
+ post.revision; // 2
161
+ });
162
+ ```
163
+
164
+ If no reload is indicated via the above mentioned ways, then the promise
165
+ immediately resolves with the cached version in the store.
166
+
167
+ ### Background Reloading
168
+
169
+ Optionally, if `adapter.shouldBackgroundReloadRecord` evaluates to `true`,
170
+ then a background reload is started, which updates the records' data, once
171
+ it is available:
172
+
173
+ ```js
174
+ // app/adapters/post.js
175
+ import ApplicationAdapter from "./application";
176
+
177
+ export default class PostAdapter extends ApplicationAdapter {
178
+ shouldReloadRecord(store, snapshot) {
179
+ return false;
180
+ },
181
+
182
+ shouldBackgroundReloadRecord(store, snapshot) {
183
+ return true;
184
+ }
185
+ });
186
+
187
+ // ...
188
+
189
+ store.push({
190
+ data: {
191
+ id: 1,
192
+ type: 'post',
193
+ revision: 1
194
+ }
195
+ });
196
+
197
+ let blogPost = store.findRecord('post', '1').then(function(post) {
198
+ post.revision; // 1
199
+ });
200
+
201
+ // later, once adapter#findRecord resolved with
202
+ // [
203
+ // {
204
+ // id: 1,
205
+ // type: 'post',
206
+ // revision: 2
207
+ // }
208
+ // ]
209
+
210
+ blogPost.revision; // 2
211
+ ```
212
+
213
+ If you would like to force or prevent background reloading, you can set a
214
+ boolean value for `backgroundReload` in the options object for
215
+ `findRecord`.
216
+
217
+ ```js [app/routes/post/edit.js]
218
+ export default class PostEditRoute extends Route {
219
+ model(params) {
220
+ return this.store.findRecord('post', params.post_id, { backgroundReload: false });
221
+ }
222
+ }
223
+ ```
224
+
225
+ If you pass an object on the `adapterOptions` property of the options
226
+ argument it will be passed to your adapter via the snapshot
227
+
228
+ ```js [app/routes/post/edit.js]
229
+ export default class PostEditRoute extends Route {
230
+ model(params) {
231
+ return this.store.findRecord('post', params.post_id, {
232
+ adapterOptions: { subscribe: false }
233
+ });
234
+ }
235
+ }
236
+ ```
237
+
238
+ ```js [app/adapters/post.js]
239
+ import MyCustomAdapter from './custom-adapter';
240
+
241
+ export default class PostAdapter extends MyCustomAdapter {
242
+ findRecord(store, type, id, snapshot) {
243
+ if (snapshot.adapterOptions.subscribe) {
244
+ // ...
245
+ }
246
+ // ...
247
+ }
248
+ }
249
+ ```
250
+
251
+ See [peekRecord](../methods/peekRecord?anchor=peekRecord) to get the cached version of a record.
252
+
253
+ ### Retrieving Related Model Records
254
+
255
+ If you use an adapter such as Ember's default
256
+ [`JSONAPIAdapter`](/ember-data/release/classes/JSONAPIAdapter)
257
+ that supports the [JSON API specification](http://jsonapi.org/) and if your server
258
+ endpoint supports the use of an
259
+ ['include' query parameter](http://jsonapi.org/format/#fetching-includes),
260
+ you can use `findRecord()` or `findAll()` to automatically retrieve additional records related to
261
+ the one you request by supplying an `include` parameter in the `options` object.
262
+
263
+ For example, given a `post` model that has a `hasMany` relationship with a `comment`
264
+ model, when we retrieve a specific post we can have the server also return that post's
265
+ comments in the same request:
266
+
267
+ ```js [app/routes/post.js]
268
+ export default class PostRoute extends Route {
269
+ model(params) {
270
+ return this.store.findRecord('post', params.post_id, { include: ['comments'] });
271
+ }
272
+ }
273
+ ```
274
+
275
+ ```js [app/adapters/application.js]
276
+ export default class Adapter {
277
+ findRecord(store, schema, id, snapshot) {
278
+ let type = schema.modelName;
279
+
280
+ if (type === 'post')
281
+ let includes = snapshot.adapterOptions.include;
282
+
283
+ return fetch(`./posts/${postId}?include=${includes}`)
284
+ .then(response => response.json())
285
+ }
286
+ }
287
+
288
+ static create() {
289
+ return new this();
290
+ }
291
+ }
292
+ ```
293
+
294
+ In this case, the post's comments would then be available in your template as
295
+ `model.comments`.
296
+
297
+ Multiple relationships can be requested using an `include` parameter consisting of a
298
+ list of relationship names, while nested relationships can be specified
299
+ using a dot-separated sequence of relationship names. So to request both the post's
300
+ comments and the authors of those comments the request would look like this:
301
+
302
+ ```js [app/routes/post.js]
303
+ export default class PostRoute extends Route {
304
+ model(params) {
305
+ return this.store.findRecord('post', params.post_id, { include: ['comments','comments.author'] });
306
+ }
307
+ }
308
+ ```
309
+
310
+ ### Retrieving Specific Fields by Type
311
+
312
+ If your server endpoint supports the use of a ['fields' query parameter](https://jsonapi.org/format/#fetching-sparse-fieldsets),
313
+ you can use pass those fields through to your server. At this point in time, this requires a few manual steps on your part.
314
+
315
+ 1. Implement `buildQuery` in your adapter.
316
+
317
+ ```js [app/adapters/application.js]
318
+ buildQuery(snapshot) {
319
+ let query = super.buildQuery(...arguments);
320
+
321
+ let { fields } = snapshot.adapterOptions;
322
+
323
+ if (fields) {
324
+ query.fields = fields;
325
+ }
326
+
327
+ return query;
328
+ }
329
+ ```
330
+
331
+ 2. Then pass through the applicable fields to your `findRecord` request.
332
+
333
+ Given a `post` model with attributes body, title, publishDate and meta, you can retrieve a filtered list of attributes.
334
+
335
+ ```js [app/routes/post.js]
336
+ export default class extends Route {
337
+ model(params) {
338
+ return this.store.findRecord('post', params.post_id, { adapterOptions: { fields: { post: 'body,title' } });
339
+ }
340
+ }
341
+ ```
342
+
343
+ Moreover, you can filter attributes on related models as well. If a `post` has a `belongsTo` relationship to a user,
344
+ just include the relationship key and attributes.
345
+
346
+ ```js [app/routes/post.js]
347
+ export default class extends Route {
348
+ model(params) {
349
+ return this.store.findRecord('post', params.post_id, { adapterOptions: { fields: { post: 'body,title', user: 'name,email' } });
350
+ }
351
+ }
352
+ ```
353
+
354
+ @public
355
+ @deprecated use {@link Store.request} instead
356
+ @until 6.0
357
+ @since 1.13.0
358
+ @param type - either a string representing the name of the resource or a ResourceIdentifier object containing both the type (a string) and the id (a string) for the record or an lid (a string) of an existing record
359
+ @param id - optional object with options for the request only if the first param is a ResourceIdentifier, else the string id of the record to be retrieved
360
+ @param options - if the first param is a string this will be the optional options for the request. See examples for available options.
361
+ */
362
+ findRecord<T>(type: TypeFromInstance<T>, id: string | number, options?: FindRecordOptions): Promise<T>;
363
+ /** @deprecated */
364
+ findRecord(type: string, id: string | number, options?: FindRecordOptions): Promise<unknown>;
365
+ /** @deprecated */
366
+ findRecord<T>(resource: ResourceIdentifierObject<TypeFromInstance<T>>, options?: FindRecordOptions): Promise<T>;
367
+ /** @deprecated */
368
+ findRecord(resource: ResourceIdentifierObject, options?: FindRecordOptions): Promise<unknown>;
369
+ /**
370
+ `findAll` asks the adapter's `findAll` method to find the records for the
371
+ given type, and returns a promise which will resolve with all records of
372
+ this type present in the store, even if the adapter only returns a subset
373
+ of them.
374
+
375
+ ```js [app/routes/authors.js]
376
+ export default class AuthorsRoute extends Route {
377
+ model(params) {
378
+ return this.store.findAll('author');
379
+ }
380
+ }
381
+ ```
382
+
383
+ _When_ the returned promise resolves depends on the reload behavior,
384
+ configured via the passed `options` hash and the result of the adapter's
385
+ `shouldReloadAll` method.
386
+
387
+ ### Reloading
388
+
389
+ If `{ reload: true }` is passed or `adapter.shouldReloadAll` evaluates to
390
+ `true`, then the returned promise resolves once the adapter returns data,
391
+ regardless if there are already records in the store:
392
+
393
+ ```js
394
+ store.push({
395
+ data: {
396
+ id: 'first',
397
+ type: 'author'
398
+ }
399
+ });
400
+
401
+ // adapter#findAll resolves with
402
+ // [
403
+ // {
404
+ // id: 'second',
405
+ // type: 'author'
406
+ // }
407
+ // ]
408
+ store.findAll('author', { reload: true }).then(function(authors) {
409
+ authors.getEach('id'); // ['first', 'second']
410
+ });
411
+ ```
412
+
413
+ If no reload is indicated via the above mentioned ways, then the promise
414
+ immediately resolves with all the records currently loaded in the store.
415
+
416
+ ### Background Reloading
417
+
418
+ Optionally, if `adapter.shouldBackgroundReloadAll` evaluates to `true`,
419
+ then a background reload is started. Once this resolves, the array with
420
+ which the promise resolves, is updated automatically so it contains all the
421
+ records in the store:
422
+
423
+ ```js [app/adapters/application.js]
424
+ import Adapter from '@ember-data/adapter';
425
+
426
+ export default class ApplicationAdapter extends Adapter {
427
+ shouldReloadAll(store, snapshotsArray) {
428
+ return false;
429
+ },
430
+
431
+ shouldBackgroundReloadAll(store, snapshotsArray) {
432
+ return true;
433
+ }
434
+ });
435
+
436
+ // ...
437
+
438
+ store.push({
439
+ data: {
440
+ id: 'first',
441
+ type: 'author'
442
+ }
443
+ });
444
+
445
+ let allAuthors;
446
+ store.findAll('author').then(function(authors) {
447
+ authors.getEach('id'); // ['first']
448
+
449
+ allAuthors = authors;
450
+ });
451
+
452
+ // later, once adapter#findAll resolved with
453
+ // [
454
+ // {
455
+ // id: 'second',
456
+ // type: 'author'
457
+ // }
458
+ // ]
459
+
460
+ allAuthors.getEach('id'); // ['first', 'second']
461
+ ```
462
+
463
+ If you would like to force or prevent background reloading, you can set a
464
+ boolean value for `backgroundReload` in the options object for
465
+ `findAll`.
466
+
467
+ ```js [app/routes/post/edit.js]
468
+ export default class PostEditRoute extends Route {
469
+ model() {
470
+ return this.store.findAll('post', { backgroundReload: false });
471
+ }
472
+ }
473
+ ```
474
+
475
+ If you pass an object on the `adapterOptions` property of the options
476
+ argument it will be passed to you adapter via the `snapshotRecordArray`
477
+
478
+ ```js [app/routes/posts.js]
479
+ export default class PostsRoute extends Route {
480
+ model(params) {
481
+ return this.store.findAll('post', {
482
+ adapterOptions: { subscribe: false }
483
+ });
484
+ }
485
+ }
486
+ ```
487
+
488
+ ```js [app/adapters/post.js]
489
+ import MyCustomAdapter from './custom-adapter';
490
+
491
+ export default class UserAdapter extends MyCustomAdapter {
492
+ findAll(store, type, sinceToken, snapshotRecordArray) {
493
+ if (snapshotRecordArray.adapterOptions.subscribe) {
494
+ // ...
495
+ }
496
+ // ...
497
+ }
498
+ }
499
+ ```
500
+
501
+ See [peekAll](../methods/peekAll?anchor=peekAll) to get an array of current records in the
502
+ store, without waiting until a reload is finished.
503
+
504
+ ### Retrieving Related Model Records
505
+
506
+ If you use an adapter such as Ember's default
507
+ [`JSONAPIAdapter`](/ember-data/release/classes/JSONAPIAdapter)
508
+ that supports the [JSON API specification](http://jsonapi.org/) and if your server
509
+ endpoint supports the use of an
510
+ ['include' query parameter](http://jsonapi.org/format/#fetching-includes),
511
+ you can use `findAll()` to automatically retrieve additional records related to
512
+ those requested by supplying an `include` parameter in the `options` object.
513
+
514
+ For example, given a `post` model that has a `hasMany` relationship with a `comment`
515
+ model, when we retrieve all of the post records we can have the server also return
516
+ all of the posts' comments in the same request:
517
+
518
+ ```js [app/routes/posts.js]
519
+ export default class PostsRoute extends Route {
520
+ model() {
521
+ return this.store.findAll('post', { include: ['comments'] });
522
+ }
523
+ }
524
+ ```
525
+ Multiple relationships can be requested using an `include` parameter consisting of a
526
+ list or relationship names, while nested relationships can be specified
527
+ using a dot-separated sequence of relationship names. So to request both the posts'
528
+ comments and the authors of those comments the request would look like this:
529
+
530
+ ```js [app/routes/posts.js]
531
+ export default class PostsRoute extends Route {
532
+ model() {
533
+ return this.store.findAll('post', { include: ['comments','comments.author'] });
534
+ }
535
+ }
536
+ ```
537
+
538
+ See [query](../methods/query?anchor=query) to only get a subset of records from the server.
539
+
540
+ @public
541
+ @deprecated use {@link Store.request} instead
542
+ @until 6.0
543
+ @since 1.13.0
544
+ @param type the name of the resource
545
+ @param options
546
+ */
547
+ findAll<T>(type: TypeFromInstance<T>, options?: FindAllOptions): Promise<LegacyLiveArray<T>>;
548
+ /** @deprecated */
549
+ findAll(type: string, options?: FindAllOptions): Promise<LegacyLiveArray>;
550
+ /**
551
+ This method delegates a query to the adapter. This is the one place where
552
+ adapter-level semantics are exposed to the application.
553
+
554
+ Each time this method is called a new request is made through the adapter.
555
+
556
+ Exposing queries this way seems preferable to creating an abstract query
557
+ language for all server-side queries, and then require all adapters to
558
+ implement them.
559
+
560
+ ---
561
+
562
+ If you do something like this:
563
+
564
+ ```js
565
+ store.query('person', { page: 1 });
566
+ ```
567
+
568
+ The request made to the server will look something like this:
569
+
570
+ ```http
571
+ GET "/api/v1/person?page=1"
572
+ ```
573
+
574
+ ---
575
+
576
+ If you do something like this:
577
+
578
+ ```javascript
579
+ store.query('person', { ids: ['1', '2', '3'] });
580
+ ```
581
+
582
+ The request made to the server will look something like this:
583
+
584
+ ```
585
+ GET "/api/v1/person?ids%5B%5D=1&ids%5B%5D=2&ids%5B%5D=3"
586
+ decoded: "/api/v1/person?ids[]=1&ids[]=2&ids[]=3"
587
+ ```
588
+
589
+ This method returns a promise, which is resolved with a
590
+ {@link LegacyQueryArray} once the server returns.
591
+
592
+ @public
593
+ @deprecated use {@link Store.request} instead
594
+ @until 6.0
595
+ @since 1.13.0
596
+ @param type the name of the resource
597
+ @param query a query to be used by the adapter
598
+ @param options optional, may include `adapterOptions` hash which will be passed to adapter.query
599
+ */
600
+ query<T>(type: TypeFromInstance<T>, query: LegacyResourceQuery, options?: QueryOptions): Promise<LegacyQueryArray<T>>;
601
+ /** @deprecated */
602
+ query(type: string, query: LegacyResourceQuery, options?: QueryOptions): Promise<LegacyQueryArray>;
603
+ /**
604
+ This method makes a request for one record, where the `id` is not known
605
+ beforehand (if the `id` is known, use [`findRecord`](../methods/findRecord?anchor=findRecord)
606
+ instead).
607
+
608
+ This method can be used when it is certain that the server will return a
609
+ single object for the primary data.
610
+
611
+ Each time this method is called a new request is made through the adapter.
612
+
613
+ Let's assume our API provides an endpoint for the currently logged in user
614
+ via:
615
+
616
+ ```
617
+ // GET /api/current_user
618
+ {
619
+ user: {
620
+ id: 1234,
621
+ username: 'admin'
622
+ }
623
+ }
624
+ ```
625
+
626
+ Since the specific `id` of the `user` is not known beforehand, we can use
627
+ `queryRecord` to get the user:
628
+
629
+ ```javascript
630
+ store.queryRecord('user', {}).then(function(user) {
631
+ let username = user.username;
632
+ // do thing
633
+ });
634
+ ```
635
+
636
+ The request is made through the adapters' `queryRecord`:
637
+
638
+ ```js [app/adapters/user.js]
639
+ import Adapter from '@ember-data/adapter';
640
+ import $ from 'jquery';
641
+
642
+ export default class UserAdapter extends Adapter {
643
+ queryRecord(modelName, query) {
644
+ return $.getJSON('/api/current_user');
645
+ }
646
+ }
647
+ ```
648
+
649
+ Note: the primary use case for `store.queryRecord` is when a single record
650
+ is queried and the `id` is not known beforehand. In all other cases
651
+ `store.query` and using the first item of the array is likely the preferred
652
+ way:
653
+
654
+ ```
655
+ // GET /users?username=unique
656
+ {
657
+ data: [{
658
+ id: 1234,
659
+ type: 'user',
660
+ attributes: {
661
+ username: "unique"
662
+ }
663
+ }]
664
+ }
665
+ ```
666
+
667
+ ```javascript
668
+ store.query('user', { username: 'unique' }).then(function(users) {
669
+ return users.firstObject;
670
+ }).then(function(user) {
671
+ let id = user.id;
672
+ });
673
+ ```
674
+
675
+ This method returns a promise, which resolves with the found record.
676
+
677
+ If the adapter returns no data for the primary data of the payload, then
678
+ `queryRecord` resolves with `null`:
679
+
680
+ ```
681
+ // GET /users?username=unique
682
+ {
683
+ data: null
684
+ }
685
+ ```
686
+
687
+ ```javascript
688
+ store.queryRecord('user', { username: 'unique' }).then(function(user) {
689
+ // user is null
690
+ });
691
+ ```
692
+
693
+ @public
694
+ @deprecated use {@link Store.request} instead
695
+ @until 6.0
696
+ @since 1.13.0
697
+ @param type
698
+ @param query an opaque query to be used by the adapter
699
+ @param options optional, may include `adapterOptions` hash which will be passed to adapter.queryRecord
700
+ @return promise which resolves with the found record or `null`
701
+ */
702
+ queryRecord<T>(type: TypeFromInstance<T>, query: LegacyResourceQuery, options?: QueryOptions): Promise<T | null>;
703
+ /** @deprecated */
704
+ queryRecord(type: string, query: LegacyResourceQuery, options?: QueryOptions): Promise<unknown | null>;
705
+ /**
706
+ Get the reference for the specified record.
707
+
708
+ Example
709
+
710
+ ```javascript
711
+ let userRef = store.getReference('user', '1');
712
+
713
+ // check if the user is loaded
714
+ let isLoaded = userRef.value() !== null;
715
+
716
+ // get the record of the reference (null if not yet available)
717
+ let user = userRef.value();
718
+
719
+ // get the identifier of the reference
720
+ if (userRef.remoteType() === 'id') {
721
+ let id = userRef.id();
722
+ }
723
+
724
+ // load user (via store.find)
725
+ userRef.load().then(...)
726
+
727
+ // or trigger a reload
728
+ userRef.reload().then(...)
729
+
730
+ // provide data for reference
731
+ userRef.push({ id: 1, username: '@user' }).then(function(user) {
732
+ userRef.value() === user;
733
+ });
734
+ ```
735
+
736
+ @public
737
+ @deprecated use {@link Store.request} for loading and {@link Store.cache} for direct data insertion instead
738
+ @until 6.0
739
+ @since 2.5.0
740
+ @param resource - modelName (string) or Identifier (object)
741
+ @param id
742
+ */
743
+ getReference(resource: string | ResourceIdentifierObject, id: string | number): RecordReference;
744
+ /**
745
+ Returns the schema for a particular resource type (modelName).
746
+
747
+ When used with Model from @ember-data/model the return is the model class,
748
+ but this is not guaranteed.
749
+
750
+ If looking to query attribute or relationship information it is
751
+ recommended to use `getSchemaDefinitionService` instead. This method
752
+ should be considered legacy and exists primarily to continue to support
753
+ Adapter/Serializer APIs which expect it's return value in their method
754
+ signatures.
755
+
756
+ The class of a model might be useful if you want to get a list of all the
757
+ relationship names of the model, see
758
+ [`relationshipNames`](/ember-data/release/classes/Model?anchor=relationshipNames)
759
+ for example.
760
+
761
+ @public
762
+ @deprecated use {@link Store.schema} instead
763
+ @until 6.0
764
+ @param type
765
+ */
766
+ modelFor<T>(type: TypeFromInstance<T>): ModelSchema<T>;
767
+ /** @deprecated */
768
+ modelFor(type: string): ModelSchema;
769
+ /**
770
+ * Trigger a save for a Record.
771
+ *
772
+ * Returns a promise resolving with the same record when the save is complete.
773
+ *
774
+ * @deprecated use {@link Store.request} instead
775
+ * @until 6.0
776
+ * @public
777
+ * @param record
778
+ * @param options
779
+ */
780
+ saveRecord<T>(record: T, options?: Record<string, unknown>): Promise<T>;
781
+ }
782
+ }
783
+ export { Store };