@ic-reactor/react 3.12.5 → 4.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 (139) hide show
  1. package/README.md +236 -423
  2. package/dist/index.d.ts +259 -12
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +470 -17
  5. package/dist/index.js.map +1 -1
  6. package/llms.txt +82 -54
  7. package/package.json +12 -28
  8. package/src/index.tsx +611 -0
  9. package/dist/auth/authentication-manager.d.ts +0 -123
  10. package/dist/auth/authentication-manager.d.ts.map +0 -1
  11. package/dist/auth/authentication-manager.js +0 -767
  12. package/dist/auth/authentication-manager.js.map +0 -1
  13. package/dist/auth/constants.d.ts +0 -24
  14. package/dist/auth/constants.d.ts.map +0 -1
  15. package/dist/auth/constants.js +0 -24
  16. package/dist/auth/constants.js.map +0 -1
  17. package/dist/auth/createIdentityAttributeHooks.d.ts +0 -14
  18. package/dist/auth/createIdentityAttributeHooks.d.ts.map +0 -1
  19. package/dist/auth/createIdentityAttributeHooks.js +0 -106
  20. package/dist/auth/createIdentityAttributeHooks.js.map +0 -1
  21. package/dist/auth/identity-attributes-manager.d.ts +0 -26
  22. package/dist/auth/identity-attributes-manager.d.ts.map +0 -1
  23. package/dist/auth/identity-attributes-manager.js +0 -107
  24. package/dist/auth/identity-attributes-manager.js.map +0 -1
  25. package/dist/auth/identity-attributes.d.ts +0 -19
  26. package/dist/auth/identity-attributes.d.ts.map +0 -1
  27. package/dist/auth/identity-attributes.js +0 -170
  28. package/dist/auth/identity-attributes.js.map +0 -1
  29. package/dist/auth/index.d.ts +0 -8
  30. package/dist/auth/index.d.ts.map +0 -1
  31. package/dist/auth/index.js +0 -8
  32. package/dist/auth/index.js.map +0 -1
  33. package/dist/auth/local-ii-probe.d.ts +0 -46
  34. package/dist/auth/local-ii-probe.d.ts.map +0 -1
  35. package/dist/auth/local-ii-probe.js +0 -102
  36. package/dist/auth/local-ii-probe.js.map +0 -1
  37. package/dist/auth/types.d.ts +0 -179
  38. package/dist/auth/types.d.ts.map +0 -1
  39. package/dist/auth/types.js +0 -2
  40. package/dist/auth/types.js.map +0 -1
  41. package/dist/createActorHooks.d.ts +0 -52
  42. package/dist/createActorHooks.d.ts.map +0 -1
  43. package/dist/createActorHooks.js +0 -17
  44. package/dist/createActorHooks.js.map +0 -1
  45. package/dist/createInfiniteQuery.d.ts +0 -144
  46. package/dist/createInfiniteQuery.d.ts.map +0 -1
  47. package/dist/createInfiniteQuery.js +0 -174
  48. package/dist/createInfiniteQuery.js.map +0 -1
  49. package/dist/createMutation.d.ts +0 -30
  50. package/dist/createMutation.d.ts.map +0 -1
  51. package/dist/createMutation.js +0 -192
  52. package/dist/createMutation.js.map +0 -1
  53. package/dist/createQuery.d.ts +0 -30
  54. package/dist/createQuery.d.ts.map +0 -1
  55. package/dist/createQuery.js +0 -117
  56. package/dist/createQuery.js.map +0 -1
  57. package/dist/createSuspenseInfiniteQuery.d.ts +0 -147
  58. package/dist/createSuspenseInfiniteQuery.d.ts.map +0 -1
  59. package/dist/createSuspenseInfiniteQuery.js +0 -177
  60. package/dist/createSuspenseInfiniteQuery.js.map +0 -1
  61. package/dist/createSuspenseQuery.d.ts +0 -25
  62. package/dist/createSuspenseQuery.d.ts.map +0 -1
  63. package/dist/createSuspenseQuery.js +0 -111
  64. package/dist/createSuspenseQuery.js.map +0 -1
  65. package/dist/defineReactor.d.ts +0 -125
  66. package/dist/defineReactor.d.ts.map +0 -1
  67. package/dist/defineReactor.js +0 -180
  68. package/dist/defineReactor.js.map +0 -1
  69. package/dist/hooks/createAuthHooks.d.ts +0 -43
  70. package/dist/hooks/createAuthHooks.d.ts.map +0 -1
  71. package/dist/hooks/createAuthHooks.js +0 -131
  72. package/dist/hooks/createAuthHooks.js.map +0 -1
  73. package/dist/hooks/index.d.ts +0 -21
  74. package/dist/hooks/index.d.ts.map +0 -1
  75. package/dist/hooks/index.js +0 -24
  76. package/dist/hooks/index.js.map +0 -1
  77. package/dist/hooks/useActorInfiniteQuery.d.ts +0 -39
  78. package/dist/hooks/useActorInfiniteQuery.d.ts.map +0 -1
  79. package/dist/hooks/useActorInfiniteQuery.js +0 -56
  80. package/dist/hooks/useActorInfiniteQuery.js.map +0 -1
  81. package/dist/hooks/useActorMethod.d.ts +0 -115
  82. package/dist/hooks/useActorMethod.d.ts.map +0 -1
  83. package/dist/hooks/useActorMethod.js +0 -250
  84. package/dist/hooks/useActorMethod.js.map +0 -1
  85. package/dist/hooks/useActorMutation.d.ts +0 -48
  86. package/dist/hooks/useActorMutation.d.ts.map +0 -1
  87. package/dist/hooks/useActorMutation.js +0 -69
  88. package/dist/hooks/useActorMutation.js.map +0 -1
  89. package/dist/hooks/useActorQuery.d.ts +0 -32
  90. package/dist/hooks/useActorQuery.d.ts.map +0 -1
  91. package/dist/hooks/useActorQuery.js +0 -46
  92. package/dist/hooks/useActorQuery.js.map +0 -1
  93. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts +0 -39
  94. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts.map +0 -1
  95. package/dist/hooks/useActorSuspenseInfiniteQuery.js +0 -56
  96. package/dist/hooks/useActorSuspenseInfiniteQuery.js.map +0 -1
  97. package/dist/hooks/useActorSuspenseQuery.d.ts +0 -32
  98. package/dist/hooks/useActorSuspenseQuery.d.ts.map +0 -1
  99. package/dist/hooks/useActorSuspenseQuery.js +0 -47
  100. package/dist/hooks/useActorSuspenseQuery.js.map +0 -1
  101. package/dist/types.d.ts +0 -270
  102. package/dist/types.d.ts.map +0 -1
  103. package/dist/types.js +0 -5
  104. package/dist/types.js.map +0 -1
  105. package/dist/utils.d.ts +0 -51
  106. package/dist/utils.d.ts.map +0 -1
  107. package/dist/utils.js +0 -105
  108. package/dist/utils.js.map +0 -1
  109. package/dist/validation.d.ts +0 -131
  110. package/dist/validation.d.ts.map +0 -1
  111. package/dist/validation.js +0 -125
  112. package/dist/validation.js.map +0 -1
  113. package/src/auth/authentication-manager.ts +0 -860
  114. package/src/auth/constants.ts +0 -32
  115. package/src/auth/createIdentityAttributeHooks.ts +0 -143
  116. package/src/auth/identity-attributes-manager.ts +0 -131
  117. package/src/auth/identity-attributes.ts +0 -270
  118. package/src/auth/index.ts +0 -7
  119. package/src/auth/local-ii-probe.ts +0 -147
  120. package/src/auth/types.ts +0 -200
  121. package/src/createActorHooks.ts +0 -220
  122. package/src/createInfiniteQuery.ts +0 -578
  123. package/src/createMutation.ts +0 -341
  124. package/src/createQuery.ts +0 -237
  125. package/src/createSuspenseInfiniteQuery.ts +0 -601
  126. package/src/createSuspenseQuery.ts +0 -234
  127. package/src/defineReactor.ts +0 -324
  128. package/src/hooks/createAuthHooks.ts +0 -189
  129. package/src/hooks/index.ts +0 -103
  130. package/src/hooks/useActorInfiniteQuery.ts +0 -205
  131. package/src/hooks/useActorMethod.ts +0 -507
  132. package/src/hooks/useActorMutation.ts +0 -205
  133. package/src/hooks/useActorQuery.ts +0 -124
  134. package/src/hooks/useActorSuspenseInfiniteQuery.ts +0 -205
  135. package/src/hooks/useActorSuspenseQuery.ts +0 -132
  136. package/src/index.ts +0 -23
  137. package/src/types.ts +0 -499
  138. package/src/utils.ts +0 -121
  139. package/src/validation.ts +0 -202
