@pyreon/query 0.0.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.
@@ -0,0 +1,298 @@
1
+ import { CancelledError, DefaultError, DehydratedState, FetchQueryOptions, InfiniteData, InfiniteQueryObserverOptions, InfiniteQueryObserverResult, InvalidateOptions, InvalidateQueryFilters, MutateFunction, MutationCache, MutationFilters, MutationFilters as MutationFilters$1, MutationObserverOptions, MutationObserverResult, QueryCache, QueryClient, QueryClient as QueryClient$1, QueryClientConfig, QueryFilters, QueryFilters as QueryFilters$1, QueryKey, QueryKey as QueryKey$1, QueryObserverOptions, QueryObserverResult, RefetchOptions, RefetchQueryFilters, defaultShouldDehydrateMutation, defaultShouldDehydrateQuery, dehydrate, hashKey, hydrate, isCancelledError, keepPreviousData } from "@tanstack/query-core";
2
+ import * as _pyreon_core0 from "@pyreon/core";
3
+ import { Props, VNode, VNodeChild } from "@pyreon/core";
4
+ import { Signal } from "@pyreon/reactivity";
5
+
6
+ //#region src/query-client.d.ts
7
+ interface QueryClientProviderProps extends Props {
8
+ client: QueryClient$1;
9
+ children?: VNodeChild;
10
+ }
11
+ declare const QueryClientContext: _pyreon_core0.Context<QueryClient$1 | null>;
12
+ /**
13
+ * Provides a QueryClient to all descendant components via context.
14
+ * Wrap your app root with this to enable useQuery / useMutation throughout the tree.
15
+ *
16
+ * @example
17
+ * const client = new QueryClient()
18
+ * mount(h(QueryClientProvider, { client }, h(App, null)), el)
19
+ */
20
+ declare function QueryClientProvider(props: QueryClientProviderProps): VNode;
21
+ /**
22
+ * Returns the nearest QueryClient provided by <QueryClientProvider>.
23
+ * Throws if called outside of one.
24
+ */
25
+ declare function useQueryClient(): QueryClient$1;
26
+ //#endregion
27
+ //#region src/use-query.d.ts
28
+ interface UseQueryResult<TData, TError = DefaultError> {
29
+ /** Raw signal — the full observer result. Fine-grained accessors below are preferred. */
30
+ result: Signal<QueryObserverResult<TData, TError>>;
31
+ data: Signal<TData | undefined>;
32
+ error: Signal<TError | null>;
33
+ status: Signal<'pending' | 'error' | 'success'>;
34
+ isPending: Signal<boolean>;
35
+ isLoading: Signal<boolean>;
36
+ isFetching: Signal<boolean>;
37
+ isError: Signal<boolean>;
38
+ isSuccess: Signal<boolean>;
39
+ /** Manually trigger a refetch. */
40
+ refetch: () => Promise<QueryObserverResult<TData, TError>>;
41
+ }
42
+ /**
43
+ * Subscribe to a query. Returns fine-grained reactive signals for data,
44
+ * error and status — each signal only notifies effects that depend on it.
45
+ *
46
+ * `options` is a function so it can read Pyreon signals — when a signal changes
47
+ * (e.g. a reactive query key), the observer is updated and refetches automatically.
48
+ *
49
+ * @example
50
+ * const userId = signal(1)
51
+ * const query = useQuery(() => ({
52
+ * queryKey: ['user', userId()],
53
+ * queryFn: () => fetch(`/api/users/${userId()}`).then(r => r.json()),
54
+ * }))
55
+ * // In template: () => query.data()?.name
56
+ */
57
+ declare function useQuery<TData = unknown, TError = DefaultError, TKey extends QueryKey$1 = QueryKey$1>(options: () => QueryObserverOptions<TData, TError, TData, TData, TKey>): UseQueryResult<TData, TError>;
58
+ //#endregion
59
+ //#region src/use-mutation.d.ts
60
+ interface UseMutationResult<TData, TError = DefaultError, TVariables = void, TContext = unknown> {
61
+ /** Raw signal — full observer result. Fine-grained accessors below are preferred. */
62
+ result: Signal<MutationObserverResult<TData, TError, TVariables, TContext>>;
63
+ data: Signal<TData | undefined>;
64
+ error: Signal<TError | null>;
65
+ status: Signal<'idle' | 'pending' | 'success' | 'error'>;
66
+ isPending: Signal<boolean>;
67
+ isSuccess: Signal<boolean>;
68
+ isError: Signal<boolean>;
69
+ isIdle: Signal<boolean>;
70
+ /** Fire the mutation (fire-and-forget). Errors are captured in the error signal. */
71
+ mutate: (variables: TVariables, options?: Parameters<MutateFunction<TData, TError, TVariables, TContext>>[1]) => void;
72
+ /** Like mutate but returns a promise — use for try/catch error handling. */
73
+ mutateAsync: MutateFunction<TData, TError, TVariables, TContext>;
74
+ /** Reset the mutation state back to idle. */
75
+ reset: () => void;
76
+ }
77
+ /**
78
+ * Run a mutation (create / update / delete). Returns reactive signals for
79
+ * pending / success / error state plus `mutate` and `mutateAsync` functions.
80
+ *
81
+ * @example
82
+ * const mutation = useMutation({
83
+ * mutationFn: (data: CreatePostInput) =>
84
+ * fetch('/api/posts', { method: 'POST', body: JSON.stringify(data) }).then(r => r.json()),
85
+ * onSuccess: () => client.invalidateQueries({ queryKey: ['posts'] }),
86
+ * })
87
+ * // h('button', { onClick: () => mutation.mutate({ title: 'New' }) }, 'Create')
88
+ */
89
+ declare function useMutation<TData = unknown, TError = DefaultError, TVariables = void, TContext = unknown>(options: MutationObserverOptions<TData, TError, TVariables, TContext>): UseMutationResult<TData, TError, TVariables, TContext>;
90
+ //#endregion
91
+ //#region src/use-infinite-query.d.ts
92
+ interface UseInfiniteQueryResult<TQueryFnData, TError = DefaultError> {
93
+ /** Raw signal — full observer result. */
94
+ result: Signal<InfiniteQueryObserverResult<InfiniteData<TQueryFnData>, TError>>;
95
+ data: Signal<InfiniteData<TQueryFnData> | undefined>;
96
+ error: Signal<TError | null>;
97
+ status: Signal<'pending' | 'error' | 'success'>;
98
+ isPending: Signal<boolean>;
99
+ isLoading: Signal<boolean>;
100
+ isFetching: Signal<boolean>;
101
+ isFetchingNextPage: Signal<boolean>;
102
+ isFetchingPreviousPage: Signal<boolean>;
103
+ isError: Signal<boolean>;
104
+ isSuccess: Signal<boolean>;
105
+ hasNextPage: Signal<boolean>;
106
+ hasPreviousPage: Signal<boolean>;
107
+ fetchNextPage: () => Promise<InfiniteQueryObserverResult<InfiniteData<TQueryFnData>, TError>>;
108
+ fetchPreviousPage: () => Promise<InfiniteQueryObserverResult<InfiniteData<TQueryFnData>, TError>>;
109
+ refetch: () => Promise<QueryObserverResult<InfiniteData<TQueryFnData>, TError>>;
110
+ }
111
+ /**
112
+ * Subscribe to a paginated / infinite-scroll query.
113
+ * Returns fine-grained reactive signals plus `fetchNextPage`, `fetchPreviousPage`,
114
+ * `hasNextPage` and `hasPreviousPage`.
115
+ *
116
+ * @example
117
+ * const query = useInfiniteQuery(() => ({
118
+ * queryKey: ['posts'],
119
+ * queryFn: ({ pageParam }) => fetchPosts(pageParam as number),
120
+ * initialPageParam: 0,
121
+ * getNextPageParam: (lastPage) => lastPage.nextCursor,
122
+ * }))
123
+ * // query.data()?.pages — array of pages
124
+ * // h('button', { onClick: () => query.fetchNextPage() }, 'Load more')
125
+ */
126
+ declare function useInfiniteQuery<TQueryFnData = unknown, TError = DefaultError, TQueryKey extends QueryKey$1 = QueryKey$1, TPageParam = unknown>(options: () => InfiniteQueryObserverOptions<TQueryFnData, TError, InfiniteData<TQueryFnData>, TQueryKey, TPageParam>): UseInfiniteQueryResult<TQueryFnData, TError>;
127
+ //#endregion
128
+ //#region src/use-is-fetching.d.ts
129
+ /**
130
+ * Returns a signal that tracks how many queries are currently in-flight.
131
+ * Useful for global loading indicators.
132
+ *
133
+ * @example
134
+ * const fetching = useIsFetching()
135
+ * // h('span', null, () => fetching() > 0 ? 'Loading…' : '')
136
+ */
137
+ declare function useIsFetching(filters?: QueryFilters$1): Signal<number>;
138
+ /**
139
+ * Returns a signal that tracks how many mutations are currently in-flight.
140
+ *
141
+ * @example
142
+ * const mutating = useIsMutating()
143
+ * // h('span', null, () => mutating() > 0 ? 'Saving…' : '')
144
+ */
145
+ declare function useIsMutating(filters?: MutationFilters$1): Signal<number>;
146
+ //#endregion
147
+ //#region src/use-queries.d.ts
148
+ type UseQueriesOptions<TQueryKey extends QueryKey$1 = QueryKey$1> = QueryObserverOptions<unknown, DefaultError, unknown, unknown, TQueryKey>;
149
+ /**
150
+ * Subscribe to multiple queries in parallel. Returns a single signal containing
151
+ * the array of results — index-aligned with the `queries` array.
152
+ *
153
+ * `queries` is a reactive function so signal-based keys trigger re-evaluation
154
+ * automatically.
155
+ *
156
+ * @example
157
+ * const userIds = signal([1, 2, 3])
158
+ * const results = useQueries(() =>
159
+ * userIds().map(id => ({
160
+ * queryKey: ['user', id],
161
+ * queryFn: () => fetchUser(id),
162
+ * }))
163
+ * )
164
+ * // results() — QueryObserverResult[]
165
+ * // results()[0].data — first user
166
+ */
167
+ declare function useQueries(queries: () => UseQueriesOptions[]): Signal<QueryObserverResult[]>;
168
+ //#endregion
169
+ //#region src/use-suspense-query.d.ts
170
+ /**
171
+ * Like `UseQueryResult` but `data` is `Signal<TData>` (never undefined).
172
+ * Only use inside a `QuerySuspense` boundary which guarantees the query has
173
+ * succeeded before children are rendered.
174
+ */
175
+ interface UseSuspenseQueryResult<TData, TError = DefaultError> {
176
+ result: Signal<QueryObserverResult<TData, TError>>;
177
+ /** Always TData — never undefined inside a QuerySuspense boundary. */
178
+ data: Signal<TData>;
179
+ error: Signal<TError | null>;
180
+ status: Signal<'pending' | 'error' | 'success'>;
181
+ isPending: Signal<boolean>;
182
+ isFetching: Signal<boolean>;
183
+ isError: Signal<boolean>;
184
+ isSuccess: Signal<boolean>;
185
+ refetch: () => Promise<QueryObserverResult<TData, TError>>;
186
+ }
187
+ interface UseSuspenseInfiniteQueryResult<TQueryFnData, TError = DefaultError> {
188
+ result: Signal<InfiniteQueryObserverResult<InfiniteData<TQueryFnData>, TError>>;
189
+ /** Always InfiniteData<TQueryFnData> — never undefined inside a QuerySuspense boundary. */
190
+ data: Signal<InfiniteData<TQueryFnData>>;
191
+ error: Signal<TError | null>;
192
+ status: Signal<'pending' | 'error' | 'success'>;
193
+ isFetching: Signal<boolean>;
194
+ isFetchingNextPage: Signal<boolean>;
195
+ isFetchingPreviousPage: Signal<boolean>;
196
+ isError: Signal<boolean>;
197
+ isSuccess: Signal<boolean>;
198
+ hasNextPage: Signal<boolean>;
199
+ hasPreviousPage: Signal<boolean>;
200
+ fetchNextPage: () => Promise<InfiniteQueryObserverResult<InfiniteData<TQueryFnData>, TError>>;
201
+ fetchPreviousPage: () => Promise<InfiniteQueryObserverResult<InfiniteData<TQueryFnData>, TError>>;
202
+ refetch: () => Promise<QueryObserverResult<InfiniteData<TQueryFnData>, TError>>;
203
+ }
204
+ type AnyQueryLike = {
205
+ isPending: Signal<boolean>;
206
+ isError: Signal<boolean>;
207
+ error: Signal<unknown>;
208
+ };
209
+ interface QuerySuspenseProps {
210
+ /**
211
+ * A single query result (or array of them) to gate on.
212
+ * Children only render when ALL queries have succeeded.
213
+ */
214
+ query: AnyQueryLike | AnyQueryLike[];
215
+ /** Rendered while any query is pending. */
216
+ fallback?: VNodeChild;
217
+ /** Rendered when any query has errored. Defaults to re-throwing to nearest ErrorBoundary. */
218
+ error?: (err: unknown) => VNodeChild;
219
+ children: VNodeChild;
220
+ }
221
+ /**
222
+ * Pyreon-native Suspense boundary for queries. Shows `fallback` while any query
223
+ * is pending. On error, renders the `error` fallback or re-throws to the
224
+ * nearest Pyreon `ErrorBoundary`.
225
+ *
226
+ * Pair with `useSuspenseQuery` / `useSuspenseInfiniteQuery` to get non-undefined
227
+ * `data` types inside children.
228
+ *
229
+ * @example
230
+ * const userQuery = useSuspenseQuery(() => ({ queryKey: ['user'], queryFn: fetchUser }))
231
+ *
232
+ * h(QuerySuspense, {
233
+ * query: userQuery,
234
+ * fallback: h(Spinner, null),
235
+ * error: (err) => h('p', null, `Failed: ${err}`),
236
+ * }, () => h(UserProfile, { user: userQuery.data() }))
237
+ */
238
+ declare function QuerySuspense(props: QuerySuspenseProps): VNodeChild;
239
+ /**
240
+ * Like `useQuery` but `data` is typed as `Signal<TData>` (never undefined).
241
+ * Designed for use inside a `QuerySuspense` boundary, which guarantees
242
+ * children only render after the query succeeds.
243
+ *
244
+ * @example
245
+ * const user = useSuspenseQuery(() => ({ queryKey: ['user', id()], queryFn: fetchUser }))
246
+ *
247
+ * h(QuerySuspense, { query: user, fallback: h(Spinner, null) },
248
+ * () => h(UserCard, { name: user.data().name }),
249
+ * )
250
+ */
251
+ declare function useSuspenseQuery<TData = unknown, TError = DefaultError, TKey extends QueryKey$1 = QueryKey$1>(options: () => QueryObserverOptions<TData, TError, TData, TData, TKey>): UseSuspenseQueryResult<TData, TError>;
252
+ /**
253
+ * Like `useInfiniteQuery` but `data` is typed as `Signal<InfiniteData<TData>>`
254
+ * (never undefined). Use inside a `QuerySuspense` boundary.
255
+ */
256
+ declare function useSuspenseInfiniteQuery<TQueryFnData = unknown, TError = DefaultError, TQueryKey extends QueryKey$1 = QueryKey$1, TPageParam = unknown>(options: () => InfiniteQueryObserverOptions<TQueryFnData, TError, InfiniteData<TQueryFnData>, TQueryKey, TPageParam>): UseSuspenseInfiniteQueryResult<TQueryFnData, TError>;
257
+ //#endregion
258
+ //#region src/use-query-error-reset-boundary.d.ts
259
+ interface ErrorResetBoundaryValue {
260
+ reset: () => void;
261
+ }
262
+ interface QueryErrorResetBoundaryProps extends Props {
263
+ children?: VNodeChild;
264
+ }
265
+ /**
266
+ * Wraps a subtree so that `useQueryErrorResetBoundary()` descendants can reset
267
+ * all errored queries within this boundary.
268
+ *
269
+ * Pair with Pyreon's `ErrorBoundary` to retry failed queries when the user
270
+ * dismisses the error fallback:
271
+ *
272
+ * @example
273
+ * h(QueryErrorResetBoundary, null,
274
+ * h(ErrorBoundary, {
275
+ * fallback: (err, boundaryReset) => {
276
+ * const { reset } = useQueryErrorResetBoundary()
277
+ * return h('button', {
278
+ * onClick: () => { reset(); boundaryReset() },
279
+ * }, 'Retry')
280
+ * },
281
+ * }, h(MyComponent, null)),
282
+ * )
283
+ */
284
+ declare function QueryErrorResetBoundary(props: QueryErrorResetBoundaryProps): VNode;
285
+ /**
286
+ * Returns the `reset` function provided by the nearest `QueryErrorResetBoundary`.
287
+ * If called outside a boundary, falls back to resetting all errored queries
288
+ * on the current `QueryClient`.
289
+ *
290
+ * @example
291
+ * // Inside an ErrorBoundary fallback:
292
+ * const { reset } = useQueryErrorResetBoundary()
293
+ * h('button', { onClick: () => { reset(); boundaryReset() } }, 'Retry')
294
+ */
295
+ declare function useQueryErrorResetBoundary(): ErrorResetBoundaryValue;
296
+ //#endregion
297
+ export { CancelledError, type DehydratedState, type FetchQueryOptions, type InvalidateOptions, type InvalidateQueryFilters, MutationCache, type MutationFilters, QueryCache, QueryClient, type QueryClientConfig, QueryClientContext, QueryClientProvider, type QueryClientProviderProps, QueryErrorResetBoundary, type QueryErrorResetBoundaryProps, type QueryFilters, type QueryKey, QuerySuspense, type QuerySuspenseProps, type RefetchOptions, type RefetchQueryFilters, type UseInfiniteQueryResult, type UseMutationResult, type UseQueriesOptions, type UseQueryResult, type UseSuspenseInfiniteQueryResult, type UseSuspenseQueryResult, defaultShouldDehydrateMutation, defaultShouldDehydrateQuery, dehydrate, hashKey, hydrate, isCancelledError, keepPreviousData, useInfiniteQuery, useIsFetching, useIsMutating, useMutation, useQueries, useQuery, useQueryClient, useQueryErrorResetBoundary, useSuspenseInfiniteQuery, useSuspenseQuery };
298
+ //# sourceMappingURL=index2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index2.d.ts","names":[],"sources":["../../src/query-client.ts","../../src/use-query.ts","../../src/use-mutation.ts","../../src/use-infinite-query.ts","../../src/use-is-fetching.ts","../../src/use-queries.ts","../../src/use-suspense-query.ts","../../src/use-query-error-reset-boundary.ts"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@pyreon/query",
3
+ "version": "0.0.1",
4
+ "description": "Pyreon adapter for TanStack Query",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/pyreon/fundamentals.git",
9
+ "directory": "packages/query"
10
+ },
11
+ "homepage": "https://github.com/pyreon/fundamentals/tree/main/packages/query#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/pyreon/fundamentals/issues"
14
+ },
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "files": [
19
+ "lib",
20
+ "src",
21
+ "README.md",
22
+ "LICENSE"
23
+ ],
24
+ "type": "module",
25
+ "sideEffects": false,
26
+ "main": "./lib/index.js",
27
+ "module": "./lib/index.js",
28
+ "types": "./lib/types/index.d.ts",
29
+ "exports": {
30
+ ".": {
31
+ "bun": "./src/index.ts",
32
+ "import": "./lib/index.js",
33
+ "types": "./lib/types/index.d.ts"
34
+ }
35
+ },
36
+ "scripts": {
37
+ "build": "vl_rolldown_build",
38
+ "dev": "vl_rolldown_build-watch",
39
+ "test": "vitest run",
40
+ "typecheck": "tsc --noEmit"
41
+ },
42
+ "dependencies": {
43
+ "@tanstack/query-core": "^5.0.0"
44
+ },
45
+ "peerDependencies": {
46
+ "@pyreon/core": "^0.2.1",
47
+ "@pyreon/reactivity": "^0.2.1"
48
+ },
49
+ "devDependencies": {
50
+ "@happy-dom/global-registrator": "^20.8.3",
51
+ "@pyreon/core": "^0.2.1",
52
+ "@pyreon/reactivity": "^0.2.1",
53
+ "@pyreon/runtime-dom": "^0.2.1"
54
+ }
55
+ }
package/src/index.ts ADDED
@@ -0,0 +1,69 @@
1
+ // ─── TanStack Query core re-exports ──────────────────────────────────────────
2
+ // Users can import QueryClient, dehydrate, etc. from @pyreon/query directly.
3
+
4
+ export {
5
+ QueryClient,
6
+ QueryCache,
7
+ MutationCache,
8
+ dehydrate,
9
+ hydrate,
10
+ defaultShouldDehydrateQuery,
11
+ defaultShouldDehydrateMutation,
12
+ keepPreviousData,
13
+ hashKey,
14
+ isCancelledError,
15
+ CancelledError,
16
+ } from '@tanstack/query-core'
17
+
18
+ export type {
19
+ QueryKey,
20
+ QueryFilters,
21
+ MutationFilters,
22
+ DehydratedState,
23
+ FetchQueryOptions,
24
+ InvalidateQueryFilters,
25
+ InvalidateOptions,
26
+ RefetchQueryFilters,
27
+ RefetchOptions,
28
+ QueryClientConfig,
29
+ } from '@tanstack/query-core'
30
+
31
+ // ─── Pyreon adapter ─────────────────────────────────────────────────────────────
32
+
33
+ export {
34
+ QueryClientContext,
35
+ QueryClientProvider,
36
+ useQueryClient,
37
+ } from './query-client'
38
+ export type { QueryClientProviderProps } from './query-client'
39
+
40
+ export { useQuery } from './use-query'
41
+ export type { UseQueryResult } from './use-query'
42
+
43
+ export { useMutation } from './use-mutation'
44
+ export type { UseMutationResult } from './use-mutation'
45
+
46
+ export { useInfiniteQuery } from './use-infinite-query'
47
+ export type { UseInfiniteQueryResult } from './use-infinite-query'
48
+
49
+ export { useIsFetching, useIsMutating } from './use-is-fetching'
50
+
51
+ export { useQueries } from './use-queries'
52
+ export type { UseQueriesOptions } from './use-queries'
53
+
54
+ export {
55
+ useSuspenseQuery,
56
+ useSuspenseInfiniteQuery,
57
+ QuerySuspense,
58
+ } from './use-suspense-query'
59
+ export type {
60
+ UseSuspenseQueryResult,
61
+ UseSuspenseInfiniteQueryResult,
62
+ QuerySuspenseProps,
63
+ } from './use-suspense-query'
64
+
65
+ export {
66
+ QueryErrorResetBoundary,
67
+ useQueryErrorResetBoundary,
68
+ } from './use-query-error-reset-boundary'
69
+ export type { QueryErrorResetBoundaryProps } from './use-query-error-reset-boundary'
@@ -0,0 +1,59 @@
1
+ import {
2
+ createContext,
3
+ pushContext,
4
+ popContext,
5
+ onMount,
6
+ onUnmount,
7
+ useContext,
8
+ } from '@pyreon/core'
9
+ import type { VNodeChild, VNode } from '@pyreon/core'
10
+ import type { QueryClient } from '@tanstack/query-core'
11
+ import type { Props } from '@pyreon/core'
12
+
13
+ export interface QueryClientProviderProps extends Props {
14
+ client: QueryClient
15
+ children?: VNodeChild
16
+ }
17
+
18
+ export const QueryClientContext = createContext<QueryClient | null>(null)
19
+
20
+ /**
21
+ * Provides a QueryClient to all descendant components via context.
22
+ * Wrap your app root with this to enable useQuery / useMutation throughout the tree.
23
+ *
24
+ * @example
25
+ * const client = new QueryClient()
26
+ * mount(h(QueryClientProvider, { client }, h(App, null)), el)
27
+ */
28
+ export function QueryClientProvider(props: QueryClientProviderProps): VNode {
29
+ // Push synchronously so all descendant component functions see the context.
30
+ // Pop on unmount (matches the HeadProvider pattern in @pyreon/head).
31
+ const frame = new Map([[QueryClientContext.id, props.client]])
32
+ pushContext(frame)
33
+
34
+ // client.mount() activates window focus refetching and online/offline handling.
35
+ // client.unmount() unsubscribes focusManager + onlineManager when the provider leaves the tree.
36
+ onMount(() => {
37
+ props.client.mount()
38
+ return () => props.client.unmount()
39
+ })
40
+
41
+ onUnmount(() => popContext())
42
+
43
+ const ch = props.children
44
+ return (typeof ch === 'function' ? (ch as () => VNodeChild)() : ch) as VNode
45
+ }
46
+
47
+ /**
48
+ * Returns the nearest QueryClient provided by <QueryClientProvider>.
49
+ * Throws if called outside of one.
50
+ */
51
+ export function useQueryClient(): QueryClient {
52
+ const client = useContext(QueryClientContext)
53
+ if (!client) {
54
+ throw new Error(
55
+ '[pyreon/query] No QueryClient found. Wrap your app with <QueryClientProvider client={client}>.',
56
+ )
57
+ }
58
+ return client
59
+ }