@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.
Files changed (125) hide show
  1. package/README.md +28 -9
  2. package/dist/auth/authentication-manager.d.ts +66 -0
  3. package/dist/auth/authentication-manager.d.ts.map +1 -0
  4. package/dist/auth/authentication-manager.js +458 -0
  5. package/dist/auth/authentication-manager.js.map +1 -0
  6. package/dist/auth/constants.d.ts +18 -0
  7. package/dist/auth/constants.d.ts.map +1 -0
  8. package/dist/auth/constants.js +18 -0
  9. package/dist/auth/constants.js.map +1 -0
  10. package/dist/auth/createIdentityAttributeHooks.d.ts +14 -0
  11. package/dist/auth/createIdentityAttributeHooks.d.ts.map +1 -0
  12. package/dist/auth/createIdentityAttributeHooks.js +54 -0
  13. package/dist/auth/createIdentityAttributeHooks.js.map +1 -0
  14. package/dist/auth/identity-attributes-manager.d.ts +19 -0
  15. package/dist/auth/identity-attributes-manager.d.ts.map +1 -0
  16. package/dist/auth/identity-attributes-manager.js +94 -0
  17. package/dist/auth/identity-attributes-manager.js.map +1 -0
  18. package/dist/auth/identity-attributes.d.ts +19 -0
  19. package/dist/auth/identity-attributes.d.ts.map +1 -0
  20. package/dist/auth/identity-attributes.js +170 -0
  21. package/dist/auth/identity-attributes.js.map +1 -0
  22. package/dist/auth/index.d.ts +8 -0
  23. package/dist/auth/index.d.ts.map +1 -0
  24. package/dist/auth/index.js +8 -0
  25. package/dist/auth/index.js.map +1 -0
  26. package/dist/auth/types.d.ts +75 -0
  27. package/dist/auth/types.d.ts.map +1 -0
  28. package/dist/auth/types.js +2 -0
  29. package/dist/auth/types.js.map +1 -0
  30. package/dist/createActorHooks.d.ts +12 -12
  31. package/dist/createActorHooks.d.ts.map +1 -1
  32. package/dist/createActorHooks.js.map +1 -1
  33. package/dist/createInfiniteQuery.d.ts +32 -32
  34. package/dist/createInfiniteQuery.d.ts.map +1 -1
  35. package/dist/createInfiniteQuery.js +6 -6
  36. package/dist/createInfiniteQuery.js.map +1 -1
  37. package/dist/createMutation.d.ts +12 -1
  38. package/dist/createMutation.d.ts.map +1 -1
  39. package/dist/createMutation.js +11 -0
  40. package/dist/createMutation.js.map +1 -1
  41. package/dist/createQuery.d.ts +12 -2
  42. package/dist/createQuery.d.ts.map +1 -1
  43. package/dist/createQuery.js +15 -5
  44. package/dist/createQuery.js.map +1 -1
  45. package/dist/createSuspenseInfiniteQuery.d.ts +31 -31
  46. package/dist/createSuspenseInfiniteQuery.d.ts.map +1 -1
  47. package/dist/createSuspenseInfiniteQuery.js +6 -6
  48. package/dist/createSuspenseInfiniteQuery.js.map +1 -1
  49. package/dist/createSuspenseQuery.d.ts +2 -2
  50. package/dist/createSuspenseQuery.d.ts.map +1 -1
  51. package/dist/createSuspenseQuery.js.map +1 -1
  52. package/dist/defineReactor.d.ts +74 -0
  53. package/dist/defineReactor.d.ts.map +1 -0
  54. package/dist/defineReactor.js +75 -0
  55. package/dist/defineReactor.js.map +1 -0
  56. package/dist/{createAuthHooks.d.ts → hooks/createAuthHooks.d.ts} +6 -13
  57. package/dist/hooks/createAuthHooks.d.ts.map +1 -0
  58. package/dist/{createAuthHooks.js → hooks/createAuthHooks.js} +12 -57
  59. package/dist/hooks/createAuthHooks.js.map +1 -0
  60. package/dist/hooks/index.d.ts +2 -0
  61. package/dist/hooks/index.d.ts.map +1 -1
  62. package/dist/hooks/index.js +2 -0
  63. package/dist/hooks/index.js.map +1 -1
  64. package/dist/hooks/useActorInfiniteQuery.d.ts +9 -9
  65. package/dist/hooks/useActorInfiniteQuery.d.ts.map +1 -1
  66. package/dist/hooks/useActorInfiniteQuery.js +3 -1
  67. package/dist/hooks/useActorInfiniteQuery.js.map +1 -1
  68. package/dist/hooks/useActorMethod.d.ts +17 -17
  69. package/dist/hooks/useActorMethod.d.ts.map +1 -1
  70. package/dist/hooks/useActorMethod.js.map +1 -1
  71. package/dist/hooks/useActorMutation.d.ts +18 -7
  72. package/dist/hooks/useActorMutation.d.ts.map +1 -1
  73. package/dist/hooks/useActorMutation.js +11 -0
  74. package/dist/hooks/useActorMutation.js.map +1 -1
  75. package/dist/hooks/useActorQuery.d.ts +8 -8
  76. package/dist/hooks/useActorQuery.d.ts.map +1 -1
  77. package/dist/hooks/useActorQuery.js.map +1 -1
  78. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts +9 -9
  79. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts.map +1 -1
  80. package/dist/hooks/useActorSuspenseInfiniteQuery.js +3 -1
  81. package/dist/hooks/useActorSuspenseInfiniteQuery.js.map +1 -1
  82. package/dist/hooks/useActorSuspenseQuery.d.ts +8 -8
  83. package/dist/hooks/useActorSuspenseQuery.d.ts.map +1 -1
  84. package/dist/hooks/useActorSuspenseQuery.js.map +1 -1
  85. package/dist/index.d.ts +2 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +2 -1
  88. package/dist/index.js.map +1 -1
  89. package/dist/types.d.ts +24 -24
  90. package/dist/types.d.ts.map +1 -1
  91. package/dist/utils.d.ts +3 -0
  92. package/dist/utils.d.ts.map +1 -1
  93. package/dist/utils.js +10 -2
  94. package/dist/utils.js.map +1 -1
  95. package/llms.txt +48 -0
  96. package/package.json +28 -22
  97. package/src/auth/authentication-manager.ts +519 -0
  98. package/src/auth/constants.ts +25 -0
  99. package/src/auth/createIdentityAttributeHooks.ts +83 -0
  100. package/src/auth/identity-attributes-manager.ts +127 -0
  101. package/src/auth/identity-attributes.ts +270 -0
  102. package/src/auth/index.ts +7 -0
  103. package/src/auth/types.ts +88 -0
  104. package/src/createActorHooks.ts +81 -49
  105. package/src/createInfiniteQuery.ts +153 -97
  106. package/src/createMutation.ts +34 -18
  107. package/src/createQuery.ts +92 -48
  108. package/src/createSuspenseInfiniteQuery.ts +165 -114
  109. package/src/createSuspenseQuery.ts +67 -41
  110. package/src/defineReactor.test.ts +70 -0
  111. package/src/defineReactor.ts +150 -0
  112. package/src/{createAuthHooks.ts → hooks/createAuthHooks.ts} +17 -98
  113. package/src/hooks/index.ts +4 -0
  114. package/src/hooks/useActorInfiniteQuery.ts +44 -30
  115. package/src/hooks/useActorMethod.ts +62 -53
  116. package/src/hooks/useActorMutation.ts +47 -30
  117. package/src/hooks/useActorQuery.ts +36 -32
  118. package/src/hooks/useActorSuspenseInfiniteQuery.ts +56 -30
  119. package/src/hooks/useActorSuspenseQuery.ts +42 -32
  120. package/src/index.ts +3 -1
  121. package/src/types.ts +76 -71
  122. package/src/utils.test.ts +14 -0
  123. package/src/utils.ts +15 -2
  124. package/dist/createAuthHooks.d.ts.map +0 -1
  125. 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
- A,
25
- M extends FunctionName<A>,
26
- T extends TransformKey = "candid",
26
+ Service,
27
+ Method extends FunctionName<Service>,
28
+ Transform extends TransformKey = "candid",
27
29
  TPageParam = unknown,
28
- TSelected = InfiniteData<ReactorReturnOk<A, M, T>, TPageParam>,
30
+ Selected = InfiniteData<
31
+ ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
32
+ TPageParam
33
+ >,
29
34
  > extends Omit<
30
35
  UseSuspenseInfiniteQueryOptions<
31
- ReactorReturnOk<A, M, T>,
32
- ReactorReturnErr<A, M, T>,
33
- TSelected,
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<A, T>
45
+ reactor: Reactor<Service, Transform>
41
46
  /** The method name to call on the canister */
42
- functionName: M
47
+ functionName: Method
43
48
  /** Function to get args from page parameter */
44
- getArgs: (pageParam: TPageParam) => ReactorArgs<A, M, T>
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<A, M, T>,
54
- allPages: ReactorReturnOk<A, M, T>[],
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
- A,
62
- M extends FunctionName<A>,
63
- T extends TransformKey = "candid",
66
+ Service,
67
+ Method extends FunctionName<Service>,
68
+ Transform extends TransformKey = "candid",
64
69
  TPageParam = unknown,
65
70
  > = Omit<
66
- UseActorSuspenseInfiniteQueryParameters<A, M, T, TPageParam>,
71
+ UseActorSuspenseInfiniteQueryParameters<
72
+ Service,
73
+ Method,
74
+ Transform,
75
+ TPageParam
76
+ >,
67
77
  "reactor"
68
78
  >
69
79
 
70
80
  export type UseActorSuspenseInfiniteQueryResult<
71
- A,
72
- M extends FunctionName<A>,
73
- T extends TransformKey = "candid",
81
+ Service,
82
+ Method extends FunctionName<Service>,
83
+ Transform extends TransformKey = "candid",
74
84
  TPageParam = unknown,
75
85
  > = UseSuspenseInfiniteQueryResult<
76
- InfiniteData<ReactorReturnOk<A, M, T>, TPageParam>,
77
- ReactorReturnErr<A, M, T>
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
- A,
94
- M extends FunctionName<A>,
95
- T extends TransformKey = "candid",
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
- A,
106
- M,
107
- T,
118
+ Service,
119
+ Method,
120
+ Transform,
108
121
  TPageParam
109
- >): UseActorSuspenseInfiniteQueryResult<A, M, T, TPageParam> => {
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
- return reactor.callMethod({
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<A, M, T, TPageParam>
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
- A,
21
- M extends FunctionName<A>,
22
- T extends TransformKey = "candid",
23
- TSelected = ReactorReturnOk<A, M, T>,
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<A, M, T>,
27
- ReactorReturnErr<A, M, T>,
28
- TSelected,
29
- ReactorReturnOk<A, M, T>,
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<A, T>
35
- functionName: M
36
- args?: ReactorArgs<A, M, T>
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
- A,
43
- M extends FunctionName<A>,
44
- T extends TransformKey = "candid",
45
- TSelected = ReactorReturnOk<A, M, T>,
46
- > = Omit<UseActorSuspenseQueryParameters<A, M, T, TSelected>, "reactor">
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
- A,
50
- M extends FunctionName<A>,
51
- T extends TransformKey = "candid",
52
- TSelected = ReactorReturnOk<A, M, T>,
53
- > = UseSuspenseQueryResult<TSelected, ReactorReturnErr<A, M, T>>
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
- A,
75
- M extends FunctionName<A>,
76
- T extends TransformKey = "candid",
77
- TSelected = ReactorReturnOk<A, M, T>,
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
- A,
87
- M,
88
- T,
89
- TSelected
90
- >): UseActorSuspenseQueryResult<A, M, T, TSelected> => {
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<M>({
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<ReactorReturnOk<A, M, T>, QueryKey>,
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
- A = BaseActor,
43
- M extends FunctionName<A> = FunctionName<A>,
44
- T extends TransformKey = "candid",
45
- > = ReactorReturnOk<A, M, T>
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
- A = BaseActor,
50
- M extends FunctionName<A> = FunctionName<A>,
51
- T extends TransformKey = "candid",
52
- > = ReactorReturnErr<A, M, T>
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 A - The actor interface type
62
- * @template M - The method name on the actor
63
- * @template T - The transformation key (identity, display, etc.)
64
- * @template TSelected - The type returned after select transformation
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
- A = BaseActor,
68
- M extends FunctionName<A> = FunctionName<A>,
69
- T extends TransformKey = "candid",
70
- TSelected = QueryFnData<A, M, T>,
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
- ReactorReturnOk<A, M, T>,
74
- ReactorReturnErr<A, M, T>,
75
- TSelected,
76
- ReactorReturnOk<A, M, T>,
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: M
83
+ functionName: Method
83
84
  /** Arguments to pass to the method (if any) */
84
- args?: ReactorArgs<A, M, T>
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<A, M, T>) => TSelected
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
- A = BaseActor,
99
- M extends FunctionName<A> = FunctionName<A>,
100
- T extends TransformKey = "candid",
101
- TSelected = QueryFnData<A, M, T>,
102
- > = BaseQueryConfig<A, M, T, TSelected>
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
- A = BaseActor,
110
- M extends FunctionName<A> = FunctionName<A>,
111
- T extends TransformKey = "candid",
112
- TSelected = QueryFnData<A, M, T>,
113
- > = BaseQueryConfig<A, M, T, TSelected>
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
- A = BaseActor,
124
- M extends FunctionName<A> = FunctionName<A>,
125
- T extends TransformKey = "candid",
126
- TSelected = QueryFnData<A, M, T>,
127
- > = Omit<QueryConfig<A, M, T, TSelected>, "args">
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
- A = BaseActor,
134
- M extends FunctionName<A> = FunctionName<A>,
135
- T extends TransformKey = "candid",
136
- TSelected = QueryFnData<A, M, T>,
137
- > = Omit<SuspenseQueryConfig<A, M, T, TSelected>, "args">
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
- A = BaseActor,
344
- M extends FunctionName<A> = FunctionName<A>,
345
- T extends TransformKey = "candid",
344
+ Service = BaseActor,
345
+ Method extends FunctionName<Service> = FunctionName<Service>,
346
+ Transform extends TransformKey = "candid",
346
347
  > extends Omit<
347
348
  UseMutationOptions<
348
- ReactorReturnOk<A, M, T>,
349
- ReactorReturnErr<A, M, T>,
350
- ReactorArgs<A, M, T>
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: M
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<A, M, T>
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
- A = BaseActor,
393
- M extends FunctionName<A> = FunctionName<A>,
394
- T extends TransformKey = "candid",
395
- > = Omit<MutationConfig<A, M, T>, "onSuccess">
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
- A = BaseActor,
403
- M extends FunctionName<A> = FunctionName<A>,
404
- T extends TransformKey = "candid",
403
+ Service = BaseActor,
404
+ Method extends FunctionName<Service> = FunctionName<Service>,
405
+ Transform extends TransformKey = "candid",
405
406
  > extends Omit<
406
407
  UseMutationOptions<
407
- ReactorReturnOk<A, M, T>,
408
- ReactorReturnErr<A, M, T>,
409
- ReactorArgs<A, M, T>
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<ErrResult<ActorMethodReturnType<A[M]>>>[T]
434
+ TransformReturnRegistry<
435
+ ErrResult<ActorMethodReturnType<Service[Method]>>
436
+ >[Transform]
434
437
  >,
435
- variables: ReactorArgs<A, M, T>
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
- A = BaseActor,
444
- M extends FunctionName<A> = FunctionName<A>,
445
- T extends TransformKey = "candid",
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<A, M, T>
461
+ options?: MutationHookOptions<Service, Method, Transform>
459
462
  ) => UseMutationResult<
460
- ReactorReturnOk<A, M, T>,
461
- ReactorReturnErr<A, M, T>,
462
- ReactorArgs<A, M, T>
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: (args: ReactorArgs<A, M, T>) => Promise<ReactorReturnOk<A, M, T>>
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
- merged.push({ [FACTORY_KEY_ARGS_QUERY_KEY]: keyArgs })
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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"}