@tanstack/vue-query 5.0.0-alpha.5 → 5.0.0-alpha.50

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 (191) hide show
  1. package/README.md +18 -14
  2. package/build/lib/__mocks__/useBaseQuery.d.ts +2 -1
  3. package/build/lib/__mocks__/useBaseQuery.d.ts.map +1 -0
  4. package/build/lib/__mocks__/useQueryClient.d.ts +2 -1
  5. package/build/lib/__mocks__/useQueryClient.d.ts.map +1 -0
  6. package/build/lib/__tests__/mutationCache.test.d.ts +1 -0
  7. package/build/lib/__tests__/mutationCache.test.d.ts.map +1 -0
  8. package/build/lib/__tests__/queryCache.test.d.ts +1 -0
  9. package/build/lib/__tests__/queryCache.test.d.ts.map +1 -0
  10. package/build/lib/__tests__/queryClient.test.d.ts +1 -0
  11. package/build/lib/__tests__/queryClient.test.d.ts.map +1 -0
  12. package/build/lib/__tests__/test-utils.d.ts +3 -2
  13. package/build/lib/__tests__/test-utils.d.ts.map +1 -0
  14. package/build/lib/__tests__/useInfiniteQuery.test.d.ts +1 -0
  15. package/build/lib/__tests__/useInfiniteQuery.test.d.ts.map +1 -0
  16. package/build/lib/__tests__/useInfiniteQuery.types.test.d.ts +1 -0
  17. package/build/lib/__tests__/useInfiniteQuery.types.test.d.ts.map +1 -0
  18. package/build/lib/__tests__/useIsFetching.test.d.ts +1 -0
  19. package/build/lib/__tests__/useIsFetching.test.d.ts.map +1 -0
  20. package/build/lib/__tests__/useIsMutating.test.d.ts +1 -0
  21. package/build/lib/__tests__/useIsMutating.test.d.ts.map +1 -0
  22. package/build/lib/__tests__/useMutation.test.d.ts +1 -0
  23. package/build/lib/__tests__/useMutation.test.d.ts.map +1 -0
  24. package/build/lib/__tests__/useMutation.types.test.d.ts +1 -0
  25. package/build/lib/__tests__/useMutation.types.test.d.ts.map +1 -0
  26. package/build/lib/__tests__/useQueries.test.d.ts +1 -0
  27. package/build/lib/__tests__/useQueries.test.d.ts.map +1 -0
  28. package/build/lib/__tests__/useQuery.test.d.ts +1 -0
  29. package/build/lib/__tests__/useQuery.test.d.ts.map +1 -0
  30. package/build/lib/__tests__/useQuery.types.test.d.ts +1 -0
  31. package/build/lib/__tests__/useQuery.types.test.d.ts.map +1 -0
  32. package/build/lib/__tests__/useQueryClient.test.d.ts +1 -0
  33. package/build/lib/__tests__/useQueryClient.test.d.ts.map +1 -0
  34. package/build/lib/__tests__/utils.test.d.ts +1 -0
  35. package/build/lib/__tests__/utils.test.d.ts.map +1 -0
  36. package/build/lib/__tests__/vueQueryPlugin.test.d.ts +1 -0
  37. package/build/lib/__tests__/vueQueryPlugin.test.d.ts.map +1 -0
  38. package/build/lib/devtools/devtools.d.ts +1 -0
  39. package/build/lib/devtools/devtools.d.ts.map +1 -0
  40. package/build/lib/devtools/devtools.js +46 -7
  41. package/build/lib/devtools/devtools.js.map +1 -1
  42. package/build/lib/devtools/devtools.mjs +46 -7
  43. package/build/lib/devtools/devtools.mjs.map +1 -1
  44. package/build/lib/devtools/utils.d.ts +2 -1
  45. package/build/lib/devtools/utils.d.ts.map +1 -0
  46. package/build/lib/devtools/utils.js +3 -4
  47. package/build/lib/devtools/utils.js.map +1 -1
  48. package/build/lib/devtools/utils.mjs +3 -4
  49. package/build/lib/devtools/utils.mjs.map +1 -1
  50. package/build/lib/index.d.ts +3 -2
  51. package/build/lib/index.d.ts.map +1 -0
  52. package/build/lib/index.js +3 -2
  53. package/build/lib/index.js.map +1 -1
  54. package/build/lib/index.mjs +1 -1
  55. package/build/lib/mutationCache.d.ts +1 -0
  56. package/build/lib/mutationCache.d.ts.map +1 -0
  57. package/build/lib/mutationCache.js.map +1 -1
  58. package/build/lib/mutationCache.mjs.map +1 -1
  59. package/build/lib/queryCache.d.ts +1 -0
  60. package/build/lib/queryCache.d.ts.map +1 -0
  61. package/build/lib/queryCache.js.map +1 -1
  62. package/build/lib/queryCache.mjs.map +1 -1
  63. package/build/lib/queryClient.d.ts +1 -0
  64. package/build/lib/queryClient.d.ts.map +1 -0
  65. package/build/lib/queryClient.js.map +1 -1
  66. package/build/lib/queryClient.mjs.map +1 -1
  67. package/build/lib/types.d.ts +4 -3
  68. package/build/lib/types.d.ts.map +1 -0
  69. package/build/lib/useBaseQuery.d.ts +3 -2
  70. package/build/lib/useBaseQuery.d.ts.map +1 -0
  71. package/build/lib/useBaseQuery.js.map +1 -1
  72. package/build/lib/useBaseQuery.mjs.map +1 -1
  73. package/build/lib/useInfiniteQuery.d.ts +4 -3
  74. package/build/lib/useInfiniteQuery.d.ts.map +1 -0
  75. package/build/lib/useInfiniteQuery.js.map +1 -1
  76. package/build/lib/useInfiniteQuery.mjs.map +1 -1
  77. package/build/lib/useIsFetching.d.ts +2 -1
  78. package/build/lib/useIsFetching.d.ts.map +1 -0
  79. package/build/lib/useIsFetching.js.map +1 -1
  80. package/build/lib/useIsFetching.mjs.map +1 -1
  81. package/build/lib/useMutation.d.ts +5 -4
  82. package/build/lib/useMutation.d.ts.map +1 -0
  83. package/build/lib/useMutation.js.map +1 -1
  84. package/build/lib/useMutation.mjs.map +1 -1
  85. package/build/lib/useMutationState.d.ts +12 -0
  86. package/build/lib/useMutationState.d.ts.map +1 -0
  87. package/build/lib/useMutationState.js +36 -0
  88. package/build/lib/useMutationState.js.map +1 -0
  89. package/build/lib/useMutationState.mjs +33 -0
  90. package/build/lib/useMutationState.mjs.map +1 -0
  91. package/build/lib/useQueries.d.ts +12 -11
  92. package/build/lib/useQueries.d.ts.map +1 -0
  93. package/build/lib/useQueries.js +25 -11
  94. package/build/lib/useQueries.js.map +1 -1
  95. package/build/lib/useQueries.mjs +25 -11
  96. package/build/lib/useQueries.mjs.map +1 -1
  97. package/build/lib/useQuery.d.ts +4 -3
  98. package/build/lib/useQuery.d.ts.map +1 -0
  99. package/build/lib/useQuery.js.map +1 -1
  100. package/build/lib/useQuery.mjs.map +1 -1
  101. package/build/lib/useQueryClient.d.ts +1 -0
  102. package/build/lib/useQueryClient.d.ts.map +1 -0
  103. package/build/lib/useQueryClient.js.map +1 -1
  104. package/build/lib/useQueryClient.mjs.map +1 -1
  105. package/build/lib/utils.d.ts +1 -0
  106. package/build/lib/utils.d.ts.map +1 -0
  107. package/build/lib/utils.js.map +1 -1
  108. package/build/lib/utils.mjs.map +1 -1
  109. package/build/lib/vueQueryPlugin.d.ts +3 -2
  110. package/build/lib/vueQueryPlugin.d.ts.map +1 -0
  111. package/build/lib/vueQueryPlugin.js +0 -2
  112. package/build/lib/vueQueryPlugin.js.map +1 -1
  113. package/build/lib/vueQueryPlugin.mjs +0 -2
  114. package/build/lib/vueQueryPlugin.mjs.map +1 -1
  115. package/package.json +16 -13
  116. package/src/__mocks__/useBaseQuery.ts +8 -0
  117. package/src/__mocks__/useQueryClient.ts +10 -0
  118. package/src/__tests__/mutationCache.test.ts +40 -0
  119. package/src/__tests__/queryCache.test.ts +48 -0
  120. package/src/__tests__/queryClient.test.ts +365 -0
  121. package/src/__tests__/test-utils.ts +62 -0
  122. package/src/__tests__/useInfiniteQuery.test.ts +37 -0
  123. package/src/__tests__/useInfiniteQuery.types.test.tsx +102 -0
  124. package/src/__tests__/useIsFetching.test.ts +77 -0
  125. package/src/__tests__/useIsMutating.test.ts +123 -0
  126. package/src/__tests__/useMutation.test.ts +335 -0
  127. package/src/__tests__/useMutation.types.test.tsx +97 -0
  128. package/src/__tests__/useQueries.test.ts +256 -0
  129. package/src/__tests__/useQuery.test.ts +290 -0
  130. package/src/__tests__/useQuery.types.test.tsx +88 -0
  131. package/src/__tests__/useQueryClient.test.ts +51 -0
  132. package/src/__tests__/utils.test.ts +148 -0
  133. package/src/__tests__/vueQueryPlugin.test.ts +351 -0
  134. package/src/devtools/devtools.ts +249 -0
  135. package/src/devtools/utils.ts +96 -0
  136. package/src/index.ts +30 -0
  137. package/src/mutationCache.ts +25 -0
  138. package/src/queryCache.ts +21 -0
  139. package/src/queryClient.ts +278 -0
  140. package/src/types.ts +17 -0
  141. package/src/useBaseQuery.ts +152 -0
  142. package/src/useInfiniteQuery.ts +105 -0
  143. package/src/useIsFetching.ts +37 -0
  144. package/src/useMutation.ts +109 -0
  145. package/src/useMutationState.ts +73 -0
  146. package/src/useQueries.ts +227 -0
  147. package/src/useQuery.ts +125 -0
  148. package/src/useQueryClient.ts +23 -0
  149. package/src/utils.ts +67 -0
  150. package/src/vueQueryPlugin.ts +101 -0
  151. package/build/lib/devtools/devtools.esm.js +0 -155
  152. package/build/lib/devtools/devtools.esm.js.map +0 -1
  153. package/build/lib/devtools/utils.esm.js +0 -80
  154. package/build/lib/devtools/utils.esm.js.map +0 -1
  155. package/build/lib/index.esm.js +0 -14
  156. package/build/lib/index.esm.js.map +0 -1
  157. package/build/lib/mutationCache.esm.js +0 -14
  158. package/build/lib/mutationCache.esm.js.map +0 -1
  159. package/build/lib/queryCache.esm.js +0 -14
  160. package/build/lib/queryCache.esm.js.map +0 -1
  161. package/build/lib/queryClient.esm.js +0 -84
  162. package/build/lib/queryClient.esm.js.map +0 -1
  163. package/build/lib/useBaseQuery.esm.js +0 -67
  164. package/build/lib/useBaseQuery.esm.js.map +0 -1
  165. package/build/lib/useInfiniteQuery.esm.js +0 -18
  166. package/build/lib/useInfiniteQuery.esm.js.map +0 -1
  167. package/build/lib/useIsFetching.esm.js +0 -24
  168. package/build/lib/useIsFetching.esm.js.map +0 -1
  169. package/build/lib/useIsMutating.d.ts +0 -6
  170. package/build/lib/useIsMutating.esm.js +0 -24
  171. package/build/lib/useIsMutating.esm.js.map +0 -1
  172. package/build/lib/useIsMutating.js +0 -26
  173. package/build/lib/useIsMutating.js.map +0 -1
  174. package/build/lib/useIsMutating.mjs +0 -24
  175. package/build/lib/useIsMutating.mjs.map +0 -1
  176. package/build/lib/useMutation.esm.js +0 -39
  177. package/build/lib/useMutation.esm.js.map +0 -1
  178. package/build/lib/useQueries.esm.js +0 -46
  179. package/build/lib/useQueries.esm.js.map +0 -1
  180. package/build/lib/useQuery.esm.js +0 -13
  181. package/build/lib/useQuery.esm.js.map +0 -1
  182. package/build/lib/useQueryClient.esm.js +0 -18
  183. package/build/lib/useQueryClient.esm.js.map +0 -1
  184. package/build/lib/utils.esm.js +0 -50
  185. package/build/lib/utils.esm.js.map +0 -1
  186. package/build/lib/vueQueryPlugin.esm.js +0 -75
  187. package/build/lib/vueQueryPlugin.esm.js.map +0 -1
  188. package/build/umd/index.development.js +0 -4192
  189. package/build/umd/index.development.js.map +0 -1
  190. package/build/umd/index.production.js +0 -2
  191. package/build/umd/index.production.js.map +0 -1
package/src/types.ts ADDED
@@ -0,0 +1,17 @@
1
+ import type { Ref } from 'vue-demi'
2
+
3
+ export type MaybeRef<T> = Ref<T> | T
4
+
5
+ export type MaybeRefDeep<T> = MaybeRef<
6
+ T extends Function
7
+ ? T
8
+ : T extends object
9
+ ? {
10
+ [Property in keyof T]: MaybeRefDeep<T[Property]>
11
+ }
12
+ : T
13
+ >
14
+
15
+ export type DistributiveOmit<T, K extends keyof any> = T extends any
16
+ ? Omit<T, K>
17
+ : never
@@ -0,0 +1,152 @@
1
+ import {
2
+ onScopeDispose,
3
+ toRefs,
4
+ readonly,
5
+ reactive,
6
+ watch,
7
+ ref,
8
+ computed,
9
+ } from 'vue-demi'
10
+ import type { ToRefs } from 'vue-demi'
11
+ import type {
12
+ QueryObserver,
13
+ QueryKey,
14
+ QueryObserverResult,
15
+ DefaultedQueryObserverOptions,
16
+ } from '@tanstack/query-core'
17
+ import { useQueryClient } from './useQueryClient'
18
+ import { updateState, cloneDeepUnref } from './utils'
19
+ import type { QueryClient } from './queryClient'
20
+ import type { UseQueryOptions } from './useQuery'
21
+ import type { UseInfiniteQueryOptions } from './useInfiniteQuery'
22
+
23
+ export type UseBaseQueryReturnType<
24
+ TData,
25
+ TError,
26
+ Result = QueryObserverResult<TData, TError>,
27
+ > = ToRefs<Readonly<Result>> & {
28
+ suspense: () => Promise<Result>
29
+ }
30
+
31
+ type UseQueryOptionsGeneric<
32
+ TQueryFnData,
33
+ TError,
34
+ TData,
35
+ TQueryData,
36
+ TQueryKey extends QueryKey = QueryKey,
37
+ TPageParam = unknown,
38
+ > =
39
+ | UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>
40
+ | UseInfiniteQueryOptions<
41
+ TQueryFnData,
42
+ TError,
43
+ TData,
44
+ TQueryData,
45
+ TQueryKey,
46
+ TPageParam
47
+ >
48
+
49
+ export function useBaseQuery<
50
+ TQueryFnData,
51
+ TError,
52
+ TData,
53
+ TQueryData,
54
+ TQueryKey extends QueryKey,
55
+ TPageParam,
56
+ >(
57
+ Observer: typeof QueryObserver,
58
+ options: UseQueryOptionsGeneric<
59
+ TQueryFnData,
60
+ TError,
61
+ TData,
62
+ TQueryData,
63
+ TQueryKey,
64
+ TPageParam
65
+ >,
66
+ queryClient?: QueryClient,
67
+ ): UseBaseQueryReturnType<TData, TError> {
68
+ const client = queryClient || useQueryClient()
69
+
70
+ const defaultedOptions = computed(() => {
71
+ const defaulted: DefaultedQueryObserverOptions<
72
+ TQueryFnData,
73
+ TError,
74
+ TData,
75
+ TQueryData,
76
+ TQueryKey
77
+ > = client.defaultQueryOptions(cloneDeepUnref(options as any))
78
+
79
+ defaulted._optimisticResults = client.isRestoring.value
80
+ ? 'isRestoring'
81
+ : 'optimistic'
82
+
83
+ return defaulted
84
+ })
85
+
86
+ const observer = new Observer(client, defaultedOptions.value)
87
+ const state = reactive(observer.getCurrentResult())
88
+
89
+ const unsubscribe = ref(() => {
90
+ // noop
91
+ })
92
+
93
+ watch(
94
+ client.isRestoring,
95
+ (isRestoring) => {
96
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
97
+ if (!isRestoring) {
98
+ unsubscribe.value()
99
+ unsubscribe.value = observer.subscribe((result) => {
100
+ updateState(state, result)
101
+ })
102
+ }
103
+ },
104
+ { immediate: true },
105
+ )
106
+
107
+ watch(
108
+ defaultedOptions,
109
+ () => {
110
+ observer.setOptions(defaultedOptions.value)
111
+ updateState(state, observer.getCurrentResult())
112
+ },
113
+ { deep: true },
114
+ )
115
+
116
+ onScopeDispose(() => {
117
+ unsubscribe.value()
118
+ })
119
+
120
+ const suspense = () => {
121
+ return new Promise<QueryObserverResult<TData, TError>>((resolve) => {
122
+ let stopWatch = () => {
123
+ //noop
124
+ }
125
+ const run = () => {
126
+ if (defaultedOptions.value.enabled !== false) {
127
+ const optimisticResult = observer.getOptimisticResult(
128
+ defaultedOptions.value,
129
+ )
130
+ if (optimisticResult.isStale) {
131
+ stopWatch()
132
+ resolve(observer.fetchOptimistic(defaultedOptions.value))
133
+ } else {
134
+ stopWatch()
135
+ resolve(optimisticResult)
136
+ }
137
+ }
138
+ }
139
+
140
+ run()
141
+
142
+ stopWatch = watch(defaultedOptions, run, { deep: true })
143
+ })
144
+ }
145
+
146
+ return {
147
+ ...(toRefs(readonly(state)) as ToRefs<
148
+ Readonly<QueryObserverResult<TData, TError>>
149
+ >),
150
+ suspense,
151
+ }
152
+ }
@@ -0,0 +1,105 @@
1
+ import { InfiniteQueryObserver } from '@tanstack/query-core'
2
+ import type {
3
+ InfiniteData,
4
+ QueryObserver,
5
+ WithRequired,
6
+ QueryKey,
7
+ InfiniteQueryObserverResult,
8
+ InfiniteQueryObserverOptions,
9
+ DefaultError,
10
+ } from '@tanstack/query-core'
11
+
12
+ import { useBaseQuery } from './useBaseQuery'
13
+ import type { UseBaseQueryReturnType } from './useBaseQuery'
14
+
15
+ import type { DistributiveOmit, MaybeRefDeep } from './types'
16
+ import type { QueryClient } from './queryClient'
17
+ import type { UnwrapRef } from 'vue-demi'
18
+
19
+ export type UseInfiniteQueryOptions<
20
+ TQueryFnData = unknown,
21
+ TError = DefaultError,
22
+ TData = TQueryFnData,
23
+ TQueryData = TQueryFnData,
24
+ TQueryKey extends QueryKey = QueryKey,
25
+ TPageParam = unknown,
26
+ > = {
27
+ [Property in keyof InfiniteQueryObserverOptions<
28
+ TQueryFnData,
29
+ TError,
30
+ TData,
31
+ TQueryData,
32
+ TQueryKey,
33
+ TPageParam
34
+ >]: Property extends 'queryFn'
35
+ ? InfiniteQueryObserverOptions<
36
+ TQueryFnData,
37
+ TError,
38
+ TData,
39
+ TQueryData,
40
+ UnwrapRef<TQueryKey>,
41
+ TPageParam
42
+ >[Property]
43
+ : MaybeRefDeep<
44
+ WithRequired<
45
+ InfiniteQueryObserverOptions<
46
+ TQueryFnData,
47
+ TError,
48
+ TData,
49
+ TQueryData,
50
+ TQueryKey,
51
+ TPageParam
52
+ >,
53
+ 'queryKey'
54
+ >[Property]
55
+ >
56
+ }
57
+
58
+ type InfiniteQueryReturnType<TData, TError> = UseBaseQueryReturnType<
59
+ TData,
60
+ TError,
61
+ InfiniteQueryObserverResult<TData, TError>
62
+ >
63
+ export type UseInfiniteQueryReturnType<TData, TError> = DistributiveOmit<
64
+ InfiniteQueryReturnType<TData, TError>,
65
+ 'fetchNextPage' | 'fetchPreviousPage' | 'refetch'
66
+ > & {
67
+ fetchNextPage: InfiniteQueryObserverResult<TData, TError>['fetchNextPage']
68
+ fetchPreviousPage: InfiniteQueryObserverResult<
69
+ TData,
70
+ TError
71
+ >['fetchPreviousPage']
72
+ refetch: InfiniteQueryObserverResult<TData, TError>['refetch']
73
+ }
74
+
75
+ export function useInfiniteQuery<
76
+ TQueryFnData,
77
+ TError = DefaultError,
78
+ TData = InfiniteData<TQueryFnData>,
79
+ TQueryKey extends QueryKey = QueryKey,
80
+ TPageParam = unknown,
81
+ >(
82
+ options: UseInfiniteQueryOptions<
83
+ TQueryFnData,
84
+ TError,
85
+ TData,
86
+ TQueryFnData,
87
+ TQueryKey,
88
+ TPageParam
89
+ >,
90
+ queryClient?: QueryClient,
91
+ ): UseInfiniteQueryReturnType<TData, TError> {
92
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
93
+ const result = useBaseQuery(
94
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
95
+ InfiniteQueryObserver as typeof QueryObserver,
96
+ options,
97
+ queryClient,
98
+ ) as InfiniteQueryReturnType<TData, TError>
99
+ return {
100
+ ...result,
101
+ fetchNextPage: result.fetchNextPage.value,
102
+ fetchPreviousPage: result.fetchPreviousPage.value,
103
+ refetch: result.refetch.value,
104
+ }
105
+ }
@@ -0,0 +1,37 @@
1
+ import { computed, onScopeDispose, ref, watch } from 'vue-demi'
2
+ import type { Ref } from 'vue-demi'
3
+ import type { QueryFilters as QF } from '@tanstack/query-core'
4
+ import { useQueryClient } from './useQueryClient'
5
+ import { cloneDeepUnref } from './utils'
6
+ import type { MaybeRefDeep } from './types'
7
+ import type { QueryClient } from './queryClient'
8
+
9
+ export type QueryFilters = MaybeRefDeep<QF>
10
+
11
+ export function useIsFetching(
12
+ fetchingFilters: MaybeRefDeep<QF> = {},
13
+ queryClient?: QueryClient,
14
+ ): Ref<number> {
15
+ const filters = computed(() => cloneDeepUnref(fetchingFilters))
16
+ const client = queryClient || useQueryClient()
17
+
18
+ const isFetching = ref(client.isFetching(filters))
19
+
20
+ const unsubscribe = client.getQueryCache().subscribe(() => {
21
+ isFetching.value = client.isFetching(filters)
22
+ })
23
+
24
+ watch(
25
+ filters,
26
+ () => {
27
+ isFetching.value = client.isFetching(filters)
28
+ },
29
+ { deep: true },
30
+ )
31
+
32
+ onScopeDispose(() => {
33
+ unsubscribe()
34
+ })
35
+
36
+ return isFetching
37
+ }
@@ -0,0 +1,109 @@
1
+ import {
2
+ onScopeDispose,
3
+ reactive,
4
+ readonly,
5
+ toRefs,
6
+ watch,
7
+ computed,
8
+ } from 'vue-demi'
9
+ import type { ToRefs } from 'vue-demi'
10
+ import type {
11
+ MutateOptions,
12
+ MutateFunction,
13
+ MutationObserverResult,
14
+ MutationObserverOptions,
15
+ DefaultError,
16
+ } from '@tanstack/query-core'
17
+ import type { MaybeRefDeep, DistributiveOmit } from './types'
18
+ import { MutationObserver } from '@tanstack/query-core'
19
+ import { cloneDeepUnref, updateState } from './utils'
20
+ import { useQueryClient } from './useQueryClient'
21
+ import type { QueryClient } from './queryClient'
22
+
23
+ type MutationResult<TData, TError, TVariables, TContext> = DistributiveOmit<
24
+ MutationObserverResult<TData, TError, TVariables, TContext>,
25
+ 'mutate' | 'reset'
26
+ >
27
+
28
+ export type UseMutationOptions<
29
+ TData = unknown,
30
+ TError = DefaultError,
31
+ TVariables = void,
32
+ TContext = unknown,
33
+ > = MaybeRefDeep<MutationObserverOptions<TData, TError, TVariables, TContext>>
34
+
35
+ type MutateSyncFunction<
36
+ TData = unknown,
37
+ TError = DefaultError,
38
+ TVariables = void,
39
+ TContext = unknown,
40
+ > = (
41
+ ...options: Parameters<MutateFunction<TData, TError, TVariables, TContext>>
42
+ ) => void
43
+
44
+ export type UseMutationReturnType<
45
+ TData,
46
+ TError,
47
+ TVariables,
48
+ TContext,
49
+ Result = MutationResult<TData, TError, TVariables, TContext>,
50
+ > = ToRefs<Readonly<Result>> & {
51
+ mutate: MutateSyncFunction<TData, TError, TVariables, TContext>
52
+ mutateAsync: MutateFunction<TData, TError, TVariables, TContext>
53
+ reset: MutationObserverResult<TData, TError, TVariables, TContext>['reset']
54
+ }
55
+
56
+ export function useMutation<
57
+ TData = unknown,
58
+ TError = DefaultError,
59
+ TVariables = void,
60
+ TContext = unknown,
61
+ >(
62
+ mutationOptions: MaybeRefDeep<
63
+ MutationObserverOptions<TData, TError, TVariables, TContext>
64
+ >,
65
+ queryClient?: QueryClient,
66
+ ): UseMutationReturnType<TData, TError, TVariables, TContext> {
67
+ const client = queryClient || useQueryClient()
68
+ const options = computed(() => {
69
+ return client.defaultMutationOptions(cloneDeepUnref(mutationOptions))
70
+ })
71
+ const observer = new MutationObserver(client, options.value)
72
+ const state = reactive(observer.getCurrentResult())
73
+
74
+ const unsubscribe = observer.subscribe((result) => {
75
+ updateState(state, result)
76
+ })
77
+
78
+ const mutate = (
79
+ variables: TVariables,
80
+ mutateOptions?: MutateOptions<TData, TError, TVariables, TContext>,
81
+ ) => {
82
+ observer.mutate(variables, mutateOptions).catch(() => {
83
+ // This is intentional
84
+ })
85
+ }
86
+
87
+ watch(
88
+ options,
89
+ () => {
90
+ observer.setOptions(options.value)
91
+ },
92
+ { deep: true },
93
+ )
94
+
95
+ onScopeDispose(() => {
96
+ unsubscribe()
97
+ })
98
+
99
+ const resultRefs = toRefs(readonly(state)) as unknown as ToRefs<
100
+ Readonly<MutationResult<TData, TError, TVariables, TContext>>
101
+ >
102
+
103
+ return {
104
+ ...resultRefs,
105
+ mutate,
106
+ mutateAsync: state.mutate,
107
+ reset: state.reset,
108
+ }
109
+ }
@@ -0,0 +1,73 @@
1
+ import { onScopeDispose, readonly, computed, ref } from 'vue-demi'
2
+ import type { Ref, DeepReadonly } from 'vue-demi'
3
+ import type {
4
+ MutationFilters as MF,
5
+ Mutation,
6
+ DefaultError,
7
+ MutationState,
8
+ } from '@tanstack/query-core'
9
+ import { useQueryClient } from './useQueryClient'
10
+ import { cloneDeepUnref } from './utils'
11
+ import type { QueryClient } from './queryClient'
12
+ import type { MaybeRefDeep } from './types'
13
+ import type { MutationCache } from './mutationCache'
14
+
15
+ export type MutationFilters = MaybeRefDeep<MF>
16
+
17
+ export function useIsMutating(
18
+ filters: MutationFilters = {},
19
+ queryClient?: QueryClient,
20
+ ): Ref<number> {
21
+ const client = queryClient || useQueryClient()
22
+ const unreffedFilters = computed(() => ({
23
+ ...cloneDeepUnref(filters),
24
+ status: 'pending' as const,
25
+ }))
26
+
27
+ const length = computed(
28
+ () => useMutationState({ filters: unreffedFilters }, client).value.length,
29
+ )
30
+
31
+ return length
32
+ }
33
+
34
+ export type MutationStateOptions<TResult = MutationState> = {
35
+ filters?: MutationFilters
36
+ select?: (
37
+ mutation: Mutation<unknown, DefaultError, unknown, unknown>,
38
+ ) => TResult
39
+ }
40
+
41
+ function getResult<TResult = MutationState>(
42
+ mutationCache: MutationCache,
43
+ options: MutationStateOptions<TResult>,
44
+ ): Array<TResult> {
45
+ return mutationCache
46
+ .findAll(options.filters)
47
+ .map(
48
+ (mutation): TResult =>
49
+ (options.select
50
+ ? options.select(
51
+ mutation as Mutation<unknown, DefaultError, unknown, unknown>,
52
+ )
53
+ : mutation.state) as TResult,
54
+ )
55
+ }
56
+
57
+ export function useMutationState<TResult = MutationState>(
58
+ options: MutationStateOptions<TResult> = {},
59
+ queryClient?: QueryClient,
60
+ ): DeepReadonly<Ref<Array<TResult>>> {
61
+ const mutationCache = (queryClient || useQueryClient()).getMutationCache()
62
+ const state = ref(getResult(mutationCache, options)) as Ref<TResult[]>
63
+ const unsubscribe = mutationCache.subscribe(() => {
64
+ const result = getResult(mutationCache, options)
65
+ state.value = result
66
+ })
67
+
68
+ onScopeDispose(() => {
69
+ unsubscribe()
70
+ })
71
+
72
+ return readonly(state)
73
+ }