@@ -1,147 +0,0 @@
1
- /**
2
- * Suspense Infinite Query Factory - Generic wrapper for React Query suspense-based paginated canister data
3
- *
4
- * Creates unified fetch/hook/invalidate 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, ReactorQueryData, 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.js";
30
- type SuspenseInfiniteFactoryCallOptions = {
31
- queryKey?: QueryKey;
32
- };
33
- type SuspenseInfiniteQueryFactoryFn<Service, Method extends FunctionName<Service>, Transform extends TransformKey, TPageParam, Selected> = {
34
- (getArgs: (pageParam: TPageParam) => ReactorArgs<Service, Method, Transform>): SuspenseInfiniteQueryResult<SuspenseInfiniteQueryPageData<Service, Method, Transform>, TPageParam, Selected, SuspenseInfiniteQueryError<Service, Method, Transform>>;
35
- (getArgs: (pageParam: TPageParam) => ReactorArgs<Service, Method, Transform>, options?: SuspenseInfiniteFactoryCallOptions): SuspenseInfiniteQueryResult<SuspenseInfiniteQueryPageData<Service, Method, Transform>, TPageParam, Selected, SuspenseInfiniteQueryError<Service, Method, Transform>>;
36
- };
37
- /** The raw page data type returned by the query function */
38
- export type SuspenseInfiniteQueryPageData<Service = BaseActor, Method extends FunctionName<Service> = FunctionName<Service>, Transform extends TransformKey = "candid"> = ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>;
39
- /** The error type for infinite queries */
40
- export type SuspenseInfiniteQueryError<Service = BaseActor, Method extends FunctionName<Service> = FunctionName<Service>, Transform extends TransformKey = "candid"> = ReactorReturnErr<Service, Method, Transform>;
41
- /**
42
- * Configuration for createActorSuspenseInfiniteQuery.
43
- * Extends InfiniteQueryObserverOptions to accept all React Query options at the create level.
44
- *
45
- * @template Service - The actor interface type
46
- * @template Method - The method name on the actor
47
- * @template Transform - The transformation key (identity, display, etc.)
48
- * @template TPageParam - The type of the page parameter
49
- * @template Selected - The type returned after select transformation
50
- */
51
- export interface SuspenseInfiniteQueryConfig<Service = BaseActor, Method extends FunctionName<Service> = FunctionName<Service>, Transform extends TransformKey = "candid", TPageParam = unknown, Selected = InfiniteData<SuspenseInfiniteQueryPageData<Service, Method, Transform>, TPageParam>> extends Omit<InfiniteQueryObserverOptions<SuspenseInfiniteQueryPageData<Service, Method, Transform>, SuspenseInfiniteQueryError<Service, Method, Transform>, Selected, QueryKey, TPageParam>, "queryKey" | "queryFn"> {
52
- /** The method to call on the canister */
53
- functionName: Method;
54
- /** Call configuration for the actor method */
55
- callConfig?: CallConfig;
56
- /** Custom query key (optional, auto-generated if not provided) */
57
- queryKey?: QueryKey;
58
- /** Function to get args from page parameter */
59
- getArgs: (pageParam: TPageParam) => ReactorArgs<Service, Method, Transform>;
60
- /**
61
- * Narrows what the cache key derives from the call arguments.
62
- *
63
- * By default the key is scoped by `getArgs(initialPageParam)`, so two
64
- * infinite queries on the same method with different arguments stay in
65
- * separate cache entries. Supply this when those args embed the cursor and
66
- * only part of them identifies the query.
67
- */
68
- getKeyArgs?: (args: ReactorArgs<Service, Method, Transform>) => unknown;
69
- }
70
- /**
71
- * Configuration for createActorSuspenseInfiniteQueryFactory (without getArgs; provided at call time).
72
- */
73
- export type SuspenseInfiniteQueryFactoryConfig<Service = BaseActor, Method extends FunctionName<Service> = FunctionName<Service>, Transform extends TransformKey = "candid", TPageParam = unknown, Selected = InfiniteData<SuspenseInfiniteQueryPageData<Service, Method, Transform>, TPageParam>> = Omit<SuspenseInfiniteQueryConfig<Service, Method, Transform, TPageParam, Selected>, "getArgs">;
74
- /**
75
- * useSuspenseInfiniteQuery hook with chained select support.
76
- */
77
- export interface UseSuspenseInfiniteQueryWithSelect<TPageData, TPageParam, Selected = InfiniteData<TPageData, TPageParam>, TError = Error> {
78
- (options?: Omit<UseSuspenseInfiniteQueryOptions<TPageData, TError, Selected, QueryKey, TPageParam>, "select" | "queryKey" | "queryFn" | "initialPageParam" | "getNextPageParam" | "getPreviousPageParam">): UseSuspenseInfiniteQueryResult<Selected, TError>;
79
- <TFinal = Selected>(options: Omit<UseSuspenseInfiniteQueryOptions<TPageData, TError, TFinal, QueryKey, TPageParam>, "queryKey" | "queryFn" | "select" | "initialPageParam" | "getNextPageParam" | "getPreviousPageParam"> & {
80
- select: (data: Selected) => TFinal;
81
- }): UseSuspenseInfiniteQueryResult<TFinal, TError>;
82
- }
83
- /**
84
- * Result from createActorSuspenseInfiniteQuery
85
- *
86
- * @template TPageData - The raw page data type
87
- * @template TPageParam - The page parameter type
88
- * @template Selected - The type after select transformation
89
- * @template TError - The error type
90
- */
91
- export interface SuspenseInfiniteQueryResult<TPageData, TPageParam, Selected = InfiniteData<TPageData, TPageParam>, TError = Error> {
92
- /** Fetch first page in loader (uses ensureInfiniteQueryData for cache-first) */
93
- fetch: () => Promise<Selected>;
94
- /** React hook for components - supports pagination */
95
- useSuspenseInfiniteQuery: UseSuspenseInfiniteQueryWithSelect<TPageData, TPageParam, Selected, TError>;
96
- /** Invalidate the cache (refetches if query is active) */
97
- invalidate: () => Promise<void>;
98
- /** Get query key (for advanced React Query usage) */
99
- getQueryKey: () => QueryKey;
100
- /**
101
- * Read data directly from cache without fetching.
102
- * Returns undefined if data is not in cache.
103
- */
104
- getCacheData: {
105
- (): Selected | undefined;
106
- <TFinal>(select: (data: Selected) => TFinal): TFinal | undefined;
107
- };
108
- }
109
- export declare function createSuspenseInfiniteQuery<Service, Transform extends TransformKey, Method extends FunctionName<Service> = FunctionName<Service>, TPageParam = unknown, Selected = InfiniteData<SuspenseInfiniteQueryPageData<Service, Method, Transform>, TPageParam>>(reactor: Reactor<Service, Transform>, config: SuspenseInfiniteQueryConfig<NoInfer<Service>, Method, Transform, TPageParam, Selected>): SuspenseInfiniteQueryResult<SuspenseInfiniteQueryPageData<Service, Method, Transform>, TPageParam, Selected, SuspenseInfiniteQueryError<Service, Method, Transform>>;
110
- /**
111
- * Create a suspense infinite query factory that accepts getArgs at call time.
112
- * Useful when pagination logic varies by context.
113
- *
114
- * @template Service - The actor interface type
115
- * @template Method - The method name on the actor
116
- * @template Transform - The transformation key (identity, display, etc.)
117
- * @template TPageParam - The page parameter type
118
- * @template Selected - The type returned after select transformation
119
- *
120
- * @param reactor - The Reactor instance
121
- * @param config - Suspense infinite query configuration (without getArgs)
122
- * @returns A function that accepts getArgs and returns an SuspenseActorInfiniteQueryResult
123
- *
124
- * @example
125
- * const getPostsQuery = createActorSuspenseInfiniteQueryFactory(reactor, {
126
- * functionName: "get_posts",
127
- * initialPageParam: 0,
128
- * getKeyArgs: (args) => {
129
- * const [{ userId }] = args
130
- * return [{ userId }]
131
- * },
132
- * getNextPageParam: (lastPage) => lastPage.nextCursor,
133
- * })
134
- *
135
- * // Create query with specific args builder
136
- * const userPostsQuery = getPostsQuery((cursor) => [{ userId, cursor, limit: 10 }])
137
- * const { data, fetchNextPage } = userPostsQuery.useSuspenseInfiniteQuery()
138
- *
139
- * // Optional: append a manual query-key suffix in addition to auto key args
140
- * const scopedPostsQuery = getPostsQuery(
141
- * (cursor) => [{ userId, cursor, limit: 10 }],
142
- * { queryKey: ["v2"] }
143
- * )
144
- */
145
- export declare function createSuspenseInfiniteQueryFactory<Service, Transform extends TransformKey, Method extends FunctionName<Service> = FunctionName<Service>, TPageParam = unknown, Selected = InfiniteData<SuspenseInfiniteQueryPageData<Service, Method, Transform>, TPageParam>>(reactor: Reactor<Service, Transform>, config: SuspenseInfiniteQueryFactoryConfig<NoInfer<Service>, Method, Transform, TPageParam, Selected>): SuspenseInfiniteQueryFactoryFn<Service, Method, Transform, TPageParam, Selected>;
146
- export {};
147
- //# sourceMappingURL=createSuspenseInfiniteQuery.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createSuspenseInfiniteQuery.d.ts","sourceRoot":"","sources":["../src/createSuspenseInfiniteQuery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,WAAW,EACX,SAAS,EACT,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,QAAQ,EAER,YAAY,EACZ,8BAA8B,EAC9B,+BAA+B,EAG/B,4BAA4B,EAC7B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAOpC,KAAK,kCAAkC,GAAG;IACxC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB,CAAA;AAED,KAAK,8BAA8B,CACjC,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,EAC9B,UAAU,EACV,QAAQ,IACN;IACF,CACE,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,GAC1E,2BAA2B,CAC5B,6BAA6B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACzD,UAAU,EACV,QAAQ,EACR,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CACvD,CAAA;IACD,CACE,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAC3E,OAAO,CAAC,EAAE,kCAAkC,GAC3C,2BAA2B,CAC5B,6BAA6B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACzD,UAAU,EACV,QAAQ,EACR,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CACvD,CAAA;CACF,CAAA;AAMD,4DAA4D;AAC5D,MAAM,MAAM,6BAA6B,CACvC,OAAO,GAAG,SAAS,EACnB,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,EAC5D,SAAS,SAAS,YAAY,GAAG,QAAQ,IACvC,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;AAEjE,0CAA0C;AAC1C,MAAM,MAAM,0BAA0B,CACpC,OAAO,GAAG,SAAS,EACnB,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,EAC5D,SAAS,SAAS,YAAY,GAAG,QAAQ,IACvC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;AAMhD;;;;;;;;;GASG;AACH,MAAM,WAAW,2BAA2B,CAC1C,OAAO,GAAG,SAAS,EACnB,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,EAC5D,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,UAAU,GAAG,OAAO,EACpB,QAAQ,GAAG,YAAY,CACrB,6BAA6B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACzD,UAAU,CACX,CACD,SAAQ,IAAI,CACZ,4BAA4B,CAC1B,6BAA6B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACzD,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACtD,QAAQ,EACR,QAAQ,EACR,UAAU,CACX,EACD,UAAU,GAAG,SAAS,CACvB;IACC,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAA;IACpB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,+CAA+C;IAC/C,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;IAC3E;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,OAAO,CAAA;CACxE;AAED;;GAEG;AACH,MAAM,MAAM,kCAAkC,CAC5C,OAAO,GAAG,SAAS,EACnB,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,EAC5D,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,UAAU,GAAG,OAAO,EACpB,QAAQ,GAAG,YAAY,CACrB,6BAA6B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACzD,UAAU,CACX,IACC,IAAI,CAGN,2BAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,EAC7E,SAAS,CACV,CAAA;AAMD;;GAEG;AACH,MAAM,WAAW,kCAAkC,CACjD,SAAS,EACT,UAAU,EACV,QAAQ,GAAG,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,EAC9C,MAAM,GAAG,KAAK;IAGd,CACE,OAAO,CAAC,EAAE,IAAI,CACZ,+BAA+B,CAC7B,SAAS,EACT,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,UAAU,CACX,EACC,QAAQ,GACR,UAAU,GACV,SAAS,GACT,kBAAkB,GAClB,kBAAkB,GAClB,sBAAsB,CACzB,GACA,8BAA8B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAGnD,CAAC,MAAM,GAAG,QAAQ,EAChB,OAAO,EAAE,IAAI,CACX,+BAA+B,CAC7B,SAAS,EACT,MAAM,EACN,MAAM,EACN,QAAQ,EACR,UAAU,CACX,EACC,UAAU,GACV,SAAS,GACT,QAAQ,GACR,kBAAkB,GAClB,kBAAkB,GAClB,sBAAsB,CACzB,GAAG;QACF,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,CAAA;KACnC,GACA,8BAA8B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClD;AAMD;;;;;;;GAOG;AACH,MAAM,WAAW,2BAA2B,CAC1C,SAAS,EACT,UAAU,EACV,QAAQ,GAAG,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,EAC9C,MAAM,GAAG,KAAK;IAEd,gFAAgF;IAChF,KAAK,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAA;IAE9B,sDAAsD;IACtD,wBAAwB,EAAE,kCAAkC,CAC1D,SAAS,EACT,UAAU,EACV,QAAQ,EACR,MAAM,CACP,CAAA;IAED,0DAA0D;IAC1D,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAE/B,qDAAqD;IACrD,WAAW,EAAE,MAAM,QAAQ,CAAA;IAE3B;;;OAGG;IACH,YAAY,EAAE;QACZ,IAAI,QAAQ,GAAG,SAAS,CAAA;QACxB,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;KACjE,CAAA;CACF;AAuLD,wBAAgB,2BAA2B,CACzC,OAAO,EACP,SAAS,SAAS,YAAY,EAC9B,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,EAC5D,UAAU,GAAG,OAAO,EACpB,QAAQ,GAAG,YAAY,CACrB,6BAA6B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACzD,UAAU,CACX,EAED,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EACpC,MAAM,EAAE,2BAA2B,CACjC,OAAO,CAAC,OAAO,CAAC,EAChB,MAAM,EACN,SAAS,EACT,UAAU,EACV,QAAQ,CACT,GACA,2BAA2B,CAC5B,6BAA6B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACzD,UAAU,EACV,QAAQ,EACR,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CACvD,CAWA;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,wBAAgB,kCAAkC,CAChD,OAAO,EACP,SAAS,SAAS,YAAY,EAC9B,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,EAC5D,UAAU,GAAG,OAAO,EACpB,QAAQ,GAAG,YAAY,CACrB,6BAA6B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACzD,UAAU,CACX,EAED,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EACpC,MAAM,EAAE,kCAAkC,CACxC,OAAO,CAAC,OAAO,CAAC,EAChB,MAAM,EACN,SAAS,EACT,UAAU,EACV,QAAQ,CACT,GACA,8BAA8B,CAC/B,OAAO,EACP,MAAM,EACN,SAAS,EACT,UAAU,EACV,QAAQ,CACT,CA8CA"}
@@ -1,177 +0,0 @@
1
- /**
2
- * Suspense Infinite Query Factory - Generic wrapper for React Query suspense-based paginated canister data
3
- *
4
- * Creates unified fetch/hook/invalidate 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 { useMemo } from "react";
27
- import { useSuspenseInfiniteQuery, } from "@tanstack/react-query";
28
- import { buildChainedSelect, mergeFactoryQueryKey, normalizeQueryData, } from "./utils.js";
29
- // ============================================================================
30
- // Internal Implementation
31
- // ============================================================================
32
- const createSuspenseInfiniteQueryImpl = (reactor, config) => {
33
- const { functionName, callConfig, queryKey: customQueryKey, initialPageParam, getArgs, getKeyArgs, getNextPageParam, getPreviousPageParam, maxPages, staleTime = 5 * 60 * 1000, select, ...rest } = config;
34
- // Fold the call arguments into the key — see the matching comment in
35
- // createInfiniteQuery. Without them every infinite query on a method shares
36
- // one cache entry, because the arguments live in a `getArgs` closure rather
37
- // than in the config.
38
- const getQueryKey = () => {
39
- const initialArgs = getArgs(initialPageParam);
40
- const keyArgs = getKeyArgs?.(initialArgs) ?? initialArgs;
41
- return reactor.generateQueryKey({
42
- functionName,
43
- queryKey: mergeFactoryQueryKey(customQueryKey, undefined, keyArgs),
44
- }, callConfig);
45
- };
46
- // Query function - accepts QueryFunctionContext
47
- const queryFn = async (context) => {
48
- // pageParam is typed as unknown in QueryFunctionContext, but we know its type
49
- const pageParam = context.pageParam;
50
- const args = getArgs(pageParam);
51
- const result = await reactor.callMethod({
52
- functionName,
53
- args,
54
- callConfig,
55
- });
56
- return normalizeQueryData(result);
57
- };
58
- // Get infinite query options for fetchInfiniteQuery
59
- const getInfiniteQueryOptions = () => ({
60
- queryKey: getQueryKey(),
61
- queryFn,
62
- initialPageParam,
63
- getNextPageParam,
64
- staleTime,
65
- });
66
- // Fetch function for loaders (cache-first, fetches first page)
67
- const fetch = async () => {
68
- // Use ensureInfiniteQueryData to get cached data or fetch if stale
69
- const result = await reactor.queryClient.ensureInfiniteQueryData(getInfiniteQueryOptions());
70
- // Result is already InfiniteData format
71
- return select ? select(result) : result;
72
- };
73
- // Implementation
74
- const useSuspenseInfiniteQueryHook = (options) => {
75
- // Memoized and identity-preserving; see buildChainedSelect for why the
76
- // function identity matters to the observer's select-result cache.
77
- const chainedSelect = useMemo(() => buildChainedSelect(select, options?.select), [options?.select]);
78
- return useSuspenseInfiniteQuery({
79
- queryKey: getQueryKey(),
80
- queryFn,
81
- initialPageParam,
82
- getNextPageParam,
83
- getPreviousPageParam,
84
- maxPages,
85
- staleTime,
86
- ...rest,
87
- ...options,
88
- select: chainedSelect,
89
- }, reactor.queryClient);
90
- };
91
- // Invalidate function
92
- const invalidate = async () => {
93
- const queryKey = getQueryKey();
94
- await reactor.queryClient.invalidateQueries({ queryKey });
95
- };
96
- // Get data from cache without fetching
97
- const getCacheData = (selectFn) => {
98
- const queryKey = getQueryKey();
99
- const cachedRawData = reactor.queryClient.getQueryData(queryKey);
100
- if (cachedRawData === undefined) {
101
- return undefined;
102
- }
103
- // Apply config.select to raw cache data
104
- const selectedData = (select ? select(cachedRawData) : cachedRawData);
105
- // Apply optional select parameter
106
- if (selectFn) {
107
- return selectFn(selectedData);
108
- }
109
- return selectedData;
110
- };
111
- return {
112
- fetch,
113
- useSuspenseInfiniteQuery: useSuspenseInfiniteQueryHook,
114
- invalidate,
115
- getQueryKey,
116
- getCacheData,
117
- };
118
- };
119
- // ============================================================================
120
- // Factory Function
121
- // ============================================================================
122
- export function createSuspenseInfiniteQuery(reactor, config) {
123
- return createSuspenseInfiniteQueryImpl(reactor, config);
124
- }
125
- // ============================================================================
126
- // Factory with Dynamic Args
127
- // ============================================================================
128
- /**
129
- * Create a suspense infinite query factory that accepts getArgs at call time.
130
- * Useful when pagination logic varies by context.
131
- *
132
- * @template Service - The actor interface type
133
- * @template Method - The method name on the actor
134
- * @template Transform - The transformation key (identity, display, etc.)
135
- * @template TPageParam - The page parameter type
136
- * @template Selected - The type returned after select transformation
137
- *
138
- * @param reactor - The Reactor instance
139
- * @param config - Suspense infinite query configuration (without getArgs)
140
- * @returns A function that accepts getArgs and returns an SuspenseActorInfiniteQueryResult
141
- *
142
- * @example
143
- * const getPostsQuery = createActorSuspenseInfiniteQueryFactory(reactor, {
144
- * functionName: "get_posts",
145
- * initialPageParam: 0,
146
- * getKeyArgs: (args) => {
147
- * const [{ userId }] = args
148
- * return [{ userId }]
149
- * },
150
- * getNextPageParam: (lastPage) => lastPage.nextCursor,
151
- * })
152
- *
153
- * // Create query with specific args builder
154
- * const userPostsQuery = getPostsQuery((cursor) => [{ userId, cursor, limit: 10 }])
155
- * const { data, fetchNextPage } = userPostsQuery.useSuspenseInfiniteQuery()
156
- *
157
- * // Optional: append a manual query-key suffix in addition to auto key args
158
- * const scopedPostsQuery = getPostsQuery(
159
- * (cursor) => [{ userId, cursor, limit: 10 }],
160
- * { queryKey: ["v2"] }
161
- * )
162
- */
163
- export function createSuspenseInfiniteQueryFactory(reactor, config) {
164
- const factory = (getArgs, options) => {
165
- // Only the caller-supplied segments are merged here; the args-derived
166
- // segment is added by the impl, which does it for every infinite query.
167
- // Applying it in both places would append the args twice.
168
- const queryKey = mergeFactoryQueryKey(config.queryKey, options?.queryKey, undefined);
169
- return createSuspenseInfiniteQueryImpl(reactor, {
170
- ...config,
171
- queryKey,
172
- getArgs,
173
- });
174
- };
175
- return factory;
176
- }
177
- //# sourceMappingURL=createSuspenseInfiniteQuery.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createSuspenseInfiniteQuery.js","sourceRoot":"","sources":["../src/createSuspenseInfiniteQuery.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- /**
2
- * Suspense Query Factory - Generic wrapper for React Suspense-based canister data
3
- *
4
- * Creates unified fetch/hook/invalidate functions for any canister method.
5
- * Works with any Reactor instance.
6
- *
7
- * Uses `useSuspenseQuery` which:
8
- * - Requires wrapping in <Suspense> boundary
9
- * - Data is always defined (no undefined checks)
10
- * - Does NOT support `enabled` option
11
- *
12
- * @example
13
- * const userQuery = createSuspenseQuery(todoManager, {
14
- * functionName: "get_user",
15
- * select: (result) => result.user,
16
- * })
17
- *
18
- * // In component (wrap in Suspense)
19
- * const { data: user } = userQuery.useSuspenseQuery() // data is never undefined!
20
- */
21
- import type { Reactor, FunctionName, ReactorArgs, TransformKey } from "@ic-reactor/core";
22
- import type { QueryFnData, QueryError, SuspenseQueryConfig, SuspenseQueryResult, SuspenseQueryFactoryConfig, NoInfer } from "./types.js";
23
- export declare function createSuspenseQuery<Service, Transform extends TransformKey, Method extends FunctionName<Service> = FunctionName<Service>, Selected = QueryFnData<Service, Method, Transform>>(reactor: Reactor<Service, Transform>, config: SuspenseQueryConfig<NoInfer<Service>, Method, Transform, Selected>): SuspenseQueryResult<QueryFnData<Service, Method, Transform>, Selected, QueryError<Service, Method, Transform>>;
24
- export declare function createSuspenseQueryFactory<Service, Transform extends TransformKey, Method extends FunctionName<Service> = FunctionName<Service>, Selected = QueryFnData<Service, Method, Transform>>(reactor: Reactor<Service, Transform>, config: SuspenseQueryFactoryConfig<NoInfer<Service>, Method, Transform, Selected>): (args: ReactorArgs<Service, Method, Transform>) => SuspenseQueryResult<QueryFnData<Service, Method, Transform>, Selected, QueryError<Service, Method, Transform>>;
25
- //# sourceMappingURL=createSuspenseQuery.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createSuspenseQuery.d.ts","sourceRoot":"","sources":["../src/createSuspenseQuery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,WAAW,EACX,YAAY,EACb,MAAM,kBAAkB,CAAA;AAGzB,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,mBAAmB,EAEnB,mBAAmB,EACnB,0BAA0B,EAC1B,OAAO,EACR,MAAM,YAAY,CAAA;AAqHnB,wBAAgB,mBAAmB,CACjC,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,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,GACzE,mBAAmB,CACpB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACvC,QAAQ,EACR,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CACvC,CAKA;AAMD,wBAAgB,0BAA0B,CACxC,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,0BAA0B,CAChC,OAAO,CAAC,OAAO,CAAC,EAChB,MAAM,EACN,SAAS,EACT,QAAQ,CACT,GACA,CACD,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,KAC1C,mBAAmB,CACtB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACvC,QAAQ,EACR,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CACvC,CAqCA"}
@@ -1,111 +0,0 @@
1
- /**
2
- * Suspense Query Factory - Generic wrapper for React Suspense-based canister data
3
- *
4
- * Creates unified fetch/hook/invalidate functions for any canister method.
5
- * Works with any Reactor instance.
6
- *
7
- * Uses `useSuspenseQuery` which:
8
- * - Requires wrapping in <Suspense> boundary
9
- * - Data is always defined (no undefined checks)
10
- * - Does NOT support `enabled` option
11
- *
12
- * @example
13
- * const userQuery = createSuspenseQuery(todoManager, {
14
- * functionName: "get_user",
15
- * select: (result) => result.user,
16
- * })
17
- *
18
- * // In component (wrap in Suspense)
19
- * const { data: user } = userQuery.useSuspenseQuery() // data is never undefined!
20
- */
21
- import { useMemo } from "react";
22
- import { useSuspenseQuery } from "@tanstack/react-query";
23
- import { buildChainedSelect, createBoundedCache } from "./utils.js";
24
- // ============================================================================
25
- // Internal Implementation
26
- // ============================================================================
27
- const createSuspenseQueryImpl = (reactor, config) => {
28
- const { functionName, args, staleTime = 5 * 60 * 1000, select, queryKey: customQueryKey, ...rest } = config;
29
- const params = { functionName, args, queryKey: customQueryKey };
30
- const getQueryKey = () => reactor.generateQueryKey(params);
31
- const applySelect = (raw) => select ? select(raw) : raw;
32
- /** Cache-first fetch for use in loaders / route preloading. */
33
- const fetch = async () => {
34
- const result = await reactor.fetchQuery(params);
35
- return applySelect(result);
36
- };
37
- /** Fire-and-forget prefetch — warms the cache without blocking. */
38
- const prefetch = () => {
39
- const baseOptions = reactor.getQueryOptions(params);
40
- return reactor.queryClient.prefetchQuery({
41
- queryKey: baseOptions.queryKey,
42
- queryFn: baseOptions.queryFn,
43
- staleTime,
44
- });
45
- };
46
- const useSuspenseQueryHook = (options) => {
47
- const baseOptions = reactor.getQueryOptions(params);
48
- // Memoized so the observer's select-result cache can hit; see
49
- // buildChainedSelect. `select` comes from the factory config and is stable.
50
- const chainedSelect = useMemo(() => buildChainedSelect(select, options?.select), [options?.select]);
51
- return useSuspenseQuery({
52
- queryKey: baseOptions.queryKey,
53
- staleTime,
54
- ...rest,
55
- ...options,
56
- queryFn: baseOptions.queryFn,
57
- select: chainedSelect,
58
- }, reactor.queryClient);
59
- };
60
- const invalidate = async () => {
61
- await reactor.queryClient.invalidateQueries({ queryKey: getQueryKey() });
62
- };
63
- const getCacheData = (selectFn) => {
64
- const raw = reactor.getQueryData(params);
65
- if (raw === undefined)
66
- return undefined;
67
- const selected = applySelect(raw);
68
- return selectFn ? selectFn(selected) : selected;
69
- };
70
- const setData = (updater) => {
71
- return reactor.queryClient.setQueryData(getQueryKey(), updater);
72
- };
73
- return {
74
- fetch,
75
- prefetch,
76
- useSuspenseQuery: useSuspenseQueryHook,
77
- invalidate,
78
- getQueryKey,
79
- getCacheData,
80
- setData,
81
- };
82
- };
83
- // ============================================================================
84
- // Public Factory Function
85
- // ============================================================================
86
- export function createSuspenseQuery(reactor, config) {
87
- return createSuspenseQueryImpl(reactor, config);
88
- }
89
- // ============================================================================
90
- // Convenience: Create suspense query with dynamic args
91
- // ============================================================================
92
- export function createSuspenseQueryFactory(reactor, config) {
93
- const cache = createBoundedCache();
94
- return (args) => {
95
- const key = reactor.generateQueryKey({
96
- functionName: config.functionName,
97
- args,
98
- });
99
- const cacheKey = JSON.stringify(key);
100
- const existing = cache.get(cacheKey);
101
- if (existing)
102
- return existing;
103
- const result = createSuspenseQueryImpl(reactor, {
104
- ...config,
105
- args,
106
- });
107
- cache.set(cacheKey, result);
108
- return result;
109
- };
110
- }
111
- //# sourceMappingURL=createSuspenseQuery.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createSuspenseQuery.js","sourceRoot":"","sources":["../src/createSuspenseQuery.ts"],"names":[],"mappings":"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"}
@@ -1,125 +0,0 @@
1
- /**
2
- * defineReactor - One-call bootstrap for a canister reactor + its React hooks.
3
- *
4
- * Collapses the four manual steps (QueryClient → ClientManager → Reactor →
5
- * createActorHooks) into a single call, and turns the Reactor / DisplayReactor
6
- * choice into a `display` flag.
7
- * Use this when one-call bootstrap is enough. If you need reusable
8
- * method-specific operations outside React, compose with query/mutation
9
- * factories after setup.
10
- *
11
- * @example
12
- * ```typescript
13
- * import { defineReactor } from "@ic-reactor/react"
14
- * import { idlFactory, type _SERVICE } from "./declarations/backend"
15
- *
16
- * const { reactor, useActorQuery, useActorMutation } = defineReactor<_SERVICE>({
17
- * name: "backend",
18
- * idlFactory,
19
- * canisterId: "rrkah-fqaaa-aaaaa-aaaaq-cai",
20
- * display: true, // ⇒ DisplayReactor (string principals/bigints)
21
- * })
22
- *
23
- * function Profile() {
24
- * const { data } = useActorQuery({ functionName: "get_profile" })
25
- * return <div>{data?.name}</div>
26
- * }
27
- * ```
28
- *
29
- * @example Reuse an existing ClientManager (multiple canisters share one agent)
30
- * ```typescript
31
- * const ledger = defineReactor<_LEDGER>({ name: "ledger", idlFactory: ledgerIdl })
32
- * const index = defineReactor<_INDEX>({
33
- * name: "index",
34
- * idlFactory: indexIdl,
35
- * clientManager: ledger.clientManager,
36
- * authentication: ledger.authentication, // one Internet Identity session
37
- * })
38
- * ```
39
- *
40
- * @example Internet Identity is wired up out of the box
41
- * ```typescript
42
- * const { useAuth, useIdentityAttributes } = defineReactor<_SERVICE>({
43
- * name: "backend",
44
- * idlFactory,
45
- * // Needed when the app is served from more than one origin.
46
- * auth: { derivationOrigin: "https://app.example.com" },
47
- * })
48
- *
49
- * function LoginButton() {
50
- * const { login, logout, isAuthenticated, principal } = useAuth()
51
- * return isAuthenticated
52
- * ? <button onClick={() => logout()}>{principal?.toText()}</button>
53
- * : <button onClick={() => login()}>Sign in</button>
54
- * }
55
- * ```
56
- */
57
- import { ClientManager, Reactor, DisplayReactor } from "@ic-reactor/core";
58
- import type { BaseActor, TransformKey, ReactorParameters, ClientManagerParameters, DisplayReactorParameters } from "@ic-reactor/core";
59
- import { QueryClient } from "@tanstack/react-query";
60
- import { ActorHooks } from "./createActorHooks.js";
61
- import { AuthenticationManager } from "./auth/authentication-manager.js";
62
- import { IdentityAttributesManager } from "./auth/identity-attributes-manager.js";
63
- import type { UseIdentityAttributesReturn } from "./auth/createIdentityAttributeHooks.js";
64
- import type { CreateAuthHooksReturn } from "./hooks/createAuthHooks.js";
65
- import type { AuthenticationManagerParameters } from "./auth/authentication-manager.js";
66
- /** Options shared by both the standard and display variants of defineReactor. */
67
- export interface DefineReactorSharedParameters extends Omit<ReactorParameters, "clientManager">, Omit<ClientManagerParameters, "queryClient"> {
68
- /**
69
- * Reuse an existing ClientManager (e.g. to share one agent across canisters).
70
- * When omitted, a ClientManager is created from the agent options below.
71
- *
72
- * A supplied or adopted manager brings its own agent and QueryClient, so
73
- * `agentOptions`, `queryClient` and `allowEnvConfig` apply only when this
74
- * call creates one.
75
- */
76
- clientManager?: ClientManager;
77
- /**
78
- * QueryClient for a ClientManager created by this call.
79
- *
80
- * Ignored when `clientManager` or `authentication` is supplied — queries run
81
- * against that manager's own QueryClient, which is what is returned.
82
- */
83
- queryClient?: QueryClient;
84
- /**
85
- * Reuse an existing AuthenticationManager, so several reactors share one
86
- * Internet Identity session. When omitted, one is created for this reactor.
87
- *
88
- * Its `clientManager` is adopted for this reactor, so sign-in updates the
89
- * same agent the reactor calls through. Supplying a different `clientManager`
90
- * alongside it is rejected.
91
- */
92
- authentication?: AuthenticationManager;
93
- /**
94
- * Internet Identity options forwarded to the AuthenticationManager
95
- * (`identityProvider`, `derivationOrigin`, `idleOptions`, `storage`, …).
96
- *
97
- * Mutually exclusive with `authentication`: a manager built elsewhere is
98
- * already configured, so these could not be applied to it.
99
- */
100
- auth?: Omit<AuthenticationManagerParameters, "clientManager">;
101
- }
102
- /** Parameters for a standard (raw Candid types) reactor. */
103
- export interface DefineReactorParameters extends DefineReactorSharedParameters {
104
- display?: false;
105
- }
106
- /** Parameters for a DisplayReactor (UI-friendly string principals/bigints). */
107
- export interface DefineDisplayReactorParameters<Service> extends DefineReactorSharedParameters {
108
- display: true;
109
- /** Optional initial argument validators (receive display types). */
110
- validators?: DisplayReactorParameters<Service>["validators"];
111
- }
112
- /** The reactor instance plus its bound hooks and shared infrastructure. */
113
- export type DefineReactorResult<Service, Transform extends TransformKey, R extends Reactor<Service, Transform>> = ActorHooks<Service, Transform> & CreateAuthHooksReturn & {
114
- reactor: R;
115
- clientManager: ClientManager;
116
- queryClient: QueryClient;
117
- /** Internet Identity session manager backing `useAuth`. */
118
- authentication: AuthenticationManager;
119
- /** Signed identity attribute requests backing `useIdentityAttributes`. */
120
- identityAttributes: IdentityAttributesManager;
121
- useIdentityAttributes: () => UseIdentityAttributesReturn;
122
- };
123
- export declare function defineReactor<Service = BaseActor>(params: DefineDisplayReactorParameters<Service>): DefineReactorResult<Service, "display", DisplayReactor<Service>>;
124
- export declare function defineReactor<Service = BaseActor>(params: DefineReactorParameters): DefineReactorResult<Service, "candid", Reactor<Service, "candid">>;
125
- //# sourceMappingURL=defineReactor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"defineReactor.d.ts","sourceRoot":"","sources":["../src/defineReactor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,OAAO,EACL,aAAa,EACb,OAAO,EACP,cAAc,EAEf,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAoB,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAA;AAEjF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,wCAAwC,CAAA;AAEzF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AACvE,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,kCAAkC,CAAA;AAEvF,iFAAiF;AACjF,MAAM,WAAW,6BACf,SACE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,EACxC,IAAI,CAAC,uBAAuB,EAAE,aAAa,CAAC;IAC9C;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,qBAAqB,CAAA;IACtC;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC,+BAA+B,EAAE,eAAe,CAAC,CAAA;CAC9D;AAED,4DAA4D;AAC5D,MAAM,WAAW,uBAAwB,SAAQ,6BAA6B;IAC5E,OAAO,CAAC,EAAE,KAAK,CAAA;CAChB;AAED,+EAA+E;AAC/E,MAAM,WAAW,8BAA8B,CAC7C,OAAO,CACP,SAAQ,6BAA6B;IACrC,OAAO,EAAE,IAAI,CAAA;IACb,oEAAoE;IACpE,UAAU,CAAC,EAAE,wBAAwB,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAA;CAC7D;AAED,2EAA2E;AAC3E,MAAM,MAAM,mBAAmB,CAC7B,OAAO,EACP,SAAS,SAAS,YAAY,EAC9B,CAAC,SAAS,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,IACnC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,GAChC,qBAAqB,GAAG;IACtB,OAAO,EAAE,CAAC,CAAA;IACV,aAAa,EAAE,aAAa,CAAA;IAC5B,WAAW,EAAE,WAAW,CAAA;IACxB,2DAA2D;IAC3D,cAAc,EAAE,qBAAqB,CAAA;IACrC,0EAA0E;IAC1E,kBAAkB,EAAE,yBAAyB,CAAA;IAC7C,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;CACzD,CAAA;AAmBH,wBAAgB,aAAa,CAAC,OAAO,GAAG,SAAS,EAC/C,MAAM,EAAE,8BAA8B,CAAC,OAAO,CAAC,GAC9C,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;AAEnE,wBAAgB,aAAa,CAAC,OAAO,GAAG,SAAS,EAC/C,MAAM,EAAE,uBAAuB,GAC9B,mBAAmB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA"}