@ic-reactor/react 3.6.0 → 3.7.0
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.
- package/README.md +28 -8
- package/dist/auth/authentication-manager.d.ts +66 -0
- package/dist/auth/authentication-manager.d.ts.map +1 -0
- package/dist/auth/authentication-manager.js +458 -0
- package/dist/auth/authentication-manager.js.map +1 -0
- package/dist/auth/constants.d.ts +18 -0
- package/dist/auth/constants.d.ts.map +1 -0
- package/dist/auth/constants.js +18 -0
- package/dist/auth/constants.js.map +1 -0
- package/dist/auth/createIdentityAttributeHooks.d.ts +14 -0
- package/dist/auth/createIdentityAttributeHooks.d.ts.map +1 -0
- package/dist/auth/createIdentityAttributeHooks.js +54 -0
- package/dist/auth/createIdentityAttributeHooks.js.map +1 -0
- package/dist/auth/identity-attributes-manager.d.ts +19 -0
- package/dist/auth/identity-attributes-manager.d.ts.map +1 -0
- package/dist/auth/identity-attributes-manager.js +94 -0
- package/dist/auth/identity-attributes-manager.js.map +1 -0
- package/dist/auth/identity-attributes.d.ts +19 -0
- package/dist/auth/identity-attributes.d.ts.map +1 -0
- package/dist/auth/identity-attributes.js +170 -0
- package/dist/auth/identity-attributes.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +8 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/types.d.ts +75 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/createActorHooks.d.ts +12 -12
- package/dist/createActorHooks.d.ts.map +1 -1
- package/dist/createActorHooks.js.map +1 -1
- package/dist/createInfiniteQuery.d.ts +32 -32
- package/dist/createInfiniteQuery.d.ts.map +1 -1
- package/dist/createInfiniteQuery.js +6 -6
- package/dist/createInfiniteQuery.js.map +1 -1
- package/dist/createMutation.d.ts +12 -1
- package/dist/createMutation.d.ts.map +1 -1
- package/dist/createMutation.js +11 -0
- package/dist/createMutation.js.map +1 -1
- package/dist/createQuery.d.ts +12 -2
- package/dist/createQuery.d.ts.map +1 -1
- package/dist/createQuery.js +15 -5
- package/dist/createQuery.js.map +1 -1
- package/dist/createSuspenseInfiniteQuery.d.ts +31 -31
- package/dist/createSuspenseInfiniteQuery.d.ts.map +1 -1
- package/dist/createSuspenseInfiniteQuery.js +6 -6
- package/dist/createSuspenseInfiniteQuery.js.map +1 -1
- package/dist/createSuspenseQuery.d.ts +2 -2
- package/dist/createSuspenseQuery.d.ts.map +1 -1
- package/dist/createSuspenseQuery.js.map +1 -1
- package/dist/defineReactor.d.ts +74 -0
- package/dist/defineReactor.d.ts.map +1 -0
- package/dist/defineReactor.js +75 -0
- package/dist/defineReactor.js.map +1 -0
- package/dist/{createAuthHooks.d.ts → hooks/createAuthHooks.d.ts} +6 -13
- package/dist/hooks/createAuthHooks.d.ts.map +1 -0
- package/dist/{createAuthHooks.js → hooks/createAuthHooks.js} +12 -57
- package/dist/hooks/createAuthHooks.js.map +1 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useActorInfiniteQuery.d.ts +9 -9
- package/dist/hooks/useActorInfiniteQuery.d.ts.map +1 -1
- package/dist/hooks/useActorInfiniteQuery.js +3 -1
- package/dist/hooks/useActorInfiniteQuery.js.map +1 -1
- package/dist/hooks/useActorMethod.d.ts +17 -17
- package/dist/hooks/useActorMethod.d.ts.map +1 -1
- package/dist/hooks/useActorMethod.js.map +1 -1
- package/dist/hooks/useActorMutation.d.ts +18 -7
- package/dist/hooks/useActorMutation.d.ts.map +1 -1
- package/dist/hooks/useActorMutation.js +11 -0
- package/dist/hooks/useActorMutation.js.map +1 -1
- package/dist/hooks/useActorQuery.d.ts +8 -8
- package/dist/hooks/useActorQuery.d.ts.map +1 -1
- package/dist/hooks/useActorQuery.js.map +1 -1
- package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts +9 -9
- package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts.map +1 -1
- package/dist/hooks/useActorSuspenseInfiniteQuery.js +3 -1
- package/dist/hooks/useActorSuspenseInfiniteQuery.js.map +1 -1
- package/dist/hooks/useActorSuspenseQuery.d.ts +8 -8
- package/dist/hooks/useActorSuspenseQuery.d.ts.map +1 -1
- package/dist/hooks/useActorSuspenseQuery.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +24 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +10 -2
- package/dist/utils.js.map +1 -1
- package/llms.txt +48 -0
- package/package.json +27 -21
- package/src/auth/authentication-manager.ts +519 -0
- package/src/auth/constants.ts +25 -0
- package/src/auth/createIdentityAttributeHooks.ts +83 -0
- package/src/auth/identity-attributes-manager.ts +127 -0
- package/src/auth/identity-attributes.ts +270 -0
- package/src/auth/index.ts +7 -0
- package/src/auth/types.ts +88 -0
- package/src/createActorHooks.ts +81 -49
- package/src/createInfiniteQuery.ts +153 -97
- package/src/createMutation.ts +34 -18
- package/src/createQuery.ts +92 -48
- package/src/createSuspenseInfiniteQuery.ts +165 -114
- package/src/createSuspenseQuery.ts +67 -41
- package/src/defineReactor.test.ts +70 -0
- package/src/defineReactor.ts +150 -0
- package/src/{createAuthHooks.ts → hooks/createAuthHooks.ts} +17 -98
- package/src/hooks/index.ts +4 -0
- package/src/hooks/useActorInfiniteQuery.ts +44 -30
- package/src/hooks/useActorMethod.ts +62 -53
- package/src/hooks/useActorMutation.ts +47 -30
- package/src/hooks/useActorQuery.ts +36 -32
- package/src/hooks/useActorSuspenseInfiniteQuery.ts +56 -30
- package/src/hooks/useActorSuspenseQuery.ts +42 -32
- package/src/index.ts +3 -1
- package/src/types.ts +76 -71
- package/src/utils.test.ts +14 -0
- package/src/utils.ts +15 -2
- package/dist/createAuthHooks.d.ts.map +0 -1
- package/dist/createAuthHooks.js.map +0 -1
package/src/createQuery.ts
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Creates unified fetch/hook/invalidate functions for any canister method.
|
|
5
5
|
* Works with any Reactor instance.
|
|
6
|
+
* Use this when the same read operation must work both inside React components
|
|
7
|
+
* and outside React (loaders, actions, services, tests).
|
|
6
8
|
*
|
|
7
9
|
* @example
|
|
8
10
|
* const userQuery = createQuery(todoManager, {
|
|
@@ -12,6 +14,14 @@
|
|
|
12
14
|
*
|
|
13
15
|
* // In component
|
|
14
16
|
* const { data: user } = userQuery.useQuery()
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* const userQuery = createQuery(todoManager, { functionName: "get_user", args: ["alice"] })
|
|
20
|
+
*
|
|
21
|
+
* // Outside React (loader/service/script)
|
|
22
|
+
* await userQuery.fetch()
|
|
23
|
+
* const cached = userQuery.getCacheData()
|
|
24
|
+
* await userQuery.invalidate()
|
|
15
25
|
*/
|
|
16
26
|
|
|
17
27
|
import type {
|
|
@@ -20,7 +30,12 @@ import type {
|
|
|
20
30
|
ReactorArgs,
|
|
21
31
|
TransformKey,
|
|
22
32
|
} from "@ic-reactor/core"
|
|
23
|
-
import {
|
|
33
|
+
import {
|
|
34
|
+
QueryKey,
|
|
35
|
+
useQuery,
|
|
36
|
+
type UseQueryOptions,
|
|
37
|
+
type Updater,
|
|
38
|
+
} from "@tanstack/react-query"
|
|
24
39
|
import type {
|
|
25
40
|
QueryFnData,
|
|
26
41
|
QueryError,
|
|
@@ -37,16 +52,20 @@ import { buildChainedSelect } from "./utils"
|
|
|
37
52
|
// ============================================================================
|
|
38
53
|
|
|
39
54
|
const createQueryImpl = <
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
55
|
+
Service,
|
|
56
|
+
Method extends FunctionName<Service> = FunctionName<Service>,
|
|
57
|
+
Transform extends TransformKey = "candid",
|
|
58
|
+
Selected = QueryFnData<Service, Method, Transform>,
|
|
44
59
|
>(
|
|
45
|
-
reactor: Reactor<
|
|
46
|
-
config: QueryConfig<
|
|
47
|
-
): QueryResult<
|
|
48
|
-
|
|
49
|
-
|
|
60
|
+
reactor: Reactor<Service, Transform>,
|
|
61
|
+
config: QueryConfig<Service, Method, Transform, Selected>
|
|
62
|
+
): QueryResult<
|
|
63
|
+
QueryFnData<Service, Method, Transform>,
|
|
64
|
+
Selected,
|
|
65
|
+
QueryError<Service, Method, Transform>
|
|
66
|
+
> => {
|
|
67
|
+
type TData = QueryFnData<Service, Method, Transform>
|
|
68
|
+
type TError = QueryError<Service, Method, Transform>
|
|
50
69
|
|
|
51
70
|
const {
|
|
52
71
|
functionName,
|
|
@@ -62,11 +81,11 @@ const createQueryImpl = <
|
|
|
62
81
|
const getQueryKey = (): QueryKey => reactor.generateQueryKey(params)
|
|
63
82
|
|
|
64
83
|
// Apply config.select to raw data (shared by fetch, getCacheData, and the hook)
|
|
65
|
-
const applySelect = (raw: TData):
|
|
66
|
-
select ? select(raw) : (raw as unknown as
|
|
84
|
+
const applySelect = (raw: TData): Selected =>
|
|
85
|
+
select ? select(raw) : (raw as unknown as Selected)
|
|
67
86
|
|
|
68
87
|
/** Cache-first fetch for use in loaders / route preloading. */
|
|
69
|
-
const fetch = async (): Promise<
|
|
88
|
+
const fetch = async (): Promise<Selected> => {
|
|
70
89
|
const result = await reactor.fetchQuery(params)
|
|
71
90
|
return applySelect(result)
|
|
72
91
|
}
|
|
@@ -81,9 +100,15 @@ const createQueryImpl = <
|
|
|
81
100
|
})
|
|
82
101
|
}
|
|
83
102
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
103
|
+
// The hook publicly exposes the overloaded UseQueryWithSelect signature.
|
|
104
|
+
// Internally it takes a single broad options object, so we type the
|
|
105
|
+
// implementation explicitly and cast once to the public overloaded type.
|
|
106
|
+
type UseQueryHookOptions = Omit<
|
|
107
|
+
UseQueryOptions<TData, TError, unknown>,
|
|
108
|
+
"queryKey" | "queryFn"
|
|
109
|
+
> & { select?: (data: Selected) => unknown }
|
|
110
|
+
|
|
111
|
+
const useQueryHook = ((options?: UseQueryHookOptions) => {
|
|
87
112
|
const baseOptions = reactor.getQueryOptions(params)
|
|
88
113
|
return useQuery(
|
|
89
114
|
{
|
|
@@ -96,27 +121,28 @@ const createQueryImpl = <
|
|
|
96
121
|
},
|
|
97
122
|
reactor.queryClient
|
|
98
123
|
)
|
|
99
|
-
}
|
|
124
|
+
}) as UseQueryWithSelect<TData, Selected, TError>
|
|
100
125
|
|
|
101
126
|
const invalidate = async (): Promise<void> => {
|
|
102
127
|
await reactor.queryClient.invalidateQueries({ queryKey: getQueryKey() })
|
|
103
128
|
}
|
|
104
129
|
|
|
105
|
-
const getCacheData
|
|
106
|
-
selectFn?: (data:
|
|
107
|
-
):
|
|
130
|
+
const getCacheData = ((
|
|
131
|
+
selectFn?: (data: Selected) => unknown
|
|
132
|
+
): Selected | unknown => {
|
|
108
133
|
const raw = reactor.getQueryData(params)
|
|
109
134
|
if (raw === undefined) return undefined
|
|
110
135
|
const selected = applySelect(raw)
|
|
111
136
|
return selectFn ? selectFn(selected) : selected
|
|
112
|
-
}
|
|
137
|
+
}) as QueryResult<TData, Selected, TError>["getCacheData"]
|
|
113
138
|
|
|
114
|
-
const setData: QueryResult<TData,
|
|
139
|
+
const setData: QueryResult<TData, Selected, TError>["setData"] = (
|
|
115
140
|
updater
|
|
116
141
|
) => {
|
|
117
|
-
return reactor.queryClient.setQueryData(
|
|
118
|
-
|
|
119
|
-
| undefined
|
|
142
|
+
return reactor.queryClient.setQueryData(
|
|
143
|
+
getQueryKey(),
|
|
144
|
+
updater as Updater<TData | undefined, TData | undefined>
|
|
145
|
+
) as TData | undefined
|
|
120
146
|
}
|
|
121
147
|
|
|
122
148
|
return {
|
|
@@ -135,15 +161,22 @@ const createQueryImpl = <
|
|
|
135
161
|
// ============================================================================
|
|
136
162
|
|
|
137
163
|
export function createQuery<
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
164
|
+
Service,
|
|
165
|
+
Transform extends TransformKey,
|
|
166
|
+
Method extends FunctionName<Service> = FunctionName<Service>,
|
|
167
|
+
Selected = QueryFnData<Service, Method, Transform>,
|
|
142
168
|
>(
|
|
143
|
-
reactor: Reactor<
|
|
144
|
-
config: QueryConfig<NoInfer<
|
|
145
|
-
): QueryResult<
|
|
146
|
-
|
|
169
|
+
reactor: Reactor<Service, Transform>,
|
|
170
|
+
config: QueryConfig<NoInfer<Service>, Method, Transform, Selected>
|
|
171
|
+
): QueryResult<
|
|
172
|
+
QueryFnData<Service, Method, Transform>,
|
|
173
|
+
Selected,
|
|
174
|
+
QueryError<Service, Method, Transform>
|
|
175
|
+
> {
|
|
176
|
+
return createQueryImpl(
|
|
177
|
+
reactor,
|
|
178
|
+
config as QueryConfig<Service, Method, Transform, Selected>
|
|
179
|
+
)
|
|
147
180
|
}
|
|
148
181
|
|
|
149
182
|
// ============================================================================
|
|
@@ -151,24 +184,32 @@ export function createQuery<
|
|
|
151
184
|
// ============================================================================
|
|
152
185
|
|
|
153
186
|
export function createQueryFactory<
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
187
|
+
Service,
|
|
188
|
+
Transform extends TransformKey,
|
|
189
|
+
Method extends FunctionName<Service> = FunctionName<Service>,
|
|
190
|
+
Selected = QueryFnData<Service, Method, Transform>,
|
|
158
191
|
>(
|
|
159
|
-
reactor: Reactor<
|
|
160
|
-
config: QueryFactoryConfig<NoInfer<
|
|
192
|
+
reactor: Reactor<Service, Transform>,
|
|
193
|
+
config: QueryFactoryConfig<NoInfer<Service>, Method, Transform, Selected>
|
|
161
194
|
): (
|
|
162
|
-
args: ReactorArgs<
|
|
163
|
-
) => QueryResult<
|
|
195
|
+
args: ReactorArgs<Service, Method, Transform>
|
|
196
|
+
) => QueryResult<
|
|
197
|
+
QueryFnData<Service, Method, Transform>,
|
|
198
|
+
Selected,
|
|
199
|
+
QueryError<Service, Method, Transform>
|
|
200
|
+
> {
|
|
164
201
|
const cache = new Map<
|
|
165
202
|
string,
|
|
166
|
-
QueryResult<
|
|
203
|
+
QueryResult<
|
|
204
|
+
QueryFnData<Service, Method, Transform>,
|
|
205
|
+
Selected,
|
|
206
|
+
QueryError<Service, Method, Transform>
|
|
207
|
+
>
|
|
167
208
|
>()
|
|
168
209
|
|
|
169
|
-
return (args: ReactorArgs<
|
|
210
|
+
return (args: ReactorArgs<Service, Method, Transform>) => {
|
|
170
211
|
const key = reactor.generateQueryKey({
|
|
171
|
-
functionName: config.functionName as
|
|
212
|
+
functionName: config.functionName as Method,
|
|
172
213
|
args,
|
|
173
214
|
})
|
|
174
215
|
const cacheKey = JSON.stringify(key)
|
|
@@ -176,10 +217,13 @@ export function createQueryFactory<
|
|
|
176
217
|
const existing = cache.get(cacheKey)
|
|
177
218
|
if (existing) return existing
|
|
178
219
|
|
|
179
|
-
const result = createQueryImpl<
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
220
|
+
const result = createQueryImpl<Service, Method, Transform, Selected>(
|
|
221
|
+
reactor,
|
|
222
|
+
{
|
|
223
|
+
...config,
|
|
224
|
+
args,
|
|
225
|
+
}
|
|
226
|
+
)
|
|
183
227
|
cache.set(cacheKey, result)
|
|
184
228
|
return result
|
|
185
229
|
}
|