@tanstack/react-query 4.0.5
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/cjs/query-core/build/esm/index.js +3110 -0
- package/build/cjs/query-core/build/esm/index.js.map +1 -0
- package/build/cjs/react-query/src/Hydrate.js +66 -0
- package/build/cjs/react-query/src/Hydrate.js.map +1 -0
- package/build/cjs/react-query/src/QueryClientProvider.js +96 -0
- package/build/cjs/react-query/src/QueryClientProvider.js.map +1 -0
- package/build/cjs/react-query/src/QueryErrorResetBoundary.js +67 -0
- package/build/cjs/react-query/src/QueryErrorResetBoundary.js.map +1 -0
- package/build/cjs/react-query/src/index.js +64 -0
- package/build/cjs/react-query/src/index.js.map +1 -0
- package/build/cjs/react-query/src/isRestoring.js +43 -0
- package/build/cjs/react-query/src/isRestoring.js.map +1 -0
- package/build/cjs/react-query/src/useBaseQuery.js +117 -0
- package/build/cjs/react-query/src/useBaseQuery.js.map +1 -0
- package/build/cjs/react-query/src/useInfiniteQuery.js +24 -0
- package/build/cjs/react-query/src/useInfiniteQuery.js.map +1 -0
- package/build/cjs/react-query/src/useIsFetching.js +50 -0
- package/build/cjs/react-query/src/useIsFetching.js.map +1 -0
- package/build/cjs/react-query/src/useIsMutating.js +50 -0
- package/build/cjs/react-query/src/useIsMutating.js.map +1 -0
- package/build/cjs/react-query/src/useMutation.js +68 -0
- package/build/cjs/react-query/src/useMutation.js.map +1 -0
- package/build/cjs/react-query/src/useQueries.js +71 -0
- package/build/cjs/react-query/src/useQueries.js.map +1 -0
- package/build/cjs/react-query/src/useQuery.js +24 -0
- package/build/cjs/react-query/src/useQuery.js.map +1 -0
- package/build/cjs/react-query/src/utils.js +25 -0
- package/build/cjs/react-query/src/utils.js.map +1 -0
- package/build/esm/index.js +3368 -0
- package/build/esm/index.js.map +1 -0
- package/build/stats-html.html +2689 -0
- package/build/stats.json +666 -0
- package/build/types/packages/query-core/src/focusManager.d.ts +16 -0
- package/build/types/packages/query-core/src/hydration.d.ts +34 -0
- package/build/types/packages/query-core/src/index.d.ts +20 -0
- package/build/types/packages/query-core/src/infiniteQueryBehavior.d.ts +15 -0
- package/build/types/packages/query-core/src/infiniteQueryObserver.d.ts +18 -0
- package/build/types/packages/query-core/src/logger.d.ts +8 -0
- package/build/types/packages/query-core/src/mutation.d.ts +70 -0
- package/build/types/packages/query-core/src/mutationCache.d.ts +52 -0
- package/build/types/packages/query-core/src/mutationObserver.d.ts +23 -0
- package/build/types/packages/query-core/src/notifyManager.d.ts +18 -0
- package/build/types/packages/query-core/src/onlineManager.d.ts +16 -0
- package/build/types/packages/query-core/src/queriesObserver.d.ts +23 -0
- package/build/types/packages/query-core/src/query.d.ts +119 -0
- package/build/types/packages/query-core/src/queryCache.d.ts +59 -0
- package/build/types/packages/query-core/src/queryClient.d.ts +65 -0
- package/build/types/packages/query-core/src/queryObserver.d.ts +61 -0
- package/build/types/packages/query-core/src/removable.d.ts +9 -0
- package/build/types/packages/query-core/src/retryer.d.ts +33 -0
- package/build/types/packages/query-core/src/subscribable.d.ts +10 -0
- package/build/types/packages/query-core/src/types.d.ts +417 -0
- package/build/types/packages/query-core/src/utils.d.ts +99 -0
- package/build/types/packages/react-query/src/Hydrate.d.ts +10 -0
- package/build/types/packages/react-query/src/QueryClientProvider.d.ts +24 -0
- package/build/types/packages/react-query/src/QueryErrorResetBoundary.d.ts +12 -0
- package/build/types/packages/react-query/src/__tests__/Hydrate.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/QueryClientProvider.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.d.ts +6 -0
- package/build/types/packages/react-query/src/__tests__/ssr-hydration.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/ssr.test.d.ts +4 -0
- package/build/types/packages/react-query/src/__tests__/suspense.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/useInfiniteQuery.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/useIsFetching.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/useIsMutating.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/useMutation.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/useQueries.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/useQuery.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/useQuery.types.test.d.ts +2 -0
- package/build/types/packages/react-query/src/__tests__/utils.d.ts +8 -0
- package/build/types/packages/react-query/src/index.d.ts +17 -0
- package/build/types/packages/react-query/src/isRestoring.d.ts +3 -0
- package/build/types/packages/react-query/src/reactBatchedUpdates.d.ts +2 -0
- package/build/types/packages/react-query/src/reactBatchedUpdates.native.d.ts +2 -0
- package/build/types/packages/react-query/src/setBatchUpdatesFn.d.ts +1 -0
- package/build/types/packages/react-query/src/types.d.ts +35 -0
- package/build/types/packages/react-query/src/useBaseQuery.d.ts +3 -0
- package/build/types/packages/react-query/src/useInfiniteQuery.d.ts +5 -0
- package/build/types/packages/react-query/src/useIsFetching.d.ts +7 -0
- package/build/types/packages/react-query/src/useIsMutating.d.ts +7 -0
- package/build/types/packages/react-query/src/useMutation.d.ts +6 -0
- package/build/types/packages/react-query/src/useQueries.d.ts +49 -0
- package/build/types/packages/react-query/src/useQuery.d.ts +20 -0
- package/build/types/packages/react-query/src/utils.d.ts +1 -0
- package/build/types/tests/utils.d.ts +24 -0
- package/build/umd/index.development.js +3429 -0
- package/build/umd/index.development.js.map +1 -0
- package/build/umd/index.production.js +22 -0
- package/build/umd/index.production.js.map +1 -0
- package/codemods/v4/key-transformation.js +138 -0
- package/codemods/v4/replace-import-specifier.js +25 -0
- package/codemods/v4/utils/index.js +166 -0
- package/codemods/v4/utils/replacers/key-replacer.js +160 -0
- package/codemods/v4/utils/transformers/query-cache-transformer.js +115 -0
- package/codemods/v4/utils/transformers/query-client-transformer.js +49 -0
- package/codemods/v4/utils/transformers/use-query-like-transformer.js +32 -0
- package/codemods/v4/utils/unprocessable-key-error.js +8 -0
- package/package.json +63 -0
- package/src/Hydrate.tsx +36 -0
- package/src/QueryClientProvider.tsx +90 -0
- package/src/QueryErrorResetBoundary.tsx +52 -0
- package/src/__tests__/Hydrate.test.tsx +247 -0
- package/src/__tests__/QueryClientProvider.test.tsx +275 -0
- package/src/__tests__/QueryResetErrorBoundary.test.tsx +630 -0
- package/src/__tests__/ssr-hydration.test.tsx +274 -0
- package/src/__tests__/ssr.test.tsx +151 -0
- package/src/__tests__/suspense.test.tsx +1015 -0
- package/src/__tests__/useInfiniteQuery.test.tsx +1773 -0
- package/src/__tests__/useIsFetching.test.tsx +274 -0
- package/src/__tests__/useIsMutating.test.tsx +260 -0
- package/src/__tests__/useMutation.test.tsx +1099 -0
- package/src/__tests__/useQueries.test.tsx +1107 -0
- package/src/__tests__/useQuery.test.tsx +5746 -0
- package/src/__tests__/useQuery.types.test.tsx +157 -0
- package/src/__tests__/utils.tsx +45 -0
- package/src/index.ts +29 -0
- package/src/isRestoring.tsx +6 -0
- package/src/reactBatchedUpdates.native.ts +4 -0
- package/src/reactBatchedUpdates.ts +2 -0
- package/src/setBatchUpdatesFn.ts +4 -0
- package/src/types.ts +122 -0
- package/src/useBaseQuery.ts +140 -0
- package/src/useInfiniteQuery.ts +101 -0
- package/src/useIsFetching.ts +39 -0
- package/src/useIsMutating.ts +43 -0
- package/src/useMutation.ts +126 -0
- package/src/useQueries.ts +192 -0
- package/src/useQuery.ts +104 -0
- package/src/utils.ts +11 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { useQuery } from '../useQuery'
|
|
2
|
+
|
|
3
|
+
export type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends <
|
|
4
|
+
T,
|
|
5
|
+
>() => T extends Y ? 1 : 2
|
|
6
|
+
? true
|
|
7
|
+
: false
|
|
8
|
+
|
|
9
|
+
export type Expect<T extends true> = T
|
|
10
|
+
|
|
11
|
+
const doNotExecute = (_func: () => void) => true
|
|
12
|
+
|
|
13
|
+
describe('initialData', () => {
|
|
14
|
+
describe('Config object overload', () => {
|
|
15
|
+
it('TData should always be defined when initialData is provided as an object', () => {
|
|
16
|
+
doNotExecute(() => {
|
|
17
|
+
const { data } = useQuery({
|
|
18
|
+
queryFn: () => {
|
|
19
|
+
return {
|
|
20
|
+
wow: true,
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
initialData: {
|
|
24
|
+
wow: true,
|
|
25
|
+
},
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
const result: Expect<Equal<{ wow: boolean }, typeof data>> = true
|
|
29
|
+
return result
|
|
30
|
+
})
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('TData should always be defined when initialData is provided as a function which ALWAYS returns the data', () => {
|
|
34
|
+
doNotExecute(() => {
|
|
35
|
+
const { data } = useQuery({
|
|
36
|
+
queryFn: () => {
|
|
37
|
+
return {
|
|
38
|
+
wow: true,
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
initialData: () => ({
|
|
42
|
+
wow: true,
|
|
43
|
+
}),
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
const result: Expect<Equal<{ wow: boolean }, typeof data>> = true
|
|
47
|
+
return result
|
|
48
|
+
})
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
it('TData should have undefined in the union when initialData is NOT provided', () => {
|
|
52
|
+
doNotExecute(() => {
|
|
53
|
+
const { data } = useQuery({
|
|
54
|
+
queryFn: () => {
|
|
55
|
+
return {
|
|
56
|
+
wow: true,
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
const result: Expect<Equal<{ wow: boolean } | undefined, typeof data>> =
|
|
62
|
+
true
|
|
63
|
+
return result
|
|
64
|
+
})
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
it('TData should have undefined in the union when initialData is provided as a function which can return undefined', () => {
|
|
68
|
+
doNotExecute(() => {
|
|
69
|
+
const { data } = useQuery({
|
|
70
|
+
queryFn: () => {
|
|
71
|
+
return {
|
|
72
|
+
wow: true,
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
initialData: () => undefined as { wow: boolean } | undefined,
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
const result: Expect<Equal<{ wow: boolean } | undefined, typeof data>> =
|
|
79
|
+
true
|
|
80
|
+
return result
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
describe('Query key overload', () => {
|
|
86
|
+
it('TData should always be defined when initialData is provided', () => {
|
|
87
|
+
doNotExecute(() => {
|
|
88
|
+
const { data } = useQuery(['key'], {
|
|
89
|
+
queryFn: () => {
|
|
90
|
+
return {
|
|
91
|
+
wow: true,
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
initialData: {
|
|
95
|
+
wow: true,
|
|
96
|
+
},
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
const result: Expect<Equal<{ wow: boolean }, typeof data>> = true
|
|
100
|
+
return result
|
|
101
|
+
})
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
it('TData should have undefined in the union when initialData is NOT provided', () => {
|
|
105
|
+
doNotExecute(() => {
|
|
106
|
+
const { data } = useQuery(['key'], {
|
|
107
|
+
queryFn: () => {
|
|
108
|
+
return {
|
|
109
|
+
wow: true,
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
const result: Expect<Equal<{ wow: boolean } | undefined, typeof data>> =
|
|
115
|
+
true
|
|
116
|
+
return result
|
|
117
|
+
})
|
|
118
|
+
})
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
describe('Query key and func', () => {
|
|
122
|
+
it('TData should always be defined when initialData is provided', () => {
|
|
123
|
+
doNotExecute(() => {
|
|
124
|
+
const { data } = useQuery(
|
|
125
|
+
['key'],
|
|
126
|
+
() => {
|
|
127
|
+
return {
|
|
128
|
+
wow: true,
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
initialData: {
|
|
133
|
+
wow: true,
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
const result: Expect<Equal<{ wow: boolean }, typeof data>> = true
|
|
139
|
+
return result
|
|
140
|
+
})
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
it('TData should have undefined in the union when initialData is NOT provided', () => {
|
|
144
|
+
doNotExecute(() => {
|
|
145
|
+
const { data } = useQuery(['key'], () => {
|
|
146
|
+
return {
|
|
147
|
+
wow: true,
|
|
148
|
+
}
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
const result: Expect<Equal<{ wow: boolean } | undefined, typeof data>> =
|
|
152
|
+
true
|
|
153
|
+
return result
|
|
154
|
+
})
|
|
155
|
+
})
|
|
156
|
+
})
|
|
157
|
+
})
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import { render } from '@testing-library/react'
|
|
3
|
+
import { setActTimeout } from '../../../../tests/utils'
|
|
4
|
+
import { QueryClient, ContextOptions, QueryClientProvider } from '..'
|
|
5
|
+
|
|
6
|
+
export function renderWithClient(
|
|
7
|
+
client: QueryClient,
|
|
8
|
+
ui: React.ReactElement,
|
|
9
|
+
options: ContextOptions = {},
|
|
10
|
+
): ReturnType<typeof render> {
|
|
11
|
+
const { rerender, ...result } = render(
|
|
12
|
+
<QueryClientProvider client={client} context={options.context}>
|
|
13
|
+
{ui}
|
|
14
|
+
</QueryClientProvider>,
|
|
15
|
+
)
|
|
16
|
+
return {
|
|
17
|
+
...result,
|
|
18
|
+
rerender: (rerenderUi: React.ReactElement) =>
|
|
19
|
+
rerender(
|
|
20
|
+
<QueryClientProvider client={client} context={options.context}>
|
|
21
|
+
{rerenderUi}
|
|
22
|
+
</QueryClientProvider>,
|
|
23
|
+
),
|
|
24
|
+
} as any
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const Blink = ({
|
|
28
|
+
duration,
|
|
29
|
+
children,
|
|
30
|
+
}: {
|
|
31
|
+
duration: number
|
|
32
|
+
children: React.ReactNode
|
|
33
|
+
}) => {
|
|
34
|
+
const [shouldShow, setShouldShow] = React.useState<boolean>(true)
|
|
35
|
+
|
|
36
|
+
React.useEffect(() => {
|
|
37
|
+
setShouldShow(true)
|
|
38
|
+
const timeout = setActTimeout(() => setShouldShow(false), duration)
|
|
39
|
+
return () => {
|
|
40
|
+
clearTimeout(timeout)
|
|
41
|
+
}
|
|
42
|
+
}, [duration, children])
|
|
43
|
+
|
|
44
|
+
return shouldShow ? <>{children}</> : <>off</>
|
|
45
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Side effects
|
|
2
|
+
import './setBatchUpdatesFn'
|
|
3
|
+
|
|
4
|
+
// Re-export core
|
|
5
|
+
export * from '@tanstack/query-core'
|
|
6
|
+
|
|
7
|
+
// React Query
|
|
8
|
+
export * from './types'
|
|
9
|
+
export { useQueries } from './useQueries'
|
|
10
|
+
export type { QueriesResults, QueriesOptions } from './useQueries'
|
|
11
|
+
export { useQuery } from './useQuery'
|
|
12
|
+
export {
|
|
13
|
+
defaultContext,
|
|
14
|
+
QueryClientProvider,
|
|
15
|
+
useQueryClient,
|
|
16
|
+
} from './QueryClientProvider'
|
|
17
|
+
export type { QueryClientProviderProps } from './QueryClientProvider'
|
|
18
|
+
export type { QueryErrorResetBoundaryProps } from './QueryErrorResetBoundary'
|
|
19
|
+
export { useHydrate, Hydrate } from './Hydrate'
|
|
20
|
+
export type { HydrateProps } from './Hydrate'
|
|
21
|
+
export {
|
|
22
|
+
QueryErrorResetBoundary,
|
|
23
|
+
useQueryErrorResetBoundary,
|
|
24
|
+
} from './QueryErrorResetBoundary'
|
|
25
|
+
export { useIsFetching } from './useIsFetching'
|
|
26
|
+
export { useIsMutating } from './useIsMutating'
|
|
27
|
+
export { useMutation } from './useMutation'
|
|
28
|
+
export { useInfiniteQuery } from './useInfiniteQuery'
|
|
29
|
+
export { useIsRestoring, IsRestoringProvider } from './isRestoring'
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import {
|
|
3
|
+
InfiniteQueryObserverOptions,
|
|
4
|
+
InfiniteQueryObserverResult,
|
|
5
|
+
MutationObserverResult,
|
|
6
|
+
QueryObserverOptions,
|
|
7
|
+
QueryObserverResult,
|
|
8
|
+
QueryKey,
|
|
9
|
+
MutationObserverOptions,
|
|
10
|
+
MutateFunction,
|
|
11
|
+
} from '@tanstack/query-core'
|
|
12
|
+
import type { QueryClient } from '@tanstack/query-core'
|
|
13
|
+
|
|
14
|
+
export interface ContextOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Use this to pass your React Query context. Otherwise, `defaultContext` will be used.
|
|
17
|
+
*/
|
|
18
|
+
context?: React.Context<QueryClient | undefined>
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface UseBaseQueryOptions<
|
|
22
|
+
TQueryFnData = unknown,
|
|
23
|
+
TError = unknown,
|
|
24
|
+
TData = TQueryFnData,
|
|
25
|
+
TQueryData = TQueryFnData,
|
|
26
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
27
|
+
> extends ContextOptions,
|
|
28
|
+
QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey> {}
|
|
29
|
+
|
|
30
|
+
export interface UseQueryOptions<
|
|
31
|
+
TQueryFnData = unknown,
|
|
32
|
+
TError = unknown,
|
|
33
|
+
TData = TQueryFnData,
|
|
34
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
35
|
+
> extends UseBaseQueryOptions<
|
|
36
|
+
TQueryFnData,
|
|
37
|
+
TError,
|
|
38
|
+
TData,
|
|
39
|
+
TQueryFnData,
|
|
40
|
+
TQueryKey
|
|
41
|
+
> {}
|
|
42
|
+
|
|
43
|
+
export interface UseInfiniteQueryOptions<
|
|
44
|
+
TQueryFnData = unknown,
|
|
45
|
+
TError = unknown,
|
|
46
|
+
TData = TQueryFnData,
|
|
47
|
+
TQueryData = TQueryFnData,
|
|
48
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
49
|
+
> extends ContextOptions,
|
|
50
|
+
InfiniteQueryObserverOptions<
|
|
51
|
+
TQueryFnData,
|
|
52
|
+
TError,
|
|
53
|
+
TData,
|
|
54
|
+
TQueryData,
|
|
55
|
+
TQueryKey
|
|
56
|
+
> {}
|
|
57
|
+
|
|
58
|
+
export type UseBaseQueryResult<
|
|
59
|
+
TData = unknown,
|
|
60
|
+
TError = unknown,
|
|
61
|
+
> = QueryObserverResult<TData, TError>
|
|
62
|
+
|
|
63
|
+
export type UseQueryResult<
|
|
64
|
+
TData = unknown,
|
|
65
|
+
TError = unknown,
|
|
66
|
+
> = UseBaseQueryResult<TData, TError>
|
|
67
|
+
|
|
68
|
+
export type DefinedUseQueryResult<TData = unknown, TError = unknown> = Omit<
|
|
69
|
+
UseQueryResult<TData, TError>,
|
|
70
|
+
'data'
|
|
71
|
+
> & { data: TData }
|
|
72
|
+
|
|
73
|
+
export type UseInfiniteQueryResult<
|
|
74
|
+
TData = unknown,
|
|
75
|
+
TError = unknown,
|
|
76
|
+
> = InfiniteQueryObserverResult<TData, TError>
|
|
77
|
+
|
|
78
|
+
export interface UseMutationOptions<
|
|
79
|
+
TData = unknown,
|
|
80
|
+
TError = unknown,
|
|
81
|
+
TVariables = void,
|
|
82
|
+
TContext = unknown,
|
|
83
|
+
> extends ContextOptions,
|
|
84
|
+
Omit<
|
|
85
|
+
MutationObserverOptions<TData, TError, TVariables, TContext>,
|
|
86
|
+
'_defaulted' | 'variables'
|
|
87
|
+
> {}
|
|
88
|
+
|
|
89
|
+
export type UseMutateFunction<
|
|
90
|
+
TData = unknown,
|
|
91
|
+
TError = unknown,
|
|
92
|
+
TVariables = void,
|
|
93
|
+
TContext = unknown,
|
|
94
|
+
> = (
|
|
95
|
+
...args: Parameters<MutateFunction<TData, TError, TVariables, TContext>>
|
|
96
|
+
) => void
|
|
97
|
+
|
|
98
|
+
export type UseMutateAsyncFunction<
|
|
99
|
+
TData = unknown,
|
|
100
|
+
TError = unknown,
|
|
101
|
+
TVariables = void,
|
|
102
|
+
TContext = unknown,
|
|
103
|
+
> = MutateFunction<TData, TError, TVariables, TContext>
|
|
104
|
+
|
|
105
|
+
export type UseBaseMutationResult<
|
|
106
|
+
TData = unknown,
|
|
107
|
+
TError = unknown,
|
|
108
|
+
TVariables = unknown,
|
|
109
|
+
TContext = unknown,
|
|
110
|
+
> = Override<
|
|
111
|
+
MutationObserverResult<TData, TError, TVariables, TContext>,
|
|
112
|
+
{ mutate: UseMutateFunction<TData, TError, TVariables, TContext> }
|
|
113
|
+
> & { mutateAsync: UseMutateAsyncFunction<TData, TError, TVariables, TContext> }
|
|
114
|
+
|
|
115
|
+
export type UseMutationResult<
|
|
116
|
+
TData = unknown,
|
|
117
|
+
TError = unknown,
|
|
118
|
+
TVariables = unknown,
|
|
119
|
+
TContext = unknown,
|
|
120
|
+
> = UseBaseMutationResult<TData, TError, TVariables, TContext>
|
|
121
|
+
|
|
122
|
+
type Override<A, B> = { [K in keyof A]: K extends keyof B ? B[K] : A[K] }
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import { useSyncExternalStore } from 'use-sync-external-store/shim'
|
|
3
|
+
|
|
4
|
+
import { QueryKey, notifyManager, QueryObserver } from '@tanstack/query-core'
|
|
5
|
+
import { useQueryErrorResetBoundary } from './QueryErrorResetBoundary'
|
|
6
|
+
import { useQueryClient } from './QueryClientProvider'
|
|
7
|
+
import { UseBaseQueryOptions } from './types'
|
|
8
|
+
import { shouldThrowError } from './utils'
|
|
9
|
+
import { useIsRestoring } from './isRestoring'
|
|
10
|
+
|
|
11
|
+
export function useBaseQuery<
|
|
12
|
+
TQueryFnData,
|
|
13
|
+
TError,
|
|
14
|
+
TData,
|
|
15
|
+
TQueryData,
|
|
16
|
+
TQueryKey extends QueryKey,
|
|
17
|
+
>(
|
|
18
|
+
options: UseBaseQueryOptions<
|
|
19
|
+
TQueryFnData,
|
|
20
|
+
TError,
|
|
21
|
+
TData,
|
|
22
|
+
TQueryData,
|
|
23
|
+
TQueryKey
|
|
24
|
+
>,
|
|
25
|
+
Observer: typeof QueryObserver,
|
|
26
|
+
) {
|
|
27
|
+
const queryClient = useQueryClient({ context: options.context })
|
|
28
|
+
const isRestoring = useIsRestoring()
|
|
29
|
+
const errorResetBoundary = useQueryErrorResetBoundary()
|
|
30
|
+
const defaultedOptions = queryClient.defaultQueryOptions(options)
|
|
31
|
+
|
|
32
|
+
// Make sure results are optimistically set in fetching state before subscribing or updating options
|
|
33
|
+
defaultedOptions._optimisticResults = isRestoring
|
|
34
|
+
? 'isRestoring'
|
|
35
|
+
: 'optimistic'
|
|
36
|
+
|
|
37
|
+
// Include callbacks in batch renders
|
|
38
|
+
if (defaultedOptions.onError) {
|
|
39
|
+
defaultedOptions.onError = notifyManager.batchCalls(
|
|
40
|
+
defaultedOptions.onError,
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (defaultedOptions.onSuccess) {
|
|
45
|
+
defaultedOptions.onSuccess = notifyManager.batchCalls(
|
|
46
|
+
defaultedOptions.onSuccess,
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (defaultedOptions.onSettled) {
|
|
51
|
+
defaultedOptions.onSettled = notifyManager.batchCalls(
|
|
52
|
+
defaultedOptions.onSettled,
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (defaultedOptions.suspense) {
|
|
57
|
+
// Always set stale time when using suspense to prevent
|
|
58
|
+
// fetching again when directly mounting after suspending
|
|
59
|
+
if (typeof defaultedOptions.staleTime !== 'number') {
|
|
60
|
+
defaultedOptions.staleTime = 1000
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (defaultedOptions.suspense || defaultedOptions.useErrorBoundary) {
|
|
65
|
+
// Prevent retrying failed query if the error boundary has not been reset yet
|
|
66
|
+
if (!errorResetBoundary.isReset()) {
|
|
67
|
+
defaultedOptions.retryOnMount = false
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const [observer] = React.useState(
|
|
72
|
+
() =>
|
|
73
|
+
new Observer<TQueryFnData, TError, TData, TQueryData, TQueryKey>(
|
|
74
|
+
queryClient,
|
|
75
|
+
defaultedOptions,
|
|
76
|
+
),
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
const result = observer.getOptimisticResult(defaultedOptions)
|
|
80
|
+
|
|
81
|
+
useSyncExternalStore(
|
|
82
|
+
React.useCallback(
|
|
83
|
+
(onStoreChange) =>
|
|
84
|
+
isRestoring
|
|
85
|
+
? () => undefined
|
|
86
|
+
: observer.subscribe(notifyManager.batchCalls(onStoreChange)),
|
|
87
|
+
[observer, isRestoring],
|
|
88
|
+
),
|
|
89
|
+
() => observer.getCurrentResult(),
|
|
90
|
+
() => observer.getCurrentResult(),
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
React.useEffect(() => {
|
|
94
|
+
errorResetBoundary.clearReset()
|
|
95
|
+
}, [errorResetBoundary])
|
|
96
|
+
|
|
97
|
+
React.useEffect(() => {
|
|
98
|
+
// Do not notify on updates because of changes in the options because
|
|
99
|
+
// these changes should already be reflected in the optimistic result.
|
|
100
|
+
observer.setOptions(defaultedOptions, { listeners: false })
|
|
101
|
+
}, [defaultedOptions, observer])
|
|
102
|
+
|
|
103
|
+
// Handle suspense
|
|
104
|
+
if (
|
|
105
|
+
defaultedOptions.suspense &&
|
|
106
|
+
result.isLoading &&
|
|
107
|
+
result.isFetching &&
|
|
108
|
+
!isRestoring
|
|
109
|
+
) {
|
|
110
|
+
throw observer
|
|
111
|
+
.fetchOptimistic(defaultedOptions)
|
|
112
|
+
.then(({ data }) => {
|
|
113
|
+
defaultedOptions.onSuccess?.(data as TData)
|
|
114
|
+
defaultedOptions.onSettled?.(data, null)
|
|
115
|
+
})
|
|
116
|
+
.catch((error) => {
|
|
117
|
+
errorResetBoundary.clearReset()
|
|
118
|
+
defaultedOptions.onError?.(error)
|
|
119
|
+
defaultedOptions.onSettled?.(undefined, error)
|
|
120
|
+
})
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Handle error boundary
|
|
124
|
+
if (
|
|
125
|
+
result.isError &&
|
|
126
|
+
!errorResetBoundary.isReset() &&
|
|
127
|
+
!result.isFetching &&
|
|
128
|
+
shouldThrowError(defaultedOptions.useErrorBoundary, [
|
|
129
|
+
result.error,
|
|
130
|
+
observer.getCurrentQuery(),
|
|
131
|
+
])
|
|
132
|
+
) {
|
|
133
|
+
throw result.error
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Handle result property usage tracking
|
|
137
|
+
return !defaultedOptions.notifyOnChangeProps
|
|
138
|
+
? observer.trackResult(result)
|
|
139
|
+
: result
|
|
140
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import {
|
|
2
|
+
QueryObserver,
|
|
3
|
+
InfiniteQueryObserver,
|
|
4
|
+
QueryFunction,
|
|
5
|
+
QueryKey,
|
|
6
|
+
parseQueryArgs,
|
|
7
|
+
} from '@tanstack/query-core'
|
|
8
|
+
import { UseInfiniteQueryOptions, UseInfiniteQueryResult } from './types'
|
|
9
|
+
import { useBaseQuery } from './useBaseQuery'
|
|
10
|
+
|
|
11
|
+
// HOOK
|
|
12
|
+
|
|
13
|
+
export function useInfiniteQuery<
|
|
14
|
+
TQueryFnData = unknown,
|
|
15
|
+
TError = unknown,
|
|
16
|
+
TData = TQueryFnData,
|
|
17
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
18
|
+
>(
|
|
19
|
+
options: UseInfiniteQueryOptions<
|
|
20
|
+
TQueryFnData,
|
|
21
|
+
TError,
|
|
22
|
+
TData,
|
|
23
|
+
TQueryFnData,
|
|
24
|
+
TQueryKey
|
|
25
|
+
>,
|
|
26
|
+
): UseInfiniteQueryResult<TData, TError>
|
|
27
|
+
export function useInfiniteQuery<
|
|
28
|
+
TQueryFnData = unknown,
|
|
29
|
+
TError = unknown,
|
|
30
|
+
TData = TQueryFnData,
|
|
31
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
32
|
+
>(
|
|
33
|
+
queryKey: TQueryKey,
|
|
34
|
+
options?: Omit<
|
|
35
|
+
UseInfiniteQueryOptions<
|
|
36
|
+
TQueryFnData,
|
|
37
|
+
TError,
|
|
38
|
+
TData,
|
|
39
|
+
TQueryFnData,
|
|
40
|
+
TQueryKey
|
|
41
|
+
>,
|
|
42
|
+
'queryKey'
|
|
43
|
+
>,
|
|
44
|
+
): UseInfiniteQueryResult<TData, TError>
|
|
45
|
+
export function useInfiniteQuery<
|
|
46
|
+
TQueryFnData = unknown,
|
|
47
|
+
TError = unknown,
|
|
48
|
+
TData = TQueryFnData,
|
|
49
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
50
|
+
>(
|
|
51
|
+
queryKey: TQueryKey,
|
|
52
|
+
queryFn: QueryFunction<TQueryFnData, TQueryKey>,
|
|
53
|
+
options?: Omit<
|
|
54
|
+
UseInfiniteQueryOptions<
|
|
55
|
+
TQueryFnData,
|
|
56
|
+
TError,
|
|
57
|
+
TData,
|
|
58
|
+
TQueryFnData,
|
|
59
|
+
TQueryKey
|
|
60
|
+
>,
|
|
61
|
+
'queryKey' | 'queryFn'
|
|
62
|
+
>,
|
|
63
|
+
): UseInfiniteQueryResult<TData, TError>
|
|
64
|
+
export function useInfiniteQuery<
|
|
65
|
+
TQueryFnData,
|
|
66
|
+
TError,
|
|
67
|
+
TData = TQueryFnData,
|
|
68
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
69
|
+
>(
|
|
70
|
+
arg1:
|
|
71
|
+
| TQueryKey
|
|
72
|
+
| UseInfiniteQueryOptions<
|
|
73
|
+
TQueryFnData,
|
|
74
|
+
TError,
|
|
75
|
+
TData,
|
|
76
|
+
TQueryFnData,
|
|
77
|
+
TQueryKey
|
|
78
|
+
>,
|
|
79
|
+
arg2?:
|
|
80
|
+
| QueryFunction<TQueryFnData, TQueryKey>
|
|
81
|
+
| UseInfiniteQueryOptions<
|
|
82
|
+
TQueryFnData,
|
|
83
|
+
TError,
|
|
84
|
+
TData,
|
|
85
|
+
TQueryFnData,
|
|
86
|
+
TQueryKey
|
|
87
|
+
>,
|
|
88
|
+
arg3?: UseInfiniteQueryOptions<
|
|
89
|
+
TQueryFnData,
|
|
90
|
+
TError,
|
|
91
|
+
TData,
|
|
92
|
+
TQueryFnData,
|
|
93
|
+
TQueryKey
|
|
94
|
+
>,
|
|
95
|
+
): UseInfiniteQueryResult<TData, TError> {
|
|
96
|
+
const options = parseQueryArgs(arg1, arg2, arg3)
|
|
97
|
+
return useBaseQuery(
|
|
98
|
+
options,
|
|
99
|
+
InfiniteQueryObserver as typeof QueryObserver,
|
|
100
|
+
) as UseInfiniteQueryResult<TData, TError>
|
|
101
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import {
|
|
3
|
+
QueryKey,
|
|
4
|
+
notifyManager,
|
|
5
|
+
parseFilterArgs,
|
|
6
|
+
QueryFilters,
|
|
7
|
+
} from '@tanstack/query-core'
|
|
8
|
+
|
|
9
|
+
import { useSyncExternalStore } from 'use-sync-external-store/shim'
|
|
10
|
+
import { ContextOptions } from './types'
|
|
11
|
+
import { useQueryClient } from './QueryClientProvider'
|
|
12
|
+
|
|
13
|
+
interface Options extends ContextOptions {}
|
|
14
|
+
|
|
15
|
+
export function useIsFetching(filters?: QueryFilters, options?: Options): number
|
|
16
|
+
export function useIsFetching(
|
|
17
|
+
queryKey?: QueryKey,
|
|
18
|
+
filters?: QueryFilters,
|
|
19
|
+
options?: Options,
|
|
20
|
+
): number
|
|
21
|
+
export function useIsFetching(
|
|
22
|
+
arg1?: QueryKey | QueryFilters,
|
|
23
|
+
arg2?: QueryFilters | Options,
|
|
24
|
+
arg3?: Options,
|
|
25
|
+
): number {
|
|
26
|
+
const [filters, options = {}] = parseFilterArgs(arg1, arg2, arg3)
|
|
27
|
+
const queryClient = useQueryClient({ context: options.context })
|
|
28
|
+
const queryCache = queryClient.getQueryCache()
|
|
29
|
+
|
|
30
|
+
return useSyncExternalStore(
|
|
31
|
+
React.useCallback(
|
|
32
|
+
(onStoreChange) =>
|
|
33
|
+
queryCache.subscribe(notifyManager.batchCalls(onStoreChange)),
|
|
34
|
+
[queryCache],
|
|
35
|
+
),
|
|
36
|
+
() => queryClient.isFetching(filters),
|
|
37
|
+
() => queryClient.isFetching(filters),
|
|
38
|
+
)
|
|
39
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import { useSyncExternalStore } from 'use-sync-external-store/shim'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
notifyManager,
|
|
6
|
+
MutationKey,
|
|
7
|
+
MutationFilters,
|
|
8
|
+
parseMutationFilterArgs,
|
|
9
|
+
} from '@tanstack/query-core'
|
|
10
|
+
import { ContextOptions } from './types'
|
|
11
|
+
import { useQueryClient } from './QueryClientProvider'
|
|
12
|
+
|
|
13
|
+
interface Options extends ContextOptions {}
|
|
14
|
+
|
|
15
|
+
export function useIsMutating(
|
|
16
|
+
filters?: MutationFilters,
|
|
17
|
+
options?: Options,
|
|
18
|
+
): number
|
|
19
|
+
export function useIsMutating(
|
|
20
|
+
mutationKey?: MutationKey,
|
|
21
|
+
filters?: Omit<MutationFilters, 'mutationKey'>,
|
|
22
|
+
options?: Options,
|
|
23
|
+
): number
|
|
24
|
+
export function useIsMutating(
|
|
25
|
+
arg1?: MutationKey | MutationFilters,
|
|
26
|
+
arg2?: Omit<MutationFilters, 'mutationKey'> | Options,
|
|
27
|
+
arg3?: Options,
|
|
28
|
+
): number {
|
|
29
|
+
const [filters, options = {}] = parseMutationFilterArgs(arg1, arg2, arg3)
|
|
30
|
+
|
|
31
|
+
const queryClient = useQueryClient({ context: options.context })
|
|
32
|
+
const mutationCache = queryClient.getMutationCache()
|
|
33
|
+
|
|
34
|
+
return useSyncExternalStore(
|
|
35
|
+
React.useCallback(
|
|
36
|
+
(onStoreChange) =>
|
|
37
|
+
mutationCache.subscribe(notifyManager.batchCalls(onStoreChange)),
|
|
38
|
+
[mutationCache],
|
|
39
|
+
),
|
|
40
|
+
() => queryClient.isMutating(filters),
|
|
41
|
+
() => queryClient.isMutating(filters),
|
|
42
|
+
)
|
|
43
|
+
}
|