@ic-reactor/react 3.12.5 → 3.13.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 (152) hide show
  1. package/README.md +410 -44
  2. package/dist/auth/auth-client-compat.d.ts +122 -0
  3. package/dist/auth/auth-client-compat.d.ts.map +1 -0
  4. package/dist/auth/auth-client-compat.js +162 -0
  5. package/dist/auth/auth-client-compat.js.map +1 -0
  6. package/dist/auth/authentication-manager.d.ts +287 -5
  7. package/dist/auth/authentication-manager.d.ts.map +1 -1
  8. package/dist/auth/authentication-manager.js +920 -150
  9. package/dist/auth/authentication-manager.js.map +1 -1
  10. package/dist/auth/createIdentityAttributeHooks.d.ts.map +1 -1
  11. package/dist/auth/createIdentityAttributeHooks.js +36 -20
  12. package/dist/auth/createIdentityAttributeHooks.js.map +1 -1
  13. package/dist/auth/identity-attributes-manager.d.ts +2 -1
  14. package/dist/auth/identity-attributes-manager.d.ts.map +1 -1
  15. package/dist/auth/identity-attributes-manager.js +90 -6
  16. package/dist/auth/identity-attributes-manager.js.map +1 -1
  17. package/dist/auth/identity-attributes.d.ts.map +1 -1
  18. package/dist/auth/identity-attributes.js +57 -0
  19. package/dist/auth/identity-attributes.js.map +1 -1
  20. package/dist/auth/local-ii-probe.d.ts +12 -1
  21. package/dist/auth/local-ii-probe.d.ts.map +1 -1
  22. package/dist/auth/local-ii-probe.js +22 -3
  23. package/dist/auth/local-ii-probe.js.map +1 -1
  24. package/dist/auth/types.d.ts +48 -5
  25. package/dist/auth/types.d.ts.map +1 -1
  26. package/dist/createActorHooks.d.ts +7 -18
  27. package/dist/createActorHooks.d.ts.map +1 -1
  28. package/dist/createActorHooks.js.map +1 -1
  29. package/dist/createInfiniteQuery.d.ts +51 -10
  30. package/dist/createInfiniteQuery.d.ts.map +1 -1
  31. package/dist/createInfiniteQuery.js +39 -15
  32. package/dist/createInfiniteQuery.js.map +1 -1
  33. package/dist/createMutation.d.ts +3 -0
  34. package/dist/createMutation.d.ts.map +1 -1
  35. package/dist/createMutation.js +87 -80
  36. package/dist/createMutation.js.map +1 -1
  37. package/dist/createQuery.d.ts +35 -2
  38. package/dist/createQuery.d.ts.map +1 -1
  39. package/dist/createQuery.js +104 -17
  40. package/dist/createQuery.js.map +1 -1
  41. package/dist/createReactorProvider.d.ts +158 -0
  42. package/dist/createReactorProvider.d.ts.map +1 -0
  43. package/dist/createReactorProvider.js +256 -0
  44. package/dist/createReactorProvider.js.map +1 -0
  45. package/dist/createSuspenseInfiniteQuery.d.ts +16 -9
  46. package/dist/createSuspenseInfiniteQuery.d.ts.map +1 -1
  47. package/dist/createSuspenseInfiniteQuery.js +59 -27
  48. package/dist/createSuspenseInfiniteQuery.js.map +1 -1
  49. package/dist/createSuspenseQuery.d.ts +23 -2
  50. package/dist/createSuspenseQuery.d.ts.map +1 -1
  51. package/dist/createSuspenseQuery.js +68 -21
  52. package/dist/createSuspenseQuery.js.map +1 -1
  53. package/dist/defineDisplayReactor.d.ts +43 -0
  54. package/dist/defineDisplayReactor.d.ts.map +1 -0
  55. package/dist/defineDisplayReactor.js +42 -0
  56. package/dist/defineDisplayReactor.js.map +1 -0
  57. package/dist/defineReactor.d.ts +46 -72
  58. package/dist/defineReactor.d.ts.map +1 -1
  59. package/dist/defineReactor.js +11 -176
  60. package/dist/defineReactor.js.map +1 -1
  61. package/dist/defineReactorShared.d.ts +84 -0
  62. package/dist/defineReactorShared.d.ts.map +1 -0
  63. package/dist/defineReactorShared.js +139 -0
  64. package/dist/defineReactorShared.js.map +1 -0
  65. package/dist/hooks/createAuthHooks.d.ts +7 -0
  66. package/dist/hooks/createAuthHooks.d.ts.map +1 -1
  67. package/dist/hooks/createAuthHooks.js +180 -20
  68. package/dist/hooks/createAuthHooks.js.map +1 -1
  69. package/dist/hooks/useActorInfiniteQuery.d.ts +34 -6
  70. package/dist/hooks/useActorInfiniteQuery.d.ts.map +1 -1
  71. package/dist/hooks/useActorInfiniteQuery.js +54 -21
  72. package/dist/hooks/useActorInfiniteQuery.js.map +1 -1
  73. package/dist/hooks/useActorMethod.d.ts +37 -4
  74. package/dist/hooks/useActorMethod.d.ts.map +1 -1
  75. package/dist/hooks/useActorMethod.js +201 -57
  76. package/dist/hooks/useActorMethod.js.map +1 -1
  77. package/dist/hooks/useActorMutation.d.ts +10 -7
  78. package/dist/hooks/useActorMutation.d.ts.map +1 -1
  79. package/dist/hooks/useActorMutation.js +14 -13
  80. package/dist/hooks/useActorMutation.js.map +1 -1
  81. package/dist/hooks/useActorQuery.d.ts +17 -4
  82. package/dist/hooks/useActorQuery.d.ts.map +1 -1
  83. package/dist/hooks/useActorQuery.js +30 -9
  84. package/dist/hooks/useActorQuery.js.map +1 -1
  85. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts +15 -3
  86. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts.map +1 -1
  87. package/dist/hooks/useActorSuspenseInfiniteQuery.js +37 -17
  88. package/dist/hooks/useActorSuspenseInfiniteQuery.js.map +1 -1
  89. package/dist/hooks/useActorSuspenseQuery.d.ts +2 -2
  90. package/dist/hooks/useActorSuspenseQuery.d.ts.map +1 -1
  91. package/dist/hooks/useActorSuspenseQuery.js +20 -9
  92. package/dist/hooks/useActorSuspenseQuery.js.map +1 -1
  93. package/dist/index.d.ts +4 -0
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +6 -0
  96. package/dist/index.js.map +1 -1
  97. package/dist/ownedAuthentication.d.ts +52 -0
  98. package/dist/ownedAuthentication.d.ts.map +1 -0
  99. package/dist/ownedAuthentication.js +49 -0
  100. package/dist/ownedAuthentication.js.map +1 -0
  101. package/dist/server.d.ts +21 -0
  102. package/dist/server.d.ts.map +1 -0
  103. package/dist/server.js +23 -0
  104. package/dist/server.js.map +1 -0
  105. package/dist/testing.d.ts +19 -0
  106. package/dist/testing.d.ts.map +1 -0
  107. package/dist/testing.js +19 -0
  108. package/dist/testing.js.map +1 -0
  109. package/dist/types.d.ts +416 -15
  110. package/dist/types.d.ts.map +1 -1
  111. package/dist/types.js +1 -1
  112. package/dist/utils.d.ts +159 -3
  113. package/dist/utils.d.ts.map +1 -1
  114. package/dist/utils.js +301 -1
  115. package/dist/utils.js.map +1 -1
  116. package/dist/validation.d.ts +12 -7
  117. package/dist/validation.d.ts.map +1 -1
  118. package/dist/validation.js +34 -15
  119. package/dist/validation.js.map +1 -1
  120. package/llms.txt +259 -33
  121. package/package.json +17 -5
  122. package/src/auth/auth-client-compat.ts +273 -0
  123. package/src/auth/authentication-manager.ts +918 -96
  124. package/src/auth/createIdentityAttributeHooks.ts +47 -21
  125. package/src/auth/identity-attributes-manager.ts +100 -5
  126. package/src/auth/identity-attributes.ts +75 -0
  127. package/src/auth/local-ii-probe.ts +29 -3
  128. package/src/auth/types.ts +49 -6
  129. package/src/createActorHooks.ts +20 -32
  130. package/src/createInfiniteQuery.ts +120 -28
  131. package/src/createMutation.ts +161 -178
  132. package/src/createQuery.ts +164 -32
  133. package/src/createReactorProvider.ts +365 -0
  134. package/src/createSuspenseInfiniteQuery.ts +93 -43
  135. package/src/createSuspenseQuery.ts +102 -32
  136. package/src/defineDisplayReactor.ts +62 -0
  137. package/src/defineReactor.ts +81 -263
  138. package/src/defineReactorShared.ts +268 -0
  139. package/src/hooks/createAuthHooks.ts +206 -24
  140. package/src/hooks/useActorInfiniteQuery.ts +122 -49
  141. package/src/hooks/useActorMethod.ts +295 -92
  142. package/src/hooks/useActorMutation.ts +23 -23
  143. package/src/hooks/useActorQuery.ts +43 -10
  144. package/src/hooks/useActorSuspenseInfiniteQuery.ts +93 -50
  145. package/src/hooks/useActorSuspenseQuery.ts +30 -15
  146. package/src/index.ts +8 -0
  147. package/src/ownedAuthentication.ts +81 -0
  148. package/src/server.ts +23 -0
  149. package/src/testing.ts +18 -0
  150. package/src/types.ts +463 -14
  151. package/src/utils.ts +387 -3
  152. package/src/validation.ts +43 -19
