@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.
- package/README.md +18 -14
- package/build/lib/__mocks__/useBaseQuery.d.ts +2 -1
- package/build/lib/__mocks__/useBaseQuery.d.ts.map +1 -0
- package/build/lib/__mocks__/useQueryClient.d.ts +2 -1
- package/build/lib/__mocks__/useQueryClient.d.ts.map +1 -0
- package/build/lib/__tests__/mutationCache.test.d.ts +1 -0
- package/build/lib/__tests__/mutationCache.test.d.ts.map +1 -0
- package/build/lib/__tests__/queryCache.test.d.ts +1 -0
- package/build/lib/__tests__/queryCache.test.d.ts.map +1 -0
- package/build/lib/__tests__/queryClient.test.d.ts +1 -0
- package/build/lib/__tests__/queryClient.test.d.ts.map +1 -0
- package/build/lib/__tests__/test-utils.d.ts +3 -2
- package/build/lib/__tests__/test-utils.d.ts.map +1 -0
- package/build/lib/__tests__/useInfiniteQuery.test.d.ts +1 -0
- package/build/lib/__tests__/useInfiniteQuery.test.d.ts.map +1 -0
- package/build/lib/__tests__/useInfiniteQuery.types.test.d.ts +1 -0
- package/build/lib/__tests__/useInfiniteQuery.types.test.d.ts.map +1 -0
- package/build/lib/__tests__/useIsFetching.test.d.ts +1 -0
- package/build/lib/__tests__/useIsFetching.test.d.ts.map +1 -0
- package/build/lib/__tests__/useIsMutating.test.d.ts +1 -0
- package/build/lib/__tests__/useIsMutating.test.d.ts.map +1 -0
- package/build/lib/__tests__/useMutation.test.d.ts +1 -0
- package/build/lib/__tests__/useMutation.test.d.ts.map +1 -0
- package/build/lib/__tests__/useMutation.types.test.d.ts +1 -0
- package/build/lib/__tests__/useMutation.types.test.d.ts.map +1 -0
- package/build/lib/__tests__/useQueries.test.d.ts +1 -0
- package/build/lib/__tests__/useQueries.test.d.ts.map +1 -0
- package/build/lib/__tests__/useQuery.test.d.ts +1 -0
- package/build/lib/__tests__/useQuery.test.d.ts.map +1 -0
- package/build/lib/__tests__/useQuery.types.test.d.ts +1 -0
- package/build/lib/__tests__/useQuery.types.test.d.ts.map +1 -0
- package/build/lib/__tests__/useQueryClient.test.d.ts +1 -0
- package/build/lib/__tests__/useQueryClient.test.d.ts.map +1 -0
- package/build/lib/__tests__/utils.test.d.ts +1 -0
- package/build/lib/__tests__/utils.test.d.ts.map +1 -0
- package/build/lib/__tests__/vueQueryPlugin.test.d.ts +1 -0
- package/build/lib/__tests__/vueQueryPlugin.test.d.ts.map +1 -0
- package/build/lib/devtools/devtools.d.ts +1 -0
- package/build/lib/devtools/devtools.d.ts.map +1 -0
- package/build/lib/devtools/devtools.js +46 -7
- package/build/lib/devtools/devtools.js.map +1 -1
- package/build/lib/devtools/devtools.mjs +46 -7
- package/build/lib/devtools/devtools.mjs.map +1 -1
- package/build/lib/devtools/utils.d.ts +2 -1
- package/build/lib/devtools/utils.d.ts.map +1 -0
- package/build/lib/devtools/utils.js +3 -4
- package/build/lib/devtools/utils.js.map +1 -1
- package/build/lib/devtools/utils.mjs +3 -4
- package/build/lib/devtools/utils.mjs.map +1 -1
- package/build/lib/index.d.ts +3 -2
- package/build/lib/index.d.ts.map +1 -0
- package/build/lib/index.js +3 -2
- package/build/lib/index.js.map +1 -1
- package/build/lib/index.mjs +1 -1
- package/build/lib/mutationCache.d.ts +1 -0
- package/build/lib/mutationCache.d.ts.map +1 -0
- package/build/lib/mutationCache.js.map +1 -1
- package/build/lib/mutationCache.mjs.map +1 -1
- package/build/lib/queryCache.d.ts +1 -0
- package/build/lib/queryCache.d.ts.map +1 -0
- package/build/lib/queryCache.js.map +1 -1
- package/build/lib/queryCache.mjs.map +1 -1
- package/build/lib/queryClient.d.ts +1 -0
- package/build/lib/queryClient.d.ts.map +1 -0
- package/build/lib/queryClient.js.map +1 -1
- package/build/lib/queryClient.mjs.map +1 -1
- package/build/lib/types.d.ts +4 -3
- package/build/lib/types.d.ts.map +1 -0
- package/build/lib/useBaseQuery.d.ts +3 -2
- package/build/lib/useBaseQuery.d.ts.map +1 -0
- package/build/lib/useBaseQuery.js.map +1 -1
- package/build/lib/useBaseQuery.mjs.map +1 -1
- package/build/lib/useInfiniteQuery.d.ts +4 -3
- package/build/lib/useInfiniteQuery.d.ts.map +1 -0
- package/build/lib/useInfiniteQuery.js.map +1 -1
- package/build/lib/useInfiniteQuery.mjs.map +1 -1
- package/build/lib/useIsFetching.d.ts +2 -1
- package/build/lib/useIsFetching.d.ts.map +1 -0
- package/build/lib/useIsFetching.js.map +1 -1
- package/build/lib/useIsFetching.mjs.map +1 -1
- package/build/lib/useMutation.d.ts +5 -4
- package/build/lib/useMutation.d.ts.map +1 -0
- package/build/lib/useMutation.js.map +1 -1
- package/build/lib/useMutation.mjs.map +1 -1
- package/build/lib/useMutationState.d.ts +12 -0
- package/build/lib/useMutationState.d.ts.map +1 -0
- package/build/lib/useMutationState.js +36 -0
- package/build/lib/useMutationState.js.map +1 -0
- package/build/lib/useMutationState.mjs +33 -0
- package/build/lib/useMutationState.mjs.map +1 -0
- package/build/lib/useQueries.d.ts +12 -11
- package/build/lib/useQueries.d.ts.map +1 -0
- package/build/lib/useQueries.js +25 -11
- package/build/lib/useQueries.js.map +1 -1
- package/build/lib/useQueries.mjs +25 -11
- package/build/lib/useQueries.mjs.map +1 -1
- package/build/lib/useQuery.d.ts +4 -3
- package/build/lib/useQuery.d.ts.map +1 -0
- package/build/lib/useQuery.js.map +1 -1
- package/build/lib/useQuery.mjs.map +1 -1
- package/build/lib/useQueryClient.d.ts +1 -0
- package/build/lib/useQueryClient.d.ts.map +1 -0
- package/build/lib/useQueryClient.js.map +1 -1
- package/build/lib/useQueryClient.mjs.map +1 -1
- package/build/lib/utils.d.ts +1 -0
- package/build/lib/utils.d.ts.map +1 -0
- package/build/lib/utils.js.map +1 -1
- package/build/lib/utils.mjs.map +1 -1
- package/build/lib/vueQueryPlugin.d.ts +3 -2
- package/build/lib/vueQueryPlugin.d.ts.map +1 -0
- package/build/lib/vueQueryPlugin.js +0 -2
- package/build/lib/vueQueryPlugin.js.map +1 -1
- package/build/lib/vueQueryPlugin.mjs +0 -2
- package/build/lib/vueQueryPlugin.mjs.map +1 -1
- package/package.json +16 -13
- package/src/__mocks__/useBaseQuery.ts +8 -0
- package/src/__mocks__/useQueryClient.ts +10 -0
- package/src/__tests__/mutationCache.test.ts +40 -0
- package/src/__tests__/queryCache.test.ts +48 -0
- package/src/__tests__/queryClient.test.ts +365 -0
- package/src/__tests__/test-utils.ts +62 -0
- package/src/__tests__/useInfiniteQuery.test.ts +37 -0
- package/src/__tests__/useInfiniteQuery.types.test.tsx +102 -0
- package/src/__tests__/useIsFetching.test.ts +77 -0
- package/src/__tests__/useIsMutating.test.ts +123 -0
- package/src/__tests__/useMutation.test.ts +335 -0
- package/src/__tests__/useMutation.types.test.tsx +97 -0
- package/src/__tests__/useQueries.test.ts +256 -0
- package/src/__tests__/useQuery.test.ts +290 -0
- package/src/__tests__/useQuery.types.test.tsx +88 -0
- package/src/__tests__/useQueryClient.test.ts +51 -0
- package/src/__tests__/utils.test.ts +148 -0
- package/src/__tests__/vueQueryPlugin.test.ts +351 -0
- package/src/devtools/devtools.ts +249 -0
- package/src/devtools/utils.ts +96 -0
- package/src/index.ts +30 -0
- package/src/mutationCache.ts +25 -0
- package/src/queryCache.ts +21 -0
- package/src/queryClient.ts +278 -0
- package/src/types.ts +17 -0
- package/src/useBaseQuery.ts +152 -0
- package/src/useInfiniteQuery.ts +105 -0
- package/src/useIsFetching.ts +37 -0
- package/src/useMutation.ts +109 -0
- package/src/useMutationState.ts +73 -0
- package/src/useQueries.ts +227 -0
- package/src/useQuery.ts +125 -0
- package/src/useQueryClient.ts +23 -0
- package/src/utils.ts +67 -0
- package/src/vueQueryPlugin.ts +101 -0
- package/build/lib/devtools/devtools.esm.js +0 -155
- package/build/lib/devtools/devtools.esm.js.map +0 -1
- package/build/lib/devtools/utils.esm.js +0 -80
- package/build/lib/devtools/utils.esm.js.map +0 -1
- package/build/lib/index.esm.js +0 -14
- package/build/lib/index.esm.js.map +0 -1
- package/build/lib/mutationCache.esm.js +0 -14
- package/build/lib/mutationCache.esm.js.map +0 -1
- package/build/lib/queryCache.esm.js +0 -14
- package/build/lib/queryCache.esm.js.map +0 -1
- package/build/lib/queryClient.esm.js +0 -84
- package/build/lib/queryClient.esm.js.map +0 -1
- package/build/lib/useBaseQuery.esm.js +0 -67
- package/build/lib/useBaseQuery.esm.js.map +0 -1
- package/build/lib/useInfiniteQuery.esm.js +0 -18
- package/build/lib/useInfiniteQuery.esm.js.map +0 -1
- package/build/lib/useIsFetching.esm.js +0 -24
- package/build/lib/useIsFetching.esm.js.map +0 -1
- package/build/lib/useIsMutating.d.ts +0 -6
- package/build/lib/useIsMutating.esm.js +0 -24
- package/build/lib/useIsMutating.esm.js.map +0 -1
- package/build/lib/useIsMutating.js +0 -26
- package/build/lib/useIsMutating.js.map +0 -1
- package/build/lib/useIsMutating.mjs +0 -24
- package/build/lib/useIsMutating.mjs.map +0 -1
- package/build/lib/useMutation.esm.js +0 -39
- package/build/lib/useMutation.esm.js.map +0 -1
- package/build/lib/useQueries.esm.js +0 -46
- package/build/lib/useQueries.esm.js.map +0 -1
- package/build/lib/useQuery.esm.js +0 -13
- package/build/lib/useQuery.esm.js.map +0 -1
- package/build/lib/useQueryClient.esm.js +0 -18
- package/build/lib/useQueryClient.esm.js.map +0 -1
- package/build/lib/utils.esm.js +0 -50
- package/build/lib/utils.esm.js.map +0 -1
- package/build/lib/vueQueryPlugin.esm.js +0 -75
- package/build/lib/vueQueryPlugin.esm.js.map +0 -1
- package/build/umd/index.development.js +0 -4192
- package/build/umd/index.development.js.map +0 -1
- package/build/umd/index.production.js +0 -2
- 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
|
+
}
|