@ic-reactor/react 2.0.1 → 3.0.0-beta.1

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 (155) hide show
  1. package/README.md +105 -79
  2. package/dist/createActorHooks.d.ts +39 -0
  3. package/dist/createActorHooks.d.ts.map +1 -0
  4. package/dist/createActorHooks.js +30 -0
  5. package/dist/createActorHooks.js.map +1 -0
  6. package/dist/createAuthHooks.d.ts +37 -0
  7. package/dist/createAuthHooks.d.ts.map +1 -0
  8. package/dist/createAuthHooks.js +94 -0
  9. package/dist/createAuthHooks.js.map +1 -0
  10. package/dist/createInfiniteQuery.d.ts +129 -0
  11. package/dist/createInfiniteQuery.d.ts.map +1 -0
  12. package/dist/createInfiniteQuery.js +160 -0
  13. package/dist/createInfiniteQuery.js.map +1 -0
  14. package/dist/createMutation.d.ts +19 -0
  15. package/dist/createMutation.d.ts.map +1 -0
  16. package/dist/createMutation.js +98 -0
  17. package/dist/createMutation.js.map +1 -0
  18. package/dist/createQuery.d.ts +20 -0
  19. package/dist/createQuery.d.ts.map +1 -0
  20. package/dist/createQuery.js +111 -0
  21. package/dist/createQuery.js.map +1 -0
  22. package/dist/createSuspenseInfiniteQuery.d.ts +122 -0
  23. package/dist/createSuspenseInfiniteQuery.d.ts.map +1 -0
  24. package/dist/createSuspenseInfiniteQuery.js +160 -0
  25. package/dist/createSuspenseInfiniteQuery.js.map +1 -0
  26. package/dist/createSuspenseQuery.d.ts +25 -0
  27. package/dist/createSuspenseQuery.d.ts.map +1 -0
  28. package/dist/createSuspenseQuery.js +116 -0
  29. package/dist/createSuspenseQuery.js.map +1 -0
  30. package/dist/hooks/index.d.ts +6 -2
  31. package/dist/hooks/index.d.ts.map +1 -0
  32. package/dist/hooks/index.js +6 -18
  33. package/dist/hooks/index.js.map +1 -0
  34. package/dist/hooks/useActorInfiniteQuery.d.ts +37 -0
  35. package/dist/hooks/useActorInfiniteQuery.d.ts.map +1 -0
  36. package/dist/hooks/useActorInfiniteQuery.js +33 -0
  37. package/dist/hooks/useActorInfiniteQuery.js.map +1 -0
  38. package/dist/hooks/useActorMutation.d.ts +23 -0
  39. package/dist/hooks/useActorMutation.d.ts.map +1 -0
  40. package/dist/hooks/useActorMutation.js +39 -0
  41. package/dist/hooks/useActorMutation.js.map +1 -0
  42. package/dist/hooks/useActorQuery.d.ts +32 -0
  43. package/dist/hooks/useActorQuery.d.ts.map +1 -0
  44. package/dist/hooks/useActorQuery.js +35 -0
  45. package/dist/hooks/useActorQuery.js.map +1 -0
  46. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts +36 -0
  47. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts.map +1 -0
  48. package/dist/hooks/useActorSuspenseInfiniteQuery.js +33 -0
  49. package/dist/hooks/useActorSuspenseInfiniteQuery.js.map +1 -0
  50. package/dist/hooks/useActorSuspenseQuery.d.ts +32 -0
  51. package/dist/hooks/useActorSuspenseQuery.d.ts.map +1 -0
  52. package/dist/hooks/useActorSuspenseQuery.js +36 -0
  53. package/dist/hooks/useActorSuspenseQuery.js.map +1 -0
  54. package/dist/index.d.ts +11 -8
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +17 -49
  57. package/dist/index.js.map +1 -0
  58. package/dist/types.d.ts +232 -13
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +5 -22
  61. package/dist/types.js.map +1 -0
  62. package/dist/validation.d.ts +131 -0
  63. package/dist/validation.d.ts.map +1 -0
  64. package/dist/validation.js +125 -0
  65. package/dist/validation.js.map +1 -0
  66. package/package.json +70 -35
  67. package/LICENSE.md +0 -8
  68. package/dist/context/actor/create.d.ts +0 -63
  69. package/dist/context/actor/create.js +0 -119
  70. package/dist/context/actor/hooks/useActorInterface.d.ts +0 -4
  71. package/dist/context/actor/hooks/useActorInterface.js +0 -10
  72. package/dist/context/actor/hooks/useActorState.d.ts +0 -21
  73. package/dist/context/actor/hooks/useActorState.js +0 -25
  74. package/dist/context/actor/hooks/useActorStore.d.ts +0 -32
  75. package/dist/context/actor/hooks/useActorStore.js +0 -36
  76. package/dist/context/actor/hooks/useInitializeActor.d.ts +0 -6
  77. package/dist/context/actor/hooks/useInitializeActor.js +0 -10
  78. package/dist/context/actor/hooks/useMethod.d.ts +0 -29
  79. package/dist/context/actor/hooks/useMethod.js +0 -34
  80. package/dist/context/actor/hooks/useMethodAttributes.d.ts +0 -7
  81. package/dist/context/actor/hooks/useMethodAttributes.js +0 -11
  82. package/dist/context/actor/hooks/useMethodNames.d.ts +0 -7
  83. package/dist/context/actor/hooks/useMethodNames.js +0 -11
  84. package/dist/context/actor/hooks/useQueryCall.d.ts +0 -28
  85. package/dist/context/actor/hooks/useQueryCall.js +0 -33
  86. package/dist/context/actor/hooks/useUpdateCall.d.ts +0 -29
  87. package/dist/context/actor/hooks/useUpdateCall.js +0 -34
  88. package/dist/context/actor/hooks/useVisitMethod.d.ts +0 -8
  89. package/dist/context/actor/hooks/useVisitMethod.js +0 -13
  90. package/dist/context/actor/hooks/useVisitService.d.ts +0 -8
  91. package/dist/context/actor/hooks/useVisitService.js +0 -13
  92. package/dist/context/actor/index.d.ts +0 -16
  93. package/dist/context/actor/index.js +0 -33
  94. package/dist/context/actor/provider.d.ts +0 -71
  95. package/dist/context/actor/provider.js +0 -75
  96. package/dist/context/actor/types.d.ts +0 -35
  97. package/dist/context/actor/types.js +0 -2
  98. package/dist/context/adapter/create.d.ts +0 -2
  99. package/dist/context/adapter/create.js +0 -102
  100. package/dist/context/adapter/hooks/useCandidAdapter.d.ts +0 -23
  101. package/dist/context/adapter/hooks/useCandidAdapter.js +0 -27
  102. package/dist/context/adapter/hooks/useCandidEvaluation.d.ts +0 -5
  103. package/dist/context/adapter/hooks/useCandidEvaluation.js +0 -9
  104. package/dist/context/adapter/index.d.ts +0 -6
  105. package/dist/context/adapter/index.js +0 -24
  106. package/dist/context/adapter/provider.d.ts +0 -23
  107. package/dist/context/adapter/provider.js +0 -27
  108. package/dist/context/adapter/types.d.ts +0 -52
  109. package/dist/context/adapter/types.js +0 -2
  110. package/dist/context/agent/create.d.ts +0 -74
  111. package/dist/context/agent/create.js +0 -104
  112. package/dist/context/agent/hooks/useAgent.d.ts +0 -14
  113. package/dist/context/agent/hooks/useAgent.js +0 -18
  114. package/dist/context/agent/hooks/useAgentManager.d.ts +0 -14
  115. package/dist/context/agent/hooks/useAgentManager.js +0 -18
  116. package/dist/context/agent/hooks/useAgentState.d.ts +0 -21
  117. package/dist/context/agent/hooks/useAgentState.js +0 -25
  118. package/dist/context/agent/hooks/useAuth.d.ts +0 -57
  119. package/dist/context/agent/hooks/useAuth.js +0 -61
  120. package/dist/context/agent/hooks/useAuthState.d.ts +0 -19
  121. package/dist/context/agent/hooks/useAuthState.js +0 -23
  122. package/dist/context/agent/hooks/useUserPrincipal.d.ts +0 -17
  123. package/dist/context/agent/hooks/useUserPrincipal.js +0 -21
  124. package/dist/context/agent/index.d.ts +0 -12
  125. package/dist/context/agent/index.js +0 -29
  126. package/dist/context/agent/provider.d.ts +0 -28
  127. package/dist/context/agent/provider.js +0 -32
  128. package/dist/context/agent/types.d.ts +0 -17
  129. package/dist/context/agent/types.js +0 -2
  130. package/dist/core.d.ts +0 -1
  131. package/dist/core.js +0 -9
  132. package/dist/createReactor.d.ts +0 -49
  133. package/dist/createReactor.js +0 -69
  134. package/dist/helpers/actorHooks.d.ts +0 -18
  135. package/dist/helpers/actorHooks.js +0 -283
  136. package/dist/helpers/agentHooks.d.ts +0 -3
  137. package/dist/helpers/agentHooks.js +0 -22
  138. package/dist/helpers/authHooks.d.ts +0 -2
  139. package/dist/helpers/authHooks.js +0 -120
  140. package/dist/helpers/extractActorContext.d.ts +0 -4
  141. package/dist/helpers/extractActorContext.js +0 -44
  142. package/dist/helpers/extractAgentContext.d.ts +0 -28
  143. package/dist/helpers/extractAgentContext.js +0 -59
  144. package/dist/helpers/index.d.ts +0 -5
  145. package/dist/helpers/index.js +0 -21
  146. package/dist/helpers/types.d.ts +0 -222
  147. package/dist/helpers/types.js +0 -2
  148. package/dist/hooks/types.d.ts +0 -22
  149. package/dist/hooks/types.js +0 -2
  150. package/dist/hooks/useActor.d.ts +0 -67
  151. package/dist/hooks/useActor.js +0 -197
  152. package/dist/hooks/useActorManager.d.ts +0 -68
  153. package/dist/hooks/useActorManager.js +0 -75
  154. package/dist/utils.d.ts +0 -1
  155. package/dist/utils.js +0 -17
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Infinite Query Factory - Generic wrapper for React Query paginated canister data
3
+ *
4
+ * Creates unified fetch/hook/refetch functions for any paginated canister method.
5
+ * Works with any Reactor instance.
6
+ *
7
+ * @example
8
+ * const postsQuery = createInfiniteQuery(reactor, {
9
+ * functionName: "get_posts",
10
+ * initialPageParam: 0,
11
+ * getArgs: (cursor) => [{ cursor, limit: 10 }],
12
+ * getNextPageParam: (lastPage) => lastPage.nextCursor,
13
+ * })
14
+ *
15
+ * // In component
16
+ * const { data, fetchNextPage, hasNextPage } = postsQuery.useInfiniteQuery()
17
+ *
18
+ * // Flatten all pages
19
+ * const allPosts = data?.pages.flatMap(page => page.posts)
20
+ *
21
+ * // Invalidate cache
22
+ * postsQuery.refetch()
23
+ */
24
+ import { useInfiniteQuery, } from "@tanstack/react-query";
25
+ // ============================================================================
26
+ // Internal Implementation
27
+ // ============================================================================
28
+ const createInfiniteQueryImpl = (reactor, config) => {
29
+ const { functionName, callConfig, queryKey: customQueryKey, initialPageParam, getArgs, getNextPageParam, getPreviousPageParam, maxPages, staleTime = 5 * 60 * 1000, select, } = config;
30
+ // Get query key from actor manager
31
+ const getQueryKey = () => {
32
+ return reactor.generateQueryKey({
33
+ functionName,
34
+ queryKey: customQueryKey,
35
+ });
36
+ };
37
+ // Query function - accepts QueryFunctionContext
38
+ const queryFn = async (context) => {
39
+ // pageParam is typed as unknown in QueryFunctionContext, but we know its type
40
+ const pageParam = context.pageParam;
41
+ const args = getArgs(pageParam);
42
+ const result = await reactor.callMethod({
43
+ functionName,
44
+ args,
45
+ callConfig,
46
+ });
47
+ return result;
48
+ };
49
+ // Get infinite query options for fetchInfiniteQuery
50
+ const getInfiniteQueryOptions = () => ({
51
+ queryKey: getQueryKey(),
52
+ queryFn,
53
+ initialPageParam,
54
+ getNextPageParam,
55
+ });
56
+ // Fetch function for loaders (cache-first, fetches first page)
57
+ const fetch = async () => {
58
+ // Check cache first
59
+ const cachedData = reactor.queryClient.getQueryData(getQueryKey());
60
+ if (cachedData !== undefined) {
61
+ return select ? select(cachedData) : cachedData;
62
+ }
63
+ // Fetch if not in cache
64
+ const result = await reactor.queryClient.fetchInfiniteQuery(getInfiniteQueryOptions());
65
+ // Result is already InfiniteData format
66
+ return select ? select(result) : result;
67
+ };
68
+ // Implementation
69
+ const useInfiniteQueryHook = (options) => {
70
+ // Chain the selects: raw -> config.select -> options.select
71
+ const chainedSelect = (rawData) => {
72
+ const firstPass = select ? select(rawData) : rawData;
73
+ if (options?.select) {
74
+ return options.select(firstPass);
75
+ }
76
+ return firstPass;
77
+ };
78
+ return useInfiniteQuery({
79
+ queryKey: getQueryKey(),
80
+ queryFn,
81
+ initialPageParam,
82
+ getNextPageParam,
83
+ getPreviousPageParam,
84
+ maxPages,
85
+ staleTime,
86
+ ...options,
87
+ select: chainedSelect,
88
+ }, reactor.queryClient);
89
+ };
90
+ // Refetch/invalidate function
91
+ const refetch = async () => {
92
+ const queryKey = getQueryKey();
93
+ await reactor.queryClient.refetchQueries({ queryKey });
94
+ };
95
+ // Get data from cache without fetching
96
+ const getCacheData = (selectFn) => {
97
+ const queryKey = getQueryKey();
98
+ const cachedRawData = reactor.queryClient.getQueryData(queryKey);
99
+ if (cachedRawData === undefined) {
100
+ return undefined;
101
+ }
102
+ // Apply config.select to raw cache data
103
+ const selectedData = (select ? select(cachedRawData) : cachedRawData);
104
+ // Apply optional select parameter
105
+ if (selectFn) {
106
+ return selectFn(selectedData);
107
+ }
108
+ return selectedData;
109
+ };
110
+ return {
111
+ fetch,
112
+ useInfiniteQuery: useInfiniteQueryHook,
113
+ refetch,
114
+ getQueryKey,
115
+ getCacheData,
116
+ };
117
+ };
118
+ // ============================================================================
119
+ // Factory Function
120
+ // ============================================================================
121
+ export function createInfiniteQuery(reactor, config) {
122
+ return createInfiniteQueryImpl(reactor, config);
123
+ }
124
+ // ============================================================================
125
+ // Factory with Dynamic Args
126
+ // ============================================================================
127
+ /**
128
+ * Create an infinite query factory that accepts getArgs at call time.
129
+ * Useful when pagination logic varies by context.
130
+ *
131
+ * @template A - The actor interface type
132
+ * @template M - The method name on the actor
133
+ * @template T - The transformation key (identity, display, etc.)
134
+ * @template TPageParam - The page parameter type
135
+ * @template TSelected - The type returned after select transformation
136
+ *
137
+ * @param reactor - The Reactor instance
138
+ * @param config - Infinite query configuration (without getArgs)
139
+ * @returns A function that accepts getArgs and returns an ActorInfiniteQueryResult
140
+ *
141
+ * @example
142
+ * const getPostsQuery = createActorInfiniteQueryFactory(reactor, {
143
+ * functionName: "get_posts",
144
+ * initialPageParam: 0,
145
+ * getNextPageParam: (lastPage) => lastPage.nextCursor,
146
+ * })
147
+ *
148
+ * // Create query with specific args builder
149
+ * const userPostsQuery = getPostsQuery((cursor) => [{ userId, cursor, limit: 10 }])
150
+ * const { data, fetchNextPage } = userPostsQuery.useInfiniteQuery()
151
+ */
152
+ export function createInfiniteQueryFactory(reactor, config) {
153
+ return (getArgs) => {
154
+ return createInfiniteQueryImpl(reactor, {
155
+ ...config,
156
+ getArgs,
157
+ });
158
+ };
159
+ }
160
+ //# sourceMappingURL=createInfiniteQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createInfiniteQuery.js","sourceRoot":"","sources":["../src/createInfiniteQuery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Mutation Factory - Generic wrapper for mutating canister data
3
+ *
4
+ * Creates unified mutation hooks for any canister method.
5
+ * Works with any Reactor instance.
6
+ *
7
+ * @example
8
+ * const transferMutation = createMutation(reactor, {
9
+ * functionName: "transfer",
10
+ * onSuccess: () => console.log("Success!"),
11
+ * })
12
+ *
13
+ * // In component
14
+ * const { mutate, isPending } = transferMutation.useMutation()
15
+ */
16
+ import type { Reactor, FunctionName, TransformKey } from "@ic-reactor/core";
17
+ import type { MutationConfig, MutationResult, NoInfer } from "./types";
18
+ export declare function createMutation<A, T extends TransformKey, M extends FunctionName<A> = FunctionName<A>>(reactor: Reactor<A, T>, config: MutationConfig<NoInfer<A>, M, T>): MutationResult<A, M, T>;
19
+ //# sourceMappingURL=createMutation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMutation.d.ts","sourceRoot":"","sources":["../src/createMutation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EAEZ,YAAY,EAEb,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EAEd,OAAO,EACR,MAAM,SAAS,CAAA;AAuHhB,wBAAgB,cAAc,CAC5B,CAAC,EACD,CAAC,SAAS,YAAY,EACtB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAE3C,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EACtB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACvC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAEzB"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Mutation Factory - Generic wrapper for mutating canister data
3
+ *
4
+ * Creates unified mutation hooks for any canister method.
5
+ * Works with any Reactor instance.
6
+ *
7
+ * @example
8
+ * const transferMutation = createMutation(reactor, {
9
+ * functionName: "transfer",
10
+ * onSuccess: () => console.log("Success!"),
11
+ * })
12
+ *
13
+ * // In component
14
+ * const { mutate, isPending } = transferMutation.useMutation()
15
+ */
16
+ import { useMutation } from "@tanstack/react-query";
17
+ import { isCanisterError } from "@ic-reactor/core";
18
+ // ============================================================================
19
+ // Internal Implementation
20
+ // ============================================================================
21
+ const createMutationImpl = (reactor, config) => {
22
+ const { functionName, callConfig, refetchQueries: factoryRefetchQueries, onSuccess: factoryOnSuccess, onCanisterError: factoryOnCanisterError, onError: factoryOnError, ...factoryOptions } = config;
23
+ // Direct execution function
24
+ const execute = async (args) => {
25
+ return reactor.callMethod({
26
+ functionName,
27
+ args,
28
+ callConfig,
29
+ });
30
+ };
31
+ // Hook implementation
32
+ const useMutationHook = (options) => {
33
+ // Extract our custom options
34
+ const { refetchQueries: hookRefetchQueries, onCanisterError: hookOnCanisterError, ...restOptions } = options || {};
35
+ return useMutation({
36
+ ...factoryOptions,
37
+ ...restOptions,
38
+ mutationFn: execute,
39
+ onSuccess: async (...args) => {
40
+ // 1. Handle factory-level refetchQueries
41
+ if (factoryRefetchQueries) {
42
+ await Promise.all(factoryRefetchQueries.map((queryKey) => {
43
+ return reactor.queryClient.refetchQueries({ queryKey });
44
+ }));
45
+ }
46
+ // 2. Handle hook-level refetchQueries
47
+ if (hookRefetchQueries) {
48
+ await Promise.all(hookRefetchQueries.map((queryKey) => {
49
+ if (queryKey) {
50
+ return reactor.queryClient.refetchQueries({ queryKey });
51
+ }
52
+ return Promise.resolve();
53
+ }));
54
+ }
55
+ // 3. Call factory onSuccess
56
+ if (factoryOnSuccess) {
57
+ await factoryOnSuccess(...args);
58
+ }
59
+ // 4. Call hook-local onSuccess
60
+ if (restOptions?.onSuccess) {
61
+ await restOptions.onSuccess(...args);
62
+ }
63
+ },
64
+ onError: (error, variables, context, mutation) => {
65
+ // Check if this is a CanisterError (from Result { Err: E })
66
+ if (isCanisterError(error)) {
67
+ // 1. Call factory-level onCanisterError
68
+ if (factoryOnCanisterError) {
69
+ factoryOnCanisterError(error, variables);
70
+ }
71
+ // 2. Call hook-level onCanisterError
72
+ if (hookOnCanisterError) {
73
+ hookOnCanisterError(error, variables);
74
+ }
75
+ }
76
+ // 3. Call factory-level onError (for all errors)
77
+ if (factoryOnError) {
78
+ factoryOnError(error, variables, context, mutation);
79
+ }
80
+ // 4. Call hook-level onError (for all errors)
81
+ if (restOptions?.onError) {
82
+ restOptions.onError(error, variables, context, mutation);
83
+ }
84
+ },
85
+ }, reactor.queryClient);
86
+ };
87
+ return {
88
+ useMutation: useMutationHook,
89
+ execute,
90
+ };
91
+ };
92
+ // ============================================================================
93
+ // Factory Function
94
+ // ============================================================================
95
+ export function createMutation(reactor, config) {
96
+ return createMutationImpl(reactor, config);
97
+ }
98
+ //# sourceMappingURL=createMutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMutation.js","sourceRoot":"","sources":["../src/createMutation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Query Factory - Generic wrapper for React Query-based canister data
3
+ *
4
+ * Creates unified fetch/hook/refetch functions for any canister method.
5
+ * Works with any Reactor instance.
6
+ *
7
+ * @example
8
+ * const userQuery = createQuery(todoManager, {
9
+ * functionName: "get_user",
10
+ * select: (result) => result.user,
11
+ * })
12
+ *
13
+ * // In component
14
+ * const { data: user } = userQuery.useQuery()
15
+ */
16
+ import type { Reactor, FunctionName, ReactorArgs, TransformKey } from "@ic-reactor/core";
17
+ import type { QueryFnData, QueryError, QueryConfig, QueryResult, QueryFactoryConfig, NoInfer } from "./types";
18
+ export declare function createQuery<A, T extends TransformKey, M extends FunctionName<A> = FunctionName<A>, TSelected = QueryFnData<A, M, T>>(reactor: Reactor<A, T>, config: QueryConfig<NoInfer<A>, M, T, TSelected>): QueryResult<QueryFnData<A, M, T>, TSelected, QueryError<A, M, T>>;
19
+ export declare function createQueryFactory<A, T extends TransformKey, M extends FunctionName<A> = FunctionName<A>, TSelected = QueryFnData<A, M, T>>(reactor: Reactor<A, T>, config: QueryFactoryConfig<NoInfer<A>, M, T, TSelected>): (args: ReactorArgs<A, M, T>) => QueryResult<QueryFnData<A, M, T>, TSelected, QueryError<A, M, T>>;
20
+ //# sourceMappingURL=createQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createQuery.d.ts","sourceRoot":"","sources":["../src/createQuery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,WAAW,EACX,YAAY,EACb,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,WAAW,EAEX,WAAW,EACX,kBAAkB,EAClB,OAAO,EACR,MAAM,SAAS,CAAA;AA+GhB,wBAAgB,WAAW,CACzB,CAAC,EACD,CAAC,SAAS,YAAY,EACtB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAC3C,SAAS,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAEhC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EACtB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,GAC/C,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAEnE;AAMD,wBAAgB,kBAAkB,CAChC,CAAC,EACD,CAAC,SAAS,YAAY,EACtB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAC3C,SAAS,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAEhC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EACtB,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,GACtD,CACD,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACvB,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CA4BrE"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Query Factory - Generic wrapper for React Query-based canister data
3
+ *
4
+ * Creates unified fetch/hook/refetch functions for any canister method.
5
+ * Works with any Reactor instance.
6
+ *
7
+ * @example
8
+ * const userQuery = createQuery(todoManager, {
9
+ * functionName: "get_user",
10
+ * select: (result) => result.user,
11
+ * })
12
+ *
13
+ * // In component
14
+ * const { data: user } = userQuery.useQuery()
15
+ */
16
+ import { useQuery } from "@tanstack/react-query";
17
+ // ============================================================================
18
+ // Internal Implementation
19
+ // ============================================================================
20
+ const createQueryImpl = (reactor, config) => {
21
+ const { functionName, args, staleTime = 5 * 60 * 1000, select, queryKey: customQueryKey, ...rest } = config;
22
+ const params = {
23
+ functionName,
24
+ args,
25
+ queryKey: customQueryKey,
26
+ };
27
+ // Get query key from actor manager
28
+ const getQueryKey = () => {
29
+ return reactor.generateQueryKey(params);
30
+ };
31
+ // Fetch function for loaders (cache-first)
32
+ const fetch = async () => {
33
+ const result = await reactor.fetchQuery(params);
34
+ return select ? select(result) : result;
35
+ };
36
+ // Implementation
37
+ const useQueryHook = (options) => {
38
+ const baseOptions = reactor.getQueryOptions(params);
39
+ // Chain the selects: raw -> config.select -> options.select
40
+ const chainedSelect = (rawData) => {
41
+ const firstPass = config.select ? config.select(rawData) : rawData;
42
+ if (options?.select) {
43
+ return options.select(firstPass);
44
+ }
45
+ return firstPass;
46
+ };
47
+ return useQuery({
48
+ queryKey: baseOptions.queryKey,
49
+ staleTime,
50
+ ...rest,
51
+ ...options,
52
+ queryFn: baseOptions.queryFn,
53
+ select: chainedSelect,
54
+ }, reactor.queryClient);
55
+ };
56
+ // Refetch/invalidate function
57
+ const refetch = async () => {
58
+ const queryKey = getQueryKey();
59
+ await reactor.queryClient.refetchQueries({ queryKey });
60
+ };
61
+ // Get data from cache without fetching
62
+ const getCacheData = (selectFn) => {
63
+ const cachedRawData = reactor.getQueryData(params);
64
+ if (cachedRawData === undefined) {
65
+ return undefined;
66
+ }
67
+ // Apply config.select to raw cache data
68
+ const selectedData = (config.select ? config.select(cachedRawData) : cachedRawData);
69
+ // Apply optional select parameter
70
+ if (selectFn) {
71
+ return selectFn(selectedData);
72
+ }
73
+ return selectedData;
74
+ };
75
+ return {
76
+ fetch,
77
+ useQuery: useQueryHook,
78
+ refetch,
79
+ getQueryKey,
80
+ getCacheData,
81
+ };
82
+ };
83
+ // ============================================================================
84
+ // Factory Function
85
+ // ============================================================================
86
+ export function createQuery(reactor, config) {
87
+ return createQueryImpl(reactor, config);
88
+ }
89
+ // ============================================================================
90
+ // Convenience: Create query with dynamic args
91
+ // ============================================================================
92
+ export function createQueryFactory(reactor, config) {
93
+ const cache = new Map();
94
+ return (args) => {
95
+ const key = reactor.generateQueryKey({
96
+ functionName: config.functionName,
97
+ args,
98
+ });
99
+ const cacheKey = JSON.stringify(key);
100
+ if (cache.has(cacheKey)) {
101
+ return cache.get(cacheKey);
102
+ }
103
+ const result = createQueryImpl(reactor, {
104
+ ...config,
105
+ args,
106
+ });
107
+ cache.set(cacheKey, result);
108
+ return result;
109
+ };
110
+ }
111
+ //# sourceMappingURL=createQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createQuery.js","sourceRoot":"","sources":["../src/createQuery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Suspense Infinite Query Factory - Generic wrapper for React Query suspense-based paginated canister data
3
+ *
4
+ * Creates unified fetch/hook/refetch functions for any paginated canister method.
5
+ * Works with any Reactor instance.
6
+ *
7
+ * Uses `useSuspenseInfiniteQuery` which:
8
+ * - Requires wrapping in <Suspense> boundary
9
+ * - Data is always defined (no undefined checks)
10
+ * - Does NOT support `enabled` or `placeholderData` options
11
+ *
12
+ * @example
13
+ * const postsQuery = createSuspenseInfiniteQuery(reactor, {
14
+ * functionName: "get_posts",
15
+ * initialPageParam: 0,
16
+ * getArgs: (cursor) => [{ cursor, limit: 10 }],
17
+ * getNextPageParam: (lastPage) => lastPage.nextCursor,
18
+ * })
19
+ *
20
+ * // In component (wrap in Suspense)
21
+ * const { data, fetchNextPage, hasNextPage } = postsQuery.useSuspenseInfiniteQuery()
22
+ *
23
+ * // Flatten all pages
24
+ * const allPosts = data.pages.flatMap(page => page.posts)
25
+ */
26
+ import type { Reactor, FunctionName, ReactorArgs, BaseActor, TransformKey, ReactorReturnOk, ReactorReturnErr } from "@ic-reactor/core";
27
+ import { QueryKey, InfiniteData, UseSuspenseInfiniteQueryResult, UseSuspenseInfiniteQueryOptions, InfiniteQueryObserverOptions } from "@tanstack/react-query";
28
+ import { CallConfig } from "@icp-sdk/core/agent";
29
+ import { NoInfer } from "./types";
30
+ /** The raw page data type returned by the query function */
31
+ export type SuspenseInfiniteQueryPageData<A = BaseActor, M extends FunctionName<A> = FunctionName<A>, T extends TransformKey = "candid"> = ReactorReturnOk<A, M, T>;
32
+ /** The error type for infinite queries */
33
+ export type SuspenseInfiniteQueryError<A = BaseActor, M extends FunctionName<A> = FunctionName<A>, T extends TransformKey = "candid"> = ReactorReturnErr<A, M, T>;
34
+ /**
35
+ * Configuration for createActorSuspenseInfiniteQuery.
36
+ * Extends InfiniteQueryObserverOptions to accept all React Query options at the create level.
37
+ *
38
+ * @template A - The actor interface type
39
+ * @template M - The method name on the actor
40
+ * @template T - The transformation key (identity, display, etc.)
41
+ * @template TPageParam - The type of the page parameter
42
+ * @template TSelected - The type returned after select transformation
43
+ */
44
+ export interface SuspenseInfiniteQueryConfig<A = BaseActor, M extends FunctionName<A> = FunctionName<A>, T extends TransformKey = "candid", TPageParam = unknown, TSelected = InfiniteData<SuspenseInfiniteQueryPageData<A, M, T>, TPageParam>> extends Omit<InfiniteQueryObserverOptions<SuspenseInfiniteQueryPageData<A, M, T>, SuspenseInfiniteQueryError<A, M, T>, TSelected, QueryKey, TPageParam>, "queryKey" | "queryFn"> {
45
+ /** The method to call on the canister */
46
+ functionName: M;
47
+ /** Call configuration for the actor method */
48
+ callConfig?: CallConfig;
49
+ /** Custom query key (optional, auto-generated if not provided) */
50
+ queryKey?: QueryKey;
51
+ /** Function to get args from page parameter */
52
+ getArgs: (pageParam: TPageParam) => ReactorArgs<A, M, T>;
53
+ }
54
+ /**
55
+ * Configuration for createActorSuspenseInfiniteQueryFactory (without initialPageParam, getArgs determined at call time).
56
+ */
57
+ export type SuspenseInfiniteQueryFactoryConfig<A = BaseActor, M extends FunctionName<A> = FunctionName<A>, T extends TransformKey = "candid", TPageParam = unknown, TSelected = InfiniteData<SuspenseInfiniteQueryPageData<A, M, T>, TPageParam>> = Omit<SuspenseInfiniteQueryConfig<A, M, T, TPageParam, TSelected>, "getArgs">;
58
+ /**
59
+ * useSuspenseInfiniteQuery hook with chained select support.
60
+ */
61
+ export interface UseSuspenseInfiniteQueryWithSelect<TPageData, TPageParam, TSelected = InfiniteData<TPageData, TPageParam>, TError = Error> {
62
+ (options?: Omit<UseSuspenseInfiniteQueryOptions<TPageData, TError, TSelected, QueryKey, TPageParam>, "select" | "queryKey" | "queryFn" | "initialPageParam" | "getNextPageParam" | "getPreviousPageParam">): UseSuspenseInfiniteQueryResult<TSelected, TError>;
63
+ <TFinal = TSelected>(options: Omit<UseSuspenseInfiniteQueryOptions<TPageData, TError, TFinal, QueryKey, TPageParam>, "queryKey" | "queryFn" | "select" | "initialPageParam" | "getNextPageParam" | "getPreviousPageParam"> & {
64
+ select: (data: TSelected) => TFinal;
65
+ }): UseSuspenseInfiniteQueryResult<TFinal, TError>;
66
+ }
67
+ /**
68
+ * Result from createActorSuspenseInfiniteQuery
69
+ *
70
+ * @template TPageData - The raw page data type
71
+ * @template TPageParam - The page parameter type
72
+ * @template TSelected - The type after select transformation
73
+ * @template TError - The error type
74
+ */
75
+ export interface SuspenseInfiniteQueryResult<TPageData, TPageParam, TSelected = InfiniteData<TPageData, TPageParam>, TError = Error> {
76
+ /** Fetch first page in loader (uses ensureInfiniteQueryData for cache-first) */
77
+ fetch: () => Promise<TSelected>;
78
+ /** React hook for components - supports pagination */
79
+ useSuspenseInfiniteQuery: UseSuspenseInfiniteQueryWithSelect<TPageData, TPageParam, TSelected, TError>;
80
+ /** Invalidate and refetch cache */
81
+ refetch: () => Promise<void>;
82
+ /** Get query key (for advanced React Query usage) */
83
+ getQueryKey: () => QueryKey;
84
+ /**
85
+ * Read data directly from cache without fetching.
86
+ * Returns undefined if data is not in cache.
87
+ */
88
+ getCacheData: {
89
+ (): TSelected | undefined;
90
+ <TFinal>(select: (data: TSelected) => TFinal): TFinal | undefined;
91
+ };
92
+ }
93
+ export declare function createSuspenseInfiniteQuery<A, T extends TransformKey, M extends FunctionName<A> = FunctionName<A>, TPageParam = unknown, TSelected = InfiniteData<SuspenseInfiniteQueryPageData<A, M, T>, TPageParam>>(reactor: Reactor<A, T>, config: SuspenseInfiniteQueryConfig<NoInfer<A>, M, T, TPageParam, TSelected>): SuspenseInfiniteQueryResult<SuspenseInfiniteQueryPageData<A, M, T>, TPageParam, TSelected, SuspenseInfiniteQueryError<A, M, T>>;
94
+ /**
95
+ * Create a suspense infinite query factory that accepts getArgs at call time.
96
+ * Useful when pagination logic varies by context.
97
+ *
98
+ * @template A - The actor interface type
99
+ * @template M - The method name on the actor
100
+ * @template T - The transformation key (identity, display, etc.)
101
+ * @template TPageParam - The page parameter type
102
+ * @template TSelected - The type returned after select transformation
103
+ *
104
+ * @param reactor - The Reactor instance
105
+ * @param config - Suspense infinite query configuration (without getArgs)
106
+ * @returns A function that accepts getArgs and returns an SuspenseActorInfiniteQueryResult
107
+ *
108
+ * @example
109
+ * const getPostsQuery = createActorSuspenseInfiniteQueryFactory(reactor, {
110
+ * functionName: "get_posts",
111
+ * initialPageParam: 0,
112
+ * getNextPageParam: (lastPage) => lastPage.nextCursor,
113
+ * })
114
+ *
115
+ * // Create query with specific args builder
116
+ * const userPostsQuery = getPostsQuery((cursor) => [{ userId, cursor, limit: 10 }])
117
+ * const { data, fetchNextPage } = userPostsQuery.useSuspenseInfiniteQuery()
118
+ */
119
+ export declare function createSuspenseInfiniteQueryFactory<A, T extends TransformKey, M extends FunctionName<A> = FunctionName<A>, TPageParam = unknown, TSelected = InfiniteData<SuspenseInfiniteQueryPageData<A, M, T>, TPageParam>>(reactor: Reactor<A, T>, config: SuspenseInfiniteQueryFactoryConfig<NoInfer<A>, M, T, TPageParam, TSelected>): (getArgs: (pageParam: TPageParam) => ReactorArgs<A, M, T>, options?: {
120
+ queryKey?: QueryKey;
121
+ }) => SuspenseInfiniteQueryResult<SuspenseInfiniteQueryPageData<A, M, T>, TPageParam, TSelected, SuspenseInfiniteQueryError<A, M, T>>;
122
+ //# sourceMappingURL=createSuspenseInfiniteQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSuspenseInfiniteQuery.d.ts","sourceRoot":"","sources":["../src/createSuspenseInfiniteQuery.ts"],"names":[],"mappings":"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"}