@tanstack/query-core 5.0.0-alpha.3 → 5.0.0-alpha.6
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/lib/_virtual/_rollupPluginBabelHelpers.esm.js +13 -0
- package/build/lib/_virtual/_rollupPluginBabelHelpers.esm.js.map +1 -0
- package/build/lib/_virtual/_rollupPluginBabelHelpers.js +16 -0
- package/build/lib/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
- package/build/lib/focusManager.esm.js +31 -15
- package/build/lib/focusManager.esm.js.map +1 -1
- package/build/lib/focusManager.js +31 -15
- package/build/lib/focusManager.js.map +1 -1
- package/build/lib/hydration.esm.js +4 -2
- package/build/lib/hydration.esm.js.map +1 -1
- package/build/lib/hydration.js +4 -2
- package/build/lib/hydration.js.map +1 -1
- package/build/lib/infiniteQueryBehavior.d.ts +2 -2
- package/build/lib/infiniteQueryBehavior.esm.js +52 -48
- package/build/lib/infiniteQueryBehavior.esm.js.map +1 -1
- package/build/lib/infiniteQueryBehavior.js +52 -48
- package/build/lib/infiniteQueryBehavior.js.map +1 -1
- package/build/lib/infiniteQueryBehavior.mjs +48 -45
- package/build/lib/infiniteQueryBehavior.mjs.map +1 -1
- package/build/lib/infiniteQueryObserver.d.ts +6 -6
- package/build/lib/infiniteQueryObserver.esm.js +7 -8
- package/build/lib/infiniteQueryObserver.esm.js.map +1 -1
- package/build/lib/infiniteQueryObserver.js +7 -8
- package/build/lib/infiniteQueryObserver.js.map +1 -1
- package/build/lib/infiniteQueryObserver.mjs +4 -6
- package/build/lib/infiniteQueryObserver.mjs.map +1 -1
- package/build/lib/mutation.esm.js +127 -102
- package/build/lib/mutation.esm.js.map +1 -1
- package/build/lib/mutation.js +127 -102
- package/build/lib/mutation.js.map +1 -1
- package/build/lib/mutationCache.esm.js +30 -17
- package/build/lib/mutationCache.esm.js.map +1 -1
- package/build/lib/mutationCache.js +30 -17
- package/build/lib/mutationCache.js.map +1 -1
- package/build/lib/mutationObserver.esm.js +81 -51
- package/build/lib/mutationObserver.esm.js.map +1 -1
- package/build/lib/mutationObserver.js +81 -51
- package/build/lib/mutationObserver.js.map +1 -1
- package/build/lib/onlineManager.esm.js +29 -14
- package/build/lib/onlineManager.esm.js.map +1 -1
- package/build/lib/onlineManager.js +29 -14
- package/build/lib/onlineManager.js.map +1 -1
- package/build/lib/queriesObserver.esm.js +94 -65
- package/build/lib/queriesObserver.esm.js.map +1 -1
- package/build/lib/queriesObserver.js +94 -65
- package/build/lib/queriesObserver.js.map +1 -1
- package/build/lib/query.d.ts +4 -3
- package/build/lib/query.esm.js +210 -161
- package/build/lib/query.esm.js.map +1 -1
- package/build/lib/query.js +210 -161
- package/build/lib/query.js.map +1 -1
- package/build/lib/query.mjs.map +1 -1
- package/build/lib/queryCache.esm.js +16 -9
- package/build/lib/queryCache.esm.js.map +1 -1
- package/build/lib/queryCache.js +16 -9
- package/build/lib/queryCache.js.map +1 -1
- package/build/lib/queryClient.esm.js +103 -63
- package/build/lib/queryClient.esm.js.map +1 -1
- package/build/lib/queryClient.js +103 -63
- package/build/lib/queryClient.js.map +1 -1
- package/build/lib/queryObserver.esm.js +308 -207
- package/build/lib/queryObserver.esm.js.map +1 -1
- package/build/lib/queryObserver.js +307 -206
- package/build/lib/queryObserver.js.map +1 -1
- package/build/lib/removable.esm.js +13 -6
- package/build/lib/removable.esm.js.map +1 -1
- package/build/lib/removable.js +13 -6
- package/build/lib/removable.js.map +1 -1
- package/build/lib/retryer.esm.js +15 -14
- package/build/lib/retryer.esm.js.map +1 -1
- package/build/lib/retryer.js +15 -14
- package/build/lib/retryer.js.map +1 -1
- package/build/lib/tests/utils.d.ts +4 -5
- package/build/lib/types.d.ts +5 -3
- package/build/lib/utils.esm.js +1 -1
- package/build/lib/utils.esm.js.map +1 -1
- package/build/lib/utils.js +1 -1
- package/build/lib/utils.js.map +1 -1
- package/build/umd/index.development.js +52 -51
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +2 -2
- package/src/infiniteQueryBehavior.ts +52 -60
- package/src/infiniteQueryObserver.ts +15 -10
- package/src/query.ts +6 -4
- package/src/tests/focusManager.test.tsx +12 -14
- package/src/tests/hydration.test.tsx +15 -14
- package/src/tests/infiniteQueryBehavior.test.tsx +16 -9
- package/src/tests/infiniteQueryObserver.test.tsx +62 -1
- package/src/tests/mutationCache.test.tsx +11 -10
- package/src/tests/mutationObserver.test.tsx +3 -2
- package/src/tests/mutations.test.tsx +11 -10
- package/src/tests/notifyManager.test.tsx +7 -6
- package/src/tests/onlineManager.test.tsx +12 -17
- package/src/tests/queriesObserver.test.tsx +18 -17
- package/src/tests/query.test.tsx +18 -17
- package/src/tests/queryCache.test.tsx +14 -13
- package/src/tests/queryClient.test.tsx +49 -48
- package/src/tests/queryObserver.test.tsx +10 -9
- package/src/tests/utils.test.tsx +2 -1
- package/src/tests/utils.ts +5 -4
- package/src/types.ts +9 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/query-core",
|
|
3
|
-
"version": "5.0.0-alpha.
|
|
3
|
+
"version": "5.0.0-alpha.6",
|
|
4
4
|
"description": "The framework agnostic core that powers TanStack Query",
|
|
5
5
|
"author": "tannerlinsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"clean": "rimraf ./build",
|
|
32
32
|
"test:eslint": "eslint --ext .ts,.tsx ./src",
|
|
33
33
|
"test:types": "tsc",
|
|
34
|
-
"test:lib": "
|
|
34
|
+
"test:lib": "vitest run --coverage",
|
|
35
35
|
"test:lib:dev": "pnpm run test:lib --watch",
|
|
36
36
|
"build:types": "tsc --build"
|
|
37
37
|
}
|
|
@@ -14,12 +14,12 @@ export function infiniteQueryBehavior<
|
|
|
14
14
|
>(): QueryBehavior<TQueryFnData, TError, InfiniteData<TData>> {
|
|
15
15
|
return {
|
|
16
16
|
onFetch: (context) => {
|
|
17
|
-
context.fetchFn = () => {
|
|
17
|
+
context.fetchFn = async () => {
|
|
18
18
|
const options = context.options as InfiniteQueryPageParamsOptions<TData>
|
|
19
19
|
const direction = context.fetchOptions?.meta?.fetchMore?.direction
|
|
20
20
|
const oldPages = context.state.data?.pages || []
|
|
21
21
|
const oldPageParams = context.state.data?.pageParams || []
|
|
22
|
-
|
|
22
|
+
const empty = { pages: [], pageParams: [] }
|
|
23
23
|
let cancelled = false
|
|
24
24
|
|
|
25
25
|
const addSignalProperty = (object: unknown) => {
|
|
@@ -43,35 +43,18 @@ export function infiniteQueryBehavior<
|
|
|
43
43
|
context.options.queryFn ||
|
|
44
44
|
(() => Promise.reject(new Error('Missing queryFn')))
|
|
45
45
|
|
|
46
|
-
const buildNewPages = (
|
|
47
|
-
pages: unknown[],
|
|
48
|
-
param: unknown,
|
|
49
|
-
page: unknown,
|
|
50
|
-
previous?: boolean,
|
|
51
|
-
) => {
|
|
52
|
-
const { maxPages } = context.options
|
|
53
|
-
|
|
54
|
-
if (previous) {
|
|
55
|
-
newPageParams = addToStart(newPageParams, param, maxPages)
|
|
56
|
-
return addToStart(pages, page, maxPages)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
newPageParams = addToEnd(newPageParams, param, maxPages)
|
|
60
|
-
return addToEnd(pages, page, maxPages)
|
|
61
|
-
}
|
|
62
|
-
|
|
63
46
|
// Create function to fetch a page
|
|
64
|
-
const fetchPage = (
|
|
65
|
-
|
|
47
|
+
const fetchPage = async (
|
|
48
|
+
data: InfiniteData<unknown>,
|
|
66
49
|
param: unknown,
|
|
67
50
|
previous?: boolean,
|
|
68
|
-
): Promise<unknown
|
|
51
|
+
): Promise<InfiniteData<unknown>> => {
|
|
69
52
|
if (cancelled) {
|
|
70
53
|
return Promise.reject()
|
|
71
54
|
}
|
|
72
55
|
|
|
73
|
-
if (typeof param === 'undefined' && pages.length) {
|
|
74
|
-
return Promise.resolve(
|
|
56
|
+
if (typeof param === 'undefined' && data.pages.length) {
|
|
57
|
+
return Promise.resolve(data)
|
|
75
58
|
}
|
|
76
59
|
|
|
77
60
|
const queryFnContext: Omit<
|
|
@@ -80,60 +63,58 @@ export function infiniteQueryBehavior<
|
|
|
80
63
|
> = {
|
|
81
64
|
queryKey: context.queryKey,
|
|
82
65
|
pageParam: param,
|
|
66
|
+
direction: previous ? 'backward' : 'forward',
|
|
83
67
|
meta: context.options.meta,
|
|
84
68
|
}
|
|
85
69
|
|
|
86
70
|
addSignalProperty(queryFnContext)
|
|
87
71
|
|
|
88
|
-
const
|
|
72
|
+
const page = await queryFn(
|
|
89
73
|
queryFnContext as QueryFunctionContext<QueryKey, unknown>,
|
|
90
74
|
)
|
|
91
75
|
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
)
|
|
76
|
+
const { maxPages } = context.options
|
|
77
|
+
const addTo = previous ? addToStart : addToEnd
|
|
95
78
|
|
|
96
|
-
return
|
|
79
|
+
return {
|
|
80
|
+
pages: addTo(data.pages, page, maxPages),
|
|
81
|
+
pageParams: addTo(data.pageParams, param, maxPages),
|
|
82
|
+
}
|
|
97
83
|
}
|
|
98
84
|
|
|
99
|
-
let
|
|
85
|
+
let result: InfiniteData<unknown>
|
|
100
86
|
|
|
101
87
|
// Fetch first page?
|
|
102
88
|
if (!oldPages.length) {
|
|
103
|
-
|
|
89
|
+
result = await fetchPage(empty, options.defaultPageParam)
|
|
104
90
|
}
|
|
105
91
|
|
|
106
92
|
// fetch next / previous page?
|
|
107
93
|
else if (direction) {
|
|
108
94
|
const previous = direction === 'backward'
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
:
|
|
112
|
-
|
|
95
|
+
const pageParamFn = previous ? getPreviousPageParam : getNextPageParam
|
|
96
|
+
const oldData = {
|
|
97
|
+
pages: oldPages,
|
|
98
|
+
pageParams: oldPageParams,
|
|
99
|
+
}
|
|
100
|
+
const param = pageParamFn(options, oldData)
|
|
101
|
+
|
|
102
|
+
result = await fetchPage(oldData, param, previous)
|
|
113
103
|
}
|
|
114
104
|
|
|
115
105
|
// Refetch pages
|
|
116
106
|
else {
|
|
117
|
-
newPageParams = []
|
|
118
|
-
|
|
119
107
|
// Fetch first page
|
|
120
|
-
|
|
108
|
+
result = await fetchPage(empty, oldPageParams[0])
|
|
121
109
|
|
|
122
110
|
// Fetch remaining pages
|
|
123
111
|
for (let i = 1; i < oldPages.length; i++) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
return fetchPage(pages, param)
|
|
127
|
-
})
|
|
112
|
+
const param = getNextPageParam(options, result)
|
|
113
|
+
result = await fetchPage(result, param)
|
|
128
114
|
}
|
|
129
115
|
}
|
|
130
116
|
|
|
131
|
-
|
|
132
|
-
pages,
|
|
133
|
-
pageParams: newPageParams,
|
|
134
|
-
}))
|
|
135
|
-
|
|
136
|
-
return finalPromise
|
|
117
|
+
return result
|
|
137
118
|
}
|
|
138
119
|
},
|
|
139
120
|
}
|
|
@@ -141,36 +122,47 @@ export function infiniteQueryBehavior<
|
|
|
141
122
|
|
|
142
123
|
function getNextPageParam(
|
|
143
124
|
options: InfiniteQueryPageParamsOptions<any>,
|
|
144
|
-
pages: unknown
|
|
125
|
+
{ pages, pageParams }: InfiniteData<unknown>,
|
|
145
126
|
): unknown | undefined {
|
|
146
|
-
|
|
127
|
+
const lastIndex = pages.length - 1
|
|
128
|
+
return options.getNextPageParam(
|
|
129
|
+
pages[lastIndex],
|
|
130
|
+
pages,
|
|
131
|
+
pageParams[lastIndex],
|
|
132
|
+
pageParams,
|
|
133
|
+
)
|
|
147
134
|
}
|
|
148
135
|
|
|
149
136
|
function getPreviousPageParam(
|
|
150
137
|
options: InfiniteQueryPageParamsOptions<any>,
|
|
151
|
-
pages: unknown
|
|
138
|
+
{ pages, pageParams }: InfiniteData<unknown>,
|
|
152
139
|
): unknown | undefined {
|
|
153
|
-
return options.getPreviousPageParam?.(
|
|
140
|
+
return options.getPreviousPageParam?.(
|
|
141
|
+
pages[0],
|
|
142
|
+
pages,
|
|
143
|
+
pageParams[0],
|
|
144
|
+
pageParams,
|
|
145
|
+
)
|
|
154
146
|
}
|
|
155
147
|
|
|
156
148
|
/**
|
|
157
149
|
* Checks if there is a next page.
|
|
158
150
|
*/
|
|
159
151
|
export function hasNextPage(
|
|
160
|
-
options: InfiniteQueryPageParamsOptions<any>,
|
|
161
|
-
|
|
152
|
+
options: InfiniteQueryPageParamsOptions<any, any>,
|
|
153
|
+
data?: InfiniteData<unknown>,
|
|
162
154
|
): boolean {
|
|
163
|
-
if (!
|
|
164
|
-
return typeof getNextPageParam(options,
|
|
155
|
+
if (!data) return false
|
|
156
|
+
return typeof getNextPageParam(options, data) !== 'undefined'
|
|
165
157
|
}
|
|
166
158
|
|
|
167
159
|
/**
|
|
168
160
|
* Checks if there is a previous page.
|
|
169
161
|
*/
|
|
170
162
|
export function hasPreviousPage(
|
|
171
|
-
options: InfiniteQueryPageParamsOptions<any>,
|
|
172
|
-
|
|
163
|
+
options: InfiniteQueryPageParamsOptions<any, any>,
|
|
164
|
+
data?: InfiniteData<unknown>,
|
|
173
165
|
): boolean {
|
|
174
|
-
if (!
|
|
175
|
-
return typeof getPreviousPageParam(options,
|
|
166
|
+
if (!data || !options.getPreviousPageParam) return false
|
|
167
|
+
return typeof getPreviousPageParam(options, data) !== 'undefined'
|
|
176
168
|
}
|
|
@@ -28,6 +28,7 @@ export class InfiniteQueryObserver<
|
|
|
28
28
|
TData = InfiniteData<TQueryFnData>,
|
|
29
29
|
TQueryData = TQueryFnData,
|
|
30
30
|
TQueryKey extends QueryKey = QueryKey,
|
|
31
|
+
TPageParam = unknown,
|
|
31
32
|
> extends QueryObserver<
|
|
32
33
|
TQueryFnData,
|
|
33
34
|
TError,
|
|
@@ -56,7 +57,8 @@ export class InfiniteQueryObserver<
|
|
|
56
57
|
TError,
|
|
57
58
|
TData,
|
|
58
59
|
TQueryData,
|
|
59
|
-
TQueryKey
|
|
60
|
+
TQueryKey,
|
|
61
|
+
TPageParam
|
|
60
62
|
>,
|
|
61
63
|
) {
|
|
62
64
|
super(client, options)
|
|
@@ -74,7 +76,8 @@ export class InfiniteQueryObserver<
|
|
|
74
76
|
TError,
|
|
75
77
|
TData,
|
|
76
78
|
TQueryData,
|
|
77
|
-
TQueryKey
|
|
79
|
+
TQueryKey,
|
|
80
|
+
TPageParam
|
|
78
81
|
>,
|
|
79
82
|
notifyOptions?: NotifyOptions,
|
|
80
83
|
): void {
|
|
@@ -93,7 +96,8 @@ export class InfiniteQueryObserver<
|
|
|
93
96
|
TError,
|
|
94
97
|
TData,
|
|
95
98
|
TQueryData,
|
|
96
|
-
TQueryKey
|
|
99
|
+
TQueryKey,
|
|
100
|
+
TPageParam
|
|
97
101
|
>,
|
|
98
102
|
): InfiniteQueryObserverResult<TData, TError> {
|
|
99
103
|
options.behavior = infiniteQueryBehavior()
|
|
@@ -104,7 +108,7 @@ export class InfiniteQueryObserver<
|
|
|
104
108
|
}
|
|
105
109
|
|
|
106
110
|
fetchNextPage(
|
|
107
|
-
options
|
|
111
|
+
options?: FetchNextPageOptions,
|
|
108
112
|
): Promise<InfiniteQueryObserverResult<TData, TError>> {
|
|
109
113
|
return this.fetch({
|
|
110
114
|
...options,
|
|
@@ -114,9 +118,9 @@ export class InfiniteQueryObserver<
|
|
|
114
118
|
})
|
|
115
119
|
}
|
|
116
120
|
|
|
117
|
-
fetchPreviousPage(
|
|
118
|
-
|
|
119
|
-
|
|
121
|
+
fetchPreviousPage(
|
|
122
|
+
options?: FetchPreviousPageOptions,
|
|
123
|
+
): Promise<InfiniteQueryObserverResult<TData, TError>> {
|
|
120
124
|
return this.fetch({
|
|
121
125
|
...options,
|
|
122
126
|
meta: {
|
|
@@ -132,7 +136,8 @@ export class InfiniteQueryObserver<
|
|
|
132
136
|
TError,
|
|
133
137
|
TData,
|
|
134
138
|
TQueryData,
|
|
135
|
-
TQueryKey
|
|
139
|
+
TQueryKey,
|
|
140
|
+
TPageParam
|
|
136
141
|
>,
|
|
137
142
|
): InfiniteQueryObserverResult<TData, TError> {
|
|
138
143
|
const { state } = query
|
|
@@ -150,8 +155,8 @@ export class InfiniteQueryObserver<
|
|
|
150
155
|
...result,
|
|
151
156
|
fetchNextPage: this.fetchNextPage,
|
|
152
157
|
fetchPreviousPage: this.fetchPreviousPage,
|
|
153
|
-
hasNextPage: hasNextPage(options, state.data
|
|
154
|
-
hasPreviousPage: hasPreviousPage(options, state.data
|
|
158
|
+
hasNextPage: hasNextPage(options, state.data),
|
|
159
|
+
hasPreviousPage: hasPreviousPage(options, state.data),
|
|
155
160
|
isFetchingNextPage,
|
|
156
161
|
isFetchingPreviousPage,
|
|
157
162
|
isRefetching:
|
package/src/query.ts
CHANGED
|
@@ -74,8 +74,10 @@ export interface QueryBehavior<
|
|
|
74
74
|
) => void
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
+
export type FetchDirection = 'forward' | 'backward'
|
|
78
|
+
|
|
77
79
|
export interface FetchMeta {
|
|
78
|
-
fetchMore?: { direction:
|
|
80
|
+
fetchMore?: { direction: FetchDirection }
|
|
79
81
|
}
|
|
80
82
|
|
|
81
83
|
export interface FetchOptions {
|
|
@@ -120,7 +122,7 @@ interface ContinueAction {
|
|
|
120
122
|
|
|
121
123
|
interface SetStateAction<TData, TError> {
|
|
122
124
|
type: 'setState'
|
|
123
|
-
state: QueryState<TData, TError
|
|
125
|
+
state: Partial<QueryState<TData, TError>>
|
|
124
126
|
setStateOptions?: SetStateOptions
|
|
125
127
|
}
|
|
126
128
|
|
|
@@ -211,7 +213,7 @@ export class Query<
|
|
|
211
213
|
}
|
|
212
214
|
|
|
213
215
|
setState(
|
|
214
|
-
state: QueryState<TData, TError
|
|
216
|
+
state: Partial<QueryState<TData, TError>>,
|
|
215
217
|
setStateOptions?: SetStateOptions,
|
|
216
218
|
): void {
|
|
217
219
|
this.#dispatch({ type: 'setState', state, setStateOptions })
|
|
@@ -453,7 +455,7 @@ export class Query<
|
|
|
453
455
|
|
|
454
456
|
// Try to fetch the data
|
|
455
457
|
this.#retryer = createRetryer({
|
|
456
|
-
fn: context.fetchFn as () => TData
|
|
458
|
+
fn: context.fetchFn as () => Promise<TData>,
|
|
457
459
|
abort: abortController.abort.bind(abortController),
|
|
458
460
|
onSuccess: (data) => {
|
|
459
461
|
if (typeof data === 'undefined') {
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { sleep } from '../utils'
|
|
2
2
|
import { FocusManager } from '../focusManager'
|
|
3
3
|
import { setIsServer } from './utils'
|
|
4
|
+
import { vi } from 'vitest'
|
|
4
5
|
|
|
5
6
|
describe('focusManager', () => {
|
|
6
7
|
let focusManager: FocusManager
|
|
7
8
|
beforeEach(() => {
|
|
8
|
-
|
|
9
|
+
vi.resetModules()
|
|
9
10
|
focusManager = new FocusManager()
|
|
10
11
|
})
|
|
11
12
|
|
|
12
13
|
it('should call previous remove handler when replacing an event listener', () => {
|
|
13
|
-
const remove1Spy =
|
|
14
|
-
const remove2Spy =
|
|
14
|
+
const remove1Spy = vi.fn()
|
|
15
|
+
const remove2Spy = vi.fn()
|
|
15
16
|
|
|
16
17
|
focusManager.setEventListener(() => remove1Spy)
|
|
17
18
|
focusManager.setEventListener(() => remove2Spy)
|
|
@@ -39,7 +40,7 @@ describe('focusManager', () => {
|
|
|
39
40
|
})
|
|
40
41
|
|
|
41
42
|
it('should not notify listeners on focus if already focused', async () => {
|
|
42
|
-
const subscriptionSpy =
|
|
43
|
+
const subscriptionSpy = vi.fn()
|
|
43
44
|
const unsubscribe = focusManager.subscribe(subscriptionSpy)
|
|
44
45
|
|
|
45
46
|
focusManager.setFocused(true)
|
|
@@ -66,7 +67,7 @@ describe('focusManager', () => {
|
|
|
66
67
|
test('cleanup (removeEventListener) should not be called if window is not defined', async () => {
|
|
67
68
|
const restoreIsServer = setIsServer(true)
|
|
68
69
|
|
|
69
|
-
const removeEventListenerSpy =
|
|
70
|
+
const removeEventListenerSpy = vi.spyOn(globalThis, 'removeEventListener')
|
|
70
71
|
|
|
71
72
|
const unsubscribe = focusManager.subscribe(() => undefined)
|
|
72
73
|
|
|
@@ -83,7 +84,7 @@ describe('focusManager', () => {
|
|
|
83
84
|
// @ts-expect-error
|
|
84
85
|
globalThis.window.addEventListener = undefined
|
|
85
86
|
|
|
86
|
-
const removeEventListenerSpy =
|
|
87
|
+
const removeEventListenerSpy = vi.spyOn(globalThis, 'removeEventListener')
|
|
87
88
|
|
|
88
89
|
const unsubscribe = focusManager.subscribe(() => undefined)
|
|
89
90
|
|
|
@@ -95,8 +96,8 @@ describe('focusManager', () => {
|
|
|
95
96
|
})
|
|
96
97
|
|
|
97
98
|
it('should replace default window listener when a new event listener is set', async () => {
|
|
98
|
-
const unsubscribeSpy =
|
|
99
|
-
const handlerSpy =
|
|
99
|
+
const unsubscribeSpy = vi.fn().mockImplementation(() => undefined)
|
|
100
|
+
const handlerSpy = vi.fn().mockImplementation(() => unsubscribeSpy)
|
|
100
101
|
|
|
101
102
|
focusManager.setEventListener(() => handlerSpy())
|
|
102
103
|
|
|
@@ -115,12 +116,9 @@ describe('focusManager', () => {
|
|
|
115
116
|
})
|
|
116
117
|
|
|
117
118
|
test('should call removeEventListener when last listener unsubscribes', () => {
|
|
118
|
-
const addEventListenerSpy =
|
|
119
|
-
globalThis.window,
|
|
120
|
-
'addEventListener',
|
|
121
|
-
)
|
|
119
|
+
const addEventListenerSpy = vi.spyOn(globalThis.window, 'addEventListener')
|
|
122
120
|
|
|
123
|
-
const removeEventListenerSpy =
|
|
121
|
+
const removeEventListenerSpy = vi.spyOn(
|
|
124
122
|
globalThis.window,
|
|
125
123
|
'removeEventListener',
|
|
126
124
|
)
|
|
@@ -136,7 +134,7 @@ describe('focusManager', () => {
|
|
|
136
134
|
})
|
|
137
135
|
|
|
138
136
|
test('should keep setup function even if last listener unsubscribes', () => {
|
|
139
|
-
const setupSpy =
|
|
137
|
+
const setupSpy = vi.fn().mockImplementation(() => () => undefined)
|
|
140
138
|
|
|
141
139
|
focusManager.setEventListener(setupSpy)
|
|
142
140
|
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
} from './utils'
|
|
7
7
|
import { QueryCache } from '../queryCache'
|
|
8
8
|
import { dehydrate, hydrate } from '../hydration'
|
|
9
|
+
import { vi } from 'vitest'
|
|
9
10
|
|
|
10
11
|
async function fetchData<TData>(value: TData, ms?: number): Promise<TData> {
|
|
11
12
|
await sleep(ms || 0)
|
|
@@ -67,7 +68,7 @@ describe('dehydration and rehydration', () => {
|
|
|
67
68
|
key: [{ nestedKey: 1 }],
|
|
68
69
|
})
|
|
69
70
|
|
|
70
|
-
const fetchDataAfterHydration =
|
|
71
|
+
const fetchDataAfterHydration = vi.fn<unknown[], unknown>()
|
|
71
72
|
await hydrationClient.prefetchQuery({
|
|
72
73
|
queryKey: ['string'],
|
|
73
74
|
queryFn: fetchDataAfterHydration,
|
|
@@ -192,7 +193,7 @@ describe('dehydration and rehydration', () => {
|
|
|
192
193
|
})?.state.data,
|
|
193
194
|
).toBe('string')
|
|
194
195
|
|
|
195
|
-
const fetchDataAfterHydration =
|
|
196
|
+
const fetchDataAfterHydration = vi.fn<unknown[], unknown>()
|
|
196
197
|
await hydrationClient.prefetchQuery({
|
|
197
198
|
queryKey: ['string', { key: ['string'], key2: 0 }],
|
|
198
199
|
queryFn: fetchDataAfterHydration,
|
|
@@ -205,7 +206,7 @@ describe('dehydration and rehydration', () => {
|
|
|
205
206
|
})
|
|
206
207
|
|
|
207
208
|
test('should only hydrate successful queries by default', async () => {
|
|
208
|
-
const consoleMock =
|
|
209
|
+
const consoleMock = vi.spyOn(console, 'error')
|
|
209
210
|
consoleMock.mockImplementation(() => undefined)
|
|
210
211
|
|
|
211
212
|
const queryCache = new QueryCache()
|
|
@@ -341,18 +342,18 @@ describe('dehydration and rehydration', () => {
|
|
|
341
342
|
})
|
|
342
343
|
|
|
343
344
|
test('should be able to dehydrate mutations and continue on hydration', async () => {
|
|
344
|
-
const consoleMock =
|
|
345
|
+
const consoleMock = vi.spyOn(console, 'error')
|
|
345
346
|
consoleMock.mockImplementation(() => undefined)
|
|
346
347
|
const onlineMock = mockNavigatorOnLine(false)
|
|
347
348
|
|
|
348
|
-
const serverAddTodo =
|
|
349
|
+
const serverAddTodo = vi
|
|
349
350
|
.fn()
|
|
350
351
|
.mockImplementation(() => Promise.reject(new Error('offline')))
|
|
351
|
-
const serverOnMutate =
|
|
352
|
+
const serverOnMutate = vi.fn().mockImplementation((variables) => {
|
|
352
353
|
const optimisticTodo = { id: 1, text: variables.text }
|
|
353
354
|
return { optimisticTodo }
|
|
354
355
|
})
|
|
355
|
-
const serverOnSuccess =
|
|
356
|
+
const serverOnSuccess = vi.fn()
|
|
356
357
|
|
|
357
358
|
const serverClient = createQueryClient()
|
|
358
359
|
|
|
@@ -386,14 +387,14 @@ describe('dehydration and rehydration', () => {
|
|
|
386
387
|
const parsed = JSON.parse(stringified)
|
|
387
388
|
const client = createQueryClient()
|
|
388
389
|
|
|
389
|
-
const clientAddTodo =
|
|
390
|
+
const clientAddTodo = vi.fn().mockImplementation((variables) => {
|
|
390
391
|
return { id: 2, text: variables.text }
|
|
391
392
|
})
|
|
392
|
-
const clientOnMutate =
|
|
393
|
+
const clientOnMutate = vi.fn().mockImplementation((variables) => {
|
|
393
394
|
const optimisticTodo = { id: 1, text: variables.text }
|
|
394
395
|
return { optimisticTodo }
|
|
395
396
|
})
|
|
396
|
-
const clientOnSuccess =
|
|
397
|
+
const clientOnSuccess = vi.fn()
|
|
397
398
|
|
|
398
399
|
client.setMutationDefaults(['addTodo'], {
|
|
399
400
|
mutationFn: clientAddTodo,
|
|
@@ -422,10 +423,10 @@ describe('dehydration and rehydration', () => {
|
|
|
422
423
|
})
|
|
423
424
|
|
|
424
425
|
test('should not dehydrate mutations if dehydrateMutations is set to false', async () => {
|
|
425
|
-
const consoleMock =
|
|
426
|
+
const consoleMock = vi.spyOn(console, 'error')
|
|
426
427
|
consoleMock.mockImplementation(() => undefined)
|
|
427
428
|
|
|
428
|
-
const serverAddTodo =
|
|
429
|
+
const serverAddTodo = vi
|
|
429
430
|
.fn()
|
|
430
431
|
.mockImplementation(() => Promise.reject(new Error('offline')))
|
|
431
432
|
|
|
@@ -454,10 +455,10 @@ describe('dehydration and rehydration', () => {
|
|
|
454
455
|
})
|
|
455
456
|
|
|
456
457
|
test('should not dehydrate mutation if mutation state is set to pause', async () => {
|
|
457
|
-
const consoleMock =
|
|
458
|
+
const consoleMock = vi.spyOn(console, 'error')
|
|
458
459
|
consoleMock.mockImplementation(() => undefined)
|
|
459
460
|
|
|
460
|
-
const serverAddTodo =
|
|
461
|
+
const serverAddTodo = vi
|
|
461
462
|
.fn()
|
|
462
463
|
.mockImplementation(() => Promise.reject(new Error('offline')))
|
|
463
464
|
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { waitFor } from '@testing-library/react'
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
InfiniteQueryObserverResult,
|
|
5
|
-
} from '@tanstack/query-core'
|
|
6
|
-
import { InfiniteQueryObserver, CancelledError } from '@tanstack/query-core'
|
|
2
|
+
import type { QueryClient, InfiniteQueryObserverResult } from '..'
|
|
3
|
+
import { InfiniteQueryObserver, CancelledError } from '..'
|
|
7
4
|
import { createQueryClient, queryKey, sleep } from './utils'
|
|
5
|
+
import { vi } from 'vitest'
|
|
8
6
|
|
|
9
7
|
describe('InfiniteQueryBehavior', () => {
|
|
10
8
|
let queryClient: QueryClient
|
|
@@ -50,7 +48,7 @@ describe('InfiniteQueryBehavior', () => {
|
|
|
50
48
|
const key = queryKey()
|
|
51
49
|
let abortSignal: AbortSignal | null = null
|
|
52
50
|
|
|
53
|
-
const queryFnSpy =
|
|
51
|
+
const queryFnSpy = vi.fn().mockImplementation(({ pageParam, signal }) => {
|
|
54
52
|
abortSignal = signal
|
|
55
53
|
return pageParam
|
|
56
54
|
})
|
|
@@ -84,6 +82,7 @@ describe('InfiniteQueryBehavior', () => {
|
|
|
84
82
|
queryKey: key,
|
|
85
83
|
pageParam: 1,
|
|
86
84
|
meta: undefined,
|
|
85
|
+
direction: 'forward',
|
|
87
86
|
signal: abortSignal,
|
|
88
87
|
})
|
|
89
88
|
|
|
@@ -95,6 +94,7 @@ describe('InfiniteQueryBehavior', () => {
|
|
|
95
94
|
expect(queryFnSpy).toHaveBeenNthCalledWith(1, {
|
|
96
95
|
queryKey: key,
|
|
97
96
|
pageParam: 2,
|
|
97
|
+
direction: 'forward',
|
|
98
98
|
meta: undefined,
|
|
99
99
|
signal: abortSignal,
|
|
100
100
|
})
|
|
@@ -112,6 +112,7 @@ describe('InfiniteQueryBehavior', () => {
|
|
|
112
112
|
expect(queryFnSpy).toHaveBeenNthCalledWith(1, {
|
|
113
113
|
queryKey: key,
|
|
114
114
|
pageParam: 0,
|
|
115
|
+
direction: 'backward',
|
|
115
116
|
meta: undefined,
|
|
116
117
|
signal: abortSignal,
|
|
117
118
|
})
|
|
@@ -131,6 +132,7 @@ describe('InfiniteQueryBehavior', () => {
|
|
|
131
132
|
queryKey: key,
|
|
132
133
|
pageParam: -1,
|
|
133
134
|
meta: undefined,
|
|
135
|
+
direction: 'backward',
|
|
134
136
|
signal: abortSignal,
|
|
135
137
|
})
|
|
136
138
|
|
|
@@ -148,6 +150,7 @@ describe('InfiniteQueryBehavior', () => {
|
|
|
148
150
|
queryKey: key,
|
|
149
151
|
pageParam: 1,
|
|
150
152
|
meta: undefined,
|
|
153
|
+
direction: 'forward',
|
|
151
154
|
signal: abortSignal,
|
|
152
155
|
})
|
|
153
156
|
|
|
@@ -168,6 +171,7 @@ describe('InfiniteQueryBehavior', () => {
|
|
|
168
171
|
queryKey: key,
|
|
169
172
|
pageParam: 0,
|
|
170
173
|
meta: undefined,
|
|
174
|
+
direction: 'forward',
|
|
171
175
|
signal: abortSignal,
|
|
172
176
|
})
|
|
173
177
|
|
|
@@ -175,6 +179,7 @@ describe('InfiniteQueryBehavior', () => {
|
|
|
175
179
|
queryKey: key,
|
|
176
180
|
pageParam: 1,
|
|
177
181
|
meta: undefined,
|
|
182
|
+
direction: 'forward',
|
|
178
183
|
signal: abortSignal,
|
|
179
184
|
})
|
|
180
185
|
|
|
@@ -185,7 +190,7 @@ describe('InfiniteQueryBehavior', () => {
|
|
|
185
190
|
const key = queryKey()
|
|
186
191
|
let abortSignal: AbortSignal | null = null
|
|
187
192
|
|
|
188
|
-
const queryFnSpy =
|
|
193
|
+
const queryFnSpy = vi.fn().mockImplementation(({ pageParam, signal }) => {
|
|
189
194
|
abortSignal = signal
|
|
190
195
|
sleep(10)
|
|
191
196
|
return pageParam
|
|
@@ -226,6 +231,7 @@ describe('InfiniteQueryBehavior', () => {
|
|
|
226
231
|
queryKey: key,
|
|
227
232
|
pageParam: 1,
|
|
228
233
|
meta: undefined,
|
|
234
|
+
direction: 'forward',
|
|
229
235
|
signal: abortSignal,
|
|
230
236
|
})
|
|
231
237
|
|
|
@@ -236,7 +242,7 @@ describe('InfiniteQueryBehavior', () => {
|
|
|
236
242
|
const key = queryKey()
|
|
237
243
|
let abortSignal: AbortSignal | null = null
|
|
238
244
|
|
|
239
|
-
let queryFnSpy =
|
|
245
|
+
let queryFnSpy = vi.fn().mockImplementation(({ pageParam, signal }) => {
|
|
240
246
|
abortSignal = signal
|
|
241
247
|
return pageParam
|
|
242
248
|
})
|
|
@@ -281,10 +287,11 @@ describe('InfiniteQueryBehavior', () => {
|
|
|
281
287
|
queryKey: key,
|
|
282
288
|
pageParam: 2,
|
|
283
289
|
meta: undefined,
|
|
290
|
+
direction: 'forward',
|
|
284
291
|
signal: abortSignal,
|
|
285
292
|
})
|
|
286
293
|
|
|
287
|
-
queryFnSpy =
|
|
294
|
+
queryFnSpy = vi.fn().mockImplementation(({ pageParam = 1, signal }) => {
|
|
288
295
|
abortSignal = signal
|
|
289
296
|
sleep(10)
|
|
290
297
|
return pageParam
|