@tanstack/vue-query 5.0.0-beta.9 → 5.0.0-rc.11

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 (175) hide show
  1. package/build/legacy/devtools/devtools.cjs.map +1 -1
  2. package/build/legacy/devtools/devtools.js.map +1 -1
  3. package/build/legacy/index.d.cts +2 -2
  4. package/build/legacy/index.d.ts +2 -2
  5. package/build/legacy/mutationCache.cjs.map +1 -1
  6. package/build/legacy/mutationCache.d.cts +1 -1
  7. package/build/legacy/mutationCache.d.ts +1 -1
  8. package/build/legacy/mutationCache.js.map +1 -1
  9. package/build/legacy/queryCache.cjs.map +1 -1
  10. package/build/legacy/queryCache.d.cts +1 -1
  11. package/build/legacy/queryCache.d.ts +1 -1
  12. package/build/legacy/queryCache.js.map +1 -1
  13. package/build/legacy/queryClient.cjs +3 -4
  14. package/build/legacy/queryClient.cjs.map +1 -1
  15. package/build/legacy/queryClient.d.cts +4 -4
  16. package/build/legacy/queryClient.d.ts +4 -4
  17. package/build/legacy/queryClient.js +3 -4
  18. package/build/legacy/queryClient.js.map +1 -1
  19. package/build/legacy/types.cjs.map +1 -1
  20. package/build/legacy/types.d.cts +8 -2
  21. package/build/legacy/types.d.ts +8 -2
  22. package/build/legacy/useBaseQuery.cjs +62 -32
  23. package/build/legacy/useBaseQuery.cjs.map +1 -1
  24. package/build/legacy/useBaseQuery.d.cts +1 -1
  25. package/build/legacy/useBaseQuery.d.ts +1 -1
  26. package/build/legacy/useBaseQuery.js +64 -33
  27. package/build/legacy/useBaseQuery.js.map +1 -1
  28. package/build/legacy/useInfiniteQuery.cjs +1 -6
  29. package/build/legacy/useInfiniteQuery.cjs.map +1 -1
  30. package/build/legacy/useInfiniteQuery.d.cts +1 -1
  31. package/build/legacy/useInfiniteQuery.d.ts +1 -1
  32. package/build/legacy/useInfiniteQuery.js +1 -6
  33. package/build/legacy/useInfiniteQuery.js.map +1 -1
  34. package/build/legacy/useIsFetching.cjs +13 -13
  35. package/build/legacy/useIsFetching.cjs.map +1 -1
  36. package/build/legacy/useIsFetching.js +14 -14
  37. package/build/legacy/useIsFetching.js.map +1 -1
  38. package/build/legacy/useMutation.cjs +18 -7
  39. package/build/legacy/useMutation.cjs.map +1 -1
  40. package/build/legacy/useMutation.js +20 -8
  41. package/build/legacy/useMutation.js.map +1 -1
  42. package/build/legacy/useMutationState.cjs +10 -7
  43. package/build/legacy/useMutationState.cjs.map +1 -1
  44. package/build/legacy/useMutationState.js +18 -8
  45. package/build/legacy/useMutationState.js.map +1 -1
  46. package/build/legacy/useQueries.cjs +12 -2
  47. package/build/legacy/useQueries.cjs.map +1 -1
  48. package/build/legacy/useQueries.d.cts +7 -5
  49. package/build/legacy/useQueries.d.ts +7 -5
  50. package/build/legacy/useQueries.js +20 -3
  51. package/build/legacy/useQueries.js.map +1 -1
  52. package/build/legacy/{useQuery-846c66db.d.ts → useQuery-62b5e5ac.d.ts} +9 -7
  53. package/build/legacy/{useQuery-ebff9211.d.ts → useQuery-f89ce9b1.d.ts} +9 -7
  54. package/build/legacy/useQuery.cjs +1 -4
  55. package/build/legacy/useQuery.cjs.map +1 -1
  56. package/build/legacy/useQuery.d.cts +1 -1
  57. package/build/legacy/useQuery.d.ts +1 -1
  58. package/build/legacy/useQuery.js +1 -4
  59. package/build/legacy/useQuery.js.map +1 -1
  60. package/build/legacy/useQueryClient.cjs +4 -4
  61. package/build/legacy/useQueryClient.cjs.map +1 -1
  62. package/build/legacy/useQueryClient.js +5 -5
  63. package/build/legacy/useQueryClient.js.map +1 -1
  64. package/build/legacy/utils.cjs +8 -0
  65. package/build/legacy/utils.cjs.map +1 -1
  66. package/build/legacy/utils.d.cts +2 -1
  67. package/build/legacy/utils.d.ts +2 -1
  68. package/build/legacy/utils.js +7 -0
  69. package/build/legacy/utils.js.map +1 -1
  70. package/build/legacy/vueQueryPlugin.cjs +2 -0
  71. package/build/legacy/vueQueryPlugin.cjs.map +1 -1
  72. package/build/legacy/vueQueryPlugin.d.cts +3 -2
  73. package/build/legacy/vueQueryPlugin.d.ts +3 -2
  74. package/build/legacy/vueQueryPlugin.js +2 -0
  75. package/build/legacy/vueQueryPlugin.js.map +1 -1
  76. package/build/modern/devtools/devtools.cjs.map +1 -1
  77. package/build/modern/devtools/devtools.js.map +1 -1
  78. package/build/modern/index.d.cts +2 -2
  79. package/build/modern/index.d.ts +2 -2
  80. package/build/modern/mutationCache.cjs.map +1 -1
  81. package/build/modern/mutationCache.d.cts +1 -1
  82. package/build/modern/mutationCache.d.ts +1 -1
  83. package/build/modern/mutationCache.js.map +1 -1
  84. package/build/modern/queryCache.cjs.map +1 -1
  85. package/build/modern/queryCache.d.cts +1 -1
  86. package/build/modern/queryCache.d.ts +1 -1
  87. package/build/modern/queryCache.js.map +1 -1
  88. package/build/modern/queryClient.cjs +3 -4
  89. package/build/modern/queryClient.cjs.map +1 -1
  90. package/build/modern/queryClient.d.cts +4 -4
  91. package/build/modern/queryClient.d.ts +4 -4
  92. package/build/modern/queryClient.js +3 -4
  93. package/build/modern/queryClient.js.map +1 -1
  94. package/build/modern/types.cjs.map +1 -1
  95. package/build/modern/types.d.cts +8 -2
  96. package/build/modern/types.d.ts +8 -2
  97. package/build/modern/useBaseQuery.cjs +62 -32
  98. package/build/modern/useBaseQuery.cjs.map +1 -1
  99. package/build/modern/useBaseQuery.d.cts +1 -1
  100. package/build/modern/useBaseQuery.d.ts +1 -1
  101. package/build/modern/useBaseQuery.js +64 -33
  102. package/build/modern/useBaseQuery.js.map +1 -1
  103. package/build/modern/useInfiniteQuery.cjs +1 -6
  104. package/build/modern/useInfiniteQuery.cjs.map +1 -1
  105. package/build/modern/useInfiniteQuery.d.cts +1 -1
  106. package/build/modern/useInfiniteQuery.d.ts +1 -1
  107. package/build/modern/useInfiniteQuery.js +1 -6
  108. package/build/modern/useInfiniteQuery.js.map +1 -1
  109. package/build/modern/useIsFetching.cjs +13 -13
  110. package/build/modern/useIsFetching.cjs.map +1 -1
  111. package/build/modern/useIsFetching.js +14 -14
  112. package/build/modern/useIsFetching.js.map +1 -1
  113. package/build/modern/useMutation.cjs +18 -7
  114. package/build/modern/useMutation.cjs.map +1 -1
  115. package/build/modern/useMutation.js +20 -8
  116. package/build/modern/useMutation.js.map +1 -1
  117. package/build/modern/useMutationState.cjs +10 -7
  118. package/build/modern/useMutationState.cjs.map +1 -1
  119. package/build/modern/useMutationState.js +18 -8
  120. package/build/modern/useMutationState.js.map +1 -1
  121. package/build/modern/useQueries.cjs +12 -2
  122. package/build/modern/useQueries.cjs.map +1 -1
  123. package/build/modern/useQueries.d.cts +7 -5
  124. package/build/modern/useQueries.d.ts +7 -5
  125. package/build/modern/useQueries.js +20 -3
  126. package/build/modern/useQueries.js.map +1 -1
  127. package/build/modern/{useQuery-846c66db.d.ts → useQuery-62b5e5ac.d.ts} +9 -7
  128. package/build/modern/{useQuery-ebff9211.d.ts → useQuery-f89ce9b1.d.ts} +9 -7
  129. package/build/modern/useQuery.cjs +1 -4
  130. package/build/modern/useQuery.cjs.map +1 -1
  131. package/build/modern/useQuery.d.cts +1 -1
  132. package/build/modern/useQuery.d.ts +1 -1
  133. package/build/modern/useQuery.js +1 -4
  134. package/build/modern/useQuery.js.map +1 -1
  135. package/build/modern/useQueryClient.cjs +4 -3
  136. package/build/modern/useQueryClient.cjs.map +1 -1
  137. package/build/modern/useQueryClient.js +5 -4
  138. package/build/modern/useQueryClient.js.map +1 -1
  139. package/build/modern/utils.cjs +8 -0
  140. package/build/modern/utils.cjs.map +1 -1
  141. package/build/modern/utils.d.cts +2 -1
  142. package/build/modern/utils.d.ts +2 -1
  143. package/build/modern/utils.js +7 -0
  144. package/build/modern/utils.js.map +1 -1
  145. package/build/modern/vueQueryPlugin.cjs +1 -0
  146. package/build/modern/vueQueryPlugin.cjs.map +1 -1
  147. package/build/modern/vueQueryPlugin.d.cts +3 -2
  148. package/build/modern/vueQueryPlugin.d.ts +3 -2
  149. package/build/modern/vueQueryPlugin.js +1 -0
  150. package/build/modern/vueQueryPlugin.js.map +1 -1
  151. package/package.json +6 -6
  152. package/src/__mocks__/useBaseQuery.ts +1 -1
  153. package/src/__tests__/queryClient.test.ts +4 -4
  154. package/src/__tests__/useInfiniteQuery.test.ts +1 -1
  155. package/src/__tests__/useInfiniteQuery.types.test.tsx +5 -5
  156. package/src/__tests__/useMutation.test.ts +23 -3
  157. package/src/__tests__/useQueries.test.ts +23 -0
  158. package/src/__tests__/useQuery.test.ts +76 -1
  159. package/src/__tests__/useQueryClient.test.ts +4 -4
  160. package/src/__tests__/utils.test.ts +1 -1
  161. package/src/devtools/devtools.ts +2 -2
  162. package/src/mutationCache.ts +1 -1
  163. package/src/queryCache.ts +1 -1
  164. package/src/queryClient.ts +17 -10
  165. package/src/types.ts +25 -1
  166. package/src/useBaseQuery.ts +90 -37
  167. package/src/useInfiniteQuery.ts +19 -9
  168. package/src/useIsFetching.ts +16 -14
  169. package/src/useMutation.ts +25 -8
  170. package/src/useMutationState.ts +20 -9
  171. package/src/useQueries.ts +55 -28
  172. package/src/useQuery.ts +22 -9
  173. package/src/useQueryClient.ts +6 -5
  174. package/src/utils.ts +12 -0
  175. package/src/vueQueryPlugin.ts +3 -2
