@tanstack/svelte-query 5.90.2 → 6.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.
Files changed (89) hide show
  1. package/dist/HydrationBoundary.svelte +15 -4
  2. package/dist/HydrationBoundary.svelte.d.ts +9 -19
  3. package/dist/HydrationBoundary.svelte.d.ts.map +1 -1
  4. package/dist/QueryClientProvider.svelte +4 -2
  5. package/dist/QueryClientProvider.svelte.d.ts +4 -19
  6. package/dist/QueryClientProvider.svelte.d.ts.map +1 -1
  7. package/dist/containers.svelte.d.ts +19 -0
  8. package/dist/containers.svelte.d.ts.map +1 -0
  9. package/dist/containers.svelte.js +118 -0
  10. package/dist/context.d.ts +3 -3
  11. package/dist/context.d.ts.map +1 -1
  12. package/dist/context.js +4 -5
  13. package/dist/createBaseQuery.svelte.d.ts +10 -0
  14. package/dist/createBaseQuery.svelte.d.ts.map +1 -0
  15. package/dist/createBaseQuery.svelte.js +58 -0
  16. package/dist/createInfiniteQuery.d.ts +2 -2
  17. package/dist/createInfiniteQuery.d.ts.map +1 -1
  18. package/dist/createInfiniteQuery.js +1 -1
  19. package/dist/createMutation.svelte.d.ts +8 -0
  20. package/dist/createMutation.svelte.d.ts.map +1 -0
  21. package/dist/createMutation.svelte.js +50 -0
  22. package/dist/createQueries.svelte.d.ts +76 -0
  23. package/dist/createQueries.svelte.d.ts.map +1 -0
  24. package/dist/createQueries.svelte.js +39 -0
  25. package/dist/createQuery.d.ts +4 -4
  26. package/dist/createQuery.d.ts.map +1 -1
  27. package/dist/createQuery.js +1 -1
  28. package/dist/index.d.ts +6 -6
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +5 -5
  31. package/dist/types.d.ts +11 -8
  32. package/dist/types.d.ts.map +1 -1
  33. package/dist/useIsFetching.svelte.d.ts +4 -0
  34. package/dist/useIsFetching.svelte.d.ts.map +1 -0
  35. package/dist/useIsFetching.svelte.js +7 -0
  36. package/dist/useIsMutating.svelte.d.ts +4 -0
  37. package/dist/useIsMutating.svelte.d.ts.map +1 -0
  38. package/dist/useIsMutating.svelte.js +7 -0
  39. package/dist/useIsRestoring.d.ts +2 -2
  40. package/dist/useIsRestoring.d.ts.map +1 -1
  41. package/dist/{useMutationState.d.ts → useMutationState.svelte.d.ts} +2 -3
  42. package/dist/useMutationState.svelte.d.ts.map +1 -0
  43. package/dist/useMutationState.svelte.js +33 -0
  44. package/dist/utils.svelte.d.ts +4 -0
  45. package/dist/utils.svelte.d.ts.map +1 -0
  46. package/dist/utils.svelte.js +31 -0
  47. package/package.json +9 -3
  48. package/src/HydrationBoundary.svelte +15 -4
  49. package/src/QueryClientProvider.svelte +4 -2
  50. package/src/containers.svelte.ts +123 -0
  51. package/src/context.ts +10 -11
  52. package/src/createBaseQuery.svelte.ts +107 -0
  53. package/src/createInfiniteQuery.ts +4 -4
  54. package/src/createMutation.svelte.ts +91 -0
  55. package/src/{createQueries.ts → createQueries.svelte.ts} +86 -96
  56. package/src/createQuery.ts +15 -17
  57. package/src/index.ts +6 -6
  58. package/src/types.ts +12 -9
  59. package/src/useIsFetching.svelte.ts +16 -0
  60. package/src/useIsMutating.svelte.ts +16 -0
  61. package/src/useIsRestoring.ts +2 -2
  62. package/src/useMutationState.svelte.ts +56 -0
  63. package/src/utils.svelte.ts +44 -0
  64. package/dist/createBaseQuery.d.ts +0 -4
  65. package/dist/createBaseQuery.d.ts.map +0 -1
  66. package/dist/createBaseQuery.js +0 -40
  67. package/dist/createMutation.d.ts +0 -4
  68. package/dist/createMutation.d.ts.map +0 -1
  69. package/dist/createMutation.js +0 -25
  70. package/dist/createQueries.d.ts +0 -77
  71. package/dist/createQueries.d.ts.map +0 -1
  72. package/dist/createQueries.js +0 -40
  73. package/dist/useIsFetching.d.ts +0 -4
  74. package/dist/useIsFetching.d.ts.map +0 -1
  75. package/dist/useIsFetching.js +0 -20
  76. package/dist/useIsMutating.d.ts +0 -4
  77. package/dist/useIsMutating.d.ts.map +0 -1
  78. package/dist/useIsMutating.js +0 -20
  79. package/dist/useMutationState.d.ts.map +0 -1
  80. package/dist/useMutationState.js +0 -23
  81. package/dist/utils.d.ts +0 -4
  82. package/dist/utils.d.ts.map +0 -1
  83. package/dist/utils.js +0 -3
  84. package/src/createBaseQuery.ts +0 -85
  85. package/src/createMutation.ts +0 -54
  86. package/src/useIsFetching.ts +0 -30
  87. package/src/useIsMutating.ts +0 -30
  88. package/src/useMutationState.ts +0 -49
  89. package/src/utils.ts +0 -8
@@ -0,0 +1,107 @@
1
+ import { useIsRestoring } from './useIsRestoring.js'
2
+ import { useQueryClient } from './useQueryClient.js'
3
+ import { createRawRef } from './containers.svelte.js'
4
+ import { watchChanges } from './utils.svelte.js'
5
+ import type { QueryClient, QueryKey, QueryObserver } from '@tanstack/query-core'
6
+ import type {
7
+ Accessor,
8
+ CreateBaseQueryOptions,
9
+ CreateBaseQueryResult,
10
+ } from './types.js'
11
+
12
+ /**
13
+ * Base implementation for `createQuery` and `createInfiniteQuery`
14
+ * @param options - A function that returns query options
15
+ * @param Observer - The observer from query-core
16
+ * @param queryClient - Custom query client which overrides provider
17
+ */
18
+ export function createBaseQuery<
19
+ TQueryFnData,
20
+ TError,
21
+ TData,
22
+ TQueryData,
23
+ TQueryKey extends QueryKey,
24
+ >(
25
+ options: Accessor<
26
+ CreateBaseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>
27
+ >,
28
+ Observer: typeof QueryObserver,
29
+ queryClient?: Accessor<QueryClient>,
30
+ ): CreateBaseQueryResult<TData, TError> {
31
+ /** Load query client */
32
+ const client = $derived(useQueryClient(queryClient?.()))
33
+ const isRestoring = useIsRestoring()
34
+
35
+ const resolvedOptions = $derived.by(() => {
36
+ const opts = client.defaultQueryOptions(options())
37
+ opts._optimisticResults = isRestoring.current ? 'isRestoring' : 'optimistic'
38
+ return opts
39
+ })
40
+
41
+ /** Creates the observer */
42
+ // svelte-ignore state_referenced_locally - intentional, initial value
43
+ let observer = $state(
44
+ new Observer<TQueryFnData, TError, TData, TQueryData, TQueryKey>(
45
+ client,
46
+ resolvedOptions,
47
+ ),
48
+ )
49
+ watchChanges(
50
+ () => client,
51
+ 'pre',
52
+ () => {
53
+ observer = new Observer<
54
+ TQueryFnData,
55
+ TError,
56
+ TData,
57
+ TQueryData,
58
+ TQueryKey
59
+ >(client, resolvedOptions)
60
+ },
61
+ )
62
+
63
+ function createResult() {
64
+ const result = observer.getOptimisticResult(resolvedOptions)
65
+ return !resolvedOptions.notifyOnChangeProps
66
+ ? observer.trackResult(result)
67
+ : result
68
+ }
69
+ const [query, update] = createRawRef(
70
+ // svelte-ignore state_referenced_locally - intentional, initial value
71
+ createResult(),
72
+ )
73
+
74
+ $effect(() => {
75
+ const unsubscribe = isRestoring.current
76
+ ? () => undefined
77
+ : observer.subscribe(() => update(createResult()))
78
+ observer.updateResult()
79
+ return unsubscribe
80
+ })
81
+
82
+ watchChanges(
83
+ () => resolvedOptions,
84
+ 'pre',
85
+ () => {
86
+ observer.setOptions(resolvedOptions)
87
+ },
88
+ )
89
+ watchChanges(
90
+ () => [resolvedOptions, observer],
91
+ 'pre',
92
+ () => {
93
+ // The only reason this is necessary is because of `isRestoring`.
94
+ // Because we don't subscribe while restoring, the following can occur:
95
+ // - `isRestoring` is true
96
+ // - `isRestoring` becomes false
97
+ // - `observer.subscribe` and `observer.updateResult` is called in the above effect,
98
+ // but the subsequent `fetch` has already completed
99
+ // - `result` misses the intermediate restored-but-not-fetched state
100
+ //
101
+ // this could technically be its own effect but that doesn't seem necessary
102
+ update(createResult())
103
+ },
104
+ )
105
+
106
+ return query
107
+ }
@@ -1,5 +1,5 @@
1
1
  import { InfiniteQueryObserver } from '@tanstack/query-core'
2
- import { createBaseQuery } from './createBaseQuery.js'
2
+ import { createBaseQuery } from './createBaseQuery.svelte.js'
3
3
  import type {
4
4
  DefaultError,
5
5
  InfiniteData,
@@ -8,9 +8,9 @@ import type {
8
8
  QueryObserver,
9
9
  } from '@tanstack/query-core'
10
10
  import type {
11
+ Accessor,
11
12
  CreateInfiniteQueryOptions,
12
13
  CreateInfiniteQueryResult,
13
- StoreOrVal,
14
14
  } from './types.js'
15
15
 
16
16
  export function createInfiniteQuery<
@@ -20,7 +20,7 @@ export function createInfiniteQuery<
20
20
  TQueryKey extends QueryKey = QueryKey,
21
21
  TPageParam = unknown,
22
22
  >(
23
- options: StoreOrVal<
23
+ options: Accessor<
24
24
  CreateInfiniteQueryOptions<
25
25
  TQueryFnData,
26
26
  TError,
@@ -29,7 +29,7 @@ export function createInfiniteQuery<
29
29
  TPageParam
30
30
  >
31
31
  >,
32
- queryClient?: QueryClient,
32
+ queryClient?: Accessor<QueryClient>,
33
33
  ): CreateInfiniteQueryResult<TData, TError> {
34
34
  return createBaseQuery(
35
35
  options,
@@ -0,0 +1,91 @@
1
+ import { MutationObserver, noop, notifyManager } from '@tanstack/query-core'
2
+ import { useQueryClient } from './useQueryClient.js'
3
+ import { watchChanges } from './utils.svelte.js'
4
+ import type {
5
+ Accessor,
6
+ CreateMutateFunction,
7
+ CreateMutationOptions,
8
+ CreateMutationResult,
9
+ } from './types.js'
10
+
11
+ import type { DefaultError, QueryClient } from '@tanstack/query-core'
12
+
13
+ /**
14
+ * @param options - A function that returns mutation options
15
+ * @param queryClient - Custom query client which overrides provider
16
+ */
17
+ export function createMutation<
18
+ TData = unknown,
19
+ TError = DefaultError,
20
+ TVariables = void,
21
+ TContext = unknown,
22
+ >(
23
+ options: Accessor<CreateMutationOptions<TData, TError, TVariables, TContext>>,
24
+ queryClient?: Accessor<QueryClient>,
25
+ ): CreateMutationResult<TData, TError, TVariables, TContext> {
26
+ const client = $derived(useQueryClient(queryClient?.()))
27
+
28
+ // svelte-ignore state_referenced_locally - intentional, initial value
29
+ let observer = $state(
30
+ // svelte-ignore state_referenced_locally - intentional, initial value
31
+ new MutationObserver<TData, TError, TVariables, TContext>(
32
+ client,
33
+ options(),
34
+ ),
35
+ )
36
+
37
+ watchChanges(
38
+ () => client,
39
+ 'pre',
40
+ () => {
41
+ observer = new MutationObserver(client, options())
42
+ },
43
+ )
44
+
45
+ $effect.pre(() => {
46
+ observer.setOptions(options())
47
+ })
48
+
49
+ const mutate = <CreateMutateFunction<TData, TError, TVariables, TContext>>((
50
+ variables,
51
+ mutateOptions,
52
+ ) => {
53
+ observer.mutate(variables, mutateOptions).catch(noop)
54
+ })
55
+
56
+ let result = $state(observer.getCurrentResult())
57
+ watchChanges(
58
+ () => observer,
59
+ 'pre',
60
+ () => {
61
+ result = observer.getCurrentResult()
62
+ },
63
+ )
64
+
65
+ $effect.pre(() => {
66
+ const unsubscribe = observer.subscribe((val) => {
67
+ notifyManager.batchCalls(() => {
68
+ Object.assign(result, val)
69
+ })()
70
+ })
71
+ return unsubscribe
72
+ })
73
+
74
+ const resultProxy = $derived(
75
+ new Proxy(result, {
76
+ get: (_, prop) => {
77
+ const r = {
78
+ ...result,
79
+ mutate,
80
+ mutateAsync: result.mutate,
81
+ }
82
+ if (prop == 'value') return r
83
+ // @ts-expect-error
84
+ return r[prop]
85
+ },
86
+ }),
87
+ )
88
+
89
+ // @ts-expect-error
90
+ return resultProxy
91
+ }
@@ -1,33 +1,33 @@
1
- import { QueriesObserver, noop, notifyManager } from '@tanstack/query-core'
2
- import { derived, get, readable } from 'svelte/store'
1
+ import { QueriesObserver } from '@tanstack/query-core'
3
2
  import { useIsRestoring } from './useIsRestoring.js'
3
+ import { createRawRef } from './containers.svelte.js'
4
4
  import { useQueryClient } from './useQueryClient.js'
5
- import { isSvelteStore } from './utils.js'
6
- import type { Readable } from 'svelte/store'
7
- import type { StoreOrVal } from './types.js'
5
+ import type {
6
+ Accessor,
7
+ CreateQueryOptions,
8
+ CreateQueryResult,
9
+ DefinedCreateQueryResult,
10
+ } from './types.js'
8
11
  import type {
9
12
  DefaultError,
10
- DefinedQueryObserverResult,
11
13
  OmitKeyof,
12
14
  QueriesObserverOptions,
13
15
  QueriesPlaceholderDataFunction,
14
16
  QueryClient,
15
17
  QueryFunction,
16
18
  QueryKey,
17
- QueryObserverOptions,
18
- QueryObserverResult,
19
19
  ThrowOnError,
20
20
  } from '@tanstack/query-core'
21
21
 
22
22
  // This defines the `CreateQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.
23
23
  // `placeholderData` function always gets undefined passed
24
- type QueryObserverOptionsForCreateQueries<
24
+ type CreateQueryOptionsForCreateQueries<
25
25
  TQueryFnData = unknown,
26
26
  TError = DefaultError,
27
27
  TData = TQueryFnData,
28
28
  TQueryKey extends QueryKey = QueryKey,
29
29
  > = OmitKeyof<
30
- QueryObserverOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>,
30
+ CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
31
31
  'placeholderData'
32
32
  > & {
33
33
  placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>
@@ -37,60 +37,60 @@ type QueryObserverOptionsForCreateQueries<
37
37
  type MAXIMUM_DEPTH = 20
38
38
 
39
39
  // Widen the type of the symbol to enable type inference even if skipToken is not immutable.
40
- type SkipTokenForUseQueries = symbol
40
+ type SkipTokenForCreateQueries = symbol
41
41
 
42
- type GetQueryObserverOptionsForCreateQueries<T> =
42
+ type GetCreateQueryOptionsForCreateQueries<T> =
43
43
  // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }
44
44
  T extends {
45
45
  queryFnData: infer TQueryFnData
46
46
  error?: infer TError
47
47
  data: infer TData
48
48
  }
49
- ? QueryObserverOptionsForCreateQueries<TQueryFnData, TError, TData>
49
+ ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError, TData>
50
50
  : T extends { queryFnData: infer TQueryFnData; error?: infer TError }
51
- ? QueryObserverOptionsForCreateQueries<TQueryFnData, TError>
51
+ ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError>
52
52
  : T extends { data: infer TData; error?: infer TError }
53
- ? QueryObserverOptionsForCreateQueries<unknown, TError, TData>
53
+ ? CreateQueryOptionsForCreateQueries<unknown, TError, TData>
54
54
  : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData]
55
55
  T extends [infer TQueryFnData, infer TError, infer TData]
56
- ? QueryObserverOptionsForCreateQueries<TQueryFnData, TError, TData>
56
+ ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError, TData>
57
57
  : T extends [infer TQueryFnData, infer TError]
58
- ? QueryObserverOptionsForCreateQueries<TQueryFnData, TError>
58
+ ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError>
59
59
  : T extends [infer TQueryFnData]
60
- ? QueryObserverOptionsForCreateQueries<TQueryFnData>
60
+ ? CreateQueryOptionsForCreateQueries<TQueryFnData>
61
61
  : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided
62
62
  T extends {
63
63
  queryFn?:
64
64
  | QueryFunction<infer TQueryFnData, infer TQueryKey>
65
- | SkipTokenForUseQueries
65
+ | SkipTokenForCreateQueries
66
66
  select?: (data: any) => infer TData
67
67
  throwOnError?: ThrowOnError<any, infer TError, any, any>
68
68
  }
69
- ? QueryObserverOptionsForCreateQueries<
69
+ ? CreateQueryOptionsForCreateQueries<
70
70
  TQueryFnData,
71
71
  unknown extends TError ? DefaultError : TError,
72
72
  unknown extends TData ? TQueryFnData : TData,
73
73
  TQueryKey
74
74
  >
75
75
  : // Fallback
76
- QueryObserverOptionsForCreateQueries
76
+ CreateQueryOptionsForCreateQueries
77
77
 
78
- // A defined initialData setting should return a DefinedQueryObserverResult rather than CreateQueryResult
78
+ // A defined initialData setting should return a DefinedCreateQueryResult rather than CreateQueryResult
79
79
  type GetDefinedOrUndefinedQueryResult<T, TData, TError = unknown> = T extends {
80
80
  initialData?: infer TInitialData
81
81
  }
82
82
  ? unknown extends TInitialData
83
- ? QueryObserverResult<TData, TError>
83
+ ? CreateQueryResult<TData, TError>
84
84
  : TInitialData extends TData
85
- ? DefinedQueryObserverResult<TData, TError>
85
+ ? DefinedCreateQueryResult<TData, TError>
86
86
  : TInitialData extends () => infer TInitialDataResult
87
87
  ? unknown extends TInitialDataResult
88
- ? QueryObserverResult<TData, TError>
88
+ ? CreateQueryResult<TData, TError>
89
89
  : TInitialDataResult extends TData
90
- ? DefinedQueryObserverResult<TData, TError>
91
- : QueryObserverResult<TData, TError>
92
- : QueryObserverResult<TData, TError>
93
- : QueryObserverResult<TData, TError>
90
+ ? DefinedCreateQueryResult<TData, TError>
91
+ : CreateQueryResult<TData, TError>
92
+ : CreateQueryResult<TData, TError>
93
+ : CreateQueryResult<TData, TError>
94
94
 
95
95
  type GetCreateQueryResult<T> =
96
96
  // Part 1: responsible for mapping explicit type parameter to function result, if object
@@ -111,7 +111,7 @@ type GetCreateQueryResult<T> =
111
111
  T extends {
112
112
  queryFn?:
113
113
  | QueryFunction<infer TQueryFnData, any>
114
- | SkipTokenForUseQueries
114
+ | SkipTokenForCreateQueries
115
115
  select?: (data: any) => infer TData
116
116
  throwOnError?: ThrowOnError<any, infer TError, any, any>
117
117
  }
@@ -121,7 +121,7 @@ type GetCreateQueryResult<T> =
121
121
  unknown extends TError ? DefaultError : TError
122
122
  >
123
123
  : // Fallback
124
- QueryObserverResult
124
+ CreateQueryResult
125
125
 
126
126
  /**
127
127
  * QueriesOptions reducer recursively unwraps function arguments to infer/enforce type param
@@ -131,15 +131,15 @@ export type QueriesOptions<
131
131
  TResults extends Array<any> = [],
132
132
  TDepth extends ReadonlyArray<number> = [],
133
133
  > = TDepth['length'] extends MAXIMUM_DEPTH
134
- ? Array<QueryObserverOptionsForCreateQueries>
134
+ ? Array<CreateQueryOptionsForCreateQueries>
135
135
  : T extends []
136
136
  ? []
137
137
  : T extends [infer Head]
138
- ? [...TResults, GetQueryObserverOptionsForCreateQueries<Head>]
138
+ ? [...TResults, GetCreateQueryOptionsForCreateQueries<Head>]
139
139
  : T extends [infer Head, ...infer Tails]
140
140
  ? QueriesOptions<
141
141
  [...Tails],
142
- [...TResults, GetQueryObserverOptionsForCreateQueries<Head>],
142
+ [...TResults, GetCreateQueryOptionsForCreateQueries<Head>],
143
143
  [...TDepth, 1]
144
144
  >
145
145
  : ReadonlyArray<unknown> extends T
@@ -147,7 +147,7 @@ export type QueriesOptions<
147
147
  : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type!
148
148
  // use this to infer the param types in the case of Array.map() argument
149
149
  T extends Array<
150
- QueryObserverOptionsForCreateQueries<
150
+ CreateQueryOptionsForCreateQueries<
151
151
  infer TQueryFnData,
152
152
  infer TError,
153
153
  infer TData,
@@ -155,7 +155,7 @@ export type QueriesOptions<
155
155
  >
156
156
  >
157
157
  ? Array<
158
- QueryObserverOptionsForCreateQueries<
158
+ CreateQueryOptionsForCreateQueries<
159
159
  TQueryFnData,
160
160
  TError,
161
161
  TData,
@@ -163,7 +163,7 @@ export type QueriesOptions<
163
163
  >
164
164
  >
165
165
  : // Fallback
166
- Array<QueryObserverOptionsForCreateQueries>
166
+ Array<CreateQueryOptionsForCreateQueries>
167
167
 
168
168
  /**
169
169
  * QueriesResults reducer recursively maps type param to results
@@ -173,7 +173,7 @@ export type QueriesResults<
173
173
  TResults extends Array<any> = [],
174
174
  TDepth extends ReadonlyArray<number> = [],
175
175
  > = TDepth['length'] extends MAXIMUM_DEPTH
176
- ? Array<QueryObserverResult>
176
+ ? Array<CreateQueryResult>
177
177
  : T extends []
178
178
  ? []
179
179
  : T extends [infer Head]
@@ -190,75 +190,65 @@ export function createQueries<
190
190
  T extends Array<any>,
191
191
  TCombinedResult = QueriesResults<T>,
192
192
  >(
193
- {
194
- queries,
195
- ...options
196
- }: {
193
+ createQueriesOptions: Accessor<{
197
194
  queries:
198
- | StoreOrVal<[...QueriesOptions<T>]>
199
- | StoreOrVal<
200
- [...{ [K in keyof T]: GetQueryObserverOptionsForCreateQueries<T[K]> }]
201
- >
195
+ | readonly [...QueriesOptions<T>]
196
+ | readonly [
197
+ ...{ [K in keyof T]: GetCreateQueryOptionsForCreateQueries<T[K]> },
198
+ ]
202
199
  combine?: (result: QueriesResults<T>) => TCombinedResult
203
- },
204
- queryClient?: QueryClient,
205
- ): Readable<TCombinedResult> {
206
- const client = useQueryClient(queryClient)
200
+ }>,
201
+ queryClient?: Accessor<QueryClient>,
202
+ ): TCombinedResult {
203
+ const client = $derived(useQueryClient(queryClient?.()))
207
204
  const isRestoring = useIsRestoring()
208
205
 
209
- const queriesStore = isSvelteStore(queries) ? queries : readable(queries)
210
-
211
- const defaultedQueriesStore = derived(
212
- [queriesStore, isRestoring],
213
- ([$queries, $isRestoring]) => {
214
- return $queries.map((opts) => {
215
- const defaultedOptions = client.defaultQueryOptions(
216
- opts as QueryObserverOptions,
217
- )
218
- // Make sure the results are already in fetching state before subscribing or updating options
219
- defaultedOptions._optimisticResults = $isRestoring
220
- ? 'isRestoring'
221
- : 'optimistic'
222
- return defaultedOptions
223
- })
224
- },
206
+ const { queries, combine } = $derived.by(createQueriesOptions)
207
+ const resolvedQueryOptions = $derived(
208
+ queries.map((opts) => {
209
+ const resolvedOptions = client.defaultQueryOptions(opts)
210
+ // Make sure the results are already in fetching state before subscribing or updating options
211
+ resolvedOptions._optimisticResults = isRestoring.current
212
+ ? 'isRestoring'
213
+ : 'optimistic'
214
+ return resolvedOptions
215
+ }),
225
216
  )
226
- const observer = new QueriesObserver<TCombinedResult>(
227
- client,
228
- get(defaultedQueriesStore),
229
- options as QueriesObserverOptions<TCombinedResult>,
217
+
218
+ // can't do same as createMutation, as QueriesObserver has no `setOptions` method
219
+ const observer = $derived(
220
+ new QueriesObserver<TCombinedResult>(
221
+ client,
222
+ resolvedQueryOptions,
223
+ combine as QueriesObserverOptions<TCombinedResult>,
224
+ ),
230
225
  )
231
226
 
232
- defaultedQueriesStore.subscribe(($defaultedQueries) => {
233
- // Do not notify on updates because of changes in the options because
234
- // these changes should already be reflected in the optimistic result.
235
- observer.setQueries(
236
- $defaultedQueries,
237
- options as QueriesObserverOptions<TCombinedResult>,
227
+ function createResult() {
228
+ const [_, getCombinedResult, trackResult] = observer.getOptimisticResult(
229
+ resolvedQueryOptions,
230
+ combine as QueriesObserverOptions<TCombinedResult>['combine'],
238
231
  )
239
- })
232
+ return getCombinedResult(trackResult())
233
+ }
240
234
 
241
- const result = derived([isRestoring], ([$isRestoring], set) => {
242
- const unsubscribe = $isRestoring
243
- ? noop
244
- : observer.subscribe(notifyManager.batchCalls(set))
235
+ // @ts-expect-error - the crazy-complex TCombinedResult type doesn't like being called an array
236
+ // svelte-ignore state_referenced_locally
237
+ const [results, update] = createRawRef<TCombinedResult>(createResult())
245
238
 
246
- return () => unsubscribe()
239
+ $effect(() => {
240
+ const unsubscribe = isRestoring.current
241
+ ? () => undefined
242
+ : observer.subscribe(() => update(createResult()))
243
+ return unsubscribe
247
244
  })
248
245
 
249
- const { subscribe } = derived(
250
- [result, defaultedQueriesStore],
251
- // @ts-expect-error svelte-check thinks this is unused
252
- ([$result, $defaultedQueriesStore]) => {
253
- const [rawResult, combineResult, trackResult] =
254
- observer.getOptimisticResult(
255
- $defaultedQueriesStore,
256
- (options as QueriesObserverOptions<TCombinedResult>).combine,
257
- )
258
- $result = rawResult
259
- return combineResult(trackResult())
260
- },
261
- )
246
+ $effect.pre(() => {
247
+ observer.setQueries(resolvedQueryOptions, {
248
+ combine,
249
+ } as QueriesObserverOptions<TCombinedResult>)
250
+ update(createResult())
251
+ })
262
252
 
263
- return { subscribe }
253
+ return results
264
254
  }
@@ -1,11 +1,11 @@
1
1
  import { QueryObserver } from '@tanstack/query-core'
2
- import { createBaseQuery } from './createBaseQuery.js'
2
+ import { createBaseQuery } from './createBaseQuery.svelte.js'
3
3
  import type { DefaultError, QueryClient, QueryKey } from '@tanstack/query-core'
4
4
  import type {
5
+ Accessor,
5
6
  CreateQueryOptions,
6
7
  CreateQueryResult,
7
8
  DefinedCreateQueryResult,
8
- StoreOrVal,
9
9
  } from './types.js'
10
10
  import type {
11
11
  DefinedInitialDataOptions,
@@ -18,11 +18,11 @@ export function createQuery<
18
18
  TData = TQueryFnData,
19
19
  TQueryKey extends QueryKey = QueryKey,
20
20
  >(
21
- options: StoreOrVal<
22
- DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
21
+ options: Accessor<
22
+ UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
23
23
  >,
24
- queryClient?: QueryClient,
25
- ): DefinedCreateQueryResult<TData, TError>
24
+ queryClient?: Accessor<QueryClient>,
25
+ ): CreateQueryResult<TData, TError>
26
26
 
27
27
  export function createQuery<
28
28
  TQueryFnData = unknown,
@@ -30,27 +30,25 @@ export function createQuery<
30
30
  TData = TQueryFnData,
31
31
  TQueryKey extends QueryKey = QueryKey,
32
32
  >(
33
- options: StoreOrVal<
34
- UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
33
+ options: Accessor<
34
+ DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
35
35
  >,
36
- queryClient?: QueryClient,
37
- ): CreateQueryResult<TData, TError>
36
+ queryClient?: Accessor<QueryClient>,
37
+ ): DefinedCreateQueryResult<TData, TError>
38
38
 
39
39
  export function createQuery<
40
- TQueryFnData = unknown,
40
+ TQueryFnData,
41
41
  TError = DefaultError,
42
42
  TData = TQueryFnData,
43
43
  TQueryKey extends QueryKey = QueryKey,
44
44
  >(
45
- options: StoreOrVal<
46
- CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>
47
- >,
48
- queryClient?: QueryClient,
45
+ options: Accessor<CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>>,
46
+ queryClient?: Accessor<QueryClient>,
49
47
  ): CreateQueryResult<TData, TError>
50
48
 
51
49
  export function createQuery(
52
- options: StoreOrVal<CreateQueryOptions>,
53
- queryClient?: QueryClient,
50
+ options: Accessor<CreateQueryOptions>,
51
+ queryClient?: Accessor<QueryClient>,
54
52
  ) {
55
53
  return createBaseQuery(options, QueryObserver, queryClient)
56
54
  }
package/src/index.ts CHANGED
@@ -8,20 +8,20 @@ export * from './types.js'
8
8
  export * from './context.js'
9
9
 
10
10
  export { createQuery } from './createQuery.js'
11
- export type { QueriesResults, QueriesOptions } from './createQueries.js'
11
+ export type { QueriesResults, QueriesOptions } from './createQueries.svelte.js'
12
12
  export type {
13
13
  DefinedInitialDataOptions,
14
14
  UndefinedInitialDataOptions,
15
15
  } from './queryOptions.js'
16
16
  export { queryOptions } from './queryOptions.js'
17
- export { createQueries } from './createQueries.js'
17
+ export { createQueries } from './createQueries.svelte.js'
18
18
  export { createInfiniteQuery } from './createInfiniteQuery.js'
19
19
  export { infiniteQueryOptions } from './infiniteQueryOptions.js'
20
- export { createMutation } from './createMutation.js'
21
- export { useMutationState } from './useMutationState.js'
20
+ export { createMutation } from './createMutation.svelte.js'
21
+ export { useMutationState } from './useMutationState.svelte.js'
22
22
  export { useQueryClient } from './useQueryClient.js'
23
- export { useIsFetching } from './useIsFetching.js'
24
- export { useIsMutating } from './useIsMutating.js'
23
+ export { useIsFetching } from './useIsFetching.svelte.js'
24
+ export { useIsMutating } from './useIsMutating.svelte.js'
25
25
  export { useIsRestoring } from './useIsRestoring.js'
26
26
  export { useHydrate } from './useHydrate.js'
27
27
  export { default as HydrationBoundary } from './HydrationBoundary.svelte'