@tanstack/query-core 5.24.8 → 5.26.3
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/build/legacy/focusManager.cjs +2 -1
- package/build/legacy/focusManager.cjs.map +1 -1
- package/build/legacy/focusManager.d.cts +2 -1
- package/build/legacy/focusManager.d.ts +2 -1
- package/build/legacy/focusManager.js +2 -1
- package/build/legacy/focusManager.js.map +1 -1
- package/build/legacy/hydration.d.cts +1 -1
- package/build/legacy/hydration.d.ts +1 -1
- package/build/legacy/index.cjs +3 -1
- package/build/legacy/index.cjs.map +1 -1
- package/build/legacy/index.d.cts +1 -1
- package/build/legacy/index.d.ts +1 -1
- package/build/legacy/index.js +4 -2
- package/build/legacy/index.js.map +1 -1
- package/build/legacy/infiniteQueryBehavior.cjs +12 -3
- package/build/legacy/infiniteQueryBehavior.cjs.map +1 -1
- package/build/legacy/infiniteQueryBehavior.d.cts +1 -1
- package/build/legacy/infiniteQueryBehavior.d.ts +1 -1
- package/build/legacy/infiniteQueryBehavior.js +13 -4
- package/build/legacy/infiniteQueryBehavior.js.map +1 -1
- package/build/legacy/infiniteQueryObserver.d.cts +1 -1
- package/build/legacy/infiniteQueryObserver.d.ts +1 -1
- package/build/legacy/mutation.d.cts +1 -1
- package/build/legacy/mutation.d.ts +1 -1
- package/build/legacy/mutationCache.d.cts +1 -1
- package/build/legacy/mutationCache.d.ts +1 -1
- package/build/legacy/mutationObserver.d.cts +1 -1
- package/build/legacy/mutationObserver.d.ts +1 -1
- package/build/legacy/queriesObserver.d.cts +1 -1
- package/build/legacy/queriesObserver.d.ts +1 -1
- package/build/legacy/query.cjs +8 -1
- package/build/legacy/query.cjs.map +1 -1
- package/build/legacy/query.d.cts +1 -1
- package/build/legacy/query.d.ts +1 -1
- package/build/legacy/query.js +9 -2
- package/build/legacy/query.js.map +1 -1
- package/build/legacy/queryCache.d.cts +1 -1
- package/build/legacy/queryCache.d.ts +1 -1
- package/build/legacy/{queryClient-JUWz6dOI.d.cts → queryClient-QsbA-3YL.d.cts} +4 -2
- package/build/legacy/{queryClient-p98HhdxQ.d.ts → queryClient-pTTqDRDI.d.ts} +4 -2
- package/build/legacy/queryClient.cjs +5 -2
- package/build/legacy/queryClient.cjs.map +1 -1
- package/build/legacy/queryClient.d.cts +1 -1
- package/build/legacy/queryClient.d.ts +1 -1
- package/build/legacy/queryClient.js +7 -3
- package/build/legacy/queryClient.js.map +1 -1
- package/build/legacy/queryObserver.d.cts +1 -1
- package/build/legacy/queryObserver.d.ts +1 -1
- package/build/legacy/retryer.d.cts +1 -1
- package/build/legacy/retryer.d.ts +1 -1
- package/build/legacy/types.cjs.map +1 -1
- package/build/legacy/types.d.cts +1 -1
- package/build/legacy/types.d.ts +1 -1
- package/build/legacy/utils.cjs +3 -0
- package/build/legacy/utils.cjs.map +1 -1
- package/build/legacy/utils.d.cts +1 -1
- package/build/legacy/utils.d.ts +1 -1
- package/build/legacy/utils.js +2 -0
- package/build/legacy/utils.js.map +1 -1
- package/build/modern/focusManager.cjs +2 -1
- package/build/modern/focusManager.cjs.map +1 -1
- package/build/modern/focusManager.d.cts +2 -1
- package/build/modern/focusManager.d.ts +2 -1
- package/build/modern/focusManager.js +2 -1
- package/build/modern/focusManager.js.map +1 -1
- package/build/modern/hydration.d.cts +1 -1
- package/build/modern/hydration.d.ts +1 -1
- package/build/modern/index.cjs +3 -1
- package/build/modern/index.cjs.map +1 -1
- package/build/modern/index.d.cts +1 -1
- package/build/modern/index.d.ts +1 -1
- package/build/modern/index.js +4 -2
- package/build/modern/index.js.map +1 -1
- package/build/modern/infiniteQueryBehavior.cjs +12 -3
- package/build/modern/infiniteQueryBehavior.cjs.map +1 -1
- package/build/modern/infiniteQueryBehavior.d.cts +1 -1
- package/build/modern/infiniteQueryBehavior.d.ts +1 -1
- package/build/modern/infiniteQueryBehavior.js +13 -4
- package/build/modern/infiniteQueryBehavior.js.map +1 -1
- package/build/modern/infiniteQueryObserver.d.cts +1 -1
- package/build/modern/infiniteQueryObserver.d.ts +1 -1
- package/build/modern/mutation.d.cts +1 -1
- package/build/modern/mutation.d.ts +1 -1
- package/build/modern/mutationCache.d.cts +1 -1
- package/build/modern/mutationCache.d.ts +1 -1
- package/build/modern/mutationObserver.d.cts +1 -1
- package/build/modern/mutationObserver.d.ts +1 -1
- package/build/modern/queriesObserver.d.cts +1 -1
- package/build/modern/queriesObserver.d.ts +1 -1
- package/build/modern/query.cjs +8 -1
- package/build/modern/query.cjs.map +1 -1
- package/build/modern/query.d.cts +1 -1
- package/build/modern/query.d.ts +1 -1
- package/build/modern/query.js +9 -2
- package/build/modern/query.js.map +1 -1
- package/build/modern/queryCache.d.cts +1 -1
- package/build/modern/queryCache.d.ts +1 -1
- package/build/modern/{queryClient-JUWz6dOI.d.cts → queryClient-QsbA-3YL.d.cts} +4 -2
- package/build/modern/{queryClient-p98HhdxQ.d.ts → queryClient-pTTqDRDI.d.ts} +4 -2
- package/build/modern/queryClient.cjs +5 -2
- package/build/modern/queryClient.cjs.map +1 -1
- package/build/modern/queryClient.d.cts +1 -1
- package/build/modern/queryClient.d.ts +1 -1
- package/build/modern/queryClient.js +7 -3
- package/build/modern/queryClient.js.map +1 -1
- package/build/modern/queryObserver.d.cts +1 -1
- package/build/modern/queryObserver.d.ts +1 -1
- package/build/modern/retryer.d.cts +1 -1
- package/build/modern/retryer.d.ts +1 -1
- package/build/modern/types.cjs.map +1 -1
- package/build/modern/types.d.cts +1 -1
- package/build/modern/types.d.ts +1 -1
- package/build/modern/utils.cjs +3 -0
- package/build/modern/utils.cjs.map +1 -1
- package/build/modern/utils.d.cts +1 -1
- package/build/modern/utils.d.ts +1 -1
- package/build/modern/utils.js +2 -0
- package/build/modern/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/focusManager.ts +5 -2
- package/src/index.ts +2 -1
- package/src/infiniteQueryBehavior.ts +15 -6
- package/src/query.ts +11 -2
- package/src/queryClient.ts +10 -2
- package/src/tests/focusManager.test.tsx +3 -0
- package/src/tests/infiniteQueryObserver.test-d.tsx +62 -0
- package/src/tests/infiniteQueryObserver.test.tsx +2 -51
- package/src/tests/query.test.tsx +9 -3
- package/src/tests/queryClient.test-d.tsx +135 -0
- package/src/tests/queryClient.test.tsx +10 -0
- package/src/tests/queryObserver.test-d.tsx +108 -0
- package/src/tests/queryObserver.test.tsx +6 -40
- package/src/tests/utils.ts +0 -10
- package/src/types.ts +2 -2
- package/src/utils.ts +3 -0
- package/src/tests/queryClient.types.test.tsx +0 -174
- package/src/tests/queryObserver.types.test.tsx +0 -66
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
hydrate,
|
|
11
11
|
onlineManager,
|
|
12
12
|
} from '..'
|
|
13
|
+
import { skipToken } from '../utils'
|
|
13
14
|
import {
|
|
14
15
|
createQueryClient,
|
|
15
16
|
mockOnlineManagerIsOnline,
|
|
@@ -1354,6 +1355,7 @@ describe('queryClient', () => {
|
|
|
1354
1355
|
test('should refetch all active queries', async () => {
|
|
1355
1356
|
const key1 = queryKey()
|
|
1356
1357
|
const key2 = queryKey()
|
|
1358
|
+
const key3 = queryKey()
|
|
1357
1359
|
const queryFn1 = vi.fn<Array<unknown>, string>().mockReturnValue('data1')
|
|
1358
1360
|
const queryFn2 = vi.fn<Array<unknown>, string>().mockReturnValue('data2')
|
|
1359
1361
|
const observer1 = new QueryObserver(queryClient, {
|
|
@@ -1366,13 +1368,21 @@ describe('queryClient', () => {
|
|
|
1366
1368
|
queryFn: queryFn2,
|
|
1367
1369
|
enabled: false,
|
|
1368
1370
|
})
|
|
1371
|
+
const observer3 = new QueryObserver(queryClient, {
|
|
1372
|
+
queryKey: key3,
|
|
1373
|
+
queryFn: skipToken,
|
|
1374
|
+
})
|
|
1375
|
+
let didSkipTokenRun = false
|
|
1369
1376
|
observer1.subscribe(() => undefined)
|
|
1370
1377
|
observer2.subscribe(() => undefined)
|
|
1378
|
+
observer3.subscribe(() => (didSkipTokenRun = true))
|
|
1371
1379
|
await queryClient.resetQueries()
|
|
1380
|
+
observer3.destroy()
|
|
1372
1381
|
observer2.destroy()
|
|
1373
1382
|
observer1.destroy()
|
|
1374
1383
|
expect(queryFn1).toHaveBeenCalledTimes(2)
|
|
1375
1384
|
expect(queryFn2).toHaveBeenCalledTimes(0)
|
|
1385
|
+
expect(didSkipTokenRun).toBe(false)
|
|
1376
1386
|
})
|
|
1377
1387
|
})
|
|
1378
1388
|
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expectTypeOf, it } from 'vitest'
|
|
2
|
+
import { QueryObserver } from '..'
|
|
3
|
+
import { createQueryClient, queryKey } from './utils'
|
|
4
|
+
import type { QueryClient } from '..'
|
|
5
|
+
|
|
6
|
+
describe('queryObserver', () => {
|
|
7
|
+
let queryClient: QueryClient
|
|
8
|
+
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
queryClient = createQueryClient()
|
|
11
|
+
queryClient.mount()
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
queryClient.clear()
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
it('should be inferred as a correct result type', () => {
|
|
19
|
+
const observer = new QueryObserver(queryClient, {
|
|
20
|
+
queryKey: queryKey(),
|
|
21
|
+
queryFn: () => Promise.resolve({ value: 'data' }),
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
const result = observer.getCurrentResult()
|
|
25
|
+
|
|
26
|
+
if (result.isPending) {
|
|
27
|
+
expectTypeOf(result.data).toEqualTypeOf<undefined>()
|
|
28
|
+
expectTypeOf(result.error).toEqualTypeOf<null>()
|
|
29
|
+
expectTypeOf(result.isLoading).toEqualTypeOf<boolean>()
|
|
30
|
+
expectTypeOf(result.status).toEqualTypeOf<'pending'>()
|
|
31
|
+
}
|
|
32
|
+
if (result.isLoading) {
|
|
33
|
+
expectTypeOf(result.data).toEqualTypeOf<undefined>()
|
|
34
|
+
expectTypeOf(result.error).toEqualTypeOf<null>()
|
|
35
|
+
expectTypeOf(result.isPending).toEqualTypeOf<true>()
|
|
36
|
+
expectTypeOf(result.status).toEqualTypeOf<'pending'>()
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (result.isLoadingError) {
|
|
40
|
+
expectTypeOf(result.data).toEqualTypeOf<undefined>()
|
|
41
|
+
expectTypeOf(result.error).toEqualTypeOf<Error>()
|
|
42
|
+
expectTypeOf(result.status).toEqualTypeOf<'error'>()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (result.isRefetchError) {
|
|
46
|
+
expectTypeOf(result.data).toEqualTypeOf<{ value: string }>()
|
|
47
|
+
expectTypeOf(result.error).toEqualTypeOf<Error>()
|
|
48
|
+
expectTypeOf(result.status).toEqualTypeOf<'error'>()
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (result.isSuccess) {
|
|
52
|
+
expectTypeOf(result.data).toEqualTypeOf<{ value: string }>()
|
|
53
|
+
expectTypeOf(result.error).toEqualTypeOf<null>()
|
|
54
|
+
expectTypeOf(result.status).toEqualTypeOf<'success'>()
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
describe('placeholderData', () => {
|
|
59
|
+
it('previousQuery should have typed queryKey', () => {
|
|
60
|
+
const testQueryKey = ['SomeQuery', 42, { foo: 'bar' }] as const
|
|
61
|
+
|
|
62
|
+
new QueryObserver(createQueryClient(), {
|
|
63
|
+
queryKey: testQueryKey,
|
|
64
|
+
placeholderData: (_, previousQuery) => {
|
|
65
|
+
if (previousQuery) {
|
|
66
|
+
expectTypeOf(previousQuery.queryKey).toEqualTypeOf<
|
|
67
|
+
typeof testQueryKey
|
|
68
|
+
>()
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
})
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
it('previousQuery should have typed error', () => {
|
|
75
|
+
class CustomError extends Error {
|
|
76
|
+
name = 'CustomError' as const
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
new QueryObserver<boolean, CustomError>(createQueryClient(), {
|
|
80
|
+
queryKey: ['key'],
|
|
81
|
+
placeholderData: (_, previousQuery) => {
|
|
82
|
+
if (previousQuery) {
|
|
83
|
+
expectTypeOf(
|
|
84
|
+
previousQuery.state.error,
|
|
85
|
+
).toEqualTypeOf<CustomError | null>()
|
|
86
|
+
}
|
|
87
|
+
return undefined
|
|
88
|
+
},
|
|
89
|
+
})
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
it('previousData should have the same type as query data', () => {
|
|
93
|
+
const queryData = { foo: 'bar' } as const
|
|
94
|
+
|
|
95
|
+
new QueryObserver(createQueryClient(), {
|
|
96
|
+
queryKey: ['key'],
|
|
97
|
+
queryFn: () => queryData,
|
|
98
|
+
select: (data) => data.foo,
|
|
99
|
+
placeholderData: (previousData) => {
|
|
100
|
+
expectTypeOf(previousData).toEqualTypeOf<
|
|
101
|
+
typeof queryData | undefined
|
|
102
|
+
>()
|
|
103
|
+
return undefined
|
|
104
|
+
},
|
|
105
|
+
})
|
|
106
|
+
})
|
|
107
|
+
})
|
|
108
|
+
})
|
|
@@ -120,7 +120,9 @@ describe('queryObserver', () => {
|
|
|
120
120
|
})
|
|
121
121
|
let observerResult
|
|
122
122
|
const unsubscribe = observer.subscribe((result) => {
|
|
123
|
-
expectTypeOf
|
|
123
|
+
expectTypeOf(result).toEqualTypeOf<
|
|
124
|
+
QueryObserverResult<{ myCount: number }>
|
|
125
|
+
>()
|
|
124
126
|
observerResult = result
|
|
125
127
|
})
|
|
126
128
|
await sleep(1)
|
|
@@ -136,7 +138,9 @@ describe('queryObserver', () => {
|
|
|
136
138
|
select: (data) => ({ myCount: data.count }),
|
|
137
139
|
})
|
|
138
140
|
const observerResult = await observer.refetch()
|
|
139
|
-
expectTypeOf
|
|
141
|
+
expectTypeOf(observerResult.data).toEqualTypeOf<
|
|
142
|
+
{ myCount: number } | undefined
|
|
143
|
+
>()
|
|
140
144
|
expect(observerResult.data).toMatchObject({ myCount: 1 })
|
|
141
145
|
})
|
|
142
146
|
|
|
@@ -894,42 +898,4 @@ describe('queryObserver', () => {
|
|
|
894
898
|
|
|
895
899
|
unsubscribe()
|
|
896
900
|
})
|
|
897
|
-
|
|
898
|
-
test('should be inferred as a correct result type', async () => {
|
|
899
|
-
const key = queryKey()
|
|
900
|
-
const data = { value: 'data' }
|
|
901
|
-
const observer = new QueryObserver(queryClient, {
|
|
902
|
-
queryKey: key,
|
|
903
|
-
queryFn: () => Promise.resolve(data),
|
|
904
|
-
})
|
|
905
|
-
|
|
906
|
-
const result = observer.getCurrentResult()
|
|
907
|
-
|
|
908
|
-
result.isPending &&
|
|
909
|
-
expectTypeOf<undefined>(result.data) &&
|
|
910
|
-
expectTypeOf<null>(result.error) &&
|
|
911
|
-
expectTypeOf<boolean>(result.isLoading) &&
|
|
912
|
-
expectTypeOf<'pending'>(result.status)
|
|
913
|
-
|
|
914
|
-
result.isLoading &&
|
|
915
|
-
expectTypeOf<undefined>(result.data) &&
|
|
916
|
-
expectTypeOf<null>(result.error) &&
|
|
917
|
-
expectTypeOf<true>(result.isPending) &&
|
|
918
|
-
expectTypeOf<'pending'>(result.status)
|
|
919
|
-
|
|
920
|
-
result.isLoadingError &&
|
|
921
|
-
expectTypeOf<undefined>(result.data) &&
|
|
922
|
-
expectTypeOf<Error>(result.error) &&
|
|
923
|
-
expectTypeOf<'error'>(result.status)
|
|
924
|
-
|
|
925
|
-
result.isRefetchError &&
|
|
926
|
-
expectTypeOf<{ value: string }>(result.data) &&
|
|
927
|
-
expectTypeOf<Error>(result.error) &&
|
|
928
|
-
expectTypeOf<'error'>(result.status)
|
|
929
|
-
|
|
930
|
-
result.isSuccess &&
|
|
931
|
-
expectTypeOf<{ value: string }>(result.data) &&
|
|
932
|
-
expectTypeOf<null>(result.error) &&
|
|
933
|
-
expectTypeOf<'success'>(result.status)
|
|
934
|
-
})
|
|
935
901
|
})
|
package/src/tests/utils.ts
CHANGED
|
@@ -57,13 +57,3 @@ export function setIsServer(isServer: boolean) {
|
|
|
57
57
|
})
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
|
-
|
|
61
|
-
export const doNotExecute = (_func: () => void) => true
|
|
62
|
-
|
|
63
|
-
export type Equal<TTargetA, TTargetB> = (<T>() => T extends TTargetA
|
|
64
|
-
? 1
|
|
65
|
-
: 2) extends <T>() => T extends TTargetB ? 1 : 2
|
|
66
|
-
? true
|
|
67
|
-
: false
|
|
68
|
-
|
|
69
|
-
export type Expect<T extends true> = T
|
package/src/types.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import type { MutationState } from './mutation'
|
|
4
4
|
import type { FetchDirection, Query, QueryBehavior } from './query'
|
|
5
5
|
import type { RetryDelayValue, RetryValue } from './retryer'
|
|
6
|
-
import type { QueryFilters, QueryTypeFilter } from './utils'
|
|
6
|
+
import type { QueryFilters, QueryTypeFilter, SkipToken } from './utils'
|
|
7
7
|
import type { QueryCache } from './queryCache'
|
|
8
8
|
import type { MutationCache } from './mutationCache'
|
|
9
9
|
|
|
@@ -147,7 +147,7 @@ export interface QueryOptions<
|
|
|
147
147
|
* Setting it to `Infinity` will disable garbage collection.
|
|
148
148
|
*/
|
|
149
149
|
gcTime?: number
|
|
150
|
-
queryFn?: QueryFunction<TQueryFnData, TQueryKey, TPageParam>
|
|
150
|
+
queryFn?: QueryFunction<TQueryFnData, TQueryKey, TPageParam> | SkipToken
|
|
151
151
|
persister?: QueryPersister<
|
|
152
152
|
NoInfer<TQueryFnData>,
|
|
153
153
|
NoInfer<TQueryKey>,
|
package/src/utils.ts
CHANGED
|
@@ -342,3 +342,6 @@ export function addToStart<T>(items: Array<T>, item: T, max = 0): Array<T> {
|
|
|
342
342
|
const newItems = [item, ...items]
|
|
343
343
|
return max && newItems.length > max ? newItems.slice(0, -1) : newItems
|
|
344
344
|
}
|
|
345
|
+
|
|
346
|
+
export const skipToken = Symbol()
|
|
347
|
+
export type SkipToken = typeof skipToken
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'vitest'
|
|
2
|
-
import { QueryClient } from '../queryClient'
|
|
3
|
-
import { doNotExecute } from './utils'
|
|
4
|
-
import type { Equal, Expect } from './utils'
|
|
5
|
-
import type { DataTag, InfiniteData } from '../types'
|
|
6
|
-
|
|
7
|
-
describe('getQueryData', () => {
|
|
8
|
-
it('should be typed if key is tagged', () => {
|
|
9
|
-
doNotExecute(() => {
|
|
10
|
-
const queryKey = ['key'] as DataTag<Array<string>, number>
|
|
11
|
-
const queryClient = new QueryClient()
|
|
12
|
-
const data = queryClient.getQueryData(queryKey)
|
|
13
|
-
|
|
14
|
-
const result: Expect<Equal<typeof data, number | undefined>> = true
|
|
15
|
-
return result
|
|
16
|
-
})
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
it('should infer unknown if key is not tagged', () => {
|
|
20
|
-
doNotExecute(() => {
|
|
21
|
-
const queryKey = ['key'] as const
|
|
22
|
-
const queryClient = new QueryClient()
|
|
23
|
-
const data = queryClient.getQueryData(queryKey)
|
|
24
|
-
|
|
25
|
-
const result: Expect<Equal<typeof data, unknown>> = true
|
|
26
|
-
return result
|
|
27
|
-
})
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
it('should infer passed generic if passed', () => {
|
|
31
|
-
doNotExecute(() => {
|
|
32
|
-
const queryKey = ['key'] as const
|
|
33
|
-
const queryClient = new QueryClient()
|
|
34
|
-
const data = queryClient.getQueryData<number>(queryKey)
|
|
35
|
-
|
|
36
|
-
const result: Expect<Equal<typeof data, number | undefined>> = true
|
|
37
|
-
return result
|
|
38
|
-
})
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
it('should only allow Arrays to be passed', () => {
|
|
42
|
-
doNotExecute(() => {
|
|
43
|
-
const queryKey = 'key' as const
|
|
44
|
-
const queryClient = new QueryClient()
|
|
45
|
-
// @ts-expect-error TS2345: Argument of type 'string' is not assignable to parameter of type 'QueryKey'
|
|
46
|
-
return queryClient.getQueryData(queryKey)
|
|
47
|
-
})
|
|
48
|
-
})
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
describe('setQueryData', () => {
|
|
52
|
-
it('updater should be typed if key is tagged', () => {
|
|
53
|
-
doNotExecute(() => {
|
|
54
|
-
const queryKey = ['key'] as DataTag<Array<string>, number>
|
|
55
|
-
const queryClient = new QueryClient()
|
|
56
|
-
const data = queryClient.setQueryData(queryKey, (prev) => {
|
|
57
|
-
const result: Expect<Equal<typeof prev, number | undefined>> = true
|
|
58
|
-
return result ? prev : 1
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
const result: Expect<Equal<typeof data, number | undefined>> = true
|
|
62
|
-
return result
|
|
63
|
-
})
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
it('value should be typed if key is tagged', () => {
|
|
67
|
-
doNotExecute(() => {
|
|
68
|
-
const queryKey = ['key'] as DataTag<Array<string>, number>
|
|
69
|
-
const queryClient = new QueryClient()
|
|
70
|
-
|
|
71
|
-
// @ts-expect-error value should be a number
|
|
72
|
-
queryClient.setQueryData(queryKey, '1')
|
|
73
|
-
|
|
74
|
-
// @ts-expect-error value should be a number
|
|
75
|
-
queryClient.setQueryData(queryKey, () => '1')
|
|
76
|
-
|
|
77
|
-
const data = queryClient.setQueryData(queryKey, 1)
|
|
78
|
-
|
|
79
|
-
const result: Expect<Equal<typeof data, number | undefined>> = true
|
|
80
|
-
return result
|
|
81
|
-
})
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
it('should infer unknown for updater if key is not tagged', () => {
|
|
85
|
-
doNotExecute(() => {
|
|
86
|
-
const queryKey = ['key'] as const
|
|
87
|
-
const queryClient = new QueryClient()
|
|
88
|
-
const data = queryClient.setQueryData(queryKey, (prev) => {
|
|
89
|
-
const result: Expect<Equal<typeof prev, unknown>> = true
|
|
90
|
-
return result ? prev : 1
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
const result: Expect<Equal<typeof data, unknown>> = true
|
|
94
|
-
return result
|
|
95
|
-
})
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
it('should infer unknown for value if key is not tagged', () => {
|
|
99
|
-
doNotExecute(() => {
|
|
100
|
-
const queryKey = ['key'] as const
|
|
101
|
-
const queryClient = new QueryClient()
|
|
102
|
-
const data = queryClient.setQueryData(queryKey, 'foo')
|
|
103
|
-
|
|
104
|
-
const result: Expect<Equal<typeof data, unknown>> = true
|
|
105
|
-
return result
|
|
106
|
-
})
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
it('should infer passed generic if passed', () => {
|
|
110
|
-
doNotExecute(() => {
|
|
111
|
-
const queryKey = ['key'] as const
|
|
112
|
-
const queryClient = new QueryClient()
|
|
113
|
-
const data = queryClient.setQueryData<string>(queryKey, (prev) => {
|
|
114
|
-
const result: Expect<Equal<typeof prev, string | undefined>> = true
|
|
115
|
-
return result ? prev : '1'
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
const result: Expect<Equal<typeof data, string | undefined>> = true
|
|
119
|
-
return result
|
|
120
|
-
})
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
it('should infer passed generic for value', () => {
|
|
124
|
-
doNotExecute(() => {
|
|
125
|
-
const queryKey = ['key'] as const
|
|
126
|
-
const queryClient = new QueryClient()
|
|
127
|
-
const data = queryClient.setQueryData<string>(queryKey, 'foo')
|
|
128
|
-
|
|
129
|
-
const result: Expect<Equal<typeof data, string | undefined>> = true
|
|
130
|
-
return result
|
|
131
|
-
})
|
|
132
|
-
})
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
describe('fetchInfiniteQuery', () => {
|
|
136
|
-
it('should allow passing pages', () => {
|
|
137
|
-
doNotExecute(async () => {
|
|
138
|
-
const data = await new QueryClient().fetchInfiniteQuery({
|
|
139
|
-
queryKey: ['key'],
|
|
140
|
-
queryFn: () => Promise.resolve('string'),
|
|
141
|
-
getNextPageParam: () => 1,
|
|
142
|
-
initialPageParam: 1,
|
|
143
|
-
pages: 5,
|
|
144
|
-
})
|
|
145
|
-
|
|
146
|
-
const result: Expect<Equal<typeof data, InfiniteData<string, number>>> =
|
|
147
|
-
true
|
|
148
|
-
return result
|
|
149
|
-
})
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
it('should not allow passing getNextPageParam without pages', () => {
|
|
153
|
-
doNotExecute(async () => {
|
|
154
|
-
return new QueryClient().fetchInfiniteQuery({
|
|
155
|
-
queryKey: ['key'],
|
|
156
|
-
queryFn: () => Promise.resolve('string'),
|
|
157
|
-
initialPageParam: 1,
|
|
158
|
-
getNextPageParam: () => 1,
|
|
159
|
-
})
|
|
160
|
-
})
|
|
161
|
-
})
|
|
162
|
-
|
|
163
|
-
it('should not allow passing pages without getNextPageParam', () => {
|
|
164
|
-
doNotExecute(async () => {
|
|
165
|
-
// @ts-expect-error Property 'getNextPageParam' is missing
|
|
166
|
-
return new QueryClient().fetchInfiniteQuery({
|
|
167
|
-
queryKey: ['key'],
|
|
168
|
-
queryFn: () => Promise.resolve('string'),
|
|
169
|
-
initialPageParam: 1,
|
|
170
|
-
pages: 5,
|
|
171
|
-
})
|
|
172
|
-
})
|
|
173
|
-
})
|
|
174
|
-
})
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'vitest'
|
|
2
|
-
import { QueryObserver } from '..'
|
|
3
|
-
import { createQueryClient, doNotExecute } from './utils'
|
|
4
|
-
import type { Equal, Expect } from './utils'
|
|
5
|
-
|
|
6
|
-
describe('placeholderData', () => {
|
|
7
|
-
describe('placeholderData function', () => {
|
|
8
|
-
it('previousQuery should have typed queryKey', () => {
|
|
9
|
-
doNotExecute(() => {
|
|
10
|
-
const queryKey = ['SomeQuery', 42, { foo: 'bar' }] as const
|
|
11
|
-
type QueryKey = typeof queryKey
|
|
12
|
-
|
|
13
|
-
new QueryObserver(createQueryClient(), {
|
|
14
|
-
queryKey,
|
|
15
|
-
placeholderData: (_, previousQuery) => {
|
|
16
|
-
const previousQueryKey = previousQuery?.queryKey
|
|
17
|
-
|
|
18
|
-
const result: Expect<
|
|
19
|
-
Equal<typeof previousQueryKey, QueryKey | undefined>
|
|
20
|
-
> = true
|
|
21
|
-
return result
|
|
22
|
-
},
|
|
23
|
-
})
|
|
24
|
-
})
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
it('previousQuery should have typed error', () => {
|
|
28
|
-
doNotExecute(() => {
|
|
29
|
-
class CustomError extends Error {
|
|
30
|
-
name = 'CustomError' as const
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
new QueryObserver<boolean, CustomError>(createQueryClient(), {
|
|
34
|
-
queryKey: ['key'],
|
|
35
|
-
placeholderData: (_, previousQuery) => {
|
|
36
|
-
const error = previousQuery?.state.error
|
|
37
|
-
|
|
38
|
-
const result: Expect<
|
|
39
|
-
Equal<typeof error, CustomError | null | undefined>
|
|
40
|
-
> = true
|
|
41
|
-
return result
|
|
42
|
-
},
|
|
43
|
-
})
|
|
44
|
-
})
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
it('previousData should have the same type as query data', () => {
|
|
48
|
-
doNotExecute(() => {
|
|
49
|
-
const queryData = { foo: 'bar' } as const
|
|
50
|
-
type QueryData = typeof queryData
|
|
51
|
-
|
|
52
|
-
new QueryObserver(createQueryClient(), {
|
|
53
|
-
queryKey: ['key'],
|
|
54
|
-
queryFn: () => queryData,
|
|
55
|
-
select: (data) => data.foo,
|
|
56
|
-
placeholderData: (previousData) => {
|
|
57
|
-
const result: Expect<
|
|
58
|
-
Equal<typeof previousData, QueryData | undefined>
|
|
59
|
-
> = true
|
|
60
|
-
return result ? previousData : undefined
|
|
61
|
-
},
|
|
62
|
-
})
|
|
63
|
-
})
|
|
64
|
-
})
|
|
65
|
-
})
|
|
66
|
-
})
|