@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.
Files changed (129) hide show
  1. package/build/cjs/query-core/build/esm/index.js +3110 -0
  2. package/build/cjs/query-core/build/esm/index.js.map +1 -0
  3. package/build/cjs/react-query/src/Hydrate.js +66 -0
  4. package/build/cjs/react-query/src/Hydrate.js.map +1 -0
  5. package/build/cjs/react-query/src/QueryClientProvider.js +96 -0
  6. package/build/cjs/react-query/src/QueryClientProvider.js.map +1 -0
  7. package/build/cjs/react-query/src/QueryErrorResetBoundary.js +67 -0
  8. package/build/cjs/react-query/src/QueryErrorResetBoundary.js.map +1 -0
  9. package/build/cjs/react-query/src/index.js +64 -0
  10. package/build/cjs/react-query/src/index.js.map +1 -0
  11. package/build/cjs/react-query/src/isRestoring.js +43 -0
  12. package/build/cjs/react-query/src/isRestoring.js.map +1 -0
  13. package/build/cjs/react-query/src/useBaseQuery.js +117 -0
  14. package/build/cjs/react-query/src/useBaseQuery.js.map +1 -0
  15. package/build/cjs/react-query/src/useInfiniteQuery.js +24 -0
  16. package/build/cjs/react-query/src/useInfiniteQuery.js.map +1 -0
  17. package/build/cjs/react-query/src/useIsFetching.js +50 -0
  18. package/build/cjs/react-query/src/useIsFetching.js.map +1 -0
  19. package/build/cjs/react-query/src/useIsMutating.js +50 -0
  20. package/build/cjs/react-query/src/useIsMutating.js.map +1 -0
  21. package/build/cjs/react-query/src/useMutation.js +68 -0
  22. package/build/cjs/react-query/src/useMutation.js.map +1 -0
  23. package/build/cjs/react-query/src/useQueries.js +71 -0
  24. package/build/cjs/react-query/src/useQueries.js.map +1 -0
  25. package/build/cjs/react-query/src/useQuery.js +24 -0
  26. package/build/cjs/react-query/src/useQuery.js.map +1 -0
  27. package/build/cjs/react-query/src/utils.js +25 -0
  28. package/build/cjs/react-query/src/utils.js.map +1 -0
  29. package/build/esm/index.js +3368 -0
  30. package/build/esm/index.js.map +1 -0
  31. package/build/stats-html.html +2689 -0
  32. package/build/stats.json +666 -0
  33. package/build/types/packages/query-core/src/focusManager.d.ts +16 -0
  34. package/build/types/packages/query-core/src/hydration.d.ts +34 -0
  35. package/build/types/packages/query-core/src/index.d.ts +20 -0
  36. package/build/types/packages/query-core/src/infiniteQueryBehavior.d.ts +15 -0
  37. package/build/types/packages/query-core/src/infiniteQueryObserver.d.ts +18 -0
  38. package/build/types/packages/query-core/src/logger.d.ts +8 -0
  39. package/build/types/packages/query-core/src/mutation.d.ts +70 -0
  40. package/build/types/packages/query-core/src/mutationCache.d.ts +52 -0
  41. package/build/types/packages/query-core/src/mutationObserver.d.ts +23 -0
  42. package/build/types/packages/query-core/src/notifyManager.d.ts +18 -0
  43. package/build/types/packages/query-core/src/onlineManager.d.ts +16 -0
  44. package/build/types/packages/query-core/src/queriesObserver.d.ts +23 -0
  45. package/build/types/packages/query-core/src/query.d.ts +119 -0
  46. package/build/types/packages/query-core/src/queryCache.d.ts +59 -0
  47. package/build/types/packages/query-core/src/queryClient.d.ts +65 -0
  48. package/build/types/packages/query-core/src/queryObserver.d.ts +61 -0
  49. package/build/types/packages/query-core/src/removable.d.ts +9 -0
  50. package/build/types/packages/query-core/src/retryer.d.ts +33 -0
  51. package/build/types/packages/query-core/src/subscribable.d.ts +10 -0
  52. package/build/types/packages/query-core/src/types.d.ts +417 -0
  53. package/build/types/packages/query-core/src/utils.d.ts +99 -0
  54. package/build/types/packages/react-query/src/Hydrate.d.ts +10 -0
  55. package/build/types/packages/react-query/src/QueryClientProvider.d.ts +24 -0
  56. package/build/types/packages/react-query/src/QueryErrorResetBoundary.d.ts +12 -0
  57. package/build/types/packages/react-query/src/__tests__/Hydrate.test.d.ts +1 -0
  58. package/build/types/packages/react-query/src/__tests__/QueryClientProvider.test.d.ts +1 -0
  59. package/build/types/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.d.ts +6 -0
  60. package/build/types/packages/react-query/src/__tests__/ssr-hydration.test.d.ts +1 -0
  61. package/build/types/packages/react-query/src/__tests__/ssr.test.d.ts +4 -0
  62. package/build/types/packages/react-query/src/__tests__/suspense.test.d.ts +1 -0
  63. package/build/types/packages/react-query/src/__tests__/useInfiniteQuery.test.d.ts +1 -0
  64. package/build/types/packages/react-query/src/__tests__/useIsFetching.test.d.ts +1 -0
  65. package/build/types/packages/react-query/src/__tests__/useIsMutating.test.d.ts +1 -0
  66. package/build/types/packages/react-query/src/__tests__/useMutation.test.d.ts +1 -0
  67. package/build/types/packages/react-query/src/__tests__/useQueries.test.d.ts +1 -0
  68. package/build/types/packages/react-query/src/__tests__/useQuery.test.d.ts +1 -0
  69. package/build/types/packages/react-query/src/__tests__/useQuery.types.test.d.ts +2 -0
  70. package/build/types/packages/react-query/src/__tests__/utils.d.ts +8 -0
  71. package/build/types/packages/react-query/src/index.d.ts +17 -0
  72. package/build/types/packages/react-query/src/isRestoring.d.ts +3 -0
  73. package/build/types/packages/react-query/src/reactBatchedUpdates.d.ts +2 -0
  74. package/build/types/packages/react-query/src/reactBatchedUpdates.native.d.ts +2 -0
  75. package/build/types/packages/react-query/src/setBatchUpdatesFn.d.ts +1 -0
  76. package/build/types/packages/react-query/src/types.d.ts +35 -0
  77. package/build/types/packages/react-query/src/useBaseQuery.d.ts +3 -0
  78. package/build/types/packages/react-query/src/useInfiniteQuery.d.ts +5 -0
  79. package/build/types/packages/react-query/src/useIsFetching.d.ts +7 -0
  80. package/build/types/packages/react-query/src/useIsMutating.d.ts +7 -0
  81. package/build/types/packages/react-query/src/useMutation.d.ts +6 -0
  82. package/build/types/packages/react-query/src/useQueries.d.ts +49 -0
  83. package/build/types/packages/react-query/src/useQuery.d.ts +20 -0
  84. package/build/types/packages/react-query/src/utils.d.ts +1 -0
  85. package/build/types/tests/utils.d.ts +24 -0
  86. package/build/umd/index.development.js +3429 -0
  87. package/build/umd/index.development.js.map +1 -0
  88. package/build/umd/index.production.js +22 -0
  89. package/build/umd/index.production.js.map +1 -0
  90. package/codemods/v4/key-transformation.js +138 -0
  91. package/codemods/v4/replace-import-specifier.js +25 -0
  92. package/codemods/v4/utils/index.js +166 -0
  93. package/codemods/v4/utils/replacers/key-replacer.js +160 -0
  94. package/codemods/v4/utils/transformers/query-cache-transformer.js +115 -0
  95. package/codemods/v4/utils/transformers/query-client-transformer.js +49 -0
  96. package/codemods/v4/utils/transformers/use-query-like-transformer.js +32 -0
  97. package/codemods/v4/utils/unprocessable-key-error.js +8 -0
  98. package/package.json +63 -0
  99. package/src/Hydrate.tsx +36 -0
  100. package/src/QueryClientProvider.tsx +90 -0
  101. package/src/QueryErrorResetBoundary.tsx +52 -0
  102. package/src/__tests__/Hydrate.test.tsx +247 -0
  103. package/src/__tests__/QueryClientProvider.test.tsx +275 -0
  104. package/src/__tests__/QueryResetErrorBoundary.test.tsx +630 -0
  105. package/src/__tests__/ssr-hydration.test.tsx +274 -0
  106. package/src/__tests__/ssr.test.tsx +151 -0
  107. package/src/__tests__/suspense.test.tsx +1015 -0
  108. package/src/__tests__/useInfiniteQuery.test.tsx +1773 -0
  109. package/src/__tests__/useIsFetching.test.tsx +274 -0
  110. package/src/__tests__/useIsMutating.test.tsx +260 -0
  111. package/src/__tests__/useMutation.test.tsx +1099 -0
  112. package/src/__tests__/useQueries.test.tsx +1107 -0
  113. package/src/__tests__/useQuery.test.tsx +5746 -0
  114. package/src/__tests__/useQuery.types.test.tsx +157 -0
  115. package/src/__tests__/utils.tsx +45 -0
  116. package/src/index.ts +29 -0
  117. package/src/isRestoring.tsx +6 -0
  118. package/src/reactBatchedUpdates.native.ts +4 -0
  119. package/src/reactBatchedUpdates.ts +2 -0
  120. package/src/setBatchUpdatesFn.ts +4 -0
  121. package/src/types.ts +122 -0
  122. package/src/useBaseQuery.ts +140 -0
  123. package/src/useInfiniteQuery.ts +101 -0
  124. package/src/useIsFetching.ts +39 -0
  125. package/src/useIsMutating.ts +43 -0
  126. package/src/useMutation.ts +126 -0
  127. package/src/useQueries.ts +192 -0
  128. package/src/useQuery.ts +104 -0
  129. 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'
@@ -0,0 +1,6 @@
1
+ import * as React from 'react'
2
+
3
+ const IsRestoringContext = React.createContext(false)
4
+
5
+ export const useIsRestoring = () => React.useContext(IsRestoringContext)
6
+ export const IsRestoringProvider = IsRestoringContext.Provider
@@ -0,0 +1,4 @@
1
+ // @ts-ignore
2
+ // eslint-disable-next-line import/no-unresolved
3
+ import { unstable_batchedUpdates } from 'react-native'
4
+ export { unstable_batchedUpdates }
@@ -0,0 +1,2 @@
1
+ import * as ReactDOM from 'react-dom'
2
+ export const unstable_batchedUpdates = ReactDOM.unstable_batchedUpdates
@@ -0,0 +1,4 @@
1
+ import { notifyManager } from '@tanstack/query-core'
2
+ import { unstable_batchedUpdates } from './reactBatchedUpdates'
3
+
4
+ notifyManager.setBatchNotifyFunction(unstable_batchedUpdates)
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
+ }