@@ -9,6 +9,9 @@
9
9
  * @example
10
10
  * const transferMutation = createMutation(reactor, {
11
11
  * functionName: "transfer",
12
+ * // Refetched before onSuccess runs: a query factory covers every args
13
+ * // instance, a `{ functionName }` every query of that method
14
+ * invalidateQueries: [getBalance, { functionName: "get_history" }],
12
15
  * onSuccess: () => console.log("Success!"),
13
16
  * })
14
17
  *
@@ -26,13 +29,7 @@
26
29
  */
27
30
  import { useMutation, } from "@tanstack/react-query";
28
31
  import { isCanisterError } from "@ic-reactor/core";
29
- // ============================================================================
30
- // Internal helpers
31
- // ============================================================================
32
- /** Invalidate a list of query keys in parallel, filtering out undefineds. */
33
- async function invalidateAll(queryClient, keys) {
34
- await Promise.all(keys.map((queryKey) => queryKey ? queryClient.invalidateQueries({ queryKey }) : Promise.resolve()));
35
- }
32
+ import { invalidateTargets, useMountQueryClient } from "./utils.js";
36
33
  // ============================================================================
37
34
  // Internal Implementation
38
35
  // ============================================================================
@@ -45,7 +42,7 @@ const createMutationImpl = (reactor, config) => {
45
42
  */
46
43
  const callFn = (args) => reactor.callMethod({ functionName, args, callConfig });
47
44
  /**
48
- * The factory's own `onMutate` result for each call through the hook.
45
+ * The factory's own `onMutate` result for each call.
49
46
  *
50
47
  * TanStack Query stores one `onMutate` result per mutation and hands it to
51
48
  * every callback. That slot holds the hook's result, which the mutation also
@@ -56,76 +53,22 @@ const createMutationImpl = (reactor, config) => {
56
53
  const factoryOnMutateResults = new WeakMap();
57
54
  /**
58
55
  * The `onMutate` result a factory callback receives. A factory without its
59
- * own `onMutate` gets the hook's, as it always has. TanStack Query before
60
- * 5.89 passes no context, so there a factory callback gets the hook's result
61
- * too.
56
+ * own `onMutate` gets the hook's, as it always has.
62
57
  */
63
58
  const factoryOnMutateResult = (onMutateResult, context) => (factoryOnMutate && context
64
59
  ? factoryOnMutateResults.get(context)
65
60
  : onMutateResult);
66
61
  /**
67
- * Imperative execution for non-React usage.
68
- *
69
- * Runs the same factory-level chain the hook does — invalidation, then
70
- * `onSuccess`, or `onCanisterError`/`onError` on failure — so a mutation
71
- * object behaves the same through both call paths. Only hook-level callbacks
72
- * are absent, because there is no hook here to supply them.
73
- *
74
- * The callbacks get the same `{ client, meta, mutationKey }` context
75
- * TanStack Query passes them on the hook path.
76
- *
77
- * The error is rethrown after the callbacks run, so `await execute(...)`
78
- * still rejects for the caller.
79
- *
80
- * Use this in route loaders, scripts, or server-side code.
62
+ * The options a mutation of this factory runs with, on both call paths: the
63
+ * factory's config, the hook's options on top when there is a hook, and the
64
+ * callbacks of both levels chained, factory first. `useMutation()` hands
65
+ * them to TanStack Query's `useMutation`, and `execute()` builds a mutation
66
+ * from them in the QueryClient's MutationCache.
81
67
  */
82
- const execute = async (args) => {
83
- // TanStack Query builds this for the hook path, and the callback types
84
- // declare it as always present. None of it is mutation state, so this path
85
- // builds the same object. Passing `undefined` made a callback that reads
86
- // `context.client` throw here and nowhere else.
87
- //
88
- // The hook path takes `meta` and `mutationKey` from the client's defaulted
89
- // options, so this runs the same spread through `defaultMutationOptions`.
90
- // Reading `factoryOptions` alone dropped mutation defaults registered on
91
- // the QueryClient (`defaultOptions.mutations`, `setMutationDefaults`).
92
- const effectiveOptions = reactor.queryClient.defaultMutationOptions({
93
- mutationKey: reactor.getQueryOptions({ functionName }).queryKey,
94
- ...factoryOptions,
95
- });
96
- const context = {
97
- client: reactor.queryClient,
98
- meta: effectiveOptions.meta,
99
- mutationKey: effectiveOptions.mutationKey,
100
- };
101
- let result;
102
- try {
103
- result = await callFn(args);
104
- }
105
- catch (error) {
106
- if (isCanisterError(error)) {
107
- // `catch` drops the type. `callMethod` rejects with this method's
108
- // CanisterError, the one the hook path narrows to.
109
- factoryOnCanisterError?.(error, args);
110
- }
111
- // `onMutate` does not run on this path, so there is no result to pass.
112
- // Awaited like `onSuccess` below and like the hook path, so an async
113
- // rollback or report finishes before `execute()` rejects.
114
- await factoryOnError?.(error, args, undefined, context);
115
- throw error;
116
- }
117
- if (factoryInvalidateQueries) {
118
- await invalidateAll(reactor.queryClient, factoryInvalidateQueries);
119
- }
120
- await factoryOnSuccess?.(result, args, undefined, context);
121
- return result;
122
- };
123
- // Hook implementation
124
- const useMutationHook = (options) => {
125
- const baseOptions = reactor.getQueryOptions({ functionName });
68
+ const mutationOptions = (options) => {
126
69
  const { invalidateQueries: hookInvalidateQueries, onCanisterError: hookOnCanisterError, ...restOptions } = options ?? {};
127
- return useMutation({
128
- mutationKey: baseOptions.queryKey,
70
+ return {
71
+ mutationKey: reactor.getQueryOptions({ functionName }).queryKey,
129
72
  ...factoryOptions,
130
73
  ...restOptions,
131
74
  // Use callFn (not execute) to avoid double-invalidation:
@@ -133,13 +76,9 @@ const createMutationImpl = (reactor, config) => {
133
76
  mutationFn: callFn,
134
77
  onSuccess: async (data, variables, onMutateResult, context) => {
135
78
  // 1. Factory-level invalidation
136
- if (factoryInvalidateQueries) {
137
- await invalidateAll(reactor.queryClient, factoryInvalidateQueries);
138
- }
79
+ await invalidateTargets(reactor, factoryInvalidateQueries, callConfig);
139
80
  // 2. Hook-level invalidation
140
- if (hookInvalidateQueries) {
141
- await invalidateAll(reactor.queryClient, hookInvalidateQueries);
142
- }
81
+ await invalidateTargets(reactor, hookInvalidateQueries, callConfig);
143
82
  // 3. Factory onSuccess
144
83
  await factoryOnSuccess?.(data, variables, factoryOnMutateResult(onMutateResult, context), context);
145
84
  // 4. Hook onSuccess
@@ -176,7 +115,73 @@ const createMutationImpl = (reactor, config) => {
176
115
  await factoryOnSettled?.(data, error, variables, factoryOnMutateResult(onMutateResult, context), context);
177
116
  await restOptions.onSettled?.(data, error, variables, onMutateResult, context);
178
117
  },
179
- }, reactor.queryClient);
118
+ };
119
+ };
120
+ /**
121
+ * Imperative execution for non-React usage.
122
+ *
123
+ * Builds the mutation in the QueryClient's MutationCache and runs it, as
124
+ * TanStack Query's `useMutation` does, with the options the hook path uses
125
+ * minus the hook's own. It used to call the canister and the factory's
126
+ * callbacks itself, so the MutationCache never saw it: its global
127
+ * `onError`, `onSuccess` and `onSettled` did not run, `useIsMutating` did
128
+ * not count it, and neither the factory's `retry` or `networkMode` nor the
129
+ * same options in the QueryClient's mutation defaults applied to the call.
130
+ * The factory's `onMutate` and `onSettled` did not run either.
131
+ *
132
+ * Now the factory's chain runs as it does through `useMutation()`:
133
+ * `onMutate`, then the factory's invalidation and `onSuccess`, or
134
+ * `onCanisterError` and `onError` on failure, then `onSettled`. Each factory
135
+ * callback gets the result of the factory's `onMutate` for this call. Only
136
+ * hook-level callbacks are absent, because there is no hook here to supply
137
+ * them.
138
+ *
139
+ * The QueryClient's mutation defaults apply as well, so a `mutations.retry`
140
+ * there re-sends a failed call here too. Each retry of an update method is
141
+ * a new call the canister runs; set `retry` on the factory (`false`, or
142
+ * `reactorUpdateRetry` to retry only a SysTransient rejection) to decide it
143
+ * per method.
144
+ *
145
+ * It resolves with the method's result. On failure it rejects with the
146
+ * call's error once the callbacks have run, so `await execute(...)` still
147
+ * rejects for the caller.
148
+ *
149
+ * Use this in route loaders, scripts, or server-side code.
150
+ */
151
+ const execute = async (args) => {
152
+ const { queryClient } = reactor;
153
+ const options = mutationOptions();
154
+ const { onError } = options;
155
+ // What the factory's `onError` or `onCanisterError` throws, if either
156
+ // does. execute() has always rejected with it, and a TanStack Query
157
+ // mutation at the 5.90.2 peer floor does too. Later releases reject with
158
+ // the call's error and report the thrown one as an unhandled rejection,
159
+ // which ends a Node script, so it is caught here and rethrown below.
160
+ let thrownByOnError;
161
+ const mutation = queryClient
162
+ .getMutationCache()
163
+ .build(queryClient, {
164
+ ...options,
165
+ onError: async (error, variables, onMutateResult, context) => {
166
+ try {
167
+ await onError?.(error, variables, onMutateResult, context);
168
+ }
169
+ catch (thrown) {
170
+ thrownByOnError = { error: thrown };
171
+ }
172
+ },
173
+ });
174
+ try {
175
+ return await mutation.execute(args);
176
+ }
177
+ catch (error) {
178
+ throw thrownByOnError ? thrownByOnError.error : error;
179
+ }
180
+ };
181
+ // Hook implementation
182
+ const useMutationHook = (options) => {
183
+ useMountQueryClient(reactor.queryClient);
184
+ return useMutation(mutationOptions(options), reactor.queryClient);
180
185
  };
181
186
  return { useMutation: useMutationHook, execute };
182
187
  };
@@ -184,8 +189,10 @@ const createMutationImpl = (reactor, config) => {
184
189
  // Public Factory Function
185
190
  // ============================================================================
186
191
  export function createMutation(reactor,
187
- // `execute()` runs the factory's `onSuccess` and `onError` without running
188
- // its `onMutate`, so their `onMutate` result can also be `undefined`.
192
+ // A factory `onError` or `onSettled` gets no `onMutate` result when
193
+ // `onMutate` throws, so the result can also be `undefined`. `onSuccess`
194
+ // shares the type argument. It kept the `undefined` from when `execute()`
195
+ // ran no `onMutate`, although it now always gets a result.
189
196
  config) {
190
197
  return createMutationImpl(reactor, config);
191
198
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createMutation.js","sourceRoot":"","sources":["../src/createMutation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createMutation.js","sourceRoot":"","sources":["../src/createMutation.ts"],"names":[],"mappings":"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"}
@@ -24,7 +24,40 @@
24
24
  * await userQuery.invalidate()
25
25
  */
26
26
  import type { Reactor, FunctionName, ReactorArgs, TransformKey } from "@ic-reactor/core";
27
- import type { QueryFnData, QueryError, QueryConfig, QueryResult, QueryFactoryConfig, NoInfer } from "./types.js";
27
+ import type { QueryFnData, QueryError, QueryConfig, QueryResult, QueryFactoryConfig, SkippableQueryFactoryFn, NoInfer } from "./types.js";
28
28
  export declare function createQuery<Service, Transform extends TransformKey, Method extends FunctionName<Service> = FunctionName<Service>, Selected = QueryFnData<Service, Method, Transform>>(reactor: Reactor<Service, Transform>, config: QueryConfig<NoInfer<Service>, Method, Transform, Selected>): QueryResult<QueryFnData<Service, Method, Transform>, Selected, QueryError<Service, Method, Transform>>;
29
- export declare function createQueryFactory<Service, Transform extends TransformKey, Method extends FunctionName<Service> = FunctionName<Service>, Selected = QueryFnData<Service, Method, Transform>>(reactor: Reactor<Service, Transform>, config: QueryFactoryConfig<NoInfer<Service>, Method, Transform, Selected>): (args: ReactorArgs<Service, Method, Transform>) => QueryResult<QueryFnData<Service, Method, Transform>, Selected, QueryError<Service, Method, Transform>>;
29
+ /**
30
+ * Create a query factory: a function that takes the method's args and returns
31
+ * the query object for them, the same object for the same args.
32
+ *
33
+ * The function also has `getQueryKey()`, the key prefix every query it
34
+ * returns shares, and `invalidate()`, which invalidates all of them whatever
35
+ * their args. Pass the function itself to a mutation's `invalidateQueries` to
36
+ * refresh every instance after the mutation.
37
+ *
38
+ * It also takes TanStack Query's `skipToken` in place of args, for a
39
+ * component whose args are not known yet, and returns a query with only
40
+ * `useQuery()`, which waits without fetching; see
41
+ * {@link SkippableQueryFactoryFn}.
42
+ *
43
+ * @example
44
+ * const getBalance = createQueryFactory(ledger, {
45
+ * functionName: "icrc1_balance_of",
46
+ * })
47
+ *
48
+ * // In a component
49
+ * const { data } = getBalance([{ owner, subaccount: [] }]).useQuery()
50
+ *
51
+ * // In a component whose owner may not be known yet
52
+ * const { data: maybe } = getBalance(
53
+ * owner ? [{ owner, subaccount: [] }] : skipToken
54
+ * ).useQuery()
55
+ *
56
+ * // Refetch every account's balance after a transfer
57
+ * const transfer = createMutation(ledger, {
58
+ * functionName: "icrc1_transfer",
59
+ * invalidateQueries: [getBalance],
60
+ * })
61
+ */
62
+ export declare function createQueryFactory<Service, Transform extends TransformKey, Method extends FunctionName<Service> = FunctionName<Service>, Selected = QueryFnData<Service, Method, Transform>>(reactor: Reactor<Service, Transform>, config: QueryFactoryConfig<NoInfer<Service>, Method, Transform, Selected>): SkippableQueryFactoryFn<ReactorArgs<Service, Method, Transform>, QueryResult<QueryFnData<Service, Method, Transform>, Selected, QueryError<Service, Method, Transform>>>;
30
63
  //# sourceMappingURL=createQuery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createQuery.d.ts","sourceRoot":"","sources":["../src/createQuery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,WAAW,EACX,YAAY,EACb,MAAM,kBAAkB,CAAA;AAQzB,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,WAAW,EAEX,WAAW,EACX,kBAAkB,EAClB,OAAO,EACR,MAAM,YAAY,CAAA;AA0HnB,wBAAgB,WAAW,CACzB,OAAO,EACP,SAAS,SAAS,YAAY,EAC9B,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,EAC5D,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAElD,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EACpC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,GACjE,WAAW,CACZ,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACvC,QAAQ,EACR,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CACvC,CAKA;AAMD,wBAAgB,kBAAkB,CAChC,OAAO,EACP,SAAS,SAAS,YAAY,EAC9B,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,EAC5D,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAElD,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EACpC,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,GACxE,CACD,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,KAC1C,WAAW,CACd,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACvC,QAAQ,EACR,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CACvC,CA8BA"}
1
+ {"version":3,"file":"createQuery.d.ts","sourceRoot":"","sources":["../src/createQuery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,WAAW,EACX,YAAY,EACb,MAAM,kBAAkB,CAAA;AAUzB,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,WAAW,EAGX,WAAW,EACX,kBAAkB,EAClB,uBAAuB,EAEvB,OAAO,EACR,MAAM,YAAY,CAAA;AAwLnB,wBAAgB,WAAW,CACzB,OAAO,EACP,SAAS,SAAS,YAAY,EAC9B,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,EAC5D,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAElD,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EACpC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,GACjE,WAAW,CACZ,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACvC,QAAQ,EACR,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CACvC,CAKA;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EACP,SAAS,SAAS,YAAY,EAC9B,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,EAC5D,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAElD,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EACpC,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,GACxE,uBAAuB,CACxB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACvC,WAAW,CACT,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACvC,QAAQ,EACR,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CACvC,CACF,CA6DA"}
@@ -24,33 +24,72 @@
24
24
  * await userQuery.invalidate()
25
25
  */
26
26
  import { useMemo } from "react";
27
- import { useQuery, } from "@tanstack/react-query";
28
- import { buildChainedSelect, createBoundedCache } from "./utils.js";
27
+ import { useQuery, skipToken, } from "@tanstack/react-query";
28
+ import { buildChainedSelect, createBoundedCache, pickFetchOptions, queryCacheControls, retryOption, skippedQueryKey, useMountQueryClient, withQueryFactoryMethods, } from "./utils.js";
29
29
  // ============================================================================
30
30
  // Internal Implementation
31
31
  // ============================================================================
32
- const createQueryImpl = (reactor, config) => {
33
- const { functionName, args, staleTime = 5 * 60 * 1000, select, queryKey: customQueryKey, ...rest } = config;
34
- const params = { functionName, args, queryKey: customQueryKey };
35
- const getQueryKey = () => reactor.generateQueryKey(params);
32
+ const createQueryImpl = (reactor,
33
+ // `args` is `skipToken` only for a factory's skipped query, which exposes
34
+ // nothing but `useQuery`; see createQueryFactory.
35
+ config) => {
36
+ const { functionName, args, callConfig, staleTime = 5 * 60 * 1000, select, queryKey: customQueryKey, ...rest } = config;
37
+ const skipped = args === skipToken;
38
+ // `callConfig` goes wherever the hooks send it: to the call and into the
39
+ // key, so a query of another canister or agent has an entry of its own.
40
+ const params = {
41
+ functionName,
42
+ args: skipped ? undefined : args,
43
+ queryKey: customQueryKey,
44
+ callConfig,
45
+ };
46
+ // What the hook observes: the call, or for a query still waiting for its
47
+ // args, an entry of its own under the method's key, with nothing to run;
48
+ // see skippedQueryKey.
49
+ const queryOptions = () => skipped
50
+ ? {
51
+ queryKey: skippedQueryKey(reactor.generateQueryKey({ functionName }, callConfig), "query"),
52
+ // Kept as the unique symbol, which an object literal widens.
53
+ queryFn: skipToken,
54
+ retry: undefined,
55
+ }
56
+ : reactor.getQueryOptions(params);
57
+ const getQueryKey = () => reactor.generateQueryKey(params, callConfig);
36
58
  // Apply config.select to raw data (shared by fetch, getCacheData, and the hook)
37
59
  const applySelect = (raw) => select ? select(raw) : raw;
60
+ // How the query function runs, shared with the hook; see pickFetchOptions.
61
+ const fetchOptions = pickFetchOptions(rest);
38
62
  /** Cache-first fetch for use in loaders / route preloading. */
39
63
  const fetch = async () => {
40
- const result = await reactor.fetchQuery(params);
64
+ // Through the reactor rather than straight to the QueryClient: overriding
65
+ // `fetchQuery` in a Reactor subclass is a documented way to add logic to
66
+ // every factory fetch.
67
+ const result = await reactor.fetchQuery(params, fetchOptions);
41
68
  return applySelect(result);
42
69
  };
43
70
  /** Fire-and-forget prefetch — warms the cache without blocking. */
44
71
  const prefetch = () => {
45
72
  const baseOptions = reactor.getQueryOptions(params);
46
- return reactor.queryClient.prefetchQuery({
73
+ // A sign-in or sign-out cancels a prefetch in flight, and TanStack
74
+ // resolves it all the same: an entry nothing observes was left empty, and
75
+ // one a mounted query shows still held the previous principal's data
76
+ // until that query's refetch landed. It now runs again for the principal
77
+ // signed in, as `fetch()` does. Like `prefetchQuery` it never rejects, so
78
+ // the CallError for a principal that keeps switching is dropped too.
79
+ return reactor.clientManager
80
+ .fetchAcrossIdentitySwitch(() => reactor.queryClient.prefetchQuery({
81
+ ...fetchOptions,
82
+ // An update method's default `retry`; see `Reactor.getQueryRetry`.
83
+ ...retryOption(fetchOptions.retry, baseOptions.retry),
47
84
  queryKey: baseOptions.queryKey,
48
85
  queryFn: baseOptions.queryFn,
49
86
  staleTime,
50
- });
87
+ }))
88
+ .catch(() => undefined);
51
89
  };
52
90
  const useQueryHook = ((options) => {
53
- const baseOptions = reactor.getQueryOptions(params);
91
+ useMountQueryClient(reactor.queryClient);
92
+ const baseOptions = queryOptions();
54
93
  // Memoized so the observer's select-result cache can hit; see
55
94
  // buildChainedSelect. `select` comes from the factory config and is stable.
56
95
  const chainedSelect = useMemo(() => buildChainedSelect(select, options?.select), [options?.select]);
@@ -61,13 +100,16 @@ const createQueryImpl = (reactor, config) => {
61
100
  ...options,
62
101
  queryFn: baseOptions.queryFn,
63
102
  select: chainedSelect,
103
+ // The hook's `retry`, else the config's, else an update method's
104
+ // default; see `Reactor.getQueryRetry`.
105
+ ...retryOption(options?.retry ?? rest.retry, baseOptions.retry),
64
106
  }, reactor.queryClient);
65
107
  });
66
108
  const invalidate = async () => {
67
109
  await reactor.queryClient.invalidateQueries({ queryKey: getQueryKey() });
68
110
  };
69
111
  const getCacheData = ((selectFn) => {
70
- const raw = reactor.getQueryData(params);
112
+ const raw = reactor.getQueryData(params, callConfig);
71
113
  if (raw === undefined)
72
114
  return undefined;
73
115
  const selected = applySelect(raw);
@@ -84,6 +126,7 @@ const createQueryImpl = (reactor, config) => {
84
126
  getQueryKey,
85
127
  getCacheData,
86
128
  setData,
129
+ ...queryCacheControls(reactor, getQueryKey),
87
130
  };
88
131
  };
89
132
  // ============================================================================
@@ -95,13 +138,53 @@ export function createQuery(reactor, config) {
95
138
  // ============================================================================
96
139
  // Convenience: Create query with dynamic args
97
140
  // ============================================================================
141
+ /**
142
+ * Create a query factory: a function that takes the method's args and returns
143
+ * the query object for them, the same object for the same args.
144
+ *
145
+ * The function also has `getQueryKey()`, the key prefix every query it
146
+ * returns shares, and `invalidate()`, which invalidates all of them whatever
147
+ * their args. Pass the function itself to a mutation's `invalidateQueries` to
148
+ * refresh every instance after the mutation.
149
+ *
150
+ * It also takes TanStack Query's `skipToken` in place of args, for a
151
+ * component whose args are not known yet, and returns a query with only
152
+ * `useQuery()`, which waits without fetching; see
153
+ * {@link SkippableQueryFactoryFn}.
154
+ *
155
+ * @example
156
+ * const getBalance = createQueryFactory(ledger, {
157
+ * functionName: "icrc1_balance_of",
158
+ * })
159
+ *
160
+ * // In a component
161
+ * const { data } = getBalance([{ owner, subaccount: [] }]).useQuery()
162
+ *
163
+ * // In a component whose owner may not be known yet
164
+ * const { data: maybe } = getBalance(
165
+ * owner ? [{ owner, subaccount: [] }] : skipToken
166
+ * ).useQuery()
167
+ *
168
+ * // Refetch every account's balance after a transfer
169
+ * const transfer = createMutation(ledger, {
170
+ * functionName: "icrc1_transfer",
171
+ * invalidateQueries: [getBalance],
172
+ * })
173
+ */
98
174
  export function createQueryFactory(reactor, config) {
99
175
  const cache = createBoundedCache();
100
- return (args) => {
101
- const key = reactor.generateQueryKey({
102
- functionName: config.functionName,
103
- args,
104
- });
176
+ // One skipped query per factory, built on first use. Only its hook is
177
+ // handed out: until the args are known there is no call to make and no
178
+ // entry of their own to read or write.
179
+ let skippedQuery;
180
+ function factory(args) {
181
+ if (args === skipToken) {
182
+ skippedQuery ?? (skippedQuery = {
183
+ useQuery: createQueryImpl(reactor, { ...config, args: skipToken }).useQuery,
184
+ });
185
+ return skippedQuery;
186
+ }
187
+ const key = reactor.generateQueryKey({ functionName: config.functionName, args }, config.callConfig);
105
188
  const cacheKey = JSON.stringify(key);
106
189
  const existing = cache.get(cacheKey);
107
190
  if (existing)
@@ -112,6 +195,10 @@ export function createQueryFactory(reactor, config) {
112
195
  });
113
196
  cache.set(cacheKey, result);
114
197
  return result;
115
- };
198
+ }
199
+ // The method's own prefix, at the canister and agent the config's
200
+ // `callConfig` names. A config `queryKey` follows the args segment in every
201
+ // instance's key, so it cannot narrow the prefix.
202
+ return withQueryFactoryMethods(factory, reactor, () => reactor.generateQueryKey({ functionName: config.functionName }, config.callConfig));
116
203
  }
117
204
  //# sourceMappingURL=createQuery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createQuery.js","sourceRoot":"","sources":["../src/createQuery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createQuery.js","sourceRoot":"","sources":["../src/createQuery.ts"],"names":[],"mappings":"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"}