@data-client/core 0.14.18 → 0.14.20

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 (78) hide show
  1. package/dist/index.js +549 -276
  2. package/dist/index.umd.min.js +1 -1
  3. package/legacy/actions.js +1 -1
  4. package/legacy/controller/Controller.js +96 -8
  5. package/legacy/index.js +3 -4
  6. package/legacy/manager/DevtoolsManager.js +7 -4
  7. package/legacy/manager/NetworkManager.js +3 -2
  8. package/legacy/manager/SubscriptionManager.js +1 -1
  9. package/legacy/manager/applyManager.js +3 -7
  10. package/legacy/manager/initManager.js +15 -0
  11. package/legacy/state/GCPolicy.js +151 -0
  12. package/legacy/state/reducer/createReducer.js +7 -3
  13. package/legacy/state/reducer/expireReducer.js +5 -4
  14. package/legacy/state/reducer/fetchReducer.js +3 -2
  15. package/legacy/state/reducer/invalidateReducer.js +6 -5
  16. package/legacy/state/reducer/setResponseReducer.js +10 -7
  17. package/legacy/types.js +1 -1
  18. package/lib/actions.d.ts +2 -2
  19. package/lib/actions.d.ts.map +1 -1
  20. package/lib/actions.js +1 -1
  21. package/lib/controller/Controller.d.ts +108 -5
  22. package/lib/controller/Controller.d.ts.map +1 -1
  23. package/lib/controller/Controller.js +96 -8
  24. package/lib/index.d.ts +2 -0
  25. package/lib/index.d.ts.map +1 -1
  26. package/lib/index.js +3 -4
  27. package/lib/manager/SubscriptionManager.d.ts.map +1 -1
  28. package/lib/manager/SubscriptionManager.js +1 -1
  29. package/lib/manager/applyManager.d.ts.map +1 -1
  30. package/lib/manager/applyManager.js +3 -7
  31. package/lib/manager/initManager.d.ts +4 -0
  32. package/lib/manager/initManager.d.ts.map +1 -0
  33. package/lib/manager/initManager.js +15 -0
  34. package/lib/state/GCPolicy.d.ts +55 -0
  35. package/lib/state/GCPolicy.d.ts.map +1 -0
  36. package/lib/state/GCPolicy.js +151 -0
  37. package/lib/state/reducer/createReducer.js +5 -2
  38. package/lib/state/reducer/expireReducer.d.ts +1 -0
  39. package/lib/state/reducer/expireReducer.d.ts.map +1 -1
  40. package/lib/state/reducer/invalidateReducer.d.ts +1 -0
  41. package/lib/state/reducer/invalidateReducer.d.ts.map +1 -1
  42. package/lib/state/reducer/setReducer.d.ts +3 -2
  43. package/lib/state/reducer/setReducer.d.ts.map +1 -1
  44. package/lib/state/reducer/setResponseReducer.d.ts +4 -2
  45. package/lib/state/reducer/setResponseReducer.d.ts.map +1 -1
  46. package/lib/state/reducer/setResponseReducer.js +4 -2
  47. package/lib/types.d.ts +1 -0
  48. package/lib/types.d.ts.map +1 -1
  49. package/lib/types.js +1 -1
  50. package/package.json +10 -5
  51. package/src/actions.ts +2 -1
  52. package/src/controller/Controller.ts +205 -8
  53. package/src/controller/__tests__/Controller.ts +8 -4
  54. package/src/controller/__tests__/__snapshots__/get.ts.snap +7 -0
  55. package/src/controller/__tests__/__snapshots__/getResponse.ts.snap +15 -0
  56. package/src/controller/__tests__/get.ts +45 -17
  57. package/src/controller/__tests__/getResponse.ts +46 -0
  58. package/src/index.ts +2 -6
  59. package/src/manager/SubscriptionManager.ts +0 -1
  60. package/src/manager/applyManager.ts +3 -4
  61. package/src/manager/initManager.ts +21 -0
  62. package/src/state/GCPolicy.ts +197 -0
  63. package/src/state/__tests__/GCPolicy.test.ts +258 -0
  64. package/src/state/__tests__/__snapshots__/reducer.ts.snap +2 -0
  65. package/src/state/__tests__/reducer.ts +4 -4
  66. package/src/state/reducer/createReducer.ts +1 -1
  67. package/src/state/reducer/setResponseReducer.ts +3 -1
  68. package/src/types.ts +1 -0
  69. package/ts3.4/actions.d.ts +2 -5
  70. package/ts3.4/controller/Controller.d.ts +141 -5
  71. package/ts3.4/index.d.ts +2 -0
  72. package/ts3.4/manager/initManager.d.ts +4 -0
  73. package/ts3.4/state/GCPolicy.d.ts +55 -0
  74. package/ts3.4/state/reducer/expireReducer.d.ts +1 -0
  75. package/ts3.4/state/reducer/invalidateReducer.d.ts +1 -0
  76. package/ts3.4/state/reducer/setReducer.d.ts +3 -2
  77. package/ts3.4/state/reducer/setResponseReducer.d.ts +4 -2
  78. package/ts3.4/types.d.ts +1 -0
