react-redux-cache 0.19.3 → 0.19.4

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 (57) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/createActions.js +65 -0
  3. package/dist/cjs/createCache.js +208 -0
  4. package/dist/cjs/createCacheReducer.js +285 -0
  5. package/dist/cjs/createSelectors.js +68 -0
  6. package/dist/cjs/index.js +83 -0
  7. package/dist/cjs/mutate.js +161 -0
  8. package/dist/cjs/query.js +180 -0
  9. package/dist/cjs/types.js +2 -0
  10. package/dist/cjs/useMutation.js +82 -0
  11. package/dist/cjs/useQuery.js +121 -0
  12. package/dist/cjs/utilsAndConstants.js +189 -0
  13. package/dist/esm/createActions.js +61 -0
  14. package/dist/esm/createCache.js +203 -0
  15. package/dist/esm/createCacheReducer.js +271 -0
  16. package/dist/esm/createSelectors.js +64 -0
  17. package/dist/esm/index.js +3 -0
  18. package/dist/esm/mutate.js +157 -0
  19. package/dist/esm/query.js +169 -0
  20. package/dist/esm/types.js +1 -0
  21. package/dist/esm/useMutation.js +88 -0
  22. package/dist/esm/useQuery.js +125 -0
  23. package/dist/esm/utilsAndConstants.js +168 -0
  24. package/dist/types/createActions.d.ts +106 -0
  25. package/dist/types/createCache.d.ts +712 -0
  26. package/dist/types/createCacheReducer.d.ts +11 -0
  27. package/dist/types/createSelectors.d.ts +79 -0
  28. package/dist/types/index.d.ts +3 -0
  29. package/dist/types/mutate.d.ts +94 -0
  30. package/dist/types/query.d.ts +122 -0
  31. package/dist/types/types.d.ts +322 -0
  32. package/dist/types/useMutation.d.ts +39 -0
  33. package/dist/types/useQuery.d.ts +40 -0
  34. package/dist/types/utilsAndConstants.d.ts +39 -0
  35. package/package.json +21 -10
  36. package/dist/createActions.d.ts +0 -83
  37. package/dist/createActions.js +0 -64
  38. package/dist/createCache.d.ts +0 -378
  39. package/dist/createCache.js +0 -192
  40. package/dist/createCacheReducer.d.ts +0 -3
  41. package/dist/createCacheReducer.js +0 -243
  42. package/dist/createSelectors.d.ts +0 -18
  43. package/dist/createSelectors.js +0 -61
  44. package/dist/index.d.ts +0 -3
  45. package/dist/index.js +0 -53
  46. package/dist/mutate.d.ts +0 -4
  47. package/dist/mutate.js +0 -98
  48. package/dist/query.d.ts +0 -4
  49. package/dist/query.js +0 -107
  50. package/dist/types.d.ts +0 -187
  51. package/dist/types.js +0 -3
  52. package/dist/useMutation.d.ts +0 -4
  53. package/dist/useMutation.js +0 -61
  54. package/dist/useQuery.d.ts +0 -4
  55. package/dist/useQuery.js +0 -77
  56. package/dist/utilsAndConstants.d.ts +0 -20
  57. package/dist/utilsAndConstants.js +0 -161
