@ic-reactor/react 3.5.1 → 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 -9
- 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 +28 -22
- 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
|
@@ -12,36 +12,41 @@ import {
|
|
|
12
12
|
TransformKey,
|
|
13
13
|
ReactorArgs,
|
|
14
14
|
ReactorReturnOk,
|
|
15
|
+
ReactorQueryData,
|
|
15
16
|
ReactorReturnErr,
|
|
16
17
|
} from "@ic-reactor/core"
|
|
17
18
|
import { CallConfig } from "@icp-sdk/core/agent"
|
|
19
|
+
import { normalizeQueryData } from "../utils"
|
|
18
20
|
|
|
19
21
|
/**
|
|
20
22
|
* Parameters for useActorSuspenseInfiniteQuery hook.
|
|
21
23
|
* Extends react-query's UseSuspenseInfiniteQueryOptions with custom reactor params.
|
|
22
24
|
*/
|
|
23
25
|
export interface UseActorSuspenseInfiniteQueryParameters<
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
Service,
|
|
27
|
+
Method extends FunctionName<Service>,
|
|
28
|
+
Transform extends TransformKey = "candid",
|
|
27
29
|
TPageParam = unknown,
|
|
28
|
-
|
|
30
|
+
Selected = InfiniteData<
|
|
31
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
32
|
+
TPageParam
|
|
33
|
+
>,
|
|
29
34
|
> extends Omit<
|
|
30
35
|
UseSuspenseInfiniteQueryOptions<
|
|
31
|
-
ReactorReturnOk<
|
|
32
|
-
ReactorReturnErr<
|
|
33
|
-
|
|
36
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
37
|
+
ReactorReturnErr<Service, Method, Transform>,
|
|
38
|
+
Selected,
|
|
34
39
|
QueryKey,
|
|
35
40
|
TPageParam
|
|
36
41
|
>,
|
|
37
42
|
"queryKey" | "queryFn" | "getNextPageParam" | "initialPageParam"
|
|
38
43
|
> {
|
|
39
44
|
/** The reactor instance to use for method calls */
|
|
40
|
-
reactor: Reactor<
|
|
45
|
+
reactor: Reactor<Service, Transform>
|
|
41
46
|
/** The method name to call on the canister */
|
|
42
|
-
functionName:
|
|
47
|
+
functionName: Method
|
|
43
48
|
/** Function to get args from page parameter */
|
|
44
|
-
getArgs: (pageParam: TPageParam) => ReactorArgs<
|
|
49
|
+
getArgs: (pageParam: TPageParam) => ReactorArgs<Service, Method, Transform>
|
|
45
50
|
/** Agent call configuration (effectiveCanisterId, etc.) */
|
|
46
51
|
callConfig?: CallConfig
|
|
47
52
|
/** Custom query key (auto-generated if not provided) */
|
|
@@ -50,31 +55,39 @@ export interface UseActorSuspenseInfiniteQueryParameters<
|
|
|
50
55
|
initialPageParam: TPageParam
|
|
51
56
|
/** Function to determine next page parameter */
|
|
52
57
|
getNextPageParam: (
|
|
53
|
-
lastPage: ReactorReturnOk<
|
|
54
|
-
allPages: ReactorReturnOk<
|
|
58
|
+
lastPage: ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
59
|
+
allPages: ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>[],
|
|
55
60
|
lastPageParam: TPageParam,
|
|
56
61
|
allPageParams: TPageParam[]
|
|
57
62
|
) => TPageParam | undefined | null
|
|
58
63
|
}
|
|
59
64
|
|
|
60
65
|
export type UseActorSuspenseInfiniteQueryConfig<
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
66
|
+
Service,
|
|
67
|
+
Method extends FunctionName<Service>,
|
|
68
|
+
Transform extends TransformKey = "candid",
|
|
64
69
|
TPageParam = unknown,
|
|
65
70
|
> = Omit<
|
|
66
|
-
UseActorSuspenseInfiniteQueryParameters<
|
|
71
|
+
UseActorSuspenseInfiniteQueryParameters<
|
|
72
|
+
Service,
|
|
73
|
+
Method,
|
|
74
|
+
Transform,
|
|
75
|
+
TPageParam
|
|
76
|
+
>,
|
|
67
77
|
"reactor"
|
|
68
78
|
>
|
|
69
79
|
|
|
70
80
|
export type UseActorSuspenseInfiniteQueryResult<
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
81
|
+
Service,
|
|
82
|
+
Method extends FunctionName<Service>,
|
|
83
|
+
Transform extends TransformKey = "candid",
|
|
74
84
|
TPageParam = unknown,
|
|
75
85
|
> = UseSuspenseInfiniteQueryResult<
|
|
76
|
-
InfiniteData<
|
|
77
|
-
|
|
86
|
+
InfiniteData<
|
|
87
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
88
|
+
TPageParam
|
|
89
|
+
>,
|
|
90
|
+
ReactorReturnErr<Service, Method, Transform>
|
|
78
91
|
>
|
|
79
92
|
|
|
80
93
|
/**
|
|
@@ -90,9 +103,9 @@ export type UseActorSuspenseInfiniteQueryResult<
|
|
|
90
103
|
* })
|
|
91
104
|
*/
|
|
92
105
|
export const useActorSuspenseInfiniteQuery = <
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
106
|
+
Service,
|
|
107
|
+
Method extends FunctionName<Service>,
|
|
108
|
+
Transform extends TransformKey = "candid",
|
|
96
109
|
TPageParam = unknown,
|
|
97
110
|
>({
|
|
98
111
|
reactor,
|
|
@@ -102,11 +115,16 @@ export const useActorSuspenseInfiniteQuery = <
|
|
|
102
115
|
queryKey,
|
|
103
116
|
...options
|
|
104
117
|
}: UseActorSuspenseInfiniteQueryParameters<
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
118
|
+
Service,
|
|
119
|
+
Method,
|
|
120
|
+
Transform,
|
|
108
121
|
TPageParam
|
|
109
|
-
>): UseActorSuspenseInfiniteQueryResult<
|
|
122
|
+
>): UseActorSuspenseInfiniteQueryResult<
|
|
123
|
+
Service,
|
|
124
|
+
Method,
|
|
125
|
+
Transform,
|
|
126
|
+
TPageParam
|
|
127
|
+
> => {
|
|
110
128
|
// Always pass queryKey through generateQueryKey so it is merged with the
|
|
111
129
|
// reactor/function identity. Using the custom key verbatim would cause cache
|
|
112
130
|
// collisions if two different actors or methods share the same key string.
|
|
@@ -119,11 +137,14 @@ export const useActorSuspenseInfiniteQuery = <
|
|
|
119
137
|
const queryFn = useCallback(
|
|
120
138
|
async ({ pageParam }: { pageParam: TPageParam }) => {
|
|
121
139
|
const args = getArgs(pageParam)
|
|
122
|
-
|
|
140
|
+
const result = await reactor.callMethod({
|
|
123
141
|
functionName,
|
|
124
142
|
args,
|
|
125
143
|
callConfig,
|
|
126
144
|
})
|
|
145
|
+
return normalizeQueryData<ReactorReturnOk<Service, Method, Transform>>(
|
|
146
|
+
result as ReactorReturnOk<Service, Method, Transform>
|
|
147
|
+
)
|
|
127
148
|
},
|
|
128
149
|
[reactor, functionName, getArgs, callConfig]
|
|
129
150
|
)
|
|
@@ -135,5 +156,10 @@ export const useActorSuspenseInfiniteQuery = <
|
|
|
135
156
|
...options,
|
|
136
157
|
} as any,
|
|
137
158
|
reactor.queryClient
|
|
138
|
-
) as UseActorSuspenseInfiniteQueryResult<
|
|
159
|
+
) as UseActorSuspenseInfiniteQueryResult<
|
|
160
|
+
Service,
|
|
161
|
+
Method,
|
|
162
|
+
Transform,
|
|
163
|
+
TPageParam
|
|
164
|
+
>
|
|
139
165
|
}
|
|
@@ -12,45 +12,52 @@ import {
|
|
|
12
12
|
TransformKey,
|
|
13
13
|
ReactorArgs,
|
|
14
14
|
ReactorReturnOk,
|
|
15
|
+
ReactorQueryData,
|
|
15
16
|
ReactorReturnErr,
|
|
16
17
|
} from "@ic-reactor/core"
|
|
17
18
|
import { CallConfig } from "@icp-sdk/core/agent"
|
|
18
19
|
|
|
19
20
|
export interface UseActorSuspenseQueryParameters<
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
Service,
|
|
22
|
+
Method extends FunctionName<Service>,
|
|
23
|
+
Transform extends TransformKey = "candid",
|
|
24
|
+
Selected = ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
24
25
|
> extends Omit<
|
|
25
26
|
QueryObserverOptions<
|
|
26
|
-
ReactorReturnOk<
|
|
27
|
-
ReactorReturnErr<
|
|
28
|
-
|
|
29
|
-
ReactorReturnOk<
|
|
27
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
28
|
+
ReactorReturnErr<Service, Method, Transform>,
|
|
29
|
+
Selected,
|
|
30
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
30
31
|
QueryKey
|
|
31
32
|
>,
|
|
32
33
|
"queryKey" | "queryFn"
|
|
33
34
|
> {
|
|
34
|
-
reactor: Reactor<
|
|
35
|
-
functionName:
|
|
36
|
-
args?: ReactorArgs<
|
|
35
|
+
reactor: Reactor<Service, Transform>
|
|
36
|
+
functionName: Method
|
|
37
|
+
args?: ReactorArgs<Service, Method, Transform>
|
|
37
38
|
callConfig?: CallConfig
|
|
38
39
|
queryKey?: QueryKey
|
|
39
40
|
}
|
|
40
41
|
|
|
41
42
|
export type UseActorSuspenseQueryConfig<
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
> = Omit<
|
|
43
|
+
Service,
|
|
44
|
+
Method extends FunctionName<Service>,
|
|
45
|
+
Transform extends TransformKey = "candid",
|
|
46
|
+
Selected = ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
47
|
+
> = Omit<
|
|
48
|
+
UseActorSuspenseQueryParameters<Service, Method, Transform, Selected>,
|
|
49
|
+
"reactor"
|
|
50
|
+
>
|
|
47
51
|
|
|
48
52
|
export type UseActorSuspenseQueryResult<
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
> = UseSuspenseQueryResult<
|
|
53
|
+
Service,
|
|
54
|
+
Method extends FunctionName<Service>,
|
|
55
|
+
Transform extends TransformKey = "candid",
|
|
56
|
+
Selected = ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
57
|
+
> = UseSuspenseQueryResult<
|
|
58
|
+
Selected,
|
|
59
|
+
ReactorReturnErr<Service, Method, Transform>
|
|
60
|
+
>
|
|
54
61
|
|
|
55
62
|
/**
|
|
56
63
|
* Hook for executing suspense-enabled query calls on a canister.
|
|
@@ -71,10 +78,10 @@ export type UseActorSuspenseQueryResult<
|
|
|
71
78
|
* })
|
|
72
79
|
*/
|
|
73
80
|
export const useActorSuspenseQuery = <
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
81
|
+
Service,
|
|
82
|
+
Method extends FunctionName<Service>,
|
|
83
|
+
Transform extends TransformKey = "candid",
|
|
84
|
+
Selected = ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
78
85
|
>({
|
|
79
86
|
reactor,
|
|
80
87
|
functionName,
|
|
@@ -83,15 +90,15 @@ export const useActorSuspenseQuery = <
|
|
|
83
90
|
queryKey: defaultQueryKey,
|
|
84
91
|
...options
|
|
85
92
|
}: UseActorSuspenseQueryParameters<
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
>): UseActorSuspenseQueryResult<
|
|
93
|
+
Service,
|
|
94
|
+
Method,
|
|
95
|
+
Transform,
|
|
96
|
+
Selected
|
|
97
|
+
>): UseActorSuspenseQueryResult<Service, Method, Transform, Selected> => {
|
|
91
98
|
// Memoize query options to prevent unnecessary re-computations
|
|
92
99
|
const { queryKey, queryFn } = useMemo(
|
|
93
100
|
() =>
|
|
94
|
-
reactor.getQueryOptions<
|
|
101
|
+
reactor.getQueryOptions<Method>({
|
|
95
102
|
callConfig,
|
|
96
103
|
functionName,
|
|
97
104
|
args,
|
|
@@ -103,7 +110,10 @@ export const useActorSuspenseQuery = <
|
|
|
103
110
|
return useSuspenseQuery(
|
|
104
111
|
{
|
|
105
112
|
// Suspense queries don't support skipToken, so cast the queryFn
|
|
106
|
-
queryFn: queryFn as QueryFunction<
|
|
113
|
+
queryFn: queryFn as QueryFunction<
|
|
114
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
115
|
+
QueryKey
|
|
116
|
+
>,
|
|
107
117
|
...options,
|
|
108
118
|
queryKey,
|
|
109
119
|
},
|
package/src/index.ts
CHANGED
|
@@ -9,8 +9,8 @@ export * from "./hooks"
|
|
|
9
9
|
export * from "./validation"
|
|
10
10
|
|
|
11
11
|
// React-specific exports
|
|
12
|
-
export * from "./createAuthHooks"
|
|
13
12
|
export * from "./createActorHooks"
|
|
13
|
+
export * from "./defineReactor"
|
|
14
14
|
|
|
15
15
|
export * from "./createQuery"
|
|
16
16
|
export * from "./createSuspenseQuery"
|
|
@@ -18,4 +18,6 @@ export * from "./createInfiniteQuery"
|
|
|
18
18
|
export * from "./createSuspenseInfiniteQuery"
|
|
19
19
|
export * from "./createMutation"
|
|
20
20
|
|
|
21
|
+
export * from "./auth"
|
|
22
|
+
|
|
21
23
|
export * from "./types"
|
package/src/types.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import type {
|
|
6
6
|
FunctionName,
|
|
7
7
|
ReactorReturnOk,
|
|
8
|
+
ReactorQueryData,
|
|
8
9
|
ReactorReturnErr,
|
|
9
10
|
ReactorArgs,
|
|
10
11
|
BaseActor,
|
|
@@ -39,17 +40,17 @@ export type NoInfer<T> = [T][T extends any ? 0 : never]
|
|
|
39
40
|
|
|
40
41
|
/** The raw data type returned by the query function (before select) */
|
|
41
42
|
export type QueryFnData<
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
> = ReactorReturnOk<
|
|
43
|
+
Service = BaseActor,
|
|
44
|
+
Method extends FunctionName<Service> = FunctionName<Service>,
|
|
45
|
+
Transform extends TransformKey = "candid",
|
|
46
|
+
> = ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>
|
|
46
47
|
|
|
47
48
|
/** The error type for queries */
|
|
48
49
|
export type QueryError<
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
> = ReactorReturnErr<
|
|
50
|
+
Service = BaseActor,
|
|
51
|
+
Method extends FunctionName<Service> = FunctionName<Service>,
|
|
52
|
+
Transform extends TransformKey = "candid",
|
|
53
|
+
> = ReactorReturnErr<Service, Method, Transform>
|
|
53
54
|
|
|
54
55
|
// ============================================================================
|
|
55
56
|
// Base Query Configuration
|
|
@@ -58,36 +59,36 @@ export type QueryError<
|
|
|
58
59
|
/**
|
|
59
60
|
* Base configuration for query wrappers (shared between regular and suspense).
|
|
60
61
|
*
|
|
61
|
-
* @template
|
|
62
|
-
* @template
|
|
63
|
-
* @template
|
|
64
|
-
* @template
|
|
62
|
+
* @template Service - The actor interface type
|
|
63
|
+
* @template Method - The method name on the actor
|
|
64
|
+
* @template Transform - The transformation key (identity, display, etc.)
|
|
65
|
+
* @template Selected - The type returned after select transformation
|
|
65
66
|
*/
|
|
66
67
|
export interface BaseQueryConfig<
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
Service = BaseActor,
|
|
69
|
+
Method extends FunctionName<Service> = FunctionName<Service>,
|
|
70
|
+
Transform extends TransformKey = "candid",
|
|
71
|
+
Selected = QueryFnData<Service, Method, Transform>,
|
|
71
72
|
> extends Omit<
|
|
72
73
|
QueryObserverOptions<
|
|
73
|
-
|
|
74
|
-
ReactorReturnErr<
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
QueryFnData<Service, Method, Transform>,
|
|
75
|
+
ReactorReturnErr<Service, Method, Transform>,
|
|
76
|
+
Selected,
|
|
77
|
+
QueryFnData<Service, Method, Transform>,
|
|
77
78
|
QueryKey
|
|
78
79
|
>,
|
|
79
80
|
"queryFn" | "queryKey"
|
|
80
81
|
> {
|
|
81
82
|
/** The method to call on the canister */
|
|
82
|
-
functionName:
|
|
83
|
+
functionName: Method
|
|
83
84
|
/** Arguments to pass to the method (if any) */
|
|
84
|
-
args?: ReactorArgs<
|
|
85
|
+
args?: ReactorArgs<Service, Method, Transform>
|
|
85
86
|
/** The query key to use for this query */
|
|
86
87
|
queryKey?: QueryKey
|
|
87
88
|
/** How long data stays fresh before refetching (default: 5 min) */
|
|
88
89
|
staleTime?: number
|
|
89
90
|
/** Transform the raw result before returning */
|
|
90
|
-
select?: (data: QueryFnData<
|
|
91
|
+
select?: (data: QueryFnData<Service, Method, Transform>) => Selected
|
|
91
92
|
}
|
|
92
93
|
|
|
93
94
|
/**
|
|
@@ -95,22 +96,22 @@ export interface BaseQueryConfig<
|
|
|
95
96
|
* Alias for BaseQueryConfig for clarity.
|
|
96
97
|
*/
|
|
97
98
|
export type QueryConfig<
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
> = BaseQueryConfig<
|
|
99
|
+
Service = BaseActor,
|
|
100
|
+
Method extends FunctionName<Service> = FunctionName<Service>,
|
|
101
|
+
Transform extends TransformKey = "candid",
|
|
102
|
+
Selected = QueryFnData<Service, Method, Transform>,
|
|
103
|
+
> = BaseQueryConfig<Service, Method, Transform, Selected>
|
|
103
104
|
|
|
104
105
|
/**
|
|
105
106
|
* Configuration for createSuspenseQuery (useSuspenseQuery).
|
|
106
107
|
* Alias for BaseQueryConfig for clarity.
|
|
107
108
|
*/
|
|
108
109
|
export type SuspenseQueryConfig<
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
> = BaseQueryConfig<
|
|
110
|
+
Service = BaseActor,
|
|
111
|
+
Method extends FunctionName<Service> = FunctionName<Service>,
|
|
112
|
+
Transform extends TransformKey = "candid",
|
|
113
|
+
Selected = QueryFnData<Service, Method, Transform>,
|
|
114
|
+
> = BaseQueryConfig<Service, Method, Transform, Selected>
|
|
114
115
|
|
|
115
116
|
// ============================================================================
|
|
116
117
|
// Factory Configuration (without args)
|
|
@@ -120,21 +121,21 @@ export type SuspenseQueryConfig<
|
|
|
120
121
|
* Configuration for createQueryFactory (args are provided at call time).
|
|
121
122
|
*/
|
|
122
123
|
export type QueryFactoryConfig<
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
> = Omit<QueryConfig<
|
|
124
|
+
Service = BaseActor,
|
|
125
|
+
Method extends FunctionName<Service> = FunctionName<Service>,
|
|
126
|
+
Transform extends TransformKey = "candid",
|
|
127
|
+
Selected = QueryFnData<Service, Method, Transform>,
|
|
128
|
+
> = Omit<QueryConfig<Service, Method, Transform, Selected>, "args">
|
|
128
129
|
|
|
129
130
|
/**
|
|
130
131
|
* Configuration for createSuspenseQueryFactory (args are provided at call time).
|
|
131
132
|
*/
|
|
132
133
|
export type SuspenseQueryFactoryConfig<
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
> = Omit<SuspenseQueryConfig<
|
|
134
|
+
Service = BaseActor,
|
|
135
|
+
Method extends FunctionName<Service> = FunctionName<Service>,
|
|
136
|
+
Transform extends TransformKey = "candid",
|
|
137
|
+
Selected = QueryFnData<Service, Method, Transform>,
|
|
138
|
+
> = Omit<SuspenseQueryConfig<Service, Method, Transform, Selected>, "args">
|
|
138
139
|
|
|
139
140
|
// ============================================================================
|
|
140
141
|
// Hook Interfaces with Chained Select Support
|
|
@@ -340,19 +341,19 @@ export interface SuspenseQueryResult<
|
|
|
340
341
|
* Configuration for createMutation and useActorMutation.
|
|
341
342
|
*/
|
|
342
343
|
export interface MutationConfig<
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
344
|
+
Service = BaseActor,
|
|
345
|
+
Method extends FunctionName<Service> = FunctionName<Service>,
|
|
346
|
+
Transform extends TransformKey = "candid",
|
|
346
347
|
> extends Omit<
|
|
347
348
|
UseMutationOptions<
|
|
348
|
-
ReactorReturnOk<
|
|
349
|
-
ReactorReturnErr<
|
|
350
|
-
ReactorArgs<
|
|
349
|
+
ReactorReturnOk<Service, Method, Transform>,
|
|
350
|
+
ReactorReturnErr<Service, Method, Transform>,
|
|
351
|
+
ReactorArgs<Service, Method, Transform>
|
|
351
352
|
>,
|
|
352
353
|
"mutationFn"
|
|
353
354
|
> {
|
|
354
355
|
/** The method to call on the canister */
|
|
355
|
-
functionName:
|
|
356
|
+
functionName: Method
|
|
356
357
|
/** Call configuration for the actor method */
|
|
357
358
|
callConfig?: CallConfig
|
|
358
359
|
/** Queries to invalidate upon successful mutation */
|
|
@@ -381,7 +382,7 @@ export interface MutationConfig<
|
|
|
381
382
|
*/
|
|
382
383
|
onCanisterError?: (
|
|
383
384
|
error: CanisterError<unknown>,
|
|
384
|
-
variables: ReactorArgs<
|
|
385
|
+
variables: ReactorArgs<Service, Method, Transform>
|
|
385
386
|
) => void
|
|
386
387
|
}
|
|
387
388
|
|
|
@@ -389,24 +390,24 @@ export interface MutationConfig<
|
|
|
389
390
|
* Configuration for createMutationFactory.
|
|
390
391
|
*/
|
|
391
392
|
export type MutationFactoryConfig<
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
> = Omit<MutationConfig<
|
|
393
|
+
Service = BaseActor,
|
|
394
|
+
Method extends FunctionName<Service> = FunctionName<Service>,
|
|
395
|
+
Transform extends TransformKey = "candid",
|
|
396
|
+
> = Omit<MutationConfig<Service, Method, Transform>, "onSuccess">
|
|
396
397
|
|
|
397
398
|
/**
|
|
398
399
|
* Options for useMutation hook.
|
|
399
400
|
* Extends React Query's UseMutationOptions with invalidateQueries support.
|
|
400
401
|
*/
|
|
401
402
|
export interface MutationHookOptions<
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
403
|
+
Service = BaseActor,
|
|
404
|
+
Method extends FunctionName<Service> = FunctionName<Service>,
|
|
405
|
+
Transform extends TransformKey = "candid",
|
|
405
406
|
> extends Omit<
|
|
406
407
|
UseMutationOptions<
|
|
407
|
-
ReactorReturnOk<
|
|
408
|
-
ReactorReturnErr<
|
|
409
|
-
ReactorArgs<
|
|
408
|
+
ReactorReturnOk<Service, Method, Transform>,
|
|
409
|
+
ReactorReturnErr<Service, Method, Transform>,
|
|
410
|
+
ReactorArgs<Service, Method, Transform>
|
|
410
411
|
>,
|
|
411
412
|
"mutationFn"
|
|
412
413
|
> {
|
|
@@ -430,9 +431,11 @@ export interface MutationHookOptions<
|
|
|
430
431
|
*/
|
|
431
432
|
onCanisterError?: (
|
|
432
433
|
error: CanisterError<
|
|
433
|
-
TransformReturnRegistry<
|
|
434
|
+
TransformReturnRegistry<
|
|
435
|
+
ErrResult<ActorMethodReturnType<Service[Method]>>
|
|
436
|
+
>[Transform]
|
|
434
437
|
>,
|
|
435
|
-
variables: ReactorArgs<
|
|
438
|
+
variables: ReactorArgs<Service, Method, Transform>
|
|
436
439
|
) => void
|
|
437
440
|
}
|
|
438
441
|
|
|
@@ -440,9 +443,9 @@ export interface MutationHookOptions<
|
|
|
440
443
|
* Result from createMutation.
|
|
441
444
|
*/
|
|
442
445
|
export interface MutationResult<
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
+
Service = BaseActor,
|
|
447
|
+
Method extends FunctionName<Service> = FunctionName<Service>,
|
|
448
|
+
Transform extends TransformKey = "candid",
|
|
446
449
|
> {
|
|
447
450
|
/**
|
|
448
451
|
* React hook for the mutation.
|
|
@@ -455,13 +458,15 @@ export interface MutationResult<
|
|
|
455
458
|
* })
|
|
456
459
|
*/
|
|
457
460
|
useMutation: (
|
|
458
|
-
options?: MutationHookOptions<
|
|
461
|
+
options?: MutationHookOptions<Service, Method, Transform>
|
|
459
462
|
) => UseMutationResult<
|
|
460
|
-
ReactorReturnOk<
|
|
461
|
-
ReactorReturnErr<
|
|
462
|
-
ReactorArgs<
|
|
463
|
+
ReactorReturnOk<Service, Method, Transform>,
|
|
464
|
+
ReactorReturnErr<Service, Method, Transform>,
|
|
465
|
+
ReactorArgs<Service, Method, Transform>
|
|
463
466
|
>
|
|
464
467
|
|
|
465
468
|
/** Execute the update call directly (outside of React) */
|
|
466
|
-
execute: (
|
|
469
|
+
execute: (
|
|
470
|
+
args: ReactorArgs<Service, Method, Transform>
|
|
471
|
+
) => Promise<ReactorReturnOk<Service, Method, Transform>>
|
|
467
472
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest"
|
|
2
|
+
import { normalizeQueryData } from "./utils"
|
|
3
|
+
|
|
4
|
+
describe("normalizeQueryData", () => {
|
|
5
|
+
it("uses null for a successful undefined query result", () => {
|
|
6
|
+
expect(normalizeQueryData(undefined)).toBeNull()
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
it("preserves defined query results, including nested undefined fields", () => {
|
|
10
|
+
const result = { value: undefined }
|
|
11
|
+
|
|
12
|
+
expect(normalizeQueryData(result)).toBe(result)
|
|
13
|
+
})
|
|
14
|
+
})
|
package/src/utils.ts
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import type { QueryKey } from "@tanstack/react-query"
|
|
6
|
+
import type { ReactorQueryData } from "@ic-reactor/core"
|
|
7
|
+
import { generateKey } from "@ic-reactor/core"
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* Internal query-key segment used to distinguish per-call factory args
|
|
@@ -10,6 +12,10 @@ import type { QueryKey } from "@tanstack/react-query"
|
|
|
10
12
|
*/
|
|
11
13
|
export const FACTORY_KEY_ARGS_QUERY_KEY = "__ic_reactor_factory_key_args"
|
|
12
14
|
|
|
15
|
+
/** Convert a direct reactor result into a value TanStack Query can cache. */
|
|
16
|
+
export const normalizeQueryData = <T>(value: T): ReactorQueryData<T> =>
|
|
17
|
+
(value === undefined ? null : value) as ReactorQueryData<T>
|
|
18
|
+
|
|
13
19
|
/**
|
|
14
20
|
* Merge a base query key, optional per-call query key, and optional key-args
|
|
15
21
|
* into a single query key array.
|
|
@@ -26,8 +32,15 @@ export function mergeFactoryQueryKey(
|
|
|
26
32
|
|
|
27
33
|
if (baseQueryKey) merged.push(...baseQueryKey)
|
|
28
34
|
if (callQueryKey) merged.push(...callQueryKey)
|
|
29
|
-
if (keyArgs !== undefined)
|
|
30
|
-
|
|
35
|
+
if (keyArgs !== undefined) {
|
|
36
|
+
// Serialize keyArgs through generateKey so BigInt values (and other
|
|
37
|
+
// non-JSON-serializable Candid types such as Principal) are safely
|
|
38
|
+
// converted to strings before React Query hashes the key.
|
|
39
|
+
const safeKeyArgs = generateKey(
|
|
40
|
+
Array.isArray(keyArgs) ? keyArgs : [keyArgs]
|
|
41
|
+
)
|
|
42
|
+
merged.push({ [FACTORY_KEY_ARGS_QUERY_KEY]: safeKeyArgs })
|
|
43
|
+
}
|
|
31
44
|
|
|
32
45
|
return merged.length > 0 ? merged : undefined
|
|
33
46
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createAuthHooks.d.ts","sourceRoot":"","sources":["../src/createAuthHooks.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,aAAa,EACb,UAAU,EAEV,0BAA0B,EAC1B,uBAAuB,EACvB,mCAAmC,EACnC,yCAAyC,EAC1C,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEnD,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAA;IACjD,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,0BAA0B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9D,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1D,eAAe,EAAE,OAAO,CAAA;IACxB,gBAAgB,EAAE,OAAO,CAAA;IACzB,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;IAC3B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;IACzB,KAAK,EAAE,KAAK,GAAG,SAAS,CAAA;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,UAAU,CAAA;IAC/B,gBAAgB,EAAE,MAAM,SAAS,GAAG,IAAI,CAAA;IACxC,OAAO,EAAE,MAAM,aAAa,CAAA;IAC5B,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;CACzD;AAED,MAAM,WAAW,2BAA2B;IAC1C,iBAAiB,EAAE,CACjB,MAAM,EAAE,mCAAmC,KACxC,OAAO,CAAC,uBAAuB,CAAC,CAAA;IACrC,uBAAuB,EAAE,CACvB,MAAM,EAAE,yCAAyC,KAC9C,OAAO,CAAC,uBAAuB,CAAC,CAAA;IACrC,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAAA;IAC1C,sBAAsB,EAAE,OAAO,CAAA;IAC/B,cAAc,EAAE,KAAK,GAAG,IAAI,CAAA;IAC5B,eAAe,EAAE,MAAM,IAAI,CAAA;CAC5B;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe,GAC1B,eAAe,aAAa,KAC3B,qBA4JF,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createAuthHooks.js","sourceRoot":"","sources":["../src/createAuthHooks.ts"],"names":[],"mappings":"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"}
|