@@ -1,13 +1,17 @@
1
1
  import { ErrorTypes, SnapshotInterface, Schema, Denormalize, Queryable, SchemaArgs } from '@data-client/normalizr';
2
2
  import { ExpiryStatus, EndpointInterface, FetchFunction, ResolveType, DenormalizeNullable, MemoCache } from '@data-client/normalizr';
3
+ import AbortOptimistic from './AbortOptimistic.js';
3
4
  import { EndpointUpdateFunction } from './types.js';
5
+ import { ReduxMiddlewareAPI } from '../manager/applyManager.js';
6
+ import { GCInterface } from '../state/GCPolicy.js';
4
7
  import { ActionTypes, State } from '../types.js';
5
8
  export type GenericDispatch = (value: any) => Promise<void>;
6
9
  export type DataClientDispatch = (value: ActionTypes) => Promise<void>;
7
- interface ConstructorProps<D extends GenericDispatch = DataClientDispatch> {
10
+ export interface ControllerConstructorProps<D extends GenericDispatch = DataClientDispatch> {
8
11
  dispatch?: D;
9
12
  getState?: () => State<unknown>;
10
13
  memo?: Pick<MemoCache, 'denormalize' | 'query' | 'buildQueryKey'>;
14
+ gcPolicy?: GCInterface;
11
15
  }
12
16
  /**
13
17
  * Imperative control of Reactive Data Client store
@@ -19,7 +23,7 @@ export default class Controller<D extends GenericDispatch = DataClientDispatch>
19
23
  *
20
24
  * @see https://dataclient.io/docs/api/Controller#dispatch
21
25
  */
22
- readonly dispatch: D;
26
+ protected _dispatch: D;
23
27
  /**
24
28
  * Gets the latest state snapshot that is fully committed.
25
29
  *
@@ -27,12 +31,21 @@ export default class Controller<D extends GenericDispatch = DataClientDispatch>
27
31
  * This should *not* be used to render; instead useSuspense() or useCache()
28
32
  * @see https://dataclient.io/docs/api/Controller#getState
29
33
  */
30
- readonly getState: () => State<unknown>;
34
+ getState: () => State<unknown>;
31
35
  /**
32
36
  * Singleton to maintain referential equality between calls
33
37
  */
34
38
  readonly memo: Pick<MemoCache, 'denormalize' | 'query' | 'buildQueryKey'>;
35
- constructor({ dispatch, getState, memo, }?: ConstructorProps<D>);
39
+ /**
40
+ * Handles garbage collection
41
+ */
42
+ readonly gcPolicy: GCInterface;
43
+ constructor({ dispatch, getState, memo, gcPolicy, }?: ControllerConstructorProps<D>);
44
+ dispatch: D;
45
+ bindMiddleware({ dispatch, getState, }: {
46
+ dispatch: D;
47
+ getState: ReduxMiddlewareAPI['getState'];
48
+ }): void;
36
49
  /*************** Action Dispatchers ***************/
37
50
  /**
38
51
  * Fetches the endpoint with given args, updating the Reactive Data Client cache with the response or error upon completion.
@@ -154,7 +167,7 @@ export default class Controller<D extends GenericDispatch = DataClientDispatch>
154
167
  * Gets a snapshot (https://dataclient.io/docs/api/Snapshot)
155
168
  * @see https://dataclient.io/docs/api/Controller#snapshot
156
169
  */
157
- snapshot: (state: State<unknown>, fetchedAt?: number) => SnapshotInterface;
170
+ snapshot: (state: State<unknown>, fetchedAt?: number) => Snapshot<unknown>;
158
171
  /**
159
172
  * Gets the error, if any, for a given endpoint. Returns undefined for no errors.
160
173
  * @see https://dataclient.io/docs/api/Controller#getError
@@ -187,6 +200,7 @@ export default class Controller<D extends GenericDispatch = DataClientDispatch>
187
200
  data: DenormalizeNullable<E['schema']>;
188
201
  expiryStatus: ExpiryStatus;
189
202
  expiresAt: number;
203
+ countRef: () => () => void;
190
204
  };
191
205
  getResponse<E extends Pick<EndpointInterface, 'key' | 'schema' | 'invalidIfStale'>>(endpoint: E, ...rest: readonly [
192
206
  ...(readonly [
@@ -199,6 +213,36 @@ export default class Controller<D extends GenericDispatch = DataClientDispatch>
199
213
  data: DenormalizeNullable<E['schema']>;
200
214
  expiryStatus: ExpiryStatus;
201
215
  expiresAt: number;
216
+ countRef: () => () => void;
217
+ };
218
+ /**
219
+ * Gets the (globally referentially stable) response for a given endpoint/args pair from state given.
220
+ * @see https://dataclient.io/docs/api/Controller#getResponseMeta
221
+ */
222
+ getResponseMeta<E extends EndpointInterface>(endpoint: E, ...rest: readonly [
223
+ null,
224
+ State<unknown>
225
+ ] | readonly [
226
+ ...Parameters<E>,
227
+ State<unknown>
228
+ ]): {
229
+ data: DenormalizeNullable<E['schema']>;
230
+ expiryStatus: ExpiryStatus;
231
+ expiresAt: number;
232
+ countRef: () => () => void;
233
+ };
234
+ getResponseMeta<E extends Pick<EndpointInterface, 'key' | 'schema' | 'invalidIfStale'>>(endpoint: E, ...rest: readonly [
235
+ ...(readonly [
236
+ ...Parameters<E['key']>
237
+ ] | readonly [
238
+ null
239
+ ]),
240
+ State<unknown>
241
+ ]): {
242
+ data: DenormalizeNullable<E['schema']>;
243
+ expiryStatus: ExpiryStatus;
244
+ expiresAt: number;
245
+ countRef: () => () => void;
202
246
  };
203
247
  /**
204
248
  * Queries the store for a Querable schema
@@ -208,7 +252,99 @@ export default class Controller<D extends GenericDispatch = DataClientDispatch>
208
252
  ...SchemaArgs<S>,
209
253
  Pick<State<unknown>, 'entities' | 'entityMeta'>
210
254
  ]): DenormalizeNullable<S> | undefined;
255
+ /**
256
+ * Queries the store for a Querable schema; providing related metadata
257
+ * @see https://dataclient.io/docs/api/Controller#getQueryMeta
258
+ */
259
+ getQueryMeta<S extends Queryable>(schema: S, ...rest: readonly [
260
+ ...SchemaArgs<S>,
261
+ Pick<State<unknown>, 'entities' | 'entityMeta'>
262
+ ]): {
263
+ data: DenormalizeNullable<S> | undefined;
264
+ countRef: () => () => void;
265
+ };
211
266
  private getSchemaResponse;
212
267
  }
