@ember-data-mirror/request-utils 5.4.0-alpha.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,472 @@
1
+
2
+ declare module '@ember-data-mirror/request-utils' {
3
+ import type { Cache } from '@warp-drive-mirror/core-types/cache';
4
+ import type { StableDocumentIdentifier } from '@warp-drive-mirror/core-types/identifier';
5
+ import type { QueryParamsSerializationOptions, QueryParamsSource, Serializable } from '@warp-drive-mirror/core-types/params';
6
+ import type { ImmutableRequestInfo, ResponseInfo } from '@warp-drive-mirror/core-types/request';
7
+ type Store = {
8
+ cache: Cache;
9
+ };
10
+ /**
11
+ * Simple utility function to assist in url building,
12
+ * query params, and other common request operations.
13
+ *
14
+ * These primitives may be used directly or composed
15
+ * by request builders to provide a consistent interface
16
+ * for building requests.
17
+ *
18
+ * For instance:
19
+ *
20
+ * ```ts
21
+ * import { buildBaseURL, buildQueryParams } from '@ember-data-mirror/request-utils';
22
+ *
23
+ * const baseURL = buildBaseURL({
24
+ * host: 'https://api.example.com',
25
+ * namespace: 'api/v1',
26
+ * resourcePath: 'emberDevelopers',
27
+ * op: 'query',
28
+ * identifier: { type: 'ember-developer' }
29
+ * });
30
+ * const url = `${baseURL}?${buildQueryParams({ name: 'Chris', include:['pets'] })}`;
31
+ * // => 'https://api.example.com/api/v1/emberDevelopers?include=pets&name=Chris'
32
+ * ```
33
+ *
34
+ * This is useful, but not as useful as the REST request builder for query which is sugar
35
+ * over this (and more!):
36
+ *
37
+ * ```ts
38
+ * import { query } from '@ember-data-mirror/rest/request';
39
+ *
40
+ * const options = query('ember-developer', { name: 'Chris', include:['pets'] });
41
+ * // => { url: 'https://api.example.com/api/v1/emberDevelopers?include=pets&name=Chris' }
42
+ * // Note: options will also include other request options like headers, method, etc.
43
+ * ```
44
+ *
45
+ * @module @ember-data-mirror/request-utils
46
+ * @main @ember-data-mirror/request-utils
47
+ * @public
48
+ */
49
+ export interface BuildURLConfig {
50
+ host: string | null;
51
+ namespace: string | null;
52
+ }
53
+ /**
54
+ * Sets the global configuration for `buildBaseURL`
55
+ * for host and namespace values for the application.
56
+ *
57
+ * These values may still be overridden by passing
58
+ * them to buildBaseURL directly.
59
+ *
60
+ * This method may be called as many times as needed.
61
+ * host values of `''` or `'/'` are equivalent.
62
+ *
63
+ * Except for the value of `/` as host, host should not
64
+ * end with `/`.
65
+ *
66
+ * namespace should not start or end with a `/`.
67
+ *
68
+ * ```ts
69
+ * type BuildURLConfig = {
70
+ * host: string;
71
+ * namespace: string'
72
+ * }
73
+ * ```
74
+ *
75
+ * Example:
76
+ *
77
+ * ```ts
78
+ * import { setBuildURLConfig } from '@ember-data-mirror/request-utils';
79
+ *
80
+ * setBuildURLConfig({
81
+ * host: 'https://api.example.com',
82
+ * namespace: 'api/v1'
83
+ * });
84
+ * ```
85
+ *
86
+ * @method setBuildURLConfig
87
+ * @static
88
+ * @public
89
+ * @for @ember-data-mirror/request-utils
90
+ * @param {BuildURLConfig} config
91
+ * @return void
92
+ */
93
+ export function setBuildURLConfig(config: BuildURLConfig): void;
94
+ export interface FindRecordUrlOptions {
95
+ op: 'findRecord';
96
+ identifier: {
97
+ type: string;
98
+ id: string;
99
+ };
100
+ resourcePath?: string;
101
+ host?: string;
102
+ namespace?: string;
103
+ }
104
+ export interface QueryUrlOptions {
105
+ op: 'query';
106
+ identifier: {
107
+ type: string;
108
+ };
109
+ resourcePath?: string;
110
+ host?: string;
111
+ namespace?: string;
112
+ }
113
+ export interface FindManyUrlOptions {
114
+ op: 'findMany';
115
+ identifiers: {
116
+ type: string;
117
+ id: string;
118
+ }[];
119
+ resourcePath?: string;
120
+ host?: string;
121
+ namespace?: string;
122
+ }
123
+ export interface FindRelatedCollectionUrlOptions {
124
+ op: 'findRelatedCollection';
125
+ identifier: {
126
+ type: string;
127
+ id: string;
128
+ };
129
+ fieldPath: string;
130
+ resourcePath?: string;
131
+ host?: string;
132
+ namespace?: string;
133
+ }
134
+ export interface FindRelatedResourceUrlOptions {
135
+ op: 'findRelatedRecord';
136
+ identifier: {
137
+ type: string;
138
+ id: string;
139
+ };
140
+ fieldPath: string;
141
+ resourcePath?: string;
142
+ host?: string;
143
+ namespace?: string;
144
+ }
145
+ export interface CreateRecordUrlOptions {
146
+ op: 'createRecord';
147
+ identifier: {
148
+ type: string;
149
+ };
150
+ resourcePath?: string;
151
+ host?: string;
152
+ namespace?: string;
153
+ }
154
+ export interface UpdateRecordUrlOptions {
155
+ op: 'updateRecord';
156
+ identifier: {
157
+ type: string;
158
+ id: string;
159
+ };
160
+ resourcePath?: string;
161
+ host?: string;
162
+ namespace?: string;
163
+ }
164
+ export interface DeleteRecordUrlOptions {
165
+ op: 'deleteRecord';
166
+ identifier: {
167
+ type: string;
168
+ id: string;
169
+ };
170
+ resourcePath?: string;
171
+ host?: string;
172
+ namespace?: string;
173
+ }
174
+ export interface GenericUrlOptions {
175
+ resourcePath: string;
176
+ host?: string;
177
+ namespace?: string;
178
+ }
179
+ export type UrlOptions = FindRecordUrlOptions | QueryUrlOptions | FindManyUrlOptions | FindRelatedCollectionUrlOptions | FindRelatedResourceUrlOptions | CreateRecordUrlOptions | UpdateRecordUrlOptions | DeleteRecordUrlOptions | GenericUrlOptions;
180
+ /**
181
+ * Builds a URL for a request based on the provided options.
182
+ * Does not include support for building query params (see `buildQueryParams`)
183
+ * so that it may be composed cleanly with other query-params strategies.
184
+ *
185
+ * Usage:
186
+ *
187
+ * ```ts
188
+ * import { buildBaseURL } from '@ember-data-mirror/request-utils';
189
+ *
190
+ * const url = buildBaseURL({
191
+ * host: 'https://api.example.com',
192
+ * namespace: 'api/v1',
193
+ * resourcePath: 'emberDevelopers',
194
+ * op: 'query',
195
+ * identifier: { type: 'ember-developer' }
196
+ * });
197
+ *
198
+ * // => 'https://api.example.com/api/v1/emberDevelopers'
199
+ * ```
200
+ *
201
+ * On the surface this may seem like a lot of work to do something simple, but
202
+ * it is designed to be composable with other utilities and interfaces that the
203
+ * average product engineer will never need to see or use.
204
+ *
205
+ * A few notes:
206
+ *
207
+ * - `resourcePath` is optional, but if it is not provided, `identifier.type` will be used.
208
+ * - `host` and `namespace` are optional, but if they are not provided, the values globally
209
+ * configured via `setBuildURLConfig` will be used.
210
+ * - `op` is required and must be one of the following:
211
+ * - 'findRecord' 'query' 'findMany' 'findRelatedCollection' 'findRelatedRecord'` 'createRecord' 'updateRecord' 'deleteRecord'
212
+ * - Depending on the value of `op`, `identifier` or `identifiers` will be required.
213
+ *
214
+ * @method buildBaseURL
215
+ * @static
216
+ * @public
217
+ * @for @ember-data-mirror/request-utils
218
+ * @param urlOptions
219
+ * @return string
220
+ */
221
+ export function buildBaseURL(urlOptions: UrlOptions): string;
222
+ /**
223
+ * filter out keys of an object that have falsy values or point to empty arrays
224
+ * returning a new object with only those keys that have truthy values / non-empty arrays
225
+ *
226
+ * @method filterEmpty
227
+ * @static
228
+ * @public
229
+ * @for @ember-data-mirror/request-utils
230
+ * @param {Record<string, Serializable>} source object to filter keys with empty values from
231
+ * @return {Record<string, Serializable>} A new object with the keys that contained empty values removed
232
+ */
233
+ export function filterEmpty(source: Record<string, Serializable>): Record<string, Serializable>;
234
+ /**
235
+ * Sorts query params by both key and value returning a new URLSearchParams
236
+ * object with the keys inserted in sorted order.
237
+ *
238
+ * Treats `included` specially, splicing it into an array if it is a string and sorting the array.
239
+ *
240
+ * Options:
241
+ * - arrayFormat: 'bracket' | 'indices' | 'repeat' | 'comma'
242
+ *
243
+ * 'bracket': appends [] to the key for every value e.g. `&ids[]=1&ids[]=2`
244
+ * 'indices': appends [i] to the key for every value e.g. `&ids[0]=1&ids[1]=2`
245
+ * 'repeat': appends the key for every value e.g. `&ids=1&ids=2`
246
+ * 'comma' (default): appends the key once with a comma separated list of values e.g. `&ids=1,2`
247
+ *
248
+ * @method sortQueryParams
249
+ * @static
250
+ * @public
251
+ * @for @ember-data-mirror/request-utils
252
+ * @param {URLSearchParams | object} params
253
+ * @param {object} options
254
+ * @return {URLSearchParams} A URLSearchParams with keys inserted in sorted order
255
+ */
256
+ export function sortQueryParams(params: QueryParamsSource, options?: QueryParamsSerializationOptions): URLSearchParams;
257
+ /**
258
+ * Sorts query params by both key and value, returning a query params string
259
+ *
260
+ * Treats `included` specially, splicing it into an array if it is a string and sorting the array.
261
+ *
262
+ * Options:
263
+ * - arrayFormat: 'bracket' | 'indices' | 'repeat' | 'comma'
264
+ *
265
+ * 'bracket': appends [] to the key for every value e.g. `ids[]=1&ids[]=2`
266
+ * 'indices': appends [i] to the key for every value e.g. `ids[0]=1&ids[1]=2`
267
+ * 'repeat': appends the key for every value e.g. `ids=1&ids=2`
268
+ * 'comma' (default): appends the key once with a comma separated list of values e.g. `ids=1,2`
269
+ *
270
+ * @method buildQueryParams
271
+ * @static
272
+ * @public
273
+ * @for @ember-data-mirror/request-utils
274
+ * @param {URLSearchParams | object} params
275
+ * @param {object} [options]
276
+ * @return {string} A sorted query params string without the leading `?`
277
+ */
278
+ export function buildQueryParams(params: QueryParamsSource, options?: QueryParamsSerializationOptions): string;
279
+ export interface CacheControlValue {
280
+ immutable?: boolean;
281
+ 'max-age'?: number;
282
+ 'must-revalidate'?: boolean;
283
+ 'must-understand'?: boolean;
284
+ 'no-cache'?: boolean;
285
+ 'no-store'?: boolean;
286
+ 'no-transform'?: boolean;
287
+ 'only-if-cached'?: boolean;
288
+ private?: boolean;
289
+ 'proxy-revalidate'?: boolean;
290
+ public?: boolean;
291
+ 's-maxage'?: number;
292
+ 'stale-if-error'?: number;
293
+ 'stale-while-revalidate'?: number;
294
+ }
295
+ /**
296
+ * Parses a string Cache-Control header value into an object with the following structure:
297
+ *
298
+ * ```ts
299
+ * interface CacheControlValue {
300
+ * immutable?: boolean;
301
+ * 'max-age'?: number;
302
+ * 'must-revalidate'?: boolean;
303
+ * 'must-understand'?: boolean;
304
+ * 'no-cache'?: boolean;
305
+ * 'no-store'?: boolean;
306
+ * 'no-transform'?: boolean;
307
+ * 'only-if-cached'?: boolean;
308
+ * private?: boolean;
309
+ * 'proxy-revalidate'?: boolean;
310
+ * public?: boolean;
311
+ * 's-maxage'?: number;
312
+ * 'stale-if-error'?: number;
313
+ * 'stale-while-revalidate'?: number;
314
+ * }
315
+ * ```
316
+ * @method parseCacheControl
317
+ * @static
318
+ * @public
319
+ * @for @ember-data-mirror/request-utils
320
+ * @param {string} header
321
+ * @return {CacheControlValue}
322
+ */
323
+ export function parseCacheControl(header: string): CacheControlValue;
324
+ export type LifetimesConfig = {
325
+ apiCacheSoftExpires: number;
326
+ apiCacheHardExpires: number;
327
+ };
328
+ /**
329
+ * A basic LifetimesService that can be added to the Store service.
330
+ *
331
+ * Determines staleness based on time since the request was last received from the API
332
+ * using the `date` header.
333
+ *
334
+ * Invalidates any request for which `cacheOptions.types` was provided when a createRecord
335
+ * request for that type is successful.
336
+ *
337
+ * This allows the Store's CacheHandler to determine if a request is expired and
338
+ * should be refetched upon next request.
339
+ *
340
+ * The `Fetch` handler provided by `@ember-data-mirror/request/fetch` will automatically
341
+ * add the `date` header to responses if it is not present.
342
+ *
343
+ * Note: Date headers do not have millisecond precision, so expiration times should
344
+ * generally be larger than 1000ms.
345
+ *
346
+ * Usage:
347
+ *
348
+ * ```ts
349
+ * import { LifetimesService } from '@ember-data-mirror/request-utils';
350
+ * import DataStore from '@ember-data-mirror/store';
351
+ *
352
+ * // ...
353
+ *
354
+ * export class Store extends DataStore {
355
+ * constructor(args) {
356
+ * super(args);
357
+ * this.lifetimes = new LifetimesService({ apiCacheSoftExpires: 30_000, apiCacheHardExpires: 60_000 });
358
+ * }
359
+ * }
360
+ * ```
361
+ *
362
+ * @class LifetimesService
363
+ * @public
364
+ * @module @ember-data-mirror/request-utils
365
+ */
366
+ export class LifetimesService {
367
+ config: LifetimesConfig;
368
+ _stores: WeakMap<Store, {
369
+ invalidated: Set<string>;
370
+ types: Map<string, Set<string>>;
371
+ }>;
372
+ _getStore(store: Store): {
373
+ invalidated: Set<string>;
374
+ types: Map<string, Set<string>>;
375
+ };
376
+ constructor(config: LifetimesConfig);
377
+ /**
378
+ * Invalidate a request by its identifier for a given store instance.
379
+ *
380
+ * While the store argument may seem redundant, the lifetimes service
381
+ * is designed to be shared across multiple stores / forks
382
+ * of the store.
383
+ *
384
+ * ```ts
385
+ * store.lifetimes.invalidateRequest(store, identifier);
386
+ * ```
387
+ *
388
+ * @method invalidateRequest
389
+ * @public
390
+ * @param {StableDocumentIdentifier} identifier
391
+ * @param {Store} store
392
+ */
393
+ invalidateRequest(identifier: StableDocumentIdentifier, store: Store): void;
394
+ /**
395
+ * Invalidate all requests associated to a specific type
396
+ * for a given store instance.
397
+ *
398
+ * While the store argument may seem redundant, the lifetimes service
399
+ * is designed to be shared across multiple stores / forks
400
+ * of the store.
401
+ *
402
+ * This invalidation is done automatically when using this service
403
+ * for both the CacheHandler and the LegacyNetworkHandler.
404
+ *
405
+ * ```ts
406
+ * store.lifetimes.invalidateRequestsForType(store, 'person');
407
+ * ```
408
+ *
409
+ * @method invalidateRequestsForType
410
+ * @public
411
+ * @param {string} type
412
+ * @param {Store} store
413
+ */
414
+ invalidateRequestsForType(type: string, store: Store): void;
415
+ /**
416
+ * Invoked when a request has been fulfilled from the configured request handlers.
417
+ * This is invoked by the CacheHandler for both foreground and background requests
418
+ * once the cache has been updated.
419
+ *
420
+ * Note, this is invoked by the CacheHandler regardless of whether
421
+ * the request has a cache-key.
422
+ *
423
+ * This method should not be invoked directly by consumers.
424
+ *
425
+ * @method didRequest
426
+ * @public
427
+ * @param {ImmutableRequestInfo} request
428
+ * @param {ImmutableResponse} response
429
+ * @param {Store} store
430
+ * @param {StableDocumentIdentifier | null} identifier
431
+ * @return {void}
432
+ */
433
+ didRequest(request: ImmutableRequestInfo, response: Response | ResponseInfo | null, identifier: StableDocumentIdentifier | null, store: Store): void;
434
+ /**
435
+ * Invoked to determine if the request may be fulfilled from cache
436
+ * if possible.
437
+ *
438
+ * Note, this is only invoked by the CacheHandler if the request has
439
+ * a cache-key.
440
+ *
441
+ * If no cache entry is found or the entry is hard expired,
442
+ * the request will be fulfilled from the configured request handlers
443
+ * and the cache will be updated before returning the response.
444
+ *
445
+ * @method isHardExpired
446
+ * @public
447
+ * @param {StableDocumentIdentifier} identifier
448
+ * @param {Store} store
449
+ * @return {boolean} true if the request is considered hard expired
450
+ */
451
+ isHardExpired(identifier: StableDocumentIdentifier, store: Store): boolean;
452
+ /**
453
+ * Invoked if `isHardExpired` is false to determine if the request
454
+ * should be update behind the scenes if cache data is already available.
455
+ *
456
+ * Note, this is only invoked by the CacheHandler if the request has
457
+ * a cache-key.
458
+ *
459
+ * If true, the request will be fulfilled from cache while a backgrounded
460
+ * request is made to update the cache via the configured request handlers.
461
+ *
462
+ * @method isSoftExpired
463
+ * @public
464
+ * @param {StableDocumentIdentifier} identifier
465
+ * @param {Store} store
466
+ * @return {boolean} true if the request is considered soft expired
467
+ */
468
+ isSoftExpired(identifier: StableDocumentIdentifier, store: Store): boolean;
469
+ }
470
+ export {};
471
+ }
472
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}