@@ -0,0 +1,11 @@
1
+ import type {Actions} from './createActions'
2
+ import type {CacheOptions, CacheState, Typenames} from './types'
3
+
4
+ export declare const createCacheReducer: <N extends string, T extends Typenames, QP, QR, MP, MR>(
5
+ actions: Actions<N, T, QP, QR, MP, MR>,
6
+ queryKeys: (keyof (QP | QR))[],
7
+ cacheOptions: CacheOptions
8
+ ) => (
9
+ state: CacheState<T, QP, QR, MP, MR> | undefined,
10
+ action: ReturnType<(typeof actions)[keyof typeof actions]>
11
+ ) => CacheState<T, QP, QR, MP, MR>
@@ -0,0 +1,79 @@
1
+ import {Cache, Key, MutationState, QueryState, Typenames} from './types'
2
+
3
+ export type Selectors<
4
+ N extends string = string,
5
+ T extends Typenames = Typenames,
6
+ QP = unknown,
7
+ QR = unknown,
8
+ MP = unknown,
9
+ MR = unknown
10
+ > = ReturnType<typeof createSelectors<N, T, QP, QR, MP, MR>>
11
+ export declare const createSelectors: <N extends string, T extends Typenames, QP, QR, MP, MR>(
12
+ cache: Cache<N, T, QP, QR, MP, MR>
13
+ ) => {
14
+ selectQueryState: <QK extends keyof (QP & QR)>(
15
+ state: unknown,
16
+ query: QK,
17
+ cacheKey: Key
18
+ ) => QueryState<T, QK extends keyof (QP | QR) ? QP[QK] : never, QK extends keyof (QP | QR) ? QR[QK] : never>
19
+ selectQueryResult: <QK extends keyof (QP & QR)>(
20
+ state: unknown,
21
+ query: QK,
22
+ cacheKey: Key
23
+ ) => (QK extends keyof QP & keyof QR ? QR[QK] : never) | undefined
24
+ selectQueryLoading: <QK extends keyof (QP & QR)>(
25
+ state: unknown,
26
+ query: QK,
27
+ cacheKey: Key
28
+ ) =>
29
+ | false
30
+ | Promise<import('./types').NormalizedQueryResponse<T, QK extends keyof QP & keyof QR ? QR[QK] : never>>
31
+ selectQueryError: <QK extends keyof (QP & QR)>(
32
+ state: unknown,
33
+ query: QK,
34
+ cacheKey: Key
35
+ ) => Error | undefined
36
+ selectQueryParams: <QK extends keyof (QP & QR)>(
37
+ state: unknown,
38
+ query: QK,
39
+ cacheKey: Key
40
+ ) => (QK extends keyof QP & keyof QR ? QP[QK] : never) | undefined
41
+ selectQueryExpiresAt: <QK extends keyof (QP & QR)>(
42
+ state: unknown,
43
+ query: QK,
44
+ cacheKey: Key
45
+ ) => number | undefined
46
+ selectMutationState: <MK extends keyof (MP & MR)>(
47
+ state: unknown,
48
+ mutation: MK
49
+ ) => MutationState<
50
+ T,
51
+ MK extends keyof (MP | MR) ? MP[MK] : never,
52
+ MK extends keyof (MP | MR) ? MR[MK] : never
53
+ >
54
+ selectMutationResult: <MK extends keyof (MP & MR)>(
55
+ state: unknown,
56
+ mutation: MK
57
+ ) => (MK extends keyof MP & keyof MR ? MR[MK] : never) | undefined
58
+ selectMutationLoading: <MK extends keyof (MP & MR)>(
59
+ state: unknown,
60
+ mutation: MK
61
+ ) =>
62
+ | false
63
+ | Promise<import('./types').NormalizedQueryResponse<T, MK extends keyof MP & keyof MR ? MR[MK] : never>>
64
+ selectMutationError: <MK extends keyof (MP & MR)>(state: unknown, mutation: MK) => Error | undefined
65
+ selectMutationParams: <MK extends keyof (MP & MR)>(
66
+ state: unknown,
67
+ mutation: MK
68
+ ) => (MK extends keyof MP & keyof MR ? MP[MK] : never) | undefined
69
+ selectEntityById: <TN extends keyof T>(
70
+ state: unknown,
71
+ id: Key | null | undefined,
72
+ typename: TN
73
+ ) => T[TN] | undefined
74
+ selectEntities: (state: unknown) => import('./types').EntitiesMap<T>
75
+ selectEntitiesByTypename: <TN extends keyof T>(
76
+ state: unknown,
77
+ typename: TN
78
+ ) => import('./types').EntitiesMap<T>[TN]
79
+ }
@@ -0,0 +1,3 @@
1
+ export {createCache, withTypenames} from './createCache'
2
+ export * from './types'
3
+ export {createStateComparer, defaultGetCacheKey, FetchPolicy, isEmptyObject} from './utilsAndConstants'
@@ -0,0 +1,94 @@
1
+ import type {Actions} from './createActions'
2
+ import {Selectors} from './createSelectors'
3
+ import type {Cache, Key, MutationResult, Store, Typenames} from './types'
4
+
5
+ export declare const mutate: <
6
+ N extends string,
7
+ T extends Typenames,
8
+ QP,
9
+ QR,
10
+ MP,
11
+ MR,
12
+ MK extends keyof (MP & MR)
13
+ >(
14
+ logTag: string,
15
+ store: Store,
16
+ cache: Cache<N, T, QP, QR, MP, MR>,
17
+ actions: Actions<N, T, QP, QR, MP, MR>,
18
+ selectors: Selectors<N, T, QP, QR, MP, MR>,
19
+ mutationKey: MK,
20
+ params: MK extends keyof (MP | MR) ? MP[MK] : never,
21
+ abortControllers: WeakMap<Store, Record<Key, AbortController>>,
22
+ onCompleted?:
23
+ | ((
24
+ response: import('./types').NormalizedQueryResponse<T, MR[keyof MP & keyof MR & string]> | undefined,
25
+ error: unknown | undefined,
26
+ params: MP[keyof MP & keyof MR & string] | undefined,
27
+ store: Store,
28
+ actions: Actions<N, T, QP, QR, MP, MR>,
29
+ selectors: Selectors<N, T, QP, QR, MP, MR>
30
+ ) => void)
31
+ | ((
32
+ response: import('./types').NormalizedQueryResponse<T, MR[keyof MP & keyof MR & number]> | undefined,
33
+ error: unknown | undefined,
34
+ params: MP[keyof MP & keyof MR & number] | undefined,
35
+ store: Store,
36
+ actions: Actions<N, T, QP, QR, MP, MR>,
37
+ selectors: Selectors<N, T, QP, QR, MP, MR>
38
+ ) => void)
39
+ | ((
40
+ response: import('./types').NormalizedQueryResponse<T, MR[keyof MP & keyof MR & symbol]> | undefined,
41
+ error: unknown | undefined,
42
+ params: MP[keyof MP & keyof MR & symbol] | undefined,
43
+ store: Store,
44
+ actions: Actions<N, T, QP, QR, MP, MR>,
45
+ selectors: Selectors<N, T, QP, QR, MP, MR>
46
+ ) => void)
47
+ | undefined,
48
+ onSuccess?:
49
+ | ((
50
+ response: import('./types').NormalizedQueryResponse<T, MR[keyof MP & keyof MR & string]>,
51
+ params: MP[keyof MP & keyof MR & string] | undefined,
52
+ store: Store,
53
+ actions: Actions<N, T, QP, QR, MP, MR>,
54
+ selectors: Selectors<N, T, QP, QR, MP, MR>
55
+ ) => void)
56
+ | ((
57
+ response: import('./types').NormalizedQueryResponse<T, MR[keyof MP & keyof MR & number]>,
58
+ params: MP[keyof MP & keyof MR & number] | undefined,
59
+ store: Store,
60
+ actions: Actions<N, T, QP, QR, MP, MR>,
61
+ selectors: Selectors<N, T, QP, QR, MP, MR>
62
+ ) => void)
63
+ | ((
64
+ response: import('./types').NormalizedQueryResponse<T, MR[keyof MP & keyof MR & symbol]>,
65
+ params: MP[keyof MP & keyof MR & symbol] | undefined,
66
+ store: Store,
67
+ actions: Actions<N, T, QP, QR, MP, MR>,
68
+ selectors: Selectors<N, T, QP, QR, MP, MR>
69
+ ) => void)
70
+ | undefined,
71
+ onError?:
72
+ | ((
73
+ error: unknown,
74
+ params: MP[keyof MP & keyof MR & string] | undefined,
75
+ store: Store,
76
+ actions: Actions<N, T, QP, QR, MP, MR>,
77
+ selectors: Selectors<N, T, QP, QR, MP, MR>
78
+ ) => boolean | void | null | undefined)
79
+ | ((
80
+ error: unknown,
81
+ params: MP[keyof MP & keyof MR & number] | undefined,
82
+ store: Store,
83
+ actions: Actions<N, T, QP, QR, MP, MR>,
84
+ selectors: Selectors<N, T, QP, QR, MP, MR>
85
+ ) => boolean | void | null | undefined)
86
+ | ((
87
+ error: unknown,
88
+ params: MP[keyof MP & keyof MR & symbol] | undefined,
89
+ store: Store,
90
+ actions: Actions<N, T, QP, QR, MP, MR>,
91
+ selectors: Selectors<N, T, QP, QR, MP, MR>
92
+ ) => boolean | void | null | undefined)
93
+ | undefined
94
+ ) => Promise<MutationResult<MK extends keyof (MP | MR) ? MR[MK] : never>>
@@ -0,0 +1,122 @@
1
+ import type {Actions} from './createActions'
2
+ import {Selectors} from './createSelectors'
3
+ import type {Cache, Key, QueryResult, Store, Typenames} from './types'
4
+
5
+ export declare const query: <
6
+ N extends string,
7
+ T extends Typenames,
8
+ QP,
9
+ QR,
10
+ MP,
11
+ MR,
12
+ QK extends keyof (QP & QR)
13
+ >(
14
+ logTag: string,
15
+ store: Store,
16
+ cache: Cache<N, T, QP, QR, MP, MR>,
17
+ actions: Actions<N, T, QP, QR, MP, MR>,
18
+ selectors: Selectors<N, T, QP, QR, MP, MR>,
19
+ queryKey: QK,
20
+ cacheKey: Key,
21
+ params: QK extends keyof (QP | QR) ? QP[QK] : never,
22
+ secondsToLive: number | undefined,
23
+ onlyIfExpired: boolean | undefined,
24
+ mergeResults?:
25
+ | ((
26
+ oldResult: QR[keyof QP & keyof QR & string] | undefined,
27
+ response: import('./types').NormalizedQueryResponse<T, QR[keyof QP & keyof QR & string]>,
28
+ params: QP[keyof QP & keyof QR & string] | undefined,
29
+ store: Store,
30
+ actions: Actions<N, T, QP, QR, MP, MR>,
31
+ selectors: Selectors<N, T, QP, QR, MP, MR>
32
+ ) => QR[keyof QP & keyof QR & string])
33
+ | ((
34
+ oldResult: QR[keyof QP & keyof QR & number] | undefined,
35
+ response: import('./types').NormalizedQueryResponse<T, QR[keyof QP & keyof QR & number]>,
36
+ params: QP[keyof QP & keyof QR & number] | undefined,
37
+ store: Store,
38
+ actions: Actions<N, T, QP, QR, MP, MR>,
39
+ selectors: Selectors<N, T, QP, QR, MP, MR>
40
+ ) => QR[keyof QP & keyof QR & number])
41
+ | ((
42
+ oldResult: QR[keyof QP & keyof QR & symbol] | undefined,
43
+ response: import('./types').NormalizedQueryResponse<T, QR[keyof QP & keyof QR & symbol]>,
44
+ params: QP[keyof QP & keyof QR & symbol] | undefined,
45
+ store: Store,
46
+ actions: Actions<N, T, QP, QR, MP, MR>,
47
+ selectors: Selectors<N, T, QP, QR, MP, MR>
48
+ ) => QR[keyof QP & keyof QR & symbol])
49
+ | undefined,
50
+ onCompleted?:
51
+ | ((
52
+ response: import('./types').NormalizedQueryResponse<T, QR[keyof QP & keyof QR & string]> | undefined,
53
+ error: unknown | undefined,
54
+ params: QP[keyof QP & keyof QR & string] | undefined,
55
+ store: Store,
56
+ actions: Actions<N, T, QP, QR, MP, MR>,
57
+ selectors: Selectors<N, T, QP, QR, MP, MR>
58
+ ) => void)
59
+ | ((
60
+ response: import('./types').NormalizedQueryResponse<T, QR[keyof QP & keyof QR & number]> | undefined,
61
+ error: unknown | undefined,
62
+ params: QP[keyof QP & keyof QR & number] | undefined,
63
+ store: Store,
64
+ actions: Actions<N, T, QP, QR, MP, MR>,
65
+ selectors: Selectors<N, T, QP, QR, MP, MR>
66
+ ) => void)
67
+ | ((
68
+ response: import('./types').NormalizedQueryResponse<T, QR[keyof QP & keyof QR & symbol]> | undefined,
69
+ error: unknown | undefined,
70
+ params: QP[keyof QP & keyof QR & symbol] | undefined,
71
+ store: Store,
72
+ actions: Actions<N, T, QP, QR, MP, MR>,
73
+ selectors: Selectors<N, T, QP, QR, MP, MR>
74
+ ) => void)
75
+ | undefined,
76
+ onSuccess?:
77
+ | ((
78
+ response: import('./types').NormalizedQueryResponse<T, QR[keyof QP & keyof QR & string]>,
79
+ params: QP[keyof QP & keyof QR & string] | undefined,
80
+ store: Store,
81
+ actions: Actions<N, T, QP, QR, MP, MR>,
82
+ selectors: Selectors<N, T, QP, QR, MP, MR>
83
+ ) => void)
84
+ | ((
85
+ response: import('./types').NormalizedQueryResponse<T, QR[keyof QP & keyof QR & number]>,
86
+ params: QP[keyof QP & keyof QR & number] | undefined,
87
+ store: Store,
88
+ actions: Actions<N, T, QP, QR, MP, MR>,
89
+ selectors: Selectors<N, T, QP, QR, MP, MR>
90
+ ) => void)
91
+ | ((
92
+ response: import('./types').NormalizedQueryResponse<T, QR[keyof QP & keyof QR & symbol]>,
93
+ params: QP[keyof QP & keyof QR & symbol] | undefined,
94
+ store: Store,
95
+ actions: Actions<N, T, QP, QR, MP, MR>,
96
+ selectors: Selectors<N, T, QP, QR, MP, MR>
97
+ ) => void)
98
+ | undefined,
99
+ onError?:
100
+ | ((
101
+ error: unknown,
102
+ params: QP[keyof QP & keyof QR & string] | undefined,
103
+ store: Store,
104
+ actions: Actions<N, T, QP, QR, MP, MR>,
105
+ selectors: Selectors<N, T, QP, QR, MP, MR>
106
+ ) => boolean | void | null | undefined)
107
+ | ((
108
+ error: unknown,
109
+ params: QP[keyof QP & keyof QR & number] | undefined,
110
+ store: Store,
111
+ actions: Actions<N, T, QP, QR, MP, MR>,
112
+ selectors: Selectors<N, T, QP, QR, MP, MR>
113
+ ) => boolean | void | null | undefined)
114
+ | ((
115
+ error: unknown,
116
+ params: QP[keyof QP & keyof QR & symbol] | undefined,
117
+ store: Store,
118
+ actions: Actions<N, T, QP, QR, MP, MR>,
119
+ selectors: Selectors<N, T, QP, QR, MP, MR>
120
+ ) => boolean | void | null | undefined)
121
+ | undefined
122
+ ) => Promise<QueryResult<QK extends keyof (QP | QR) ? QR[QK] : never>>
@@ -0,0 +1,322 @@
1
+ import type {Actions} from './createActions'
2
+ import type {Selectors} from './createSelectors'
3
+
4
+ export type Key = string | number | symbol
5
+ export type Dict<T> = Record<Key, T>
6
+ export type OptionalPartial<T, K extends keyof T> = Partial<{
7
+ [A in K]: Partial<T[A]>
8
+ }> &
9
+ Omit<T, K>
10
+ /** Entity changes to be merged to the state. */
11
+ export type EntityChanges<T extends Typenames> = {
12
+ /** Entities that will be merged with existing. */
13
+ merge?: PartialEntitiesMap<T>
14
+ /** Entities that will replace existing. */
15
+ replace?: Partial<EntitiesMap<T>>
16
+ /** Ids of entities that will be removed. */
17
+ remove?: EntityIds<T>
18
+ /** Alias for `merge` to support normalizr. */
19
+ entities?: EntityChanges<T>['merge']
20
+ }
21
+ export type Store<S = unknown> = {
22
+ dispatch: (action: ReturnType<Actions[keyof Actions]>) => unknown
23
+ getState: () => S
24
+ }
25
+ /** Record of typename and its corresponding entity type */
26
+ export type Typenames = Record<string, object>
27
+ export type Cache<N extends string, T extends Typenames, QP, QR, MP, MR> = {
28
+ /** Used as prefix for actions and in default cacheStateSelector for selecting cache state from store root state. */
29
+ name: N
30
+ /** Cache options. */
31
+ options: CacheOptions
32
+ /** Default options for queries and mutations. */
33
+ globals: Globals<N, T, QP, QR, MP, MR>
34
+ /** Hooks to access and subscribe to the store. Imported from react-redux if not overridden. */
35
+ storeHooks: {
36
+ useStore: () => Store
37
+ useSelector: <R>(selector: (state: unknown) => R, comparer?: (x: R, y: R) => boolean) => R
38
+ }
39
+ /** Should return cache state from store root state. Default implementation returns `state[name]`. */
40
+ cacheStateSelector: (state: any) => CacheState<T, QP, QR, MP, MR>
41
+ /** Queries. */
42
+ queries: {
43
+ [QK in keyof (QP & QR)]: QK extends keyof (QP | QR)
44
+ ? QueryInfo<N, T, QP[QK], QR[QK], QP, QR, MP, MR>
45
+ : never
46
+ }
47
+ /** Mutations. */
48
+ mutations: {
49
+ [MK in keyof (MP & MR)]: MK extends keyof (MP | MR)
50
+ ? MutationInfo<N, T, MP[MK], MR[MK], QP, QR, MP, MR>
51
+ : never
52
+ }
53
+ }
54
+ export type QueryStateComparer<T extends Typenames, P, R> = (
55
+ x: QueryState<T, P, R> | undefined,
56
+ y: QueryState<T, P, R> | undefined
57
+ ) => boolean
58
+ export type Globals<N extends string, T extends Typenames, QP, QR, MP, MR> = {
59
+ /** Handles errors, not handled by onError from queries and mutations. @Default undefined. */
60
+ onError?: (
61
+ error: unknown,
62
+ key: string,
63
+ params: unknown,
64
+ store: Store,
65
+ actions: Actions<N, T, QP, QR, MP, MR>,
66
+ selectors: Selectors<N, T, QP, QR, MP, MR>
67
+ ) => void
68
+ /** Query options. */
69
+ queries: {
70
+ /** Determines when useQuery fetch triggers should start fetching. Fetch is performed if function returns true.
71
+ * Fetch triggers are: 1) mount 2) cache key change 3) skipFetch value change to false.
72
+ * @Default FetchPolicy.NoCacheOrExpired */
73
+ fetchPolicy: (
74
+ expired: boolean,
75
+ params: unknown,
76
+ state: QueryState<T, unknown, unknown>,
77
+ store: Store,
78
+ selectors: Selectors<N, T, QP, QR, MP, MR>
79
+ ) => boolean
80
+ /** Disables any fetches when set to true. Triggers fetch when changed to false. @Default false */
81
+ skipFetch: boolean
82
+ /** If set, this value updates expiresAt value of query state when query result is received. @Default undefined */
83
+ secondsToLive?: number
84
+ /** Either comparer function, or array of keys to subscribe by useQuery's useSelector. @Default compares result, loading, params, error. */
85
+ selectorComparer?: QueryStateComparer<T, unknown, unknown> | (keyof QueryState<T, unknown, unknown>)[]
86
+ }
87
+ }
88
+ export type CacheOptions = {
89
+ /** Enables additional validation with logging to console.warn. Recommened to enable in dev/testing mode. @Default true in dev mode. */
90
+ additionalValidation: boolean
91
+ /** Enables debug logs. @Default false */
92
+ logsEnabled: boolean
93
+ /**
94
+ * Enables deep comparison before merging entities to the state.
95
+ * Re-rendering is a heavier operation than comparison, so disabling it can lead to performance drop.
96
+ * Makes sense to disable only if merging equal results & entities to the state is a rare case.
97
+ * @Default true
98
+ */
99
+ deepComparisonEnabled: boolean
100
+ }
101
+ export type PartialEntitiesMap<T extends Typenames> = {
102
+ [K in keyof T]?: Dict<Partial<T[K]>>
103
+ }
104
+ export type EntitiesMap<T extends Typenames> = {
105
+ [K in keyof T]?: Dict<T[K]>
106
+ }
107
+ export type EntityIds<T extends Typenames> = {
108
+ [K in keyof T]?: Key[]
109
+ }
110
+ export type CacheState<T extends Typenames, QP, QR, MP, MR> = {
111
+ entities: EntitiesMap<T>
112
+ queries: {
113
+ [QK in keyof (QP | QR)]: Dict<QueryState<T, QP[QK], QR[QK]> | undefined>
114
+ }
115
+ mutations: {
116
+ [MK in keyof (MP | MR)]: MutationState<T, MP[MK], MR[MK]>
117
+ }
118
+ }
119
+ export type QueryInfo<
120
+ N extends string,
121
+ T extends Typenames = Typenames,
122
+ P = unknown,
123
+ R = unknown,
124
+ QP = unknown,
125
+ QR = unknown,
126
+ MP = unknown,
127
+ MR = unknown
128
+ > = Partial<Pick<Globals<N, T, QP, QR, MP, MR>['queries'], 'skipFetch' | 'secondsToLive'>> & {
129
+ query: NormalizedQuery<T, P, R>
130
+ /** Determines when useQuery fetch triggers should start fetching. Fetch is performed if function returns true.
131
+ * Fetch triggers are: 1) mount 2) cache key change 3) skipFetch value change to false.
132
+ * @Default FetchPolicy.NoCacheOrExpired */
133
+ fetchPolicy?: (
134
+ expired: boolean,
135
+ params: P,
136
+ queryState: QueryState<T, P, R>,
137
+ store: Store,
138
+ selectors: Selectors<N, T, QP, QR, MP, MR>
139
+ ) => boolean
140
+ /** Merges results before saving to the store. Default implementation is using the latest result. */
141
+ mergeResults?: (
142
+ oldResult: R | undefined,
143
+ response: NormalizedQueryResponse<T, R>,
144
+ params: P | undefined,
145
+ store: Store,
146
+ actions: Actions<N, T, QP, QR, MP, MR>,
147
+ selectors: Selectors<N, T, QP, QR, MP, MR>
148
+ ) => R
149
+ /**
150
+ * Cache key is used for storing the query state and for performing a fetch when it changes. Queries with the same cache key share their state.
151
+ * Default implementation uses `String()` or `JSON.stringify` depending on type.
152
+ * It is recommended to override it when default implementation is not optimal or when keys in params object can be sorted in random order etc.
153
+ */
154
+ getCacheKey?: (params?: P) => Key
155
+ /** Called after fetch completed either successfully or not. */
156
+ onCompleted?: (
157
+ response: NormalizedQueryResponse<T, R> | undefined,
158
+ error: unknown | undefined,
159
+ params: P | undefined,
160
+ store: Store,
161
+ actions: Actions<N, T, QP, QR, MP, MR>,
162
+ selectors: Selectors<N, T, QP, QR, MP, MR>
163
+ ) => void
164
+ /** Called after fetch finished successfully. */
165
+ onSuccess?: (
166
+ response: NormalizedQueryResponse<T, R>,
167
+ params: P | undefined,
168
+ store: Store,
169
+ actions: Actions<N, T, QP, QR, MP, MR>,
170
+ selectors: Selectors<N, T, QP, QR, MP, MR>
171
+ ) => void
172
+ /** Called after fetch finished with error. Should return true if error was handled and does not require global onError handling. */
173
+ onError?: (
174
+ error: unknown,
175
+ params: P | undefined,
176
+ store: Store,
177
+ actions: Actions<N, T, QP, QR, MP, MR>,
178
+ selectors: Selectors<N, T, QP, QR, MP, MR>
179
+ ) => boolean | void | null | undefined
180
+ /** Either comparer function, or array of keys to subscribe by useQuery's useSelector. Default compares params, result, loading, error. */
181
+ selectorComparer?: QueryStateComparer<T, P, R> | (keyof QueryState<T, P, R>)[]
182
+ }
183
+ export type Query<P = unknown, R = unknown> = (
184
+ /** Query parameters */
185
+ params: P,
186
+ /** Store */
187
+ store: Store
188
+ ) => Promise<QueryResponse<R>>
189
+ export type NormalizedQuery<T extends Typenames = Typenames, P = unknown, R = unknown> = (
190
+ ...args: Parameters<Query<P, R>>
191
+ ) => Promise<NormalizedQueryResponse<T, R>>
192
+ export type QueryState<T extends Typenames, P, R> = MutationState<T, P, R> & {
193
+ /**
194
+ * Timestamp in milliseconds, after which state is considered expired.
195
+ * Hooks may refetch the query again when component mounts, cache key or skip option change, depending on the fetch policy.
196
+ * Client query calls also start making fetch if onlyIfExpired argument is truthy.
197
+ * */
198
+ expiresAt?: number
199
+ }
200
+ export type UseQueryOptions<
201
+ N extends string,
202
+ T extends Typenames,
203
+ QK extends keyof (QP & QR),
204
+ QP,
205
+ QR,
206
+ MP,
207
+ MR
208
+ > = {
209
+ query: QK
210
+ params: QK extends keyof (QP | QR) ? QP[QK] : never
211
+ } & Pick<
212
+ QueryInfo<
213
+ N,
214
+ T,
215
+ QK extends keyof (QP | QR) ? QP[QK] : never,
216
+ QK extends keyof (QP | QR) ? QR[QK] : never,
217
+ QP,
218
+ QR,
219
+ MP,
220
+ MR
221
+ >,
222
+ | 'fetchPolicy'
223
+ | 'skipFetch'
224
+ | 'secondsToLive'
225
+ | 'selectorComparer'
226
+ | 'mergeResults'
227
+ | 'onCompleted'
228
+ | 'onSuccess'
229
+ | 'onError'
230
+ >
231
+ export type QueryOptions<
232
+ N extends string,
233
+ T extends Typenames,
234
+ QP,
235
+ QR,
236
+ QK extends keyof (QP & QR),
237
+ MP,
238
+ MR
239
+ > = Omit<UseQueryOptions<N, T, QK, QP, QR, MP, MR>, 'skipFetch'> & {
240
+ /** If set to true, query will run only if it is expired or result not yet cached. */
241
+ onlyIfExpired?: boolean
242
+ }
243
+ export type QueryResponse<R = unknown> = {
244
+ result: R
245
+ /** If defined, overrides this value for query state, ignoring `secondsToLive`. */
246
+ expiresAt?: number
247
+ }
248
+ export type NormalizedQueryResponse<T extends Typenames = Typenames, R = unknown> = EntityChanges<T> &
249
+ QueryResponse<R>
250
+ export type QueryResult<R = unknown> = {
251
+ error?: unknown
252
+ /** Fetch cancelled reason. */
253
+ cancelled?: 'loading' | 'not-expired'
254
+ result?: R
255
+ }
256
+ export type MutationInfo<
257
+ N extends string,
258
+ T extends Typenames = Typenames,
259
+ P = unknown,
260
+ R = unknown,
261
+ QP = unknown,
262
+ QR = unknown,
263
+ MP = unknown,
264
+ MR = unknown
265
+ > = Pick<QueryInfo<N, T, P, R, QP, QR, MP, MR>, 'onCompleted' | 'onSuccess' | 'onError'> & {
266
+ mutation: NormalizedMutation<T, P, R>
267
+ }
268
+ export type Mutation<P = unknown, R = unknown> = (
269
+ /** Mutation parameters */
270
+ params: P,
271
+ /** Store */
272
+ store: Store,
273
+ /** Signal is aborted for current mutation when the same mutation was called once again. */
274
+ abortSignal: AbortSignal
275
+ ) => Promise<MutationResponse<R>>
276
+ export type NormalizedMutation<T extends Typenames = Typenames, P = unknown, R = unknown> = (
277
+ ...args: Parameters<Mutation<P, R>>
278
+ ) => Promise<NormalizedMutationResponse<T, R>>
279
+ export type MutateOptions<
280
+ N extends string,
281
+ T extends Typenames,
282
+ QP,
283
+ QR,
284
+ MP,
285
+ MR,
286
+ MK extends keyof (MP & MR)
287
+ > = Pick<
288
+ MutationInfo<
289
+ N,
290
+ T,
291
+ MK extends keyof (MP | MR) ? MP[MK] : never,
292
+ MK extends keyof (MP | MR) ? MR[MK] : never,
293
+ QP,
294
+ QR,
295
+ MP,
296
+ MR
297
+ >,
298
+ 'onCompleted' | 'onSuccess' | 'onError'
299
+ > & {
300
+ mutation: MK
301
+ params: MK extends keyof (MP | MR) ? MP[MK] : never
302
+ }
303
+ export type MutationResponse<R = unknown> = {
304
+ result?: R
305
+ }
306
+ export type NormalizedMutationResponse<T extends Typenames = Typenames, R = unknown> = EntityChanges<T> &
307
+ MutationResponse<R>
308
+ export type MutationResult<R = unknown> = {
309
+ error?: unknown
310
+ aborted?: true
311
+ result?: R
312
+ }
313
+ export type MutationState<T extends Typenames, P, R> = {
314
+ /** Set when fetch is currently in progress. */
315
+ loading?: Promise<NormalizedQueryResponse<T, R>>
316
+ /** Result of the latest successfull response. */
317
+ result?: R
318
+ /** Error of the latest response. */
319
+ error?: Error
320
+ /** Parameters of the latest request. */
321
+ params?: P
322
+ }
@@ -0,0 +1,39 @@
1
+ import {Actions} from './createActions'
2
+ import {Selectors} from './createSelectors'
3
+ import {Cache, Key, MutateOptions, MutationState, Store, Typenames} from './types'
4
+
5
+ export declare const useMutation: <
6
+ N extends string,
7
+ T extends Typenames,
8
+ QP,
9
+ QR,
10
+ MP,
11
+ MR,
12
+ MK extends keyof (MP & MR)
13
+ >(
14
+ cache: Cache<N, T, QP, QR, MP, MR>,
15
+ actions: Actions<N, T, QP, QR, MP, MR>,
16
+ selectors: Selectors<N, T, QP, QR, MP, MR>,
17
+ options: Omit<MutateOptions<N, T, QP, QR, MP, MR, MK>, 'params'>,
18
+ abortControllers: WeakMap<Store, Record<Key, AbortController>>
19
+ ) => readonly [
20
+ (
21
+ params: MK extends keyof MP & keyof MR ? MP[MK] : never
22
+ ) => Promise<
23
+ import('./types').MutationResult<
24
+ MK extends infer T_1
25
+ ? T_1 extends MK
26
+ ? T_1 extends keyof MP & keyof MR
27
+ ? MR[T_1]
28
+ : never
29
+ : never
30
+ : never
31
+ >
32
+ >,
33
+ MutationState<
34
+ T,
35
+ MK extends keyof MP & keyof MR ? MP[MK] : never,
36
+ MK extends keyof MP & keyof MR ? MP[MK] : never
37
+ >,
38
+ () => boolean
39
+ ]