213
268
  export { ErrorTypes };
269
+ declare class Snapshot<T = unknown> implements SnapshotInterface {
270
+ static readonly abort: AbortOptimistic;
271
+ private state;
272
+ private controller;
273
+ readonly fetchedAt: number;
274
+ readonly abort: AbortOptimistic;
275
+ constructor(controller: Controller, state: State<T>, fetchedAt?: number);
276
+ /*************** Data Access ***************/
277
+ /** @see https://dataclient.io/docs/api/Snapshot#getResponse */
278
+ getResponse<E extends EndpointInterface>(endpoint: E, ...args: readonly [
279
+ null
280
+ ]): {
281
+ data: DenormalizeNullable<E['schema']>;
282
+ expiryStatus: ExpiryStatus;
283
+ expiresAt: number;
284
+ };
285
+ getResponse<E extends EndpointInterface>(endpoint: E, ...args: readonly [
286
+ ...Parameters<E>
287
+ ]): {
288
+ data: DenormalizeNullable<E['schema']>;
289
+ expiryStatus: ExpiryStatus;
290
+ expiresAt: number;
291
+ };
292
+ getResponse<E extends Pick<EndpointInterface, 'key' | 'schema' | 'invalidIfStale'>>(endpoint: E, ...args: readonly [
293
+ ...Parameters<E['key']>
294
+ ] | readonly [
295
+ null
296
+ ]): {
297
+ data: DenormalizeNullable<E['schema']>;
298
+ expiryStatus: ExpiryStatus;
299
+ expiresAt: number;
300
+ };
301
+ /** @see https://dataclient.io/docs/api/Snapshot#getResponseMeta */
302
+ getResponseMeta<E extends EndpointInterface>(endpoint: E, ...args: readonly [
303
+ null
304
+ ]): {
305
+ data: DenormalizeNullable<E['schema']>;
306
+ expiryStatus: ExpiryStatus;
307
+ expiresAt: number;
308
+ };
309
+ getResponseMeta<E extends EndpointInterface>(endpoint: E, ...args: readonly [
310
+ ...Parameters<E>
311
+ ]): {
312
+ data: DenormalizeNullable<E['schema']>;
313
+ expiryStatus: ExpiryStatus;
314
+ expiresAt: number;
315
+ };
316
+ getResponseMeta<E extends Pick<EndpointInterface, 'key' | 'schema' | 'invalidIfStale'>>(endpoint: E, ...args: readonly [
317
+ ...Parameters<E['key']>
318
+ ] | readonly [
319
+ null
320
+ ]): {
321
+ data: DenormalizeNullable<E['schema']>;
322
+ expiryStatus: ExpiryStatus;
323
+ expiresAt: number;
324
+ };
325
+ /** @see https://dataclient.io/docs/api/Snapshot#getError */
326
+ getError<E extends EndpointInterface>(endpoint: E, ...args: readonly [
327
+ ...Parameters<E>
328
+ ] | readonly [
329
+ null
330
+ ]): ErrorTypes | undefined;
331
+ getError<E extends Pick<EndpointInterface, 'key'>>(endpoint: E, ...args: readonly [
332
+ ...Parameters<E['key']>
333
+ ] | readonly [
334
+ null
335
+ ]): ErrorTypes | undefined;
336
+ /**
337
+ * Retrieved memoized value for any Querable schema
338
+ * @see https://dataclient.io/docs/api/Snapshot#get
339
+ */
340
+ get<S extends Queryable>(schema: S, ...args: SchemaArgs<S>): DenormalizeNullable<S> | undefined;
341
+ /**
342
+ * Queries the store for a Querable schema; providing related metadata
343
+ * @see https://dataclient.io/docs/api/Snapshot#getQueryMeta
344
+ */
345
+ getQueryMeta<S extends Queryable>(schema: S, ...args: SchemaArgs<S>): {
346
+ data: DenormalizeNullable<S> | undefined;
347
+ countRef: () => () => void;
348
+ };
349
+ }
214
350
  //# sourceMappingURL=Controller.d.ts.map
package/ts3.4/index.d.ts CHANGED
@@ -3,8 +3,10 @@ export { __INTERNAL__1 as __INTERNAL__ };
3
3
  export { NetworkError, UnknownError, ErrorTypes, Schema, EndpointInterface, EntityInterface, SchemaClass, ResolveType, DenormalizeNullable, Denormalize, Normalize, NormalizeNullable, FetchFunction, EndpointExtraOptions, Queryable, SchemaArgs, NI, } from '@data-client/normalizr';
4
4
  export { ExpiryStatus } from '@data-client/normalizr';
5
5
  export { default as NetworkManager, ResetError, } from './manager/NetworkManager.js';
6
+ export * from './state/GCPolicy.js';
6
7
  export { default as createReducer, initialState, } from './state/reducer/createReducer.js';
7
8
  export { default as applyManager } from './manager/applyManager.js';
9
+ export { default as initManager } from './manager/initManager.js';
8
10
  export { default as Controller } from './controller/Controller.js';
9
11
  export { DataClientDispatch, GenericDispatch, } from './controller/Controller.js';
10
12
  import * as actions_1 from './controller/actions/index.js';
@@ -0,0 +1,4 @@
1
+ import Controller from '../controller/Controller.js';
2
+ import { Manager, State } from '../types.js';
3
+ export default function initManager(managers: Manager[], controller: Controller, initialState: State<unknown>): () => () => void;
4
+ //# sourceMappingURL=initManager.d.ts.map
@@ -0,0 +1,55 @@
1
+ import { EntityPath } from '@data-client/normalizr';
2
+ import Controller from '../controller/Controller.js';
3
+ export declare class GCPolicy implements GCInterface {
4
+ protected endpointCount: Map<string, number>;
5
+ protected entityCount: Map<string, Map<string, number>>;
6
+ protected endpointsQ: Set<string>;
7
+ protected entitiesQ: EntityPath[];
8
+ protected intervalId: ReturnType<typeof setInterval>;
9
+ protected controller: Controller;
10
+ protected options: Required<Pick<GCOptions, Exclude<keyof GCOptions, 'expiresAt'>>>;
11
+ constructor({ intervalMS, expiryMultiplier, expiresAt, }?: GCOptions);
12
+ init(controller: Controller): void;
13
+ cleanup(): void;
14
+ createCountRef({ key, paths }: {
15
+ key?: string;
16
+ paths?: EntityPath[];
17
+ }): () => () => void;
18
+ protected expiresAt({ fetchedAt, expiresAt, }: {
19
+ expiresAt: number;
20
+ date: number;
21
+ fetchedAt: number;
22
+ }): number;
23
+ protected runSweep(): void;
24
+ /** Calls the callback when client is not 'busy' with high priority interaction tasks
25
+ *
26
+ * Override for platform-specific implementations
27
+ */
28
+ protected idleCallback(callback: (...args: any[]) => void, options?: IdleRequestOptions): void;
29
+ }
30
+ export declare class ImmortalGCPolicy implements GCInterface {
31
+ init(): void;
32
+ cleanup(): void;
33
+ createCountRef(): () => () => undefined;
34
+ }
35
+ export interface GCOptions {
36
+ intervalMS?: number;
37
+ expiryMultiplier?: number;
38
+ expiresAt?: (meta: {
39
+ expiresAt: number;
40
+ date: number;
41
+ fetchedAt: number;
42
+ }) => number;
43
+ }
44
+ export interface CreateCountRef {
45
+ ({ key, paths }: {
46
+ key?: string;
47
+ paths?: EntityPath[];
48
+ }): () => () => void;
49
+ }
50
+ export interface GCInterface {
51
+ createCountRef: CreateCountRef;
52
+ init(controller: Controller): void;
53
+ cleanup(): void;
54
+ }
55
+ //# sourceMappingURL=GCPolicy.d.ts.map
@@ -3,6 +3,7 @@ export declare function expireReducer(state: State<unknown>, action: ExpireAllAc
3
3
  meta: {
4
4
  [x: string]: {
5
5
  readonly date: number;
6
+ readonly fetchedAt: number;
6
7
  readonly expiresAt: number;
7
8
  readonly prevExpiresAt?: number;
8
9
  readonly error?: import("packages/normalizr/lib/index.js").ErrorTypes;
@@ -6,6 +6,7 @@ export declare function invalidateReducer(state: State<unknown>, action: Invalid
6
6
  meta: {
7
7
  [x: string]: {
8
8
  readonly date: number;
9
+ readonly fetchedAt: number;
9
10
  readonly expiresAt: number;
10
11
  readonly prevExpiresAt?: number;
11
12
  readonly error?: import("packages/normalizr/lib/index.js").ErrorTypes;
@@ -11,6 +11,7 @@ export declare function setReducer(state: State<unknown>, action: SetAction, con
11
11
  meta: {
12
12
  readonly [key: string]: {
13
13
  readonly date: number;
14
+ readonly fetchedAt: number;
14
15
  readonly expiresAt: number;
15
16
  readonly prevExpiresAt?: number;
16
17
  readonly error?: import("@data-client/normalizr").ErrorTypes;
@@ -21,9 +22,9 @@ export declare function setReducer(state: State<unknown>, action: SetAction, con
21
22
  entityMeta: import("packages/normalizr/lib/types.js").EntitiesToMeta<{
22
23
  [x: string]: any;
23
24
  }>;
24
- optimistic: (import("../../actions.js").SetResponseAction | import("../../actions.js").OptimisticAction<import("@data-client/normalizr").EndpointInterface<import("@data-client/normalizr").FetchFunction, import("@data-client/normalizr").Schema | undefined, boolean | undefined> & {
25
+ optimistic: (import("../../actions.js").OptimisticAction<import("@data-client/normalizr").EndpointInterface<import("@data-client/normalizr").FetchFunction, import("@data-client/normalizr").Schema | undefined, boolean | undefined> & {
25
26
  update?: import("../../index.js").EndpointUpdateFunction<import("@data-client/normalizr").EndpointInterface>;
26
- }>)[];
27
+ }> | import("../../actions.js").SetResponseAction)[];
27
28
  lastReset: number;
28
29
  };
29
30
  //# sourceMappingURL=setReducer.d.ts.map
@@ -9,6 +9,7 @@ export declare function setResponseReducer(state: State<unknown>, action: Optimi
9
9
  meta: {
10
10
  [x: string]: {
11
11
  readonly date: number;
12
+ readonly fetchedAt: number;
12
13
  readonly expiresAt: number;
13
14
  readonly prevExpiresAt?: number;
14
15
  readonly error?: import("@data-client/normalizr").ErrorTypes;
@@ -16,6 +17,7 @@ export declare function setResponseReducer(state: State<unknown>, action: Optimi
16
17
  readonly errorPolicy?: "hard" | "soft" | undefined;
17
18
  } | {
18
19
  date: number;
20
+ fetchedAt: number;
19
21
  expiresAt: number;
20
22
  prevExpiresAt: number;
21
23
  };
@@ -23,9 +25,9 @@ export declare function setResponseReducer(state: State<unknown>, action: Optimi
23
25
  entityMeta: import("packages/normalizr/lib/types.js").EntitiesToMeta<{
24
26
  [x: string]: any;
25
27
  }>;
26
- optimistic: (SetResponseAction | OptimisticAction<import("@data-client/normalizr").EndpointInterface<import("@data-client/normalizr").FetchFunction, import("@data-client/normalizr").Schema | undefined, boolean | undefined> & {
28
+ optimistic: (OptimisticAction<import("@data-client/normalizr").EndpointInterface<import("@data-client/normalizr").FetchFunction, import("@data-client/normalizr").Schema | undefined, boolean | undefined> & {
27
29
  update?: import("../../index.js").EndpointUpdateFunction<import("@data-client/normalizr").EndpointInterface>;
28
- }>)[];
30
+ }> | SetResponseAction)[];
29
31
  lastReset: number;
30
32
  };
31
33
  //# sourceMappingURL=setResponseReducer.d.ts.map
package/ts3.4/types.d.ts CHANGED
@@ -23,6 +23,7 @@ export interface State<T> {
23
23
  readonly meta: {
24
24
  readonly [key: string]: {
25
25
  readonly date: number;
26
+ readonly fetchedAt: number;
26
27
  readonly expiresAt: number;
27
28
  readonly prevExpiresAt?: number;
28
29
  readonly error?: ErrorTypes;