@tanstack/solid-query 5.101.4 → 5.102.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.
package/build/dev.js CHANGED
@@ -1,530 +1,431 @@
1
- import { MutationObserver, shouldThrowError, QueriesObserver, noop, QueryClient as QueryClient$1, replaceEqualDeep, hydrate, notifyManager, QueryObserver, InfiniteQueryObserver } from '@tanstack/query-core';
2
- export * from '@tanstack/query-core';
3
- import { createContext, useContext, createRenderEffect, onCleanup, createMemo, createComputed, on, mergeProps, createResource, batch, onMount, createSignal, createEffect } from 'solid-js';
4
- import { createComponent, isServer } from 'solid-js/web';
5
- import { createStore, unwrap, reconcile } from 'solid-js/store';
6
-
7
- // src/useQuery.ts
8
- var QueryClientContext = createContext(void 0);
9
- var useQueryClient = (queryClient) => {
10
- if (queryClient) {
11
- return queryClient;
12
- }
13
- const client = useContext(QueryClientContext);
14
- if (!client) {
15
- throw new Error("No QueryClient set, use QueryClientProvider to set one");
16
- }
17
- return client();
1
+ import { InfiniteQueryObserver, MutationObserver, QueriesObserver, QueryClient as QueryClient$1, QueryObserver, hydrate, noop, notifyManager, replaceEqualDeep, shouldThrowError } from "@tanstack/query-core";
2
+ import { batch, createComputed, createContext, createEffect, createMemo, createRenderEffect, createResource, createSignal, mergeProps, on, onCleanup, onMount, useContext } from "solid-js";
3
+ import { createComponent, isServer } from "solid-js/web";
4
+ import { createStore, reconcile, unwrap } from "solid-js/store";
5
+ export * from "@tanstack/query-core";
6
+ //#region src/QueryClientProvider.tsx
7
+ const QueryClientContext = createContext(void 0);
8
+ const queryClientContextError = "No QueryClient set, use QueryClientProvider to set one";
9
+ const useQueryClient = (queryClient) => {
10
+ if (queryClient) return queryClient;
11
+ const client = useContext(QueryClientContext);
12
+ if (!client) throw new Error(queryClientContextError);
13
+ return client();
18
14
  };
19
- var QueryClientProvider = (props) => {
20
- createRenderEffect((unmount) => {
21
- unmount?.();
22
- props.client.mount();
23
- return props.client.unmount.bind(props.client);
24
- });
25
- onCleanup(() => props.client.unmount());
26
- return createComponent(QueryClientContext.Provider, {
27
- value: () => props.client,
28
- get children() {
29
- return props.children;
30
- }
31
- });
15
+ const useQueryClientResolver = (queryClient) => {
16
+ const contextClient = useContext(QueryClientContext);
17
+ return () => {
18
+ const resolvedClient = queryClient?.();
19
+ if (resolvedClient) return resolvedClient;
20
+ if (!contextClient) throw new Error(queryClientContextError);
21
+ return contextClient();
22
+ };
32
23
  };
33
- var IsRestoringContext = createContext(() => false);
34
- var useIsRestoring = () => useContext(IsRestoringContext);
35
- var IsRestoringProvider = IsRestoringContext.Provider;
36
-
37
- // src/useBaseQuery.ts
24
+ const QueryClientProvider = (props) => {
25
+ createRenderEffect((unmount) => {
26
+ unmount?.();
27
+ props.client.mount();
28
+ return props.client.unmount.bind(props.client);
29
+ });
30
+ onCleanup(() => props.client.unmount());
31
+ return createComponent(QueryClientContext.Provider, {
32
+ value: () => props.client,
33
+ get children() {
34
+ return props.children;
35
+ }
36
+ });
37
+ };
38
+ //#endregion
39
+ //#region src/isRestoring.ts
40
+ const IsRestoringContext = createContext(() => false);
41
+ const useIsRestoring = () => useContext(IsRestoringContext);
42
+ const IsRestoringProvider = IsRestoringContext.Provider;
43
+ //#endregion
44
+ //#region src/useBaseQuery.ts
38
45
  function reconcileFn(store, result, reconcileOption, queryHash) {
39
- if (reconcileOption === false) return result;
40
- if (typeof reconcileOption === "function") {
41
- const newData2 = reconcileOption(store.data, result.data);
42
- return { ...result, data: newData2 };
43
- }
44
- let data = result.data;
45
- if (store.data === void 0) {
46
- try {
47
- data = structuredClone(data);
48
- } catch (error) {
49
- {
50
- if (error instanceof Error) {
51
- console.warn(
52
- `Unable to correctly reconcile data for query key: ${queryHash}. Possibly because the query data contains data structures that aren't supported by the 'structuredClone' algorithm. Consider using a callback function instead to manage the reconciliation manually.
53
-
54
- Error Received: ${error.name} - ${error.message}`
55
- );
56
- }
57
- }
58
- }
59
- }
60
- const newData = reconcile(data, { key: reconcileOption })(store.data);
61
- return { ...result, data: newData };
46
+ if (reconcileOption === false) return result;
47
+ if (typeof reconcileOption === "function") {
48
+ const newData = reconcileOption(store.data, result.data);
49
+ return {
50
+ ...result,
51
+ data: newData
52
+ };
53
+ }
54
+ let data = result.data;
55
+ if (store.data === void 0) try {
56
+ data = structuredClone(data);
57
+ } catch (error) {
58
+ if (error instanceof Error) console.warn(`Unable to correctly reconcile data for query key: ${queryHash}. Possibly because the query data contains data structures that aren't supported by the 'structuredClone' algorithm. Consider using a callback function instead to manage the reconciliation manually.\n\n Error Received: ${error.name} - ${error.message}`);
59
+ }
60
+ const newData = reconcile(data, { key: reconcileOption })(store.data);
61
+ return {
62
+ ...result,
63
+ data: newData
64
+ };
62
65
  }
63
- var hydratableObserverResult = (query, result) => {
64
- if (!isServer) return result;
65
- const obj = {
66
- ...unwrap(result),
67
- // During SSR, functions cannot be serialized, so we need to remove them
68
- // This is safe because we will add these functions back when the query is hydrated
69
- refetch: void 0
70
- };
71
- if ("fetchNextPage" in result) {
72
- obj.fetchNextPage = void 0;
73
- obj.fetchPreviousPage = void 0;
74
- }
75
- obj.hydrationData = {
76
- state: query.state,
77
- queryKey: query.queryKey,
78
- queryHash: query.queryHash,
79
- ...query.meta && { meta: query.meta }
80
- };
81
- return obj;
66
+ /**
67
+ * Solid's `onHydrated` functionality will silently "fail" (hydrate with an empty object)
68
+ * if the resource data is not serializable.
69
+ */
70
+ const hydratableObserverResult = (query, result) => {
71
+ if (!isServer) return result;
72
+ const obj = {
73
+ ...unwrap(result),
74
+ refetch: void 0
75
+ };
76
+ if ("fetchNextPage" in result) {
77
+ obj.fetchNextPage = void 0;
78
+ obj.fetchPreviousPage = void 0;
79
+ }
80
+ obj.hydrationData = {
81
+ state: query.state,
82
+ queryKey: query.queryKey,
83
+ queryHash: query.queryHash,
84
+ ...query.meta && { meta: query.meta }
85
+ };
86
+ return obj;
82
87
  };
83
88
  function useBaseQuery(options, Observer, queryClient) {
84
- const client = createMemo(() => useQueryClient(queryClient?.()));
85
- const isRestoring = useIsRestoring();
86
- let unsubscribeQueued = false;
87
- const defaultedOptions = createMemo(() => {
88
- const defaultOptions = client().defaultQueryOptions(options());
89
- defaultOptions._optimisticResults = isRestoring() ? "isRestoring" : "optimistic";
90
- defaultOptions.structuralSharing = false;
91
- if (isServer) {
92
- defaultOptions.retry = false;
93
- defaultOptions.throwOnError = true;
94
- defaultOptions.experimental_prefetchInRender = true;
95
- }
96
- return defaultOptions;
97
- });
98
- const initialOptions = defaultedOptions();
99
- const [observer, setObserver] = createSignal(
100
- new Observer(client(), defaultedOptions())
101
- );
102
- let observerResult = observer().getOptimisticResult(defaultedOptions());
103
- const [state, setState] = createStore(observerResult);
104
- const createServerSubscriber = (resolve, reject) => {
105
- return observer().subscribe((result) => {
106
- notifyManager.batchCalls(() => {
107
- const query = observer().getCurrentQuery();
108
- const unwrappedResult = hydratableObserverResult(query, result);
109
- if (result.data !== void 0 && unwrappedResult.isError) {
110
- reject(unwrappedResult.error);
111
- unsubscribeIfQueued();
112
- } else {
113
- resolve(unwrappedResult);
114
- unsubscribeIfQueued();
115
- }
116
- })();
117
- });
118
- };
119
- const unsubscribeIfQueued = () => {
120
- if (unsubscribeQueued) {
121
- unsubscribe?.();
122
- unsubscribeQueued = false;
123
- }
124
- };
125
- const createClientSubscriber = () => {
126
- const obs = observer();
127
- return obs.subscribe((result) => {
128
- observerResult = result;
129
- queueMicrotask(() => {
130
- if (unsubscribe) {
131
- refetch();
132
- }
133
- });
134
- });
135
- };
136
- function setStateWithReconciliation(res) {
137
- const opts = observer().options;
138
- const reconcileOptions = opts.reconcile;
139
- setState((store) => {
140
- return reconcileFn(
141
- store,
142
- res,
143
- reconcileOptions === void 0 ? false : reconcileOptions,
144
- opts.queryHash
145
- );
146
- });
147
- }
148
- function createDeepSignal() {
149
- return [
150
- () => state,
151
- (v) => {
152
- const unwrapped = unwrap(state);
153
- if (typeof v === "function") {
154
- v = v(unwrapped);
155
- }
156
- if (v?.hydrationData) {
157
- const { hydrationData, ...rest } = v;
158
- v = rest;
159
- }
160
- setStateWithReconciliation(v);
161
- }
162
- ];
163
- }
164
- let unsubscribe = null;
165
- let resolver = null;
166
- const [queryResource, { refetch }] = createResource(
167
- () => {
168
- const obs = observer();
169
- return new Promise((resolve, reject) => {
170
- resolver = resolve;
171
- if (isServer) {
172
- unsubscribe = createServerSubscriber(resolve, reject);
173
- } else if (!unsubscribe && !isRestoring()) {
174
- unsubscribe = createClientSubscriber();
175
- }
176
- obs.updateResult();
177
- if (observerResult.isError && !observerResult.isFetching && !isRestoring() && shouldThrowError(obs.options.throwOnError, [
178
- observerResult.error,
179
- obs.getCurrentQuery()
180
- ])) {
181
- setStateWithReconciliation(observerResult);
182
- return reject(observerResult.error);
183
- }
184
- if (!observerResult.isLoading) {
185
- resolver = null;
186
- return resolve(
187
- hydratableObserverResult(obs.getCurrentQuery(), observerResult)
188
- );
189
- }
190
- setStateWithReconciliation(observerResult);
191
- });
192
- },
193
- {
194
- storage: createDeepSignal,
195
- get deferStream() {
196
- return options().deferStream;
197
- },
198
- /**
199
- * If this resource was populated on the server (either sync render, or streamed in over time), onHydrated
200
- * will be called. This is the point at which we can hydrate the query cache state, and setup the query subscriber.
201
- *
202
- * Leveraging onHydrated allows us to plug into the async and streaming support that solidjs resources already support.
203
- *
204
- * Note that this is only invoked on the client, for queries that were originally run on the server.
205
- */
206
- onHydrated(_k, info) {
207
- if (info.value && "hydrationData" in info.value) {
208
- hydrate(client(), {
209
- // @ts-expect-error - hydrationData is not correctly typed internally
210
- queries: [{ ...info.value.hydrationData }]
211
- });
212
- }
213
- if (unsubscribe) return;
214
- const newOptions = { ...initialOptions };
215
- if ((initialOptions.staleTime || !initialOptions.initialData) && info.value) {
216
- newOptions.refetchOnMount = false;
217
- }
218
- observer().setOptions(newOptions);
219
- setStateWithReconciliation(observer().getOptimisticResult(newOptions));
220
- unsubscribe = createClientSubscriber();
221
- }
222
- }
223
- );
224
- createComputed(
225
- on(
226
- client,
227
- (c) => {
228
- if (unsubscribe) {
229
- unsubscribe();
230
- }
231
- const newObserver = new Observer(c, defaultedOptions());
232
- unsubscribe = createClientSubscriber();
233
- setObserver(newObserver);
234
- },
235
- {
236
- defer: true
237
- }
238
- )
239
- );
240
- createComputed(
241
- on(
242
- isRestoring,
243
- (restoring) => {
244
- if (!restoring && !isServer) {
245
- refetch();
246
- }
247
- },
248
- { defer: true }
249
- )
250
- );
251
- onCleanup(() => {
252
- if (isServer && queryResource.loading) {
253
- unsubscribeQueued = true;
254
- return;
255
- }
256
- if (unsubscribe) {
257
- unsubscribe();
258
- unsubscribe = null;
259
- }
260
- if (resolver && !isServer) {
261
- resolver(observerResult);
262
- resolver = null;
263
- }
264
- });
265
- createComputed(
266
- on(
267
- [observer, defaultedOptions],
268
- ([obs, opts]) => {
269
- obs.setOptions(opts);
270
- setStateWithReconciliation(obs.getOptimisticResult(opts));
271
- refetch();
272
- },
273
- { defer: true }
274
- )
275
- );
276
- const handler = {
277
- get(target, prop) {
278
- if (prop === "data") {
279
- if (state.data !== void 0) {
280
- return queryResource.latest?.data;
281
- }
282
- return queryResource()?.data;
283
- }
284
- return Reflect.get(target, prop);
285
- }
286
- };
287
- return new Proxy(state, handler);
89
+ const resolveClient = useQueryClientResolver(queryClient);
90
+ const client = createMemo(() => resolveClient());
91
+ const isRestoring = useIsRestoring();
92
+ let unsubscribeQueued = false;
93
+ const defaultedOptions = createMemo(() => {
94
+ const defaultOptions = client().defaultQueryOptions(options());
95
+ defaultOptions._optimisticResults = isRestoring() ? "isRestoring" : "optimistic";
96
+ defaultOptions.structuralSharing = false;
97
+ if (isServer) {
98
+ defaultOptions.retry = false;
99
+ defaultOptions.throwOnError = true;
100
+ }
101
+ return defaultOptions;
102
+ });
103
+ const initialOptions = defaultedOptions();
104
+ const [observer, setObserver] = createSignal(new Observer(client(), defaultedOptions()));
105
+ let observerResult = observer().getOptimisticResult(defaultedOptions());
106
+ const [state, setState] = createStore(observerResult);
107
+ const createServerSubscriber = (resolve, reject) => {
108
+ return observer().subscribe((result) => {
109
+ notifyManager.batchCalls(() => {
110
+ const query = observer().getCurrentQuery();
111
+ const unwrappedResult = hydratableObserverResult(query, result);
112
+ if (result.data !== void 0 && unwrappedResult.isError) {
113
+ reject(unwrappedResult.error);
114
+ unsubscribeIfQueued();
115
+ } else {
116
+ resolve(unwrappedResult);
117
+ unsubscribeIfQueued();
118
+ }
119
+ })();
120
+ });
121
+ };
122
+ const unsubscribeIfQueued = () => {
123
+ if (unsubscribeQueued) {
124
+ unsubscribe?.();
125
+ unsubscribeQueued = false;
126
+ }
127
+ };
128
+ const createClientSubscriber = () => {
129
+ return observer().subscribe((result) => {
130
+ observerResult = result;
131
+ queueMicrotask(() => {
132
+ if (unsubscribe) refetch();
133
+ });
134
+ });
135
+ };
136
+ function setStateWithReconciliation(res) {
137
+ const opts = observer().options;
138
+ const reconcileOptions = opts.reconcile;
139
+ setState((store) => {
140
+ return reconcileFn(store, res, reconcileOptions === void 0 ? false : reconcileOptions, opts.queryHash);
141
+ });
142
+ }
143
+ function createDeepSignal() {
144
+ return [() => state, (v) => {
145
+ const unwrapped = unwrap(state);
146
+ if (typeof v === "function") v = v(unwrapped);
147
+ if (v?.hydrationData) {
148
+ const { hydrationData, ...rest } = v;
149
+ v = rest;
150
+ }
151
+ setStateWithReconciliation(v);
152
+ }];
153
+ }
154
+ /**
155
+ * Unsubscribe is set lazily, so that we can subscribe after hydration when needed.
156
+ */
157
+ let unsubscribe = null;
158
+ let resolver = null;
159
+ const [queryResource, { refetch }] = createResource(() => {
160
+ const obs = observer();
161
+ return new Promise((resolve, reject) => {
162
+ resolver = resolve;
163
+ if (isServer) unsubscribe = createServerSubscriber(resolve, reject);
164
+ else if (!unsubscribe && !isRestoring()) unsubscribe = createClientSubscriber();
165
+ obs.updateResult();
166
+ if (observerResult.isError && !observerResult.isFetching && !isRestoring() && shouldThrowError(obs.options.throwOnError, [observerResult.error, obs.getCurrentQuery()])) {
167
+ setStateWithReconciliation(observerResult);
168
+ return reject(observerResult.error);
169
+ }
170
+ if (!observerResult.isLoading) {
171
+ resolver = null;
172
+ return resolve(hydratableObserverResult(obs.getCurrentQuery(), observerResult));
173
+ }
174
+ setStateWithReconciliation(observerResult);
175
+ });
176
+ }, {
177
+ storage: createDeepSignal,
178
+ get deferStream() {
179
+ return options().deferStream;
180
+ },
181
+ /**
182
+ * If this resource was populated on the server (either sync render, or streamed in over time), onHydrated
183
+ * will be called. This is the point at which we can hydrate the query cache state, and setup the query subscriber.
184
+ *
185
+ * Leveraging onHydrated allows us to plug into the async and streaming support that solidjs resources already support.
186
+ *
187
+ * Note that this is only invoked on the client, for queries that were originally run on the server.
188
+ */
189
+ onHydrated(_k, info) {
190
+ if (info.value && "hydrationData" in info.value) hydrate(client(), { queries: [{ ...info.value.hydrationData }] });
191
+ if (unsubscribe) return;
192
+ /**
193
+ * Do not refetch query on mount if query was fetched on server,
194
+ * even if `staleTime` is not set.
195
+ */
196
+ const newOptions = { ...initialOptions };
197
+ if ((initialOptions.staleTime || !initialOptions.initialData) && info.value) newOptions.refetchOnMount = false;
198
+ observer().setOptions(newOptions);
199
+ setStateWithReconciliation(observer().getOptimisticResult(newOptions));
200
+ unsubscribe = createClientSubscriber();
201
+ }
202
+ });
203
+ createComputed(on(client, (c) => {
204
+ if (unsubscribe) unsubscribe();
205
+ const newObserver = new Observer(c, defaultedOptions());
206
+ unsubscribe = createClientSubscriber();
207
+ setObserver(newObserver);
208
+ }, { defer: true }));
209
+ createComputed(on(isRestoring, (restoring) => {
210
+ if (!restoring && !isServer) refetch();
211
+ }, { defer: true }));
212
+ onCleanup(() => {
213
+ if (isServer && queryResource.loading) {
214
+ unsubscribeQueued = true;
215
+ return;
216
+ }
217
+ if (unsubscribe) {
218
+ unsubscribe();
219
+ unsubscribe = null;
220
+ }
221
+ if (resolver && !isServer) {
222
+ resolver(observerResult);
223
+ resolver = null;
224
+ }
225
+ });
226
+ createComputed(on([observer, defaultedOptions], ([obs, opts]) => {
227
+ obs.setOptions(opts);
228
+ setStateWithReconciliation(obs.getOptimisticResult(opts));
229
+ refetch();
230
+ }, { defer: true }));
231
+ return new Proxy(state, { get(target, prop) {
232
+ if (prop === "data") {
233
+ if (state.data !== void 0) return queryResource.latest?.data;
234
+ return queryResource()?.data;
235
+ }
236
+ return Reflect.get(target, prop);
237
+ } });
288
238
  }
289
-
290
- // src/useQuery.ts
239
+ //#endregion
240
+ //#region src/useQuery.ts
291
241
  function useQuery(options, queryClient) {
292
- return useBaseQuery(
293
- createMemo(() => options()),
294
- QueryObserver,
295
- queryClient
296
- );
242
+ return useBaseQuery(createMemo(() => options()), QueryObserver, queryClient);
297
243
  }
244
+ //#endregion
245
+ //#region src/useInfiniteQuery.ts
298
246
  function useInfiniteQuery(options, queryClient) {
299
- return useBaseQuery(
300
- createMemo(() => options()),
301
- InfiniteQueryObserver,
302
- queryClient
303
- );
247
+ return useBaseQuery(createMemo(() => options()), InfiniteQueryObserver, queryClient);
304
248
  }
249
+ //#endregion
250
+ //#region src/useMutation.ts
305
251
  function useMutation(options, queryClient) {
306
- const client = createMemo(() => useQueryClient(queryClient?.()));
307
- const observer = new MutationObserver(client(), options());
308
- const mutate = (variables, mutateOptions) => {
309
- observer.mutate(variables, mutateOptions).catch(noop);
310
- };
311
- const [state, setState] = createStore({
312
- ...observer.getCurrentResult(),
313
- mutate,
314
- mutateAsync: observer.getCurrentResult().mutate
315
- });
316
- createComputed(() => {
317
- observer.setOptions(options());
318
- });
319
- createComputed(
320
- on(
321
- () => state.status,
322
- () => {
323
- if (state.isError && shouldThrowError(observer.options.throwOnError, [state.error])) {
324
- throw state.error;
325
- }
326
- }
327
- )
328
- );
329
- const unsubscribe = observer.subscribe((result) => {
330
- setState({
331
- ...result,
332
- mutate,
333
- mutateAsync: result.mutate
334
- });
335
- });
336
- onCleanup(unsubscribe);
337
- return state;
252
+ const resolveClient = useQueryClientResolver(queryClient);
253
+ const client = createMemo(() => resolveClient());
254
+ const observer = new MutationObserver(client(), options());
255
+ const mutate = (...args) => {
256
+ observer.mutate(args[0], args[1]).catch(noop);
257
+ };
258
+ const [state, setState] = createStore({
259
+ ...observer.getCurrentResult(),
260
+ mutate,
261
+ mutateAsync: observer.getCurrentResult().mutate
262
+ });
263
+ createComputed(() => {
264
+ observer.setOptions(options());
265
+ });
266
+ createComputed(on(() => state.status, () => {
267
+ if (state.isError && shouldThrowError(observer.options.throwOnError, [state.error])) throw state.error;
268
+ }));
269
+ const unsubscribe = observer.subscribe((result) => {
270
+ setState({
271
+ ...result,
272
+ mutate,
273
+ mutateAsync: result.mutate
274
+ });
275
+ });
276
+ onCleanup(unsubscribe);
277
+ return state;
338
278
  }
279
+ //#endregion
280
+ //#region src/useQueries.ts
339
281
  function useQueries(queriesOptions, queryClient) {
340
- const client = createMemo(() => useQueryClient(queryClient?.()));
341
- const isRestoring = useIsRestoring();
342
- const defaultedQueries = createMemo(
343
- () => queriesOptions().queries.map(
344
- (options) => mergeProps(
345
- client().defaultQueryOptions(options),
346
- {
347
- get _optimisticResults() {
348
- return isRestoring() ? "isRestoring" : "optimistic";
349
- }
350
- }
351
- )
352
- )
353
- );
354
- const observer = new QueriesObserver(
355
- client(),
356
- defaultedQueries(),
357
- queriesOptions().combine ? {
358
- combine: queriesOptions().combine
359
- } : void 0
360
- );
361
- const [state, setState] = createStore(
362
- observer.getOptimisticResult(
363
- defaultedQueries(),
364
- queriesOptions().combine
365
- )[1]()
366
- );
367
- createRenderEffect(
368
- on(
369
- () => queriesOptions().queries.length,
370
- () => setState(
371
- observer.getOptimisticResult(
372
- defaultedQueries(),
373
- queriesOptions().combine
374
- )[1]()
375
- )
376
- )
377
- );
378
- const dataResources = createMemo(
379
- on(
380
- () => state.length,
381
- () => state.map((queryRes) => {
382
- const dataPromise = () => new Promise((resolve) => {
383
- if (queryRes.isFetching && queryRes.isLoading) return;
384
- resolve(unwrap(queryRes.data));
385
- });
386
- return createResource(dataPromise);
387
- })
388
- )
389
- );
390
- batch(() => {
391
- const dataResources_ = dataResources();
392
- for (let index = 0; index < dataResources_.length; index++) {
393
- const dataResource = dataResources_[index];
394
- dataResource[1].mutate(() => unwrap(state[index].data));
395
- dataResource[1].refetch();
396
- }
397
- });
398
- let taskQueue = [];
399
- const subscribeToObserver = () => observer.subscribe((result) => {
400
- taskQueue.push(() => {
401
- batch(() => {
402
- const dataResources_ = dataResources();
403
- for (let index = 0; index < dataResources_.length; index++) {
404
- const dataResource = dataResources_[index];
405
- const unwrappedResult = { ...unwrap(result[index]) };
406
- setState(index, unwrap(unwrappedResult));
407
- dataResource[1].mutate(() => unwrap(state[index].data));
408
- dataResource[1].refetch();
409
- }
410
- });
411
- });
412
- queueMicrotask(() => {
413
- const taskToRun = taskQueue.pop();
414
- if (taskToRun) taskToRun();
415
- taskQueue = [];
416
- });
417
- });
418
- let unsubscribe = noop;
419
- createComputed((cleanup) => {
420
- cleanup?.();
421
- unsubscribe = isRestoring() ? noop : subscribeToObserver();
422
- return () => queueMicrotask(unsubscribe);
423
- });
424
- onCleanup(unsubscribe);
425
- onMount(() => {
426
- observer.setQueries(
427
- defaultedQueries(),
428
- queriesOptions().combine ? {
429
- combine: queriesOptions().combine
430
- } : void 0
431
- );
432
- });
433
- createComputed(() => {
434
- observer.setQueries(
435
- defaultedQueries(),
436
- queriesOptions().combine ? {
437
- combine: queriesOptions().combine
438
- } : void 0
439
- );
440
- });
441
- const handler = (index) => ({
442
- get(target, prop) {
443
- if (prop === "data") {
444
- return dataResources()[index][0]();
445
- }
446
- return Reflect.get(target, prop);
447
- }
448
- });
449
- const getProxies = () => state.map((s, index) => {
450
- return new Proxy(s, handler(index));
451
- });
452
- const [proxyState, setProxyState] = createStore(getProxies());
453
- createRenderEffect(() => setProxyState(getProxies()));
454
- return proxyState;
282
+ const resolveClient = useQueryClientResolver(queryClient);
283
+ const client = createMemo(() => resolveClient());
284
+ const isRestoring = useIsRestoring();
285
+ const defaultedQueries = createMemo(() => queriesOptions().queries.map((options) => mergeProps(client().defaultQueryOptions(options), { get _optimisticResults() {
286
+ return isRestoring() ? "isRestoring" : "optimistic";
287
+ } })));
288
+ const observer = new QueriesObserver(client(), defaultedQueries(), queriesOptions().combine ? { combine: queriesOptions().combine } : void 0);
289
+ const [state, setState] = createStore(observer.getOptimisticResult(defaultedQueries(), queriesOptions().combine)[1]());
290
+ createRenderEffect(on(() => queriesOptions().queries.length, () => setState(observer.getOptimisticResult(defaultedQueries(), queriesOptions().combine)[1]())));
291
+ const dataResources = createMemo(on(() => state.length, () => state.map((queryRes) => {
292
+ const dataPromise = () => new Promise((resolve) => {
293
+ if (queryRes.isFetching && queryRes.isLoading) return;
294
+ resolve(unwrap(queryRes.data));
295
+ });
296
+ return createResource(dataPromise);
297
+ })));
298
+ batch(() => {
299
+ const dataResources_ = dataResources();
300
+ for (let index = 0; index < dataResources_.length; index++) {
301
+ const dataResource = dataResources_[index];
302
+ dataResource[1].mutate(() => unwrap(state[index].data));
303
+ dataResource[1].refetch();
304
+ }
305
+ });
306
+ let taskQueue = [];
307
+ const subscribeToObserver = () => observer.subscribe((result) => {
308
+ taskQueue.push(() => {
309
+ batch(() => {
310
+ const dataResources_ = dataResources();
311
+ for (let index = 0; index < dataResources_.length; index++) {
312
+ const dataResource = dataResources_[index];
313
+ const unwrappedResult = { ...unwrap(result[index]) };
314
+ setState(index, unwrap(unwrappedResult));
315
+ dataResource[1].mutate(() => unwrap(state[index].data));
316
+ dataResource[1].refetch();
317
+ }
318
+ });
319
+ });
320
+ queueMicrotask(() => {
321
+ const taskToRun = taskQueue.pop();
322
+ if (taskToRun) taskToRun();
323
+ taskQueue = [];
324
+ });
325
+ });
326
+ let unsubscribe = noop;
327
+ createComputed((cleanup) => {
328
+ cleanup?.();
329
+ unsubscribe = isRestoring() ? noop : subscribeToObserver();
330
+ return () => queueMicrotask(unsubscribe);
331
+ });
332
+ onCleanup(unsubscribe);
333
+ onMount(() => {
334
+ observer.setQueries(defaultedQueries(), queriesOptions().combine ? { combine: queriesOptions().combine } : void 0);
335
+ });
336
+ createComputed(() => {
337
+ observer.setQueries(defaultedQueries(), queriesOptions().combine ? { combine: queriesOptions().combine } : void 0);
338
+ });
339
+ const handler = (index) => ({ get(target, prop) {
340
+ if (prop === "data") return dataResources()[index][0]();
341
+ return Reflect.get(target, prop);
342
+ } });
343
+ const getProxies = () => state.map((s, index) => {
344
+ return new Proxy(s, handler(index));
345
+ });
346
+ const [proxyState, setProxyState] = createStore(getProxies());
347
+ createRenderEffect(() => setProxyState(getProxies()));
348
+ return proxyState;
455
349
  }
350
+ //#endregion
351
+ //#region src/QueryClient.ts
456
352
  var QueryClient = class extends QueryClient$1 {
457
- constructor(config = {}) {
458
- super(config);
459
- }
353
+ constructor(config = {}) {
354
+ super(config);
355
+ }
460
356
  };
461
-
462
- // src/queryOptions.ts
357
+ //#endregion
358
+ //#region src/queryOptions.ts
463
359
  function queryOptions(options) {
464
- return options;
360
+ return options;
465
361
  }
362
+ //#endregion
363
+ //#region src/useIsFetching.ts
466
364
  function useIsFetching(filters, queryClient) {
467
- const client = createMemo(() => useQueryClient(queryClient?.()));
468
- const queryCache = createMemo(() => client().getQueryCache());
469
- const [fetches, setFetches] = createSignal(client().isFetching(filters?.()));
470
- const unsubscribe = queryCache().subscribe(() => {
471
- setFetches(client().isFetching(filters?.()));
472
- });
473
- onCleanup(unsubscribe);
474
- return fetches;
365
+ const resolveClient = useQueryClientResolver(queryClient);
366
+ const client = createMemo(() => resolveClient());
367
+ const queryCache = createMemo(() => client().getQueryCache());
368
+ const [fetches, setFetches] = createSignal(client().isFetching(filters?.()));
369
+ createEffect(() => {
370
+ setFetches(client().isFetching(filters?.()));
371
+ const unsubscribe = queryCache().subscribe(() => {
372
+ setFetches(client().isFetching(filters?.()));
373
+ });
374
+ onCleanup(unsubscribe);
375
+ });
376
+ return fetches;
475
377
  }
476
-
477
- // src/infiniteQueryOptions.ts
378
+ //#endregion
379
+ //#region src/infiniteQueryOptions.ts
478
380
  function infiniteQueryOptions(options) {
479
- return options;
381
+ return options;
480
382
  }
481
-
482
- // src/mutationOptions.ts
383
+ //#endregion
384
+ //#region src/mutationOptions.ts
483
385
  function mutationOptions(options) {
484
- return options;
386
+ return options;
485
387
  }
388
+ //#endregion
389
+ //#region src/useIsMutating.ts
486
390
  function useIsMutating(filters, queryClient) {
487
- const client = createMemo(() => useQueryClient(queryClient?.()));
488
- const mutationCache = createMemo(() => client().getMutationCache());
489
- const [mutations, setMutations] = createSignal(
490
- client().isMutating(filters?.())
491
- );
492
- const unsubscribe = mutationCache().subscribe((_result) => {
493
- setMutations(client().isMutating(filters?.()));
494
- });
495
- onCleanup(unsubscribe);
496
- return mutations;
391
+ const resolveClient = useQueryClientResolver(queryClient);
392
+ const client = createMemo(() => resolveClient());
393
+ const mutationCache = createMemo(() => client().getMutationCache());
394
+ const [mutations, setMutations] = createSignal(client().isMutating(filters?.()));
395
+ createEffect(() => {
396
+ setMutations(client().isMutating(filters?.()));
397
+ const unsubscribe = mutationCache().subscribe(() => {
398
+ setMutations(client().isMutating(filters?.()));
399
+ });
400
+ onCleanup(unsubscribe);
401
+ });
402
+ return mutations;
497
403
  }
404
+ //#endregion
405
+ //#region src/useMutationState.ts
498
406
  function getResult(mutationCache, options) {
499
- return mutationCache.findAll(options.filters).map(
500
- (mutation) => options.select ? options.select(mutation) : mutation.state
501
- );
407
+ return mutationCache.findAll(options.filters).map((mutation) => options.select ? options.select(mutation) : mutation.state);
502
408
  }
503
409
  function useMutationState(options = () => ({}), queryClient) {
504
- const client = createMemo(() => useQueryClient(queryClient?.()));
505
- const mutationCache = createMemo(() => client().getMutationCache());
506
- const [result, setResult] = createSignal(
507
- getResult(mutationCache(), options())
508
- );
509
- createEffect(() => {
510
- const unsubscribe = mutationCache().subscribe(() => {
511
- const nextResult = replaceEqualDeep(
512
- result(),
513
- getResult(mutationCache(), options())
514
- );
515
- if (result() !== nextResult) {
516
- setResult(nextResult);
517
- }
518
- });
519
- onCleanup(unsubscribe);
520
- });
521
- return result;
410
+ const resolveClient = useQueryClientResolver(queryClient);
411
+ const client = createMemo(() => resolveClient());
412
+ const mutationCache = createMemo(() => client().getMutationCache());
413
+ const [result, setResult] = createSignal(getResult(mutationCache(), options()));
414
+ createEffect(() => {
415
+ const unsubscribe = mutationCache().subscribe(() => {
416
+ const nextResult = replaceEqualDeep(result(), getResult(mutationCache(), options()));
417
+ if (result() !== nextResult) setResult(nextResult);
418
+ });
419
+ onCleanup(unsubscribe);
420
+ });
421
+ return result;
522
422
  }
523
-
524
- // src/index.ts
525
- var createQuery = useQuery;
526
- var createInfiniteQuery = useInfiniteQuery;
527
- var createMutation = useMutation;
528
- var createQueries = useQueries;
529
-
530
- export { IsRestoringProvider, QueryClient, QueryClientContext, QueryClientProvider, createInfiniteQuery, useIsFetching as createIsFetching, useIsMutating as createIsMutating, createMutation, useMutationState as createMutationState, createQueries, createQuery, infiniteQueryOptions, mutationOptions, queryOptions, useInfiniteQuery, useIsFetching, useIsMutating, useIsRestoring, useMutation, useMutationState, useQueries, useQuery, useQueryClient };
423
+ //#endregion
424
+ //#region src/index.ts
425
+ /* istanbul ignore file */
426
+ const createQuery = useQuery;
427
+ const createInfiniteQuery = useInfiniteQuery;
428
+ const createMutation = useMutation;
429
+ const createQueries = useQueries;
430
+ //#endregion
431
+ export { IsRestoringProvider, QueryClient, QueryClientContext, QueryClientProvider, createInfiniteQuery, useIsFetching as createIsFetching, useIsFetching, useIsMutating as createIsMutating, useIsMutating, createMutation, useMutationState as createMutationState, useMutationState, createQueries, createQuery, infiniteQueryOptions, mutationOptions, queryOptions, useInfiniteQuery, useIsRestoring, useMutation, useQueries, useQuery, useQueryClient };