@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
@@ -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 { QueryKey, useQuery } from "@tanstack/react-query"
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
- A,
41
- M extends FunctionName<A> = FunctionName<A>,
42
- T extends TransformKey = "candid",
43
- TSelected = QueryFnData<A, M, T>,
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<A, T>,
46
- config: QueryConfig<A, M, T, TSelected>
47
- ): QueryResult<QueryFnData<A, M, T>, TSelected, QueryError<A, M, T>> => {
48
- type TData = QueryFnData<A, M, T>
49
- type TError = QueryError<A, M, T>
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): TSelected =>
66
- select ? select(raw) : (raw as unknown as TSelected)
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<TSelected> => {
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
- const useQueryHook: UseQueryWithSelect<TData, TSelected, TError> = (
85
- options: any
86
- ): any => {
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: QueryResult<TData, TSelected, TError>["getCacheData"] = (
106
- selectFn?: (data: TSelected) => unknown
107
- ): any => {
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, TSelected, TError>["setData"] = (
139
+ const setData: QueryResult<TData, Selected, TError>["setData"] = (
115
140
  updater
116
141
  ) => {
117
- return reactor.queryClient.setQueryData(getQueryKey(), updater as any) as
118
- | TData
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
- A,
139
- T extends TransformKey,
140
- M extends FunctionName<A> = FunctionName<A>,
141
- TSelected = QueryFnData<A, M, T>,
164
+ Service,
165
+ Transform extends TransformKey,
166
+ Method extends FunctionName<Service> = FunctionName<Service>,
167
+ Selected = QueryFnData<Service, Method, Transform>,
142
168
  >(
143
- reactor: Reactor<A, T>,
144
- config: QueryConfig<NoInfer<A>, M, T, TSelected>
145
- ): QueryResult<QueryFnData<A, M, T>, TSelected, QueryError<A, M, T>> {
146
- return createQueryImpl(reactor, config as QueryConfig<A, M, T, TSelected>)
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
- A,
155
- T extends TransformKey,
156
- M extends FunctionName<A> = FunctionName<A>,
157
- TSelected = QueryFnData<A, M, T>,
187
+ Service,
188
+ Transform extends TransformKey,
189
+ Method extends FunctionName<Service> = FunctionName<Service>,
190
+ Selected = QueryFnData<Service, Method, Transform>,
158
191
  >(
159
- reactor: Reactor<A, T>,
160
- config: QueryFactoryConfig<NoInfer<A>, M, T, TSelected>
192
+ reactor: Reactor<Service, Transform>,
193
+ config: QueryFactoryConfig<NoInfer<Service>, Method, Transform, Selected>
161
194
  ): (
162
- args: ReactorArgs<A, M, T>
163
- ) => QueryResult<QueryFnData<A, M, T>, TSelected, QueryError<A, M, T>> {
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<QueryFnData<A, M, T>, TSelected, QueryError<A, M, T>>
203
+ QueryResult<
204
+ QueryFnData<Service, Method, Transform>,
205
+ Selected,
206
+ QueryError<Service, Method, Transform>
207
+ >
167
208
  >()
168
209
 
169
- return (args: ReactorArgs<A, M, T>) => {
210
+ return (args: ReactorArgs<Service, Method, Transform>) => {
170
211
  const key = reactor.generateQueryKey({
171
- functionName: config.functionName as M,
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<A, M, T, TSelected>(reactor, {
180
- ...config,
181
- args,
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
  }