@tanstack/vue-query 5.0.0-alpha.7 → 5.0.0-alpha.71
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 +1 -0
- package/build/lib/__mocks__/useBaseQuery.d.ts.map +1 -0
- package/build/lib/__mocks__/useQueryClient.d.ts +1 -0
- 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.mjs → devtools.cjs} +62 -20
- package/build/lib/devtools/devtools.cjs.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 +61 -25
- package/build/lib/devtools/devtools.js.map +1 -1
- package/build/lib/devtools/devtools.legacy.cjs +198 -0
- package/build/lib/devtools/devtools.legacy.cjs.map +1 -0
- package/build/lib/devtools/{devtools.esm.js → devtools.legacy.js} +48 -8
- package/build/lib/devtools/devtools.legacy.js.map +1 -0
- package/build/lib/devtools/{utils.mjs → utils.cjs} +11 -5
- package/build/lib/devtools/{utils.mjs.map → utils.cjs.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 +4 -10
- package/build/lib/devtools/utils.js.map +1 -1
- package/build/lib/devtools/utils.legacy.cjs +85 -0
- package/build/lib/devtools/utils.legacy.cjs.map +1 -0
- package/build/lib/devtools/{utils.esm.js → utils.legacy.js} +4 -4
- package/build/lib/devtools/utils.legacy.js.map +1 -0
- package/build/lib/index.cjs +38 -0
- package/build/lib/index.cjs.map +1 -0
- package/build/lib/index.d.ts +1 -0
- package/build/lib/index.d.ts.map +1 -0
- package/build/lib/index.js +13 -37
- package/build/lib/index.js.map +1 -1
- package/build/lib/index.legacy.cjs +38 -0
- package/build/lib/index.legacy.cjs.map +1 -0
- package/build/lib/index.legacy.js +14 -0
- package/build/lib/index.legacy.js.map +1 -0
- package/build/lib/mutationCache.cjs +16 -0
- package/build/lib/{mutationCache.mjs.map → mutationCache.cjs.map} +1 -1
- package/build/lib/mutationCache.d.ts +1 -0
- package/build/lib/mutationCache.d.ts.map +1 -0
- package/build/lib/mutationCache.js +6 -8
- package/build/lib/mutationCache.js.map +1 -1
- package/build/lib/mutationCache.legacy.cjs +16 -0
- package/build/lib/mutationCache.legacy.cjs.map +1 -0
- package/build/lib/{mutationCache.esm.js → mutationCache.legacy.js} +2 -2
- package/build/lib/mutationCache.legacy.js.map +1 -0
- package/build/lib/queryCache.cjs +16 -0
- package/build/lib/{queryCache.mjs.map → queryCache.cjs.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 +6 -8
- package/build/lib/queryCache.js.map +1 -1
- package/build/lib/queryCache.legacy.cjs +16 -0
- package/build/lib/queryCache.legacy.cjs.map +1 -0
- package/build/lib/{queryCache.esm.js → queryCache.legacy.js} +2 -2
- package/build/lib/queryCache.legacy.js.map +1 -0
- package/build/lib/queryClient.cjs +86 -0
- package/build/lib/{queryClient.mjs.map → queryClient.cjs.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 +32 -34
- package/build/lib/queryClient.js.map +1 -1
- package/build/lib/queryClient.legacy.cjs +86 -0
- package/build/lib/queryClient.legacy.cjs.map +1 -0
- package/build/lib/{queryClient.esm.js → queryClient.legacy.js} +4 -4
- package/build/lib/queryClient.legacy.js.map +1 -0
- package/build/lib/types.d.ts +4 -3
- package/build/lib/types.d.ts.map +1 -0
- package/build/lib/{useBaseQuery.mjs → useBaseQuery.cjs} +19 -17
- package/build/lib/{useBaseQuery.mjs.map → useBaseQuery.cjs.map} +1 -1
- package/build/lib/useBaseQuery.d.ts +3 -2
- package/build/lib/useBaseQuery.d.ts.map +1 -0
- package/build/lib/useBaseQuery.js +16 -18
- package/build/lib/useBaseQuery.js.map +1 -1
- package/build/lib/useBaseQuery.legacy.cjs +69 -0
- package/build/lib/useBaseQuery.legacy.cjs.map +1 -0
- package/build/lib/{useBaseQuery.esm.js → useBaseQuery.legacy.js} +3 -3
- package/build/lib/useBaseQuery.legacy.js.map +1 -0
- package/build/lib/{useInfiniteQuery.mjs → useInfiniteQuery.cjs} +8 -6
- package/build/lib/{useInfiniteQuery.mjs.map → useInfiniteQuery.cjs.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 +5 -7
- package/build/lib/useInfiniteQuery.js.map +1 -1
- package/build/lib/useInfiniteQuery.legacy.cjs +20 -0
- package/build/lib/useInfiniteQuery.legacy.cjs.map +1 -0
- package/build/lib/{useInfiniteQuery.esm.js → useInfiniteQuery.legacy.js} +2 -2
- package/build/lib/useInfiniteQuery.legacy.js.map +1 -0
- package/build/lib/useIsFetching.cjs +26 -0
- package/build/lib/{useIsFetching.mjs.map → useIsFetching.cjs.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 +9 -11
- package/build/lib/useIsFetching.js.map +1 -1
- package/build/lib/useIsFetching.legacy.cjs +26 -0
- package/build/lib/useIsFetching.legacy.cjs.map +1 -0
- package/build/lib/{useIsFetching.mjs → useIsFetching.legacy.js} +3 -3
- package/build/lib/useIsFetching.legacy.js.map +1 -0
- package/build/lib/useMutation.cjs +41 -0
- package/build/lib/{useMutation.mjs.map → useMutation.cjs.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 +14 -16
- package/build/lib/useMutation.js.map +1 -1
- package/build/lib/useMutation.legacy.cjs +41 -0
- package/build/lib/useMutation.legacy.cjs.map +1 -0
- package/build/lib/{useMutation.esm.js → useMutation.legacy.js} +3 -3
- package/build/lib/useMutation.legacy.js.map +1 -0
- package/build/lib/useMutationState.cjs +43 -0
- package/build/lib/useMutationState.cjs.map +1 -0
- package/build/lib/useMutationState.d.ts +5 -4
- package/build/lib/useMutationState.d.ts.map +1 -0
- package/build/lib/useMutationState.js +20 -16
- package/build/lib/useMutationState.js.map +1 -1
- package/build/lib/useMutationState.legacy.cjs +43 -0
- package/build/lib/useMutationState.legacy.cjs.map +1 -0
- package/build/lib/{useMutationState.esm.js → useMutationState.legacy.js} +13 -6
- package/build/lib/useMutationState.legacy.js.map +1 -0
- package/build/lib/useQueries.cjs +62 -0
- package/build/lib/useQueries.cjs.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 +34 -22
- package/build/lib/useQueries.js.map +1 -1
- package/build/lib/useQueries.legacy.cjs +62 -0
- package/build/lib/useQueries.legacy.cjs.map +1 -0
- package/build/lib/useQueries.legacy.js +60 -0
- package/build/lib/useQueries.legacy.js.map +1 -0
- package/build/lib/useQuery.cjs +15 -0
- package/build/lib/{useQuery.mjs.map → useQuery.cjs.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 +4 -6
- package/build/lib/useQuery.js.map +1 -1
- package/build/lib/useQuery.legacy.cjs +15 -0
- package/build/lib/useQuery.legacy.cjs.map +1 -0
- package/build/lib/{useQuery.esm.js → useQuery.legacy.js} +2 -2
- package/build/lib/useQuery.legacy.js.map +1 -0
- package/build/lib/{useQueryClient.mjs → useQueryClient.cjs} +9 -7
- package/build/lib/{useQueryClient.mjs.map → useQueryClient.cjs.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 +6 -9
- package/build/lib/useQueryClient.js.map +1 -1
- package/build/lib/useQueryClient.legacy.cjs +21 -0
- package/build/lib/useQueryClient.legacy.cjs.map +1 -0
- package/build/lib/{useQueryClient.esm.js → useQueryClient.legacy.js} +2 -2
- package/build/lib/useQueryClient.legacy.js.map +1 -0
- package/build/lib/{utils.mjs → utils.cjs} +12 -6
- package/build/lib/{utils.mjs.map → utils.cjs.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 +5 -11
- package/build/lib/utils.js.map +1 -1
- package/build/lib/utils.legacy.cjs +56 -0
- package/build/lib/utils.legacy.cjs.map +1 -0
- package/build/lib/{utils.esm.js → utils.legacy.js} +1 -1
- package/build/lib/utils.legacy.js.map +1 -0
- package/build/lib/{vueQueryPlugin.esm.js → vueQueryPlugin.cjs} +15 -13
- package/build/lib/{vueQueryPlugin.mjs.map → vueQueryPlugin.cjs.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 +12 -14
- package/build/lib/vueQueryPlugin.js.map +1 -1
- package/build/lib/vueQueryPlugin.legacy.cjs +75 -0
- package/build/lib/vueQueryPlugin.legacy.cjs.map +1 -0
- package/build/lib/{vueQueryPlugin.mjs → vueQueryPlugin.legacy.js} +4 -4
- package/build/lib/vueQueryPlugin.legacy.js.map +1 -0
- package/package.json +20 -15
- 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 +81 -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.map +0 -1
- package/build/lib/devtools/devtools.mjs.map +0 -1
- 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/index.mjs +0 -14
- package/build/lib/index.mjs.map +0 -1
- package/build/lib/mutationCache.esm.js.map +0 -1
- package/build/lib/mutationCache.mjs +0 -14
- package/build/lib/queryCache.esm.js.map +0 -1
- package/build/lib/queryCache.mjs +0 -14
- package/build/lib/queryClient.esm.js.map +0 -1
- package/build/lib/queryClient.mjs +0 -84
- package/build/lib/useBaseQuery.esm.js.map +0 -1
- 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/useMutation.esm.js.map +0 -1
- package/build/lib/useMutation.mjs +0 -39
- package/build/lib/useMutationState.esm.js.map +0 -1
- package/build/lib/useMutationState.mjs +0 -33
- package/build/lib/useMutationState.mjs.map +0 -1
- package/build/lib/useQueries.esm.js +0 -46
- package/build/lib/useQueries.esm.js.map +0 -1
- package/build/lib/useQueries.mjs +0 -46
- package/build/lib/useQueries.mjs.map +0 -1
- package/build/lib/useQuery.esm.js.map +0 -1
- package/build/lib/useQuery.mjs +0 -13
- package/build/lib/useQueryClient.esm.js.map +0 -1
- package/build/lib/utils.esm.js.map +0 -1
- package/build/lib/vueQueryPlugin.esm.js.map +0 -1
- package/build/umd/index.development.js +0 -4199
- 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
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { InfiniteData } from '@tanstack/query-core'
|
|
2
|
+
import { reactive } from 'vue'
|
|
3
|
+
import { useInfiniteQuery } from '../useInfiniteQuery'
|
|
4
|
+
import type { Equal, Expect } from './test-utils'
|
|
5
|
+
import { doNotExecute, simpleFetcher } from './test-utils'
|
|
6
|
+
|
|
7
|
+
describe('Discriminated union return type', () => {
|
|
8
|
+
it('data should be possibly undefined by default', () => {
|
|
9
|
+
doNotExecute(() => {
|
|
10
|
+
const query = reactive(
|
|
11
|
+
useInfiniteQuery({
|
|
12
|
+
queryKey: ['infiniteQuery'],
|
|
13
|
+
queryFn: simpleFetcher,
|
|
14
|
+
getNextPageParam: () => undefined,
|
|
15
|
+
defaultPageParam: 0,
|
|
16
|
+
}),
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
const result: Expect<
|
|
20
|
+
Equal<InfiniteData<string> | undefined, typeof query.data>
|
|
21
|
+
> = true
|
|
22
|
+
return result
|
|
23
|
+
})
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
it('data should be defined when query is success', () => {
|
|
27
|
+
doNotExecute(() => {
|
|
28
|
+
const query = reactive(
|
|
29
|
+
useInfiniteQuery({
|
|
30
|
+
queryKey: ['infiniteQuery'],
|
|
31
|
+
queryFn: simpleFetcher,
|
|
32
|
+
getNextPageParam: () => undefined,
|
|
33
|
+
defaultPageParam: 0,
|
|
34
|
+
}),
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
if (query.isSuccess) {
|
|
38
|
+
const result: Expect<Equal<InfiniteData<string>, typeof query.data>> =
|
|
39
|
+
true
|
|
40
|
+
return result
|
|
41
|
+
}
|
|
42
|
+
return
|
|
43
|
+
})
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('error should be null when query is success', () => {
|
|
47
|
+
doNotExecute(() => {
|
|
48
|
+
const query = reactive(
|
|
49
|
+
useInfiniteQuery({
|
|
50
|
+
queryKey: ['infiniteQuery'],
|
|
51
|
+
queryFn: simpleFetcher,
|
|
52
|
+
getNextPageParam: () => undefined,
|
|
53
|
+
defaultPageParam: 0,
|
|
54
|
+
}),
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
if (query.isSuccess) {
|
|
58
|
+
const result: Expect<Equal<null, typeof query.error>> = true
|
|
59
|
+
return result
|
|
60
|
+
}
|
|
61
|
+
return
|
|
62
|
+
})
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
it('data should be undefined when query is pending', () => {
|
|
66
|
+
doNotExecute(() => {
|
|
67
|
+
const query = reactive(
|
|
68
|
+
useInfiniteQuery({
|
|
69
|
+
queryKey: ['infiniteQuery'],
|
|
70
|
+
queryFn: simpleFetcher,
|
|
71
|
+
getNextPageParam: () => undefined,
|
|
72
|
+
defaultPageParam: 0,
|
|
73
|
+
}),
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
if (query.isPending) {
|
|
77
|
+
const result: Expect<Equal<undefined, typeof query.data>> = true
|
|
78
|
+
return result
|
|
79
|
+
}
|
|
80
|
+
return
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
it('error should be defined when query is error', () => {
|
|
85
|
+
doNotExecute(() => {
|
|
86
|
+
const query = reactive(
|
|
87
|
+
useInfiniteQuery({
|
|
88
|
+
queryKey: ['infiniteQuery'],
|
|
89
|
+
queryFn: simpleFetcher,
|
|
90
|
+
getNextPageParam: () => undefined,
|
|
91
|
+
defaultPageParam: 0,
|
|
92
|
+
}),
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
if (query.isError) {
|
|
96
|
+
const result: Expect<Equal<Error, typeof query.error>> = true
|
|
97
|
+
return result
|
|
98
|
+
}
|
|
99
|
+
return
|
|
100
|
+
})
|
|
101
|
+
})
|
|
102
|
+
})
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { onScopeDispose, reactive } from 'vue-demi'
|
|
2
|
+
|
|
3
|
+
import { flushPromises, simpleFetcher } from './test-utils'
|
|
4
|
+
import { useQuery } from '../useQuery'
|
|
5
|
+
import { useIsFetching } from '../useIsFetching'
|
|
6
|
+
import { vi } from 'vitest'
|
|
7
|
+
import type { MockedFunction } from 'vitest'
|
|
8
|
+
|
|
9
|
+
vi.mock('../useQueryClient')
|
|
10
|
+
|
|
11
|
+
describe('useIsFetching', () => {
|
|
12
|
+
test('should properly return isFetching state', async () => {
|
|
13
|
+
const { isFetching: isFetchingQuery } = useQuery({
|
|
14
|
+
queryKey: ['isFetching1'],
|
|
15
|
+
queryFn: simpleFetcher,
|
|
16
|
+
})
|
|
17
|
+
useQuery({ queryKey: ['isFetching2'], queryFn: simpleFetcher })
|
|
18
|
+
const isFetching = useIsFetching()
|
|
19
|
+
|
|
20
|
+
expect(isFetchingQuery.value).toStrictEqual(true)
|
|
21
|
+
expect(isFetching.value).toStrictEqual(2)
|
|
22
|
+
|
|
23
|
+
await flushPromises()
|
|
24
|
+
|
|
25
|
+
expect(isFetchingQuery.value).toStrictEqual(false)
|
|
26
|
+
expect(isFetching.value).toStrictEqual(0)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
test('should stop listening to changes on onScopeDispose', async () => {
|
|
30
|
+
const onScopeDisposeMock = onScopeDispose as MockedFunction<
|
|
31
|
+
typeof onScopeDispose
|
|
32
|
+
>
|
|
33
|
+
onScopeDisposeMock.mockImplementation((fn) => fn())
|
|
34
|
+
|
|
35
|
+
const { status } = useQuery({
|
|
36
|
+
queryKey: ['onScopeDispose'],
|
|
37
|
+
queryFn: simpleFetcher,
|
|
38
|
+
})
|
|
39
|
+
const isFetching = useIsFetching()
|
|
40
|
+
|
|
41
|
+
expect(status.value).toStrictEqual('pending')
|
|
42
|
+
expect(isFetching.value).toStrictEqual(1)
|
|
43
|
+
|
|
44
|
+
await flushPromises()
|
|
45
|
+
|
|
46
|
+
expect(status.value).toStrictEqual('pending')
|
|
47
|
+
expect(isFetching.value).toStrictEqual(1)
|
|
48
|
+
|
|
49
|
+
await flushPromises()
|
|
50
|
+
|
|
51
|
+
expect(status.value).toStrictEqual('pending')
|
|
52
|
+
expect(isFetching.value).toStrictEqual(1)
|
|
53
|
+
|
|
54
|
+
onScopeDisposeMock.mockReset()
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
test('should properly update filters', async () => {
|
|
58
|
+
const filter = reactive({ stale: false })
|
|
59
|
+
useQuery({
|
|
60
|
+
queryKey: ['isFetching'],
|
|
61
|
+
queryFn: () =>
|
|
62
|
+
new Promise((resolve) => {
|
|
63
|
+
setTimeout(() => {
|
|
64
|
+
return resolve('Some data')
|
|
65
|
+
}, 100)
|
|
66
|
+
}),
|
|
67
|
+
})
|
|
68
|
+
const isFetching = useIsFetching(filter)
|
|
69
|
+
|
|
70
|
+
expect(isFetching.value).toStrictEqual(0)
|
|
71
|
+
|
|
72
|
+
filter.stale = true
|
|
73
|
+
await flushPromises()
|
|
74
|
+
|
|
75
|
+
expect(isFetching.value).toStrictEqual(1)
|
|
76
|
+
})
|
|
77
|
+
})
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { onScopeDispose, reactive } from 'vue-demi'
|
|
2
|
+
|
|
3
|
+
import { flushPromises, successMutator } from './test-utils'
|
|
4
|
+
import { useMutation } from '../useMutation'
|
|
5
|
+
import { useIsMutating, useMutationState } from '../useMutationState'
|
|
6
|
+
import { vi } from 'vitest'
|
|
7
|
+
import type { MockedFunction } from 'vitest'
|
|
8
|
+
import { useQueryClient } from '../useQueryClient'
|
|
9
|
+
|
|
10
|
+
vi.mock('../useQueryClient')
|
|
11
|
+
|
|
12
|
+
describe('useIsMutating', () => {
|
|
13
|
+
test('should properly return isMutating state', async () => {
|
|
14
|
+
const mutation = useMutation({
|
|
15
|
+
mutationFn: (params: string) => successMutator(params),
|
|
16
|
+
})
|
|
17
|
+
const mutation2 = useMutation({
|
|
18
|
+
mutationFn: (params: string) => successMutator(params),
|
|
19
|
+
})
|
|
20
|
+
const isMutating = useIsMutating()
|
|
21
|
+
|
|
22
|
+
expect(isMutating.value).toStrictEqual(0)
|
|
23
|
+
|
|
24
|
+
mutation.mutateAsync('a')
|
|
25
|
+
mutation2.mutateAsync('b')
|
|
26
|
+
|
|
27
|
+
await flushPromises()
|
|
28
|
+
|
|
29
|
+
expect(isMutating.value).toStrictEqual(2)
|
|
30
|
+
|
|
31
|
+
await flushPromises()
|
|
32
|
+
|
|
33
|
+
expect(isMutating.value).toStrictEqual(0)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
test('should stop listening to changes on onScopeDispose', async () => {
|
|
37
|
+
const onScopeDisposeMock = onScopeDispose as MockedFunction<
|
|
38
|
+
typeof onScopeDispose
|
|
39
|
+
>
|
|
40
|
+
onScopeDisposeMock.mockImplementation((fn) => fn())
|
|
41
|
+
|
|
42
|
+
const mutation = useMutation({
|
|
43
|
+
mutationFn: (params: string) => successMutator(params),
|
|
44
|
+
})
|
|
45
|
+
const mutation2 = useMutation({
|
|
46
|
+
mutationFn: (params: string) => successMutator(params),
|
|
47
|
+
})
|
|
48
|
+
const isMutating = useIsMutating()
|
|
49
|
+
|
|
50
|
+
expect(isMutating.value).toStrictEqual(0)
|
|
51
|
+
|
|
52
|
+
mutation.mutateAsync('a')
|
|
53
|
+
mutation2.mutateAsync('b')
|
|
54
|
+
|
|
55
|
+
await flushPromises()
|
|
56
|
+
|
|
57
|
+
expect(isMutating.value).toStrictEqual(0)
|
|
58
|
+
|
|
59
|
+
await flushPromises()
|
|
60
|
+
|
|
61
|
+
expect(isMutating.value).toStrictEqual(0)
|
|
62
|
+
|
|
63
|
+
onScopeDisposeMock.mockReset()
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
test('should properly update filters', async () => {
|
|
67
|
+
const filter = reactive({ mutationKey: ['foo'] })
|
|
68
|
+
const { mutate } = useMutation({
|
|
69
|
+
mutationKey: ['isMutating'],
|
|
70
|
+
mutationFn: (params: string) => successMutator(params),
|
|
71
|
+
})
|
|
72
|
+
mutate('foo')
|
|
73
|
+
|
|
74
|
+
const isMutating = useIsMutating(filter)
|
|
75
|
+
|
|
76
|
+
expect(isMutating.value).toStrictEqual(0)
|
|
77
|
+
|
|
78
|
+
filter.mutationKey = ['isMutating']
|
|
79
|
+
|
|
80
|
+
await flushPromises()
|
|
81
|
+
|
|
82
|
+
expect(isMutating.value).toStrictEqual(1)
|
|
83
|
+
})
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
describe('useMutationState', () => {
|
|
87
|
+
it('should return variables after calling mutate', async () => {
|
|
88
|
+
const mutationKey = ['mutation']
|
|
89
|
+
const variables = 'foo123'
|
|
90
|
+
|
|
91
|
+
const { mutate } = useMutation({
|
|
92
|
+
mutationKey: mutationKey,
|
|
93
|
+
mutationFn: (params: string) => successMutator(params),
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
mutate(variables)
|
|
97
|
+
|
|
98
|
+
const mutationState = useMutationState({
|
|
99
|
+
filters: { mutationKey, status: 'pending' },
|
|
100
|
+
select: (mutation) => mutation.state.variables,
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
expect(mutationState.value).toEqual([variables])
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
it('should return variables after calling mutate', async () => {
|
|
107
|
+
const queryClient = useQueryClient()
|
|
108
|
+
queryClient.clear()
|
|
109
|
+
const mutationKey = ['mutation']
|
|
110
|
+
const variables = 'bar234'
|
|
111
|
+
|
|
112
|
+
const { mutate } = useMutation({
|
|
113
|
+
mutationKey: mutationKey,
|
|
114
|
+
mutationFn: (params: string) => successMutator(params),
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
mutate(variables)
|
|
118
|
+
|
|
119
|
+
const mutationState = useMutationState()
|
|
120
|
+
|
|
121
|
+
expect(mutationState.value[0]).toContain({ variables: variables })
|
|
122
|
+
})
|
|
123
|
+
})
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import { reactive, ref } from 'vue-demi'
|
|
2
|
+
import { errorMutator, flushPromises, successMutator } from './test-utils'
|
|
3
|
+
import { useMutation } from '../useMutation'
|
|
4
|
+
import { useQueryClient } from '../useQueryClient'
|
|
5
|
+
import { vi } from 'vitest'
|
|
6
|
+
|
|
7
|
+
vi.mock('../useQueryClient')
|
|
8
|
+
|
|
9
|
+
describe('useMutation', () => {
|
|
10
|
+
test('should be in idle state initially', () => {
|
|
11
|
+
const mutation = useMutation({
|
|
12
|
+
mutationFn: (params) => successMutator(params),
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
expect(mutation).toMatchObject({
|
|
16
|
+
isIdle: { value: true },
|
|
17
|
+
isPending: { value: false },
|
|
18
|
+
isError: { value: false },
|
|
19
|
+
isSuccess: { value: false },
|
|
20
|
+
})
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
test('should change state after invoking mutate', () => {
|
|
24
|
+
const result = 'Mock data'
|
|
25
|
+
const mutation = useMutation({
|
|
26
|
+
mutationFn: (params: string) => successMutator(params),
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
mutation.mutate(result)
|
|
30
|
+
|
|
31
|
+
expect(mutation).toMatchObject({
|
|
32
|
+
isIdle: { value: false },
|
|
33
|
+
isPending: { value: true },
|
|
34
|
+
isError: { value: false },
|
|
35
|
+
isSuccess: { value: false },
|
|
36
|
+
data: { value: undefined },
|
|
37
|
+
error: { value: null },
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
test('should return error when request fails', async () => {
|
|
42
|
+
const mutation = useMutation({ mutationFn: errorMutator })
|
|
43
|
+
mutation.mutate({})
|
|
44
|
+
await flushPromises(10)
|
|
45
|
+
expect(mutation).toMatchObject({
|
|
46
|
+
isIdle: { value: false },
|
|
47
|
+
isPending: { value: false },
|
|
48
|
+
isError: { value: true },
|
|
49
|
+
isSuccess: { value: false },
|
|
50
|
+
data: { value: undefined },
|
|
51
|
+
error: { value: Error('Some error') },
|
|
52
|
+
})
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
test('should return data when request succeeds', async () => {
|
|
56
|
+
const result = 'Mock data'
|
|
57
|
+
const mutation = useMutation({
|
|
58
|
+
mutationFn: (params: string) => successMutator(params),
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
mutation.mutate(result)
|
|
62
|
+
|
|
63
|
+
await flushPromises(10)
|
|
64
|
+
|
|
65
|
+
expect(mutation).toMatchObject({
|
|
66
|
+
isIdle: { value: false },
|
|
67
|
+
isPending: { value: false },
|
|
68
|
+
isError: { value: false },
|
|
69
|
+
isSuccess: { value: true },
|
|
70
|
+
data: { value: 'Mock data' },
|
|
71
|
+
error: { value: null },
|
|
72
|
+
})
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
test('should update reactive options', async () => {
|
|
76
|
+
const queryClient = useQueryClient()
|
|
77
|
+
const mutationCache = queryClient.getMutationCache()
|
|
78
|
+
const options = reactive({
|
|
79
|
+
mutationKey: ['foo'],
|
|
80
|
+
mutationFn: (params: string) => successMutator(params),
|
|
81
|
+
})
|
|
82
|
+
const mutation = useMutation(options)
|
|
83
|
+
|
|
84
|
+
options.mutationKey = ['bar']
|
|
85
|
+
await flushPromises()
|
|
86
|
+
mutation.mutate('xyz')
|
|
87
|
+
|
|
88
|
+
await flushPromises()
|
|
89
|
+
|
|
90
|
+
const mutations = mutationCache.find({ mutationKey: ['bar'] })
|
|
91
|
+
|
|
92
|
+
expect(mutations?.options.mutationKey).toEqual(['bar'])
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
test('should update reactive options deeply', async () => {
|
|
96
|
+
type MutationKeyTest = {
|
|
97
|
+
entity: string
|
|
98
|
+
otherObject: {
|
|
99
|
+
name: string
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const mutationKey = ref<MutationKeyTest[]>([
|
|
103
|
+
{
|
|
104
|
+
entity: 'test',
|
|
105
|
+
otherObject: { name: 'objectName' },
|
|
106
|
+
},
|
|
107
|
+
])
|
|
108
|
+
const queryClient = useQueryClient()
|
|
109
|
+
const mutationCache = queryClient.getMutationCache()
|
|
110
|
+
const options = reactive({
|
|
111
|
+
mutationKey,
|
|
112
|
+
mutationFn: (params: string) => successMutator(params),
|
|
113
|
+
})
|
|
114
|
+
const mutation = useMutation(options)
|
|
115
|
+
|
|
116
|
+
mutationKey.value[0]!.otherObject.name = 'someOtherObjectName'
|
|
117
|
+
await flushPromises()
|
|
118
|
+
mutation.mutate('xyz')
|
|
119
|
+
|
|
120
|
+
await flushPromises()
|
|
121
|
+
|
|
122
|
+
const mutations = mutationCache.getAll()
|
|
123
|
+
const relevantMutation = mutations.find((m) => {
|
|
124
|
+
return (
|
|
125
|
+
Array.isArray(m.options.mutationKey) &&
|
|
126
|
+
!!m.options.mutationKey[0].otherObject
|
|
127
|
+
)
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
expect(
|
|
131
|
+
(relevantMutation?.options.mutationKey as MutationKeyTest[])[0]
|
|
132
|
+
?.otherObject.name === 'someOtherObjectName',
|
|
133
|
+
)
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
test('should allow for non-options object (mutationFn or mutationKey) passed as arg1 & arg2 to trigger reactive updates', async () => {
|
|
137
|
+
const mutationKey = ref<string[]>(['foo2'])
|
|
138
|
+
const mutationFn = ref((params: string) => successMutator(params))
|
|
139
|
+
const queryClient = useQueryClient()
|
|
140
|
+
const mutationCache = queryClient.getMutationCache()
|
|
141
|
+
const mutation = useMutation({ mutationKey, mutationFn })
|
|
142
|
+
|
|
143
|
+
mutationKey.value = ['bar2']
|
|
144
|
+
let proof = false
|
|
145
|
+
mutationFn.value = (params: string) => {
|
|
146
|
+
proof = true
|
|
147
|
+
return successMutator(params)
|
|
148
|
+
}
|
|
149
|
+
await flushPromises()
|
|
150
|
+
|
|
151
|
+
mutation.mutate('xyz')
|
|
152
|
+
await flushPromises()
|
|
153
|
+
|
|
154
|
+
const mutations = mutationCache.find({ mutationKey: ['bar2'] })
|
|
155
|
+
expect(mutations?.options.mutationKey).toEqual(['bar2'])
|
|
156
|
+
expect(proof).toEqual(true)
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
test('should reset state after invoking mutation.reset', async () => {
|
|
160
|
+
const mutation = useMutation({
|
|
161
|
+
mutationFn: (params: string) => errorMutator(params),
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
mutation.mutate('')
|
|
165
|
+
|
|
166
|
+
await flushPromises(10)
|
|
167
|
+
|
|
168
|
+
mutation.reset()
|
|
169
|
+
|
|
170
|
+
expect(mutation).toMatchObject({
|
|
171
|
+
isIdle: { value: true },
|
|
172
|
+
isPending: { value: false },
|
|
173
|
+
isError: { value: false },
|
|
174
|
+
isSuccess: { value: false },
|
|
175
|
+
data: { value: undefined },
|
|
176
|
+
error: { value: null },
|
|
177
|
+
})
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
describe('side effects', () => {
|
|
181
|
+
beforeEach(() => {
|
|
182
|
+
vi.clearAllMocks()
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
test('should call onMutate when passed as an option', async () => {
|
|
186
|
+
const onMutate = vi.fn()
|
|
187
|
+
const mutation = useMutation({
|
|
188
|
+
mutationFn: (params: string) => successMutator(params),
|
|
189
|
+
onMutate,
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
mutation.mutate('')
|
|
193
|
+
|
|
194
|
+
await flushPromises(10)
|
|
195
|
+
|
|
196
|
+
expect(onMutate).toHaveBeenCalledTimes(1)
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
test('should call onError when passed as an option', async () => {
|
|
200
|
+
const onError = vi.fn()
|
|
201
|
+
const mutation = useMutation({
|
|
202
|
+
mutationFn: (params: string) => errorMutator(params),
|
|
203
|
+
onError,
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
mutation.mutate('')
|
|
207
|
+
|
|
208
|
+
await flushPromises(10)
|
|
209
|
+
|
|
210
|
+
expect(onError).toHaveBeenCalledTimes(1)
|
|
211
|
+
})
|
|
212
|
+
|
|
213
|
+
test('should call onSuccess when passed as an option', async () => {
|
|
214
|
+
const onSuccess = vi.fn()
|
|
215
|
+
const mutation = useMutation({
|
|
216
|
+
mutationFn: (params: string) => successMutator(params),
|
|
217
|
+
onSuccess,
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
mutation.mutate('')
|
|
221
|
+
|
|
222
|
+
await flushPromises(10)
|
|
223
|
+
|
|
224
|
+
expect(onSuccess).toHaveBeenCalledTimes(1)
|
|
225
|
+
})
|
|
226
|
+
|
|
227
|
+
test('should call onSettled when passed as an option', async () => {
|
|
228
|
+
const onSettled = vi.fn()
|
|
229
|
+
const mutation = useMutation({
|
|
230
|
+
mutationFn: (params: string) => successMutator(params),
|
|
231
|
+
onSettled,
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
mutation.mutate('')
|
|
235
|
+
|
|
236
|
+
await flushPromises(10)
|
|
237
|
+
|
|
238
|
+
expect(onSettled).toHaveBeenCalledTimes(1)
|
|
239
|
+
})
|
|
240
|
+
|
|
241
|
+
test('should call onError when passed as an argument of mutate function', async () => {
|
|
242
|
+
const onError = vi.fn()
|
|
243
|
+
const mutation = useMutation({
|
|
244
|
+
mutationFn: (params: string) => errorMutator(params),
|
|
245
|
+
})
|
|
246
|
+
|
|
247
|
+
mutation.mutate('', { onError })
|
|
248
|
+
|
|
249
|
+
await flushPromises(10)
|
|
250
|
+
|
|
251
|
+
expect(onError).toHaveBeenCalledTimes(1)
|
|
252
|
+
})
|
|
253
|
+
|
|
254
|
+
test('should call onSuccess when passed as an argument of mutate function', async () => {
|
|
255
|
+
const onSuccess = vi.fn()
|
|
256
|
+
const mutation = useMutation({
|
|
257
|
+
mutationFn: (params: string) => successMutator(params),
|
|
258
|
+
})
|
|
259
|
+
|
|
260
|
+
mutation.mutate('', { onSuccess })
|
|
261
|
+
|
|
262
|
+
await flushPromises(10)
|
|
263
|
+
|
|
264
|
+
expect(onSuccess).toHaveBeenCalledTimes(1)
|
|
265
|
+
})
|
|
266
|
+
|
|
267
|
+
test('should call onSettled when passed as an argument of mutate function', async () => {
|
|
268
|
+
const onSettled = vi.fn()
|
|
269
|
+
const mutation = useMutation({
|
|
270
|
+
mutationFn: (params: string) => successMutator(params),
|
|
271
|
+
})
|
|
272
|
+
|
|
273
|
+
mutation.mutate('', { onSettled })
|
|
274
|
+
|
|
275
|
+
await flushPromises(10)
|
|
276
|
+
|
|
277
|
+
expect(onSettled).toHaveBeenCalledTimes(1)
|
|
278
|
+
})
|
|
279
|
+
|
|
280
|
+
test('should fire both onSettled functions', async () => {
|
|
281
|
+
const onSettled = vi.fn()
|
|
282
|
+
const onSettledOnFunction = vi.fn()
|
|
283
|
+
const mutation = useMutation({
|
|
284
|
+
mutationFn: (params: string) => successMutator(params),
|
|
285
|
+
onSettled,
|
|
286
|
+
})
|
|
287
|
+
|
|
288
|
+
mutation.mutate('', { onSettled: onSettledOnFunction })
|
|
289
|
+
|
|
290
|
+
await flushPromises(10)
|
|
291
|
+
|
|
292
|
+
expect(onSettled).toHaveBeenCalledTimes(1)
|
|
293
|
+
expect(onSettledOnFunction).toHaveBeenCalledTimes(1)
|
|
294
|
+
})
|
|
295
|
+
})
|
|
296
|
+
|
|
297
|
+
describe('async', () => {
|
|
298
|
+
beforeEach(() => {
|
|
299
|
+
vi.clearAllMocks()
|
|
300
|
+
})
|
|
301
|
+
|
|
302
|
+
test('should resolve properly', async () => {
|
|
303
|
+
const result = 'Mock data'
|
|
304
|
+
const mutation = useMutation({
|
|
305
|
+
mutationFn: (params: string) => successMutator(params),
|
|
306
|
+
})
|
|
307
|
+
|
|
308
|
+
await expect(mutation.mutateAsync(result)).resolves.toBe(result)
|
|
309
|
+
|
|
310
|
+
expect(mutation).toMatchObject({
|
|
311
|
+
isIdle: { value: false },
|
|
312
|
+
isPending: { value: false },
|
|
313
|
+
isError: { value: false },
|
|
314
|
+
isSuccess: { value: true },
|
|
315
|
+
data: { value: 'Mock data' },
|
|
316
|
+
error: { value: null },
|
|
317
|
+
})
|
|
318
|
+
})
|
|
319
|
+
|
|
320
|
+
test('should throw on error', async () => {
|
|
321
|
+
const mutation = useMutation({ mutationFn: errorMutator })
|
|
322
|
+
|
|
323
|
+
await expect(mutation.mutateAsync({})).rejects.toThrowError('Some error')
|
|
324
|
+
|
|
325
|
+
expect(mutation).toMatchObject({
|
|
326
|
+
isIdle: { value: false },
|
|
327
|
+
isPending: { value: false },
|
|
328
|
+
isError: { value: true },
|
|
329
|
+
isSuccess: { value: false },
|
|
330
|
+
data: { value: undefined },
|
|
331
|
+
error: { value: Error('Some error') },
|
|
332
|
+
})
|
|
333
|
+
})
|
|
334
|
+
})
|
|
335
|
+
})
|