@@ -146,7 +146,7 @@ export function setupDevtools(app: any, queryClient: QueryClient) {
146
146
  api.sendInspectorTree(pluginId)
147
147
  api.sendInspectorState(pluginId)
148
148
 
149
- const queryEvents: QueryCacheNotifyEvent['type'][] = [
149
+ const queryEvents: Array<QueryCacheNotifyEvent['type']> = [
150
150
  'added',
151
151
  'removed',
152
152
  'updated',
@@ -189,7 +189,7 @@ export function setupDevtools(app: any, queryClient: QueryClient) {
189
189
  (a, b) => sortFns[settings.sortFn]!(a, b) * settings.baseSort,
190
190
  )
191
191
 
192
- const nodes: CustomInspectorNode[] = sorted.map((query) => {
192
+ const nodes: Array<CustomInspectorNode> = sorted.map((query) => {
193
193
  const stateLabel = getQueryStateLabel(query)
194
194
 
195
195
  return {
@@ -19,7 +19,7 @@ export class MutationCache extends MC {
19
19
  return super.find(cloneDeepUnref(filters))
20
20
  }
21
21
 
22
- findAll(filters: MaybeRefDeep<MutationFilters> = {}): Mutation[] {
22
+ findAll(filters: MaybeRefDeep<MutationFilters> = {}): Array<Mutation> {
23
23
  return super.findAll(cloneDeepUnref(filters))
24
24
  }
25
25
  }
package/src/queryCache.ts CHANGED
@@ -15,7 +15,7 @@ export class QueryCache extends QC {
15
15
  return super.find(cloneDeepUnref(filters))
16
16
  }
17
17
 
18
- findAll(filters: MaybeRefDeep<QueryFilters> = {}): Query[] {
18
+ findAll(filters: MaybeRefDeep<QueryFilters> = {}): Array<Query> {
19
19
  return super.findAll(cloneDeepUnref(filters))
20
20
  }
21
21
  }
@@ -29,12 +29,11 @@ import type {
29
29
  } from '@tanstack/query-core'
30
30
 
31
31
  export class QueryClient extends QC {
32
- constructor(config: MaybeRefDeep<QueryClientConfig> = {}) {
33
- const unreffedConfig = cloneDeepUnref(config)
34
- const vueQueryConfig: QueryClientConfig = {
35
- defaultOptions: unreffedConfig.defaultOptions,
36
- queryCache: unreffedConfig.queryCache || new QueryCache(),
37
- mutationCache: unreffedConfig.mutationCache || new MutationCache(),
32
+ constructor(config: QueryClientConfig = {}) {
33
+ const vueQueryConfig = {
34
+ defaultOptions: config.defaultOptions,
35
+ queryCache: config.queryCache || new QueryCache(),
36
+ mutationCache: config.mutationCache || new MutationCache(),
38
37
  }
39
38
  super(vueQueryConfig)
40
39
  }
@@ -57,7 +56,7 @@ export class QueryClient extends QC {
57
56
 
58
57
  getQueriesData<TData = unknown>(
59
58
  filters: MaybeRefDeep<QueryFilters>,
60
- ): [QueryKey, TData | undefined][] {
59
+ ): Array<[QueryKey, TData | undefined]> {
61
60
  return super.getQueriesData(cloneDeepUnref(filters))
62
61
  }
63
62
 
@@ -77,7 +76,7 @@ export class QueryClient extends QC {
77
76
  filters: MaybeRefDeep<QueryFilters>,
78
77
  updater: Updater<TData | undefined, TData | undefined>,
79
78
  options: MaybeRefDeep<SetDataOptions> = {},
80
- ): [QueryKey, TData | undefined][] {
79
+ ): Array<[QueryKey, TData | undefined]> {
81
80
  return super.setQueriesData(
82
81
  cloneDeepUnref(filters),
83
82
  updater,
@@ -134,17 +133,25 @@ export class QueryClient extends QC {
134
133
  TError = DefaultError,
135
134
  TData = TQueryFnData,
136
135
  TQueryKey extends QueryKey = QueryKey,
136
+ TPageParam = never,
137
137
  >(
138
- options: FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
138
+ options: FetchQueryOptions<
139
+ TQueryFnData,
140
+ TError,
141
+ TData,
142
+ TQueryKey,
143
+ TPageParam
144
+ >,
139
145
  ): Promise<TData>
140
146
  fetchQuery<
141
147
  TQueryFnData,
142
148
  TError = DefaultError,
143
149
  TData = TQueryFnData,
144
150
  TQueryKey extends QueryKey = QueryKey,
151
+ TPageParam = never,
145
152
  >(
146
153
  options: MaybeRefDeep<
147
- FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>
154
+ FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>
148
155
  >,
149
156
  ): Promise<TData> {
150
157
  return super.fetchQuery(cloneDeepUnref(options))
package/src/types.ts CHANGED
@@ -1,7 +1,21 @@
1
- import type { Ref } from 'vue-demi'
1
+ import type { Ref, UnwrapRef } from 'vue-demi'
2
+
3
+ type Primitive = string | number | boolean | bigint | symbol | undefined | null
4
+ type UnwrapLeaf =
5
+ | Primitive
6
+ | Function
7
+ | Date
8
+ | Error
9
+ | RegExp
10
+ | Map<any, any>
11
+ | WeakMap<any, any>
12
+ | Set<any>
13
+ | WeakSet<any>
2
14
 
3
15
  export type MaybeRef<T> = Ref<T> | T
4
16
 
17
+ export type MaybeRefOrGetter<T> = MaybeRef<T> | (() => T)
18
+
5
19
  export type MaybeRefDeep<T> = MaybeRef<
6
20
  T extends Function
7
21
  ? T
@@ -12,6 +26,16 @@ export type MaybeRefDeep<T> = MaybeRef<
12
26
  : T
13
27
  >
14
28
 
29
+ export type DeepUnwrapRef<T> = T extends UnwrapLeaf
30
+ ? T
31
+ : T extends Ref<infer U>
32
+ ? DeepUnwrapRef<U>
33
+ : T extends {}
34
+ ? {
35
+ [Property in keyof T]: DeepUnwrapRef<T[Property]>
36
+ }
37
+ : UnwrapRef<T>
38
+
15
39
  export type DistributiveOmit<T, K extends keyof any> = T extends any
16
40
  ? Omit<T, K>
17
41
  : never
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  computed,
3
+ getCurrentScope,
3
4
  onScopeDispose,
4
5
  reactive,
5
6
  readonly,
@@ -7,8 +8,8 @@ import {
7
8
  watch,
8
9
  } from 'vue-demi'
9
10
  import { useQueryClient } from './useQueryClient'
10
- import { cloneDeepUnref, updateState } from './utils'
11
- import type { ToRefs } from 'vue-demi'
11
+ import { cloneDeepUnref, shouldThrowError, updateState } from './utils'
12
+ import type { ToRef } from 'vue-demi'
12
13
  import type {
13
14
  DefaultedQueryObserverOptions,
14
15
  QueryKey,
@@ -16,14 +17,22 @@ import type {
16
17
  QueryObserverResult,
17
18
  } from '@tanstack/query-core'
18
19
  import type { QueryClient } from './queryClient'
19
- import type { UseQueryOptions } from './useQuery'
20
+ import type { UseQueryOptions, UseQueryReturnType } from './useQuery'
20
21
  import type { UseInfiniteQueryOptions } from './useInfiniteQuery'
21
22
 
22
23
  export type UseBaseQueryReturnType<
23
24
  TData,
24
25
  TError,
25
26
  Result = QueryObserverResult<TData, TError>,
26
- > = ToRefs<Readonly<Result>> & {
27
+ > = {
28
+ [K in keyof Result]: K extends
29
+ | 'fetchNextPage'
30
+ | 'fetchPreviousPage'
31
+ | 'refetch'
32
+ | 'remove'
33
+ ? Result[K]
34
+ : ToRef<Readonly<Result>[K]>
35
+ } & {
27
36
  suspense: () => Promise<Result>
28
37
  }
29
38
 
@@ -64,16 +73,30 @@ export function useBaseQuery<
64
73
  >,
65
74
  queryClient?: QueryClient,
66
75
  ): UseBaseQueryReturnType<TData, TError> {
76
+ if (process.env.NODE_ENV === 'development') {
77
+ if (!getCurrentScope()) {
78
+ console.warn(
79
+ 'vue-query composables like "useQuery()" should only be used inside a "setup()" function or a running effect scope. They might otherwise lead to memory leaks.',
80
+ )
81
+ }
82
+ }
83
+
67
84
  const client = queryClient || useQueryClient()
68
85
 
69
86
  const defaultedOptions = computed(() => {
87
+ const clonedOptions = cloneDeepUnref(options as any)
88
+
89
+ if (typeof clonedOptions.enabled === 'function') {
90
+ clonedOptions.enabled = clonedOptions.enabled()
91
+ }
92
+
70
93
  const defaulted: DefaultedQueryObserverOptions<
71
94
  TQueryFnData,
72
95
  TError,
73
96
  TData,
74
97
  TQueryData,
75
98
  TQueryKey
76
- > = client.defaultQueryOptions(cloneDeepUnref(options as any))
99
+ > = client.defaultQueryOptions(clonedOptions)
77
100
 
78
101
  defaulted._optimisticResults = client.isRestoring.value
79
102
  ? 'isRestoring'
@@ -103,49 +126,79 @@ export function useBaseQuery<
103
126
  { immediate: true },
104
127
  )
105
128
 
106
- watch(
107
- defaultedOptions,
108
- () => {
109
- observer.setOptions(defaultedOptions.value)
110
- updateState(state, observer.getCurrentResult())
111
- },
112
- { deep: true },
113
- )
129
+ const updater = () => {
130
+ observer.setOptions(defaultedOptions.value)
131
+ updateState(state, observer.getCurrentResult())
132
+ }
133
+
134
+ watch(defaultedOptions, updater)
114
135
 
115
136
  onScopeDispose(() => {
116
137
  unsubscribe()
117
138
  })
118
139
 
140
+ // fix #5910
141
+ const refetch = (...args: Parameters<(typeof state)['refetch']>) => {
142
+ updater()
143
+ return state.refetch(...args)
144
+ }
145
+
119
146
  const suspense = () => {
120
- return new Promise<QueryObserverResult<TData, TError>>((resolve) => {
121
- let stopWatch = () => {
122
- //noop
123
- }
124
- const run = () => {
125
- if (defaultedOptions.value.enabled !== false) {
126
- const optimisticResult = observer.getOptimisticResult(
127
- defaultedOptions.value,
128
- )
129
- if (optimisticResult.isStale) {
130
- stopWatch()
131
- resolve(observer.fetchOptimistic(defaultedOptions.value))
132
- } else {
133
- stopWatch()
134
- resolve(optimisticResult)
147
+ return new Promise<QueryObserverResult<TData, TError>>(
148
+ (resolve, reject) => {
149
+ let stopWatch = () => {
150
+ //noop
151
+ }
152
+ const run = () => {
153
+ if (defaultedOptions.value.enabled !== false) {
154
+ const optimisticResult = observer.getOptimisticResult(
155
+ defaultedOptions.value,
156
+ )
157
+ if (optimisticResult.isStale) {
158
+ stopWatch()
159
+ observer
160
+ .fetchOptimistic(defaultedOptions.value)
161
+ .then(resolve, reject)
162
+ } else {
163
+ stopWatch()
164
+ resolve(optimisticResult)
165
+ }
135
166
  }
136
167
  }
137
- }
138
168
 
139
- run()
169
+ run()
140
170
 
141
- stopWatch = watch(defaultedOptions, run, { deep: true })
142
- })
171
+ stopWatch = watch(defaultedOptions, run)
172
+ },
173
+ )
143
174
  }
144
175
 
145
- return {
146
- ...(toRefs(readonly(state)) as ToRefs<
147
- Readonly<QueryObserverResult<TData, TError>>
148
- >),
149
- suspense,
176
+ // Handle error boundary
177
+ watch(
178
+ () => state.error,
179
+ (error) => {
180
+ if (
181
+ state.isError &&
182
+ !state.isFetching &&
183
+ shouldThrowError(defaultedOptions.value.throwOnError, [
184
+ error as TError,
185
+ observer.getCurrentQuery(),
186
+ ])
187
+ ) {
188
+ throw error
189
+ }
190
+ },
191
+ )
192
+
193
+ const object: any = toRefs(readonly(state))
194
+ for (const key in state) {
195
+ if (typeof state[key as keyof typeof state] === 'function') {
196
+ object[key] = state[key as keyof typeof state]
197
+ }
150
198
  }
199
+
200
+ object.suspense = suspense
201
+ object.refetch = refetch
202
+
203
+ return object as UseQueryReturnType<TData, TError>
151
204
  }
@@ -12,9 +12,13 @@ import type {
12
12
 
13
13
  import type { UseBaseQueryReturnType } from './useBaseQuery'
14
14
 
15
- import type { DistributiveOmit, MaybeRefDeep } from './types'
15
+ import type {
16
+ DeepUnwrapRef,
17
+ DistributiveOmit,
18
+ MaybeRefDeep,
19
+ MaybeRefOrGetter,
20
+ } from './types'
16
21
  import type { QueryClient } from './queryClient'
17
- import type { UnwrapRef } from 'vue-demi'
18
22
 
19
23
  export type UseInfiniteQueryOptions<
20
24
  TQueryFnData = unknown,
@@ -37,9 +41,19 @@ export type UseInfiniteQueryOptions<
37
41
  TError,
38
42
  TData,
39
43
  TQueryData,
40
- UnwrapRef<TQueryKey>,
44
+ DeepUnwrapRef<TQueryKey>,
41
45
  TPageParam
42
46
  >[Property]
47
+ : Property extends 'enabled'
48
+ ? MaybeRefOrGetter<
49
+ InfiniteQueryObserverOptions<
50
+ TQueryFnData,
51
+ TError,
52
+ TData,
53
+ TQueryData,
54
+ TQueryKey
55
+ >[Property]
56
+ >
43
57
  : MaybeRefDeep<
44
58
  WithRequired<
45
59
  InfiniteQueryObserverOptions<
@@ -96,10 +110,6 @@ export function useInfiniteQuery<
96
110
  options,
97
111
  queryClient,
98
112
  ) as InfiniteQueryReturnType<TData, TError>
99
- return {
100
- ...result,
101
- fetchNextPage: result.fetchNextPage.value,
102
- fetchPreviousPage: result.fetchPreviousPage.value,
103
- refetch: result.refetch.value,
104
- }
113
+
114
+ return result
105
115
  }
@@ -1,6 +1,5 @@
1
- import { computed, onScopeDispose, ref, watch } from 'vue-demi'
1
+ import { getCurrentScope, onScopeDispose, ref, watchEffect } from 'vue-demi'
2
2
  import { useQueryClient } from './useQueryClient'
3
- import { cloneDeepUnref } from './utils'
4
3
  import type { Ref } from 'vue-demi'
5
4
  import type { QueryFilters as QF } from '@tanstack/query-core'
6
5
  import type { MaybeRefDeep } from './types'
@@ -12,22 +11,25 @@ export function useIsFetching(
12
11
  fetchingFilters: MaybeRefDeep<QF> = {},
13
12
  queryClient?: QueryClient,
14
13
  ): Ref<number> {
15
- const filters = computed(() => cloneDeepUnref(fetchingFilters))
14
+ if (process.env.NODE_ENV === 'development') {
15
+ if (!getCurrentScope()) {
16
+ console.warn(
17
+ 'vue-query composables like "useQuery()" should only be used inside a "setup()" function or a running effect scope. They might otherwise lead to memory leaks.',
18
+ )
19
+ }
20
+ }
21
+
16
22
  const client = queryClient || useQueryClient()
17
23
 
18
- const isFetching = ref(client.isFetching(filters))
24
+ const isFetching = ref()
19
25
 
20
- const unsubscribe = client.getQueryCache().subscribe(() => {
21
- isFetching.value = client.isFetching(filters)
22
- })
26
+ const listener = () => {
27
+ isFetching.value = client.isFetching(fetchingFilters)
28
+ }
29
+
30
+ const unsubscribe = client.getQueryCache().subscribe(listener)
23
31
 
24
- watch(
25
- filters,
26
- () => {
27
- isFetching.value = client.isFetching(filters)
28
- },
29
- { deep: true },
30
- )
32
+ watchEffect(listener)
31
33
 
32
34
  onScopeDispose(() => {
33
35
  unsubscribe()
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  computed,
3
+ getCurrentScope,
3
4
  onScopeDispose,
4
5
  reactive,
5
6
  readonly,
@@ -7,7 +8,7 @@ import {
7
8
  watch,
8
9
  } from 'vue-demi'
9
10
  import { MutationObserver } from '@tanstack/query-core'
10
- import { cloneDeepUnref, updateState } from './utils'
11
+ import { cloneDeepUnref, shouldThrowError, updateState } from './utils'
11
12
  import { useQueryClient } from './useQueryClient'
12
13
  import type { ToRefs } from 'vue-demi'
13
14
  import type {
@@ -64,6 +65,14 @@ export function useMutation<
64
65
  >,
65
66
  queryClient?: QueryClient,
66
67
  ): UseMutationReturnType<TData, TError, TVariables, TContext> {
68
+ if (process.env.NODE_ENV === 'development') {
69
+ if (!getCurrentScope()) {
70
+ console.warn(
71
+ 'vue-query composables like "useQuery()" should only be used inside a "setup()" function or a running effect scope. They might otherwise lead to memory leaks.',
72
+ )
73
+ }
74
+ }
75
+
67
76
  const client = queryClient || useQueryClient()
68
77
  const options = computed(() => {
69
78
  return client.defaultMutationOptions(cloneDeepUnref(mutationOptions))
@@ -84,13 +93,9 @@ export function useMutation<
84
93
  })
85
94
  }
86
95
 
87
- watch(
88
- options,
89
- () => {
90
- observer.setOptions(options.value)
91
- },
92
- { deep: true },
93
- )
96
+ watch(options, () => {
97
+ observer.setOptions(options.value)
98
+ })
94
99
 
95
100
  onScopeDispose(() => {
96
101
  unsubscribe()
@@ -100,6 +105,18 @@ export function useMutation<
100
105
  Readonly<MutationResult<TData, TError, TVariables, TContext>>
101
106
  >
102
107
 
108
+ watch(
109
+ () => state.error,
110
+ (error) => {
111
+ if (
112
+ error &&
113
+ shouldThrowError(options.value.throwOnError, [error as TError])
114
+ ) {
115
+ throw error
116
+ }
117
+ },
118
+ )
119
+
103
120
  return {
104
121
  ...resultRefs,
105
122
  mutate,
@@ -1,4 +1,11 @@
1
- import { computed, onScopeDispose, readonly, ref, watch } from 'vue-demi'
1
+ import {
2
+ computed,
3
+ getCurrentScope,
4
+ onScopeDispose,
5
+ readonly,
6
+ ref,
7
+ watch,
8
+ } from 'vue-demi'
2
9
  import { useQueryClient } from './useQueryClient'
3
10
  import { cloneDeepUnref } from './utils'
4
11
  import type { DeepReadonly, Ref } from 'vue-demi'
@@ -18,6 +25,14 @@ export function useIsMutating(
18
25
  filters: MutationFilters = {},
19
26
  queryClient?: QueryClient,
20
27
  ): Ref<number> {
28
+ if (process.env.NODE_ENV === 'development') {
29
+ if (!getCurrentScope()) {
30
+ console.warn(
31
+ 'vue-query composables like "useQuery()" should only be used inside a "setup()" function or a running effect scope. They might otherwise lead to memory leaks.',
32
+ )
33
+ }
34
+ }
35
+
21
36
  const client = queryClient || useQueryClient()
22
37
  const unreffedFilters = computed(() => ({
23
38
  ...cloneDeepUnref(filters),
@@ -59,19 +74,15 @@ export function useMutationState<TResult = MutationState>(
59
74
  ): DeepReadonly<Ref<Array<TResult>>> {
60
75
  const filters = computed(() => cloneDeepUnref(options.filters))
61
76
  const mutationCache = (queryClient || useQueryClient()).getMutationCache()
62
- const state = ref(getResult(mutationCache, options)) as Ref<TResult[]>
77
+ const state = ref(getResult(mutationCache, options)) as Ref<Array<TResult>>
63
78
  const unsubscribe = mutationCache.subscribe(() => {
64
79
  const result = getResult(mutationCache, options)
65
80
  state.value = result
66
81
  })
67
82
 
68
- watch(
69
- filters,
70
- () => {
71
- state.value = getResult(mutationCache, options)
72
- },
73
- { deep: true },
74
- )
83
+ watch(filters, () => {
84
+ state.value = getResult(mutationCache, options)
85
+ })
75
86
 
76
87
  onScopeDispose(() => {
77
88
  unsubscribe()