@tanstack/solid-query 4.4.0
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/QueryClientProvider.d.ts +24 -0
- package/build/lib/QueryClientProvider.esm.js +68 -0
- package/build/lib/QueryClientProvider.esm.js.map +1 -0
- package/build/lib/QueryClientProvider.js +74 -0
- package/build/lib/QueryClientProvider.js.map +1 -0
- package/build/lib/QueryClientProvider.mjs +68 -0
- package/build/lib/QueryClientProvider.mjs.map +1 -0
- package/build/lib/createBaseQuery.d.ts +4 -0
- package/build/lib/createBaseQuery.esm.js +77 -0
- package/build/lib/createBaseQuery.esm.js.map +1 -0
- package/build/lib/createBaseQuery.js +81 -0
- package/build/lib/createBaseQuery.js.map +1 -0
- package/build/lib/createBaseQuery.mjs +77 -0
- package/build/lib/createBaseQuery.mjs.map +1 -0
- package/build/lib/createInfiniteQuery.d.ts +5 -0
- package/build/lib/createInfiniteQuery.esm.js +20 -0
- package/build/lib/createInfiniteQuery.esm.js.map +1 -0
- package/build/lib/createInfiniteQuery.js +24 -0
- package/build/lib/createInfiniteQuery.js.map +1 -0
- package/build/lib/createInfiniteQuery.mjs +20 -0
- package/build/lib/createInfiniteQuery.mjs.map +1 -0
- package/build/lib/createMutation.d.ts +6 -0
- package/build/lib/createMutation.esm.js +45 -0
- package/build/lib/createMutation.esm.js.map +1 -0
- package/build/lib/createMutation.js +49 -0
- package/build/lib/createMutation.js.map +1 -0
- package/build/lib/createMutation.mjs +45 -0
- package/build/lib/createMutation.mjs.map +1 -0
- package/build/lib/createQueries.d.ts +49 -0
- package/build/lib/createQueries.esm.js +54 -0
- package/build/lib/createQueries.esm.js.map +1 -0
- package/build/lib/createQueries.js +58 -0
- package/build/lib/createQueries.js.map +1 -0
- package/build/lib/createQueries.mjs +54 -0
- package/build/lib/createQueries.mjs.map +1 -0
- package/build/lib/createQuery.d.ts +23 -0
- package/build/lib/createQuery.esm.js +25 -0
- package/build/lib/createQuery.esm.js.map +1 -0
- package/build/lib/createQuery.js +29 -0
- package/build/lib/createQuery.js.map +1 -0
- package/build/lib/createQuery.mjs +25 -0
- package/build/lib/createQuery.mjs.map +1 -0
- package/build/lib/index.d.ts +10 -0
- package/build/lib/index.esm.js +9 -0
- package/build/lib/index.esm.js.map +1 -0
- package/build/lib/index.js +31 -0
- package/build/lib/index.js.map +1 -0
- package/build/lib/index.mjs +9 -0
- package/build/lib/index.mjs.map +1 -0
- package/build/lib/types.d.ts +47 -0
- package/build/lib/useIsFetching.d.ts +7 -0
- package/build/lib/useIsFetching.esm.js +29 -0
- package/build/lib/useIsFetching.esm.js.map +1 -0
- package/build/lib/useIsFetching.js +33 -0
- package/build/lib/useIsFetching.js.map +1 -0
- package/build/lib/useIsFetching.mjs +29 -0
- package/build/lib/useIsFetching.mjs.map +1 -0
- package/build/lib/useIsMutating.d.ts +8 -0
- package/build/lib/useIsMutating.esm.js +22 -0
- package/build/lib/useIsMutating.esm.js.map +1 -0
- package/build/lib/useIsMutating.js +26 -0
- package/build/lib/useIsMutating.js.map +1 -0
- package/build/lib/useIsMutating.mjs +22 -0
- package/build/lib/useIsMutating.mjs.map +1 -0
- package/build/lib/utils.d.ts +14 -0
- package/build/lib/utils.esm.js +63 -0
- package/build/lib/utils.esm.js.map +1 -0
- package/build/lib/utils.js +72 -0
- package/build/lib/utils.js.map +1 -0
- package/build/lib/utils.mjs +63 -0
- package/build/lib/utils.mjs.map +1 -0
- package/build/solid/QueryClientProvider.jsx +42 -0
- package/build/solid/createBaseQuery.js +69 -0
- package/build/solid/createInfiniteQuery.js +16 -0
- package/build/solid/createMutation.js +40 -0
- package/build/solid/createQueries.js +39 -0
- package/build/solid/createQuery.js +16 -0
- package/build/solid/index.js +11 -0
- package/build/solid/types.js +1 -0
- package/build/solid/useIsFetching.js +23 -0
- package/build/solid/useIsMutating.js +16 -0
- package/build/solid/utils.js +45 -0
- package/build/umd/index.development.js +3467 -0
- package/build/umd/index.development.js.map +1 -0
- package/build/umd/index.production.js +2 -0
- package/build/umd/index.production.js.map +1 -0
- package/package.json +52 -0
- package/src/QueryClientProvider.tsx +100 -0
- package/src/__tests__/QueryClientProvider.test.tsx +267 -0
- package/src/__tests__/createInfiniteQuery.test.tsx +1889 -0
- package/src/__tests__/createMutation.test.tsx +1205 -0
- package/src/__tests__/createQueries.test.tsx +1163 -0
- package/src/__tests__/createQuery.test.tsx +6487 -0
- package/src/__tests__/createQuery.types.test.tsx +160 -0
- package/src/__tests__/suspense.test.tsx +1093 -0
- package/src/__tests__/useIsFetching.test.tsx +298 -0
- package/src/__tests__/useIsMutating.test.tsx +301 -0
- package/src/__tests__/utils.tsx +75 -0
- package/src/createBaseQuery.ts +121 -0
- package/src/createInfiniteQuery.ts +116 -0
- package/src/createMutation.ts +131 -0
- package/src/createQueries.ts +203 -0
- package/src/createQuery.ts +157 -0
- package/src/index.ts +17 -0
- package/src/types.ts +167 -0
- package/src/useIsFetching.ts +58 -0
- package/src/useIsMutating.ts +42 -0
- package/src/utils.ts +85 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { QueryFunction, QueryOptions } from '@tanstack/query-core'
|
|
2
|
+
import { QueryObserver } from '@tanstack/query-core'
|
|
3
|
+
import type {
|
|
4
|
+
CreateQueryOptions,
|
|
5
|
+
CreateQueryResult,
|
|
6
|
+
DefinedCreateQueryResult,
|
|
7
|
+
SolidQueryKey,
|
|
8
|
+
} from './types'
|
|
9
|
+
import { createComputed } from 'solid-js'
|
|
10
|
+
import { createStore } from 'solid-js/store'
|
|
11
|
+
import { parseQueryArgs } from './utils'
|
|
12
|
+
import { createBaseQuery } from './createBaseQuery'
|
|
13
|
+
|
|
14
|
+
// There are several ways to create a query.
|
|
15
|
+
// 1. createQuery(options: CreateQueryOptions)
|
|
16
|
+
// 2. createQuery(querykey: () => Serializable[], options: CreateQueryOptions)
|
|
17
|
+
// 3. createQuery(querykey: () => Serializable[], queryFunc: Fetcher Function, options: CreateQueryOptions)
|
|
18
|
+
// 4. The fourth overload is a combination of all three function params
|
|
19
|
+
export function createQuery<
|
|
20
|
+
TQueryFnData = unknown,
|
|
21
|
+
TError = unknown,
|
|
22
|
+
TData = TQueryFnData,
|
|
23
|
+
TQueryKey extends SolidQueryKey = SolidQueryKey,
|
|
24
|
+
>(
|
|
25
|
+
options: Omit<
|
|
26
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
27
|
+
'initialData'
|
|
28
|
+
> & {
|
|
29
|
+
initialData?: () => undefined
|
|
30
|
+
},
|
|
31
|
+
): CreateQueryResult<TData, TError>
|
|
32
|
+
export function createQuery<
|
|
33
|
+
TQueryFnData = unknown,
|
|
34
|
+
TError = unknown,
|
|
35
|
+
TData = TQueryFnData,
|
|
36
|
+
TQueryKey extends SolidQueryKey = SolidQueryKey,
|
|
37
|
+
>(
|
|
38
|
+
options: Omit<
|
|
39
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
40
|
+
'initialData'
|
|
41
|
+
> & {
|
|
42
|
+
initialData: TQueryFnData | (() => TQueryFnData)
|
|
43
|
+
},
|
|
44
|
+
): DefinedCreateQueryResult<TData, TError>
|
|
45
|
+
export function createQuery<
|
|
46
|
+
TQueryFnData = unknown,
|
|
47
|
+
TError = unknown,
|
|
48
|
+
TData = TQueryFnData,
|
|
49
|
+
TQueryKey extends SolidQueryKey = SolidQueryKey,
|
|
50
|
+
>(
|
|
51
|
+
options: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
52
|
+
): CreateQueryResult<TData, TError>
|
|
53
|
+
export function createQuery<
|
|
54
|
+
TQueryFnData = unknown,
|
|
55
|
+
TError = unknown,
|
|
56
|
+
TData = TQueryFnData,
|
|
57
|
+
TQueryKey extends SolidQueryKey = SolidQueryKey,
|
|
58
|
+
>(
|
|
59
|
+
queryKey: TQueryKey,
|
|
60
|
+
options?: Omit<
|
|
61
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
62
|
+
'queryKey' | 'initialData'
|
|
63
|
+
> & { initialData?: () => undefined },
|
|
64
|
+
): CreateQueryResult<TData, TError>
|
|
65
|
+
export function createQuery<
|
|
66
|
+
TQueryFnData = unknown,
|
|
67
|
+
TError = unknown,
|
|
68
|
+
TData = TQueryFnData,
|
|
69
|
+
TQueryKey extends SolidQueryKey = SolidQueryKey,
|
|
70
|
+
>(
|
|
71
|
+
queryKey: TQueryKey,
|
|
72
|
+
options?: Omit<
|
|
73
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
74
|
+
'queryKey' | 'initialData'
|
|
75
|
+
> & { initialData: TQueryFnData | (() => TQueryFnData) },
|
|
76
|
+
): DefinedCreateQueryResult<TData, TError>
|
|
77
|
+
export function createQuery<
|
|
78
|
+
TQueryFnData = unknown,
|
|
79
|
+
TError = unknown,
|
|
80
|
+
TData = TQueryFnData,
|
|
81
|
+
TQueryKey extends SolidQueryKey = SolidQueryKey,
|
|
82
|
+
>(
|
|
83
|
+
queryKey: TQueryKey,
|
|
84
|
+
options?: Omit<
|
|
85
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
86
|
+
'queryKey'
|
|
87
|
+
>,
|
|
88
|
+
): CreateQueryResult<TData, TError>
|
|
89
|
+
export function createQuery<
|
|
90
|
+
TQueryFnData = unknown,
|
|
91
|
+
TError = unknown,
|
|
92
|
+
TData = TQueryFnData,
|
|
93
|
+
TQueryKey extends SolidQueryKey = SolidQueryKey,
|
|
94
|
+
>(
|
|
95
|
+
queryKey: TQueryKey,
|
|
96
|
+
// TODO(lukemurray): not sure if we want to use return type here
|
|
97
|
+
queryFn: QueryFunction<TQueryFnData, ReturnType<TQueryKey>>,
|
|
98
|
+
options?: Omit<
|
|
99
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
100
|
+
'queryKey' | 'queryFn' | 'initialData'
|
|
101
|
+
> & { initialData?: () => undefined },
|
|
102
|
+
): CreateQueryResult<TData, TError>
|
|
103
|
+
export function createQuery<
|
|
104
|
+
TQueryFnData = unknown,
|
|
105
|
+
TError = unknown,
|
|
106
|
+
TData = TQueryFnData,
|
|
107
|
+
TQueryKey extends SolidQueryKey = SolidQueryKey,
|
|
108
|
+
>(
|
|
109
|
+
queryKey: TQueryKey,
|
|
110
|
+
queryFn: QueryFunction<TQueryFnData, ReturnType<TQueryKey>>,
|
|
111
|
+
options?: Omit<
|
|
112
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
113
|
+
'queryKey' | 'queryFn' | 'initialData'
|
|
114
|
+
> & { initialData: TQueryFnData | (() => TQueryFnData) },
|
|
115
|
+
): DefinedCreateQueryResult<TData, TError>
|
|
116
|
+
export function createQuery<
|
|
117
|
+
TQueryFnData = unknown,
|
|
118
|
+
TError = unknown,
|
|
119
|
+
TData = TQueryFnData,
|
|
120
|
+
TQueryKey extends SolidQueryKey = SolidQueryKey,
|
|
121
|
+
>(
|
|
122
|
+
queryKey: TQueryKey,
|
|
123
|
+
queryFn: QueryFunction<TQueryFnData, ReturnType<TQueryKey>>,
|
|
124
|
+
options?: Omit<
|
|
125
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
126
|
+
'queryKey' | 'queryFn'
|
|
127
|
+
>,
|
|
128
|
+
): CreateQueryResult<TData, TError>
|
|
129
|
+
export function createQuery<
|
|
130
|
+
TQueryFnData,
|
|
131
|
+
TError,
|
|
132
|
+
TData = TQueryFnData,
|
|
133
|
+
TQueryKey extends SolidQueryKey = SolidQueryKey,
|
|
134
|
+
>(
|
|
135
|
+
arg1: TQueryKey | CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
136
|
+
arg2?:
|
|
137
|
+
| QueryFunction<TQueryFnData, ReturnType<TQueryKey>>
|
|
138
|
+
| CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
139
|
+
arg3?: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
140
|
+
): CreateQueryResult<TData, TError> {
|
|
141
|
+
// The parseQuery Args functions helps normalize the arguments into the correct form.
|
|
142
|
+
// Whatever the parameters are, they are normalized into the correct form.
|
|
143
|
+
const [parsedOptions, setParsedOptions] = createStore(
|
|
144
|
+
parseQueryArgs(arg1, arg2, arg3),
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
// Watch for changes in the options and update the parsed options.
|
|
148
|
+
createComputed(() => {
|
|
149
|
+
const newParsedOptions = parseQueryArgs(arg1, arg2, arg3)
|
|
150
|
+
setParsedOptions(newParsedOptions)
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
return createBaseQuery(
|
|
154
|
+
parsedOptions as QueryOptions<any, any, any, ReturnType<TQueryKey>>,
|
|
155
|
+
QueryObserver,
|
|
156
|
+
)
|
|
157
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Re-export core
|
|
2
|
+
export * from '@tanstack/query-core'
|
|
3
|
+
|
|
4
|
+
// Solid Query
|
|
5
|
+
export * from './types'
|
|
6
|
+
export { createQuery } from './createQuery'
|
|
7
|
+
export {
|
|
8
|
+
defaultContext,
|
|
9
|
+
QueryClientProvider,
|
|
10
|
+
useQueryClient,
|
|
11
|
+
} from './QueryClientProvider'
|
|
12
|
+
export type { QueryClientProviderProps } from './QueryClientProvider'
|
|
13
|
+
export { useIsFetching } from './useIsFetching'
|
|
14
|
+
export { useIsMutating } from './useIsMutating'
|
|
15
|
+
export { createMutation } from './createMutation'
|
|
16
|
+
export { createInfiniteQuery } from './createInfiniteQuery'
|
|
17
|
+
export { createQueries } from './createQueries'
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type { Context } from 'solid-js'
|
|
2
|
+
import type {
|
|
3
|
+
QueryClient,
|
|
4
|
+
QueryKey,
|
|
5
|
+
QueryObserverOptions,
|
|
6
|
+
QueryObserverResult,
|
|
7
|
+
MutateFunction,
|
|
8
|
+
MutationObserverOptions,
|
|
9
|
+
MutationObserverResult,
|
|
10
|
+
DefinedQueryObserverResult,
|
|
11
|
+
InfiniteQueryObserverOptions,
|
|
12
|
+
InfiniteQueryObserverResult,
|
|
13
|
+
QueryFilters,
|
|
14
|
+
QueryOptions,
|
|
15
|
+
} from '@tanstack/query-core'
|
|
16
|
+
|
|
17
|
+
export interface ContextOptions {
|
|
18
|
+
/**
|
|
19
|
+
* Use this to pass your Solid Query context. Otherwise, `defaultContext` will be used.
|
|
20
|
+
*/
|
|
21
|
+
context?: Context<QueryClient | undefined>
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* --- Create Query and Create Base Query Types --- */
|
|
25
|
+
export type SolidQueryKey = () => readonly unknown[]
|
|
26
|
+
|
|
27
|
+
export interface CreateBaseQueryOptions<
|
|
28
|
+
TQueryFnData = unknown,
|
|
29
|
+
TError = unknown,
|
|
30
|
+
TData = TQueryFnData,
|
|
31
|
+
TQueryData = TQueryFnData,
|
|
32
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
33
|
+
> extends ContextOptions,
|
|
34
|
+
QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey> {}
|
|
35
|
+
|
|
36
|
+
export interface CreateQueryOptions<
|
|
37
|
+
TQueryFnData = unknown,
|
|
38
|
+
TError = unknown,
|
|
39
|
+
TData = TQueryFnData,
|
|
40
|
+
TQueryKey extends () => readonly unknown[] = SolidQueryKey,
|
|
41
|
+
> extends Omit<
|
|
42
|
+
CreateBaseQueryOptions<
|
|
43
|
+
TQueryFnData,
|
|
44
|
+
TError,
|
|
45
|
+
TData,
|
|
46
|
+
TQueryFnData,
|
|
47
|
+
ReturnType<TQueryKey>
|
|
48
|
+
>,
|
|
49
|
+
'queryKey'
|
|
50
|
+
> {
|
|
51
|
+
queryKey?: TQueryKey
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export type CreateBaseQueryResult<
|
|
55
|
+
TData = unknown,
|
|
56
|
+
TError = unknown,
|
|
57
|
+
> = QueryObserverResult<TData, TError>
|
|
58
|
+
|
|
59
|
+
export type CreateQueryResult<
|
|
60
|
+
TData = unknown,
|
|
61
|
+
TError = unknown,
|
|
62
|
+
> = CreateBaseQueryResult<TData, TError>
|
|
63
|
+
|
|
64
|
+
export type DefinedCreateBaseQueryResult<
|
|
65
|
+
TData = unknown,
|
|
66
|
+
TError = unknown,
|
|
67
|
+
> = DefinedQueryObserverResult<TData, TError>
|
|
68
|
+
|
|
69
|
+
export type DefinedCreateQueryResult<
|
|
70
|
+
TData = unknown,
|
|
71
|
+
TError = unknown,
|
|
72
|
+
> = DefinedCreateBaseQueryResult<TData, TError>
|
|
73
|
+
|
|
74
|
+
export type ParseQueryArgs<
|
|
75
|
+
TOptions extends Omit<
|
|
76
|
+
QueryOptions<any, any, any, ReturnType<TQueryKey>>,
|
|
77
|
+
'queryKey'
|
|
78
|
+
> & {
|
|
79
|
+
queryKey?: TQueryKey
|
|
80
|
+
},
|
|
81
|
+
TQueryKey extends () => readonly unknown[] = SolidQueryKey,
|
|
82
|
+
> = TOptions['queryKey'] extends () => infer R
|
|
83
|
+
? Omit<TOptions, 'queryKey'> & { queryKey?: R }
|
|
84
|
+
: TOptions
|
|
85
|
+
|
|
86
|
+
/* --- Create Infinite Queries Types --- */
|
|
87
|
+
export interface CreateInfiniteQueryOptions<
|
|
88
|
+
TQueryFnData = unknown,
|
|
89
|
+
TError = unknown,
|
|
90
|
+
TData = TQueryFnData,
|
|
91
|
+
TQueryData = TQueryFnData,
|
|
92
|
+
TQueryKey extends () => readonly unknown[] = SolidQueryKey,
|
|
93
|
+
> extends ContextOptions,
|
|
94
|
+
Omit<
|
|
95
|
+
InfiniteQueryObserverOptions<
|
|
96
|
+
TQueryFnData,
|
|
97
|
+
TError,
|
|
98
|
+
TData,
|
|
99
|
+
TQueryData,
|
|
100
|
+
ReturnType<TQueryKey>
|
|
101
|
+
>,
|
|
102
|
+
'queryKey'
|
|
103
|
+
> {
|
|
104
|
+
queryKey?: TQueryKey
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export type CreateInfiniteQueryResult<
|
|
108
|
+
TData = unknown,
|
|
109
|
+
TError = unknown,
|
|
110
|
+
> = InfiniteQueryObserverResult<TData, TError>
|
|
111
|
+
|
|
112
|
+
/* --- Create Mutation Types --- */
|
|
113
|
+
export interface CreateMutationOptions<
|
|
114
|
+
TData = unknown,
|
|
115
|
+
TError = unknown,
|
|
116
|
+
TVariables = void,
|
|
117
|
+
TContext = unknown,
|
|
118
|
+
> extends ContextOptions,
|
|
119
|
+
Omit<
|
|
120
|
+
MutationObserverOptions<TData, TError, TVariables, TContext>,
|
|
121
|
+
'_defaulted' | 'variables'
|
|
122
|
+
> {}
|
|
123
|
+
|
|
124
|
+
export type CreateMutateFunction<
|
|
125
|
+
TData = unknown,
|
|
126
|
+
TError = unknown,
|
|
127
|
+
TVariables = void,
|
|
128
|
+
TContext = unknown,
|
|
129
|
+
> = (
|
|
130
|
+
...args: Parameters<MutateFunction<TData, TError, TVariables, TContext>>
|
|
131
|
+
) => void
|
|
132
|
+
|
|
133
|
+
export type CreateMutateAsyncFunction<
|
|
134
|
+
TData = unknown,
|
|
135
|
+
TError = unknown,
|
|
136
|
+
TVariables = void,
|
|
137
|
+
TContext = unknown,
|
|
138
|
+
> = MutateFunction<TData, TError, TVariables, TContext>
|
|
139
|
+
|
|
140
|
+
export type CreateBaseMutationResult<
|
|
141
|
+
TData = unknown,
|
|
142
|
+
TError = unknown,
|
|
143
|
+
TVariables = unknown,
|
|
144
|
+
TContext = unknown,
|
|
145
|
+
> = Override<
|
|
146
|
+
MutationObserverResult<TData, TError, TVariables, TContext>,
|
|
147
|
+
{ mutate: CreateMutateFunction<TData, TError, TVariables, TContext> }
|
|
148
|
+
> & {
|
|
149
|
+
mutateAsync: CreateMutateAsyncFunction<TData, TError, TVariables, TContext>
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export type CreateMutationResult<
|
|
153
|
+
TData = unknown,
|
|
154
|
+
TError = unknown,
|
|
155
|
+
TVariables = unknown,
|
|
156
|
+
TContext = unknown,
|
|
157
|
+
> = CreateBaseMutationResult<TData, TError, TVariables, TContext>
|
|
158
|
+
|
|
159
|
+
type Override<A, B> = { [K in keyof A]: K extends keyof B ? B[K] : A[K] }
|
|
160
|
+
|
|
161
|
+
/* --- Use Is Fetching Types --- */
|
|
162
|
+
export interface SolidQueryFilters extends Omit<QueryFilters, 'queryKey'> {
|
|
163
|
+
queryKey?: SolidQueryKey
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export type ParseFilterArgs<T extends SolidQueryFilters> =
|
|
167
|
+
T['queryKey'] extends () => infer R ? T & { queryKey: R } : T
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { QueryFilters } from '@tanstack/query-core'
|
|
2
|
+
|
|
3
|
+
import type { ContextOptions, SolidQueryKey, SolidQueryFilters } from './types'
|
|
4
|
+
import { useQueryClient } from './QueryClientProvider'
|
|
5
|
+
import type { Accessor } from 'solid-js'
|
|
6
|
+
import { createSignal, onCleanup, createComputed, createMemo } from 'solid-js'
|
|
7
|
+
import { parseFilterArgs } from './utils'
|
|
8
|
+
|
|
9
|
+
interface Options extends ContextOptions {}
|
|
10
|
+
|
|
11
|
+
export function useIsFetching(
|
|
12
|
+
filters?: SolidQueryFilters,
|
|
13
|
+
options?: Options,
|
|
14
|
+
): Accessor<number>
|
|
15
|
+
export function useIsFetching(
|
|
16
|
+
queryKey?: SolidQueryKey,
|
|
17
|
+
filters?: SolidQueryFilters,
|
|
18
|
+
options?: Options,
|
|
19
|
+
): Accessor<number>
|
|
20
|
+
export function useIsFetching(
|
|
21
|
+
arg1?: SolidQueryKey | SolidQueryFilters,
|
|
22
|
+
arg2?: SolidQueryFilters | Options,
|
|
23
|
+
arg3?: Options,
|
|
24
|
+
): Accessor<number> {
|
|
25
|
+
const [filtersObj, optionsObj = {}] = parseFilterArgs(arg1, arg2, arg3)
|
|
26
|
+
|
|
27
|
+
const [filters, setFilters] = createSignal(filtersObj)
|
|
28
|
+
const [options, setOptions] = createSignal(optionsObj)
|
|
29
|
+
|
|
30
|
+
const queryClient = createMemo(() =>
|
|
31
|
+
useQueryClient({ context: options().context }),
|
|
32
|
+
)
|
|
33
|
+
const queryCache = createMemo(() => queryClient().getQueryCache())
|
|
34
|
+
|
|
35
|
+
const [fetches, setFetches] = createSignal(
|
|
36
|
+
queryClient().isFetching(filters as QueryFilters),
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
createComputed(() => {
|
|
40
|
+
const [newFiltersObj, newOptionsObj = {}] = parseFilterArgs(
|
|
41
|
+
arg1,
|
|
42
|
+
arg2,
|
|
43
|
+
arg3,
|
|
44
|
+
)
|
|
45
|
+
setFilters(newFiltersObj)
|
|
46
|
+
setOptions(newOptionsObj)
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
const unsubscribe = queryCache().subscribe(() => {
|
|
50
|
+
setFetches(queryClient().isFetching(filters() as QueryFilters))
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
onCleanup(() => {
|
|
54
|
+
unsubscribe()
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
return fetches
|
|
58
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { MutationKey, MutationFilters } from '@tanstack/query-core'
|
|
2
|
+
import { parseMutationFilterArgs } from '@tanstack/query-core'
|
|
3
|
+
import type { ContextOptions } from './types'
|
|
4
|
+
import { useQueryClient } from './QueryClientProvider'
|
|
5
|
+
import type { Accessor } from 'solid-js'
|
|
6
|
+
import { createSignal, onCleanup } from 'solid-js'
|
|
7
|
+
|
|
8
|
+
interface Options extends ContextOptions {}
|
|
9
|
+
|
|
10
|
+
export function useIsMutating(
|
|
11
|
+
filters?: MutationFilters,
|
|
12
|
+
options?: Options,
|
|
13
|
+
): Accessor<number>
|
|
14
|
+
export function useIsMutating(
|
|
15
|
+
mutationKey?: MutationKey,
|
|
16
|
+
filters?: Omit<MutationFilters, 'mutationKey'>,
|
|
17
|
+
options?: Options,
|
|
18
|
+
): Accessor<number>
|
|
19
|
+
export function useIsMutating(
|
|
20
|
+
arg1?: MutationKey | MutationFilters,
|
|
21
|
+
arg2?: Omit<MutationFilters, 'mutationKey'> | Options,
|
|
22
|
+
arg3?: Options,
|
|
23
|
+
): Accessor<number> {
|
|
24
|
+
const [filters, options = {}] = parseMutationFilterArgs(arg1, arg2, arg3)
|
|
25
|
+
|
|
26
|
+
const queryClient = useQueryClient({ context: options.context })
|
|
27
|
+
const mutationCache = queryClient.getMutationCache()
|
|
28
|
+
|
|
29
|
+
const [mutations, setMutations] = createSignal(
|
|
30
|
+
queryClient.isMutating(filters),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
const unsubscribe = mutationCache.subscribe((_result) => {
|
|
34
|
+
setMutations(queryClient.isMutating(filters))
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
onCleanup(() => {
|
|
38
|
+
unsubscribe()
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
return mutations
|
|
42
|
+
}
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
SolidQueryKey,
|
|
3
|
+
SolidQueryFilters,
|
|
4
|
+
ParseFilterArgs,
|
|
5
|
+
ParseQueryArgs,
|
|
6
|
+
} from './types'
|
|
7
|
+
import type { QueryFunction, QueryOptions } from '@tanstack/query-core'
|
|
8
|
+
|
|
9
|
+
export function isQueryKey(value: unknown): value is SolidQueryKey {
|
|
10
|
+
return typeof value === 'function'
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// The parseQuery Args functions helps normalize the arguments into the correct form.
|
|
14
|
+
// Whatever the parameters are, they are normalized into the correct form.
|
|
15
|
+
export function parseQueryArgs<
|
|
16
|
+
TOptions extends Omit<
|
|
17
|
+
QueryOptions<any, any, any, ReturnType<TQueryKey>>,
|
|
18
|
+
'queryKey'
|
|
19
|
+
> & {
|
|
20
|
+
queryKey?: TQueryKey
|
|
21
|
+
},
|
|
22
|
+
TQueryKey extends () => readonly unknown[] = SolidQueryKey,
|
|
23
|
+
>(
|
|
24
|
+
arg1: TQueryKey | TOptions,
|
|
25
|
+
arg2?: QueryFunction<any, ReturnType<TQueryKey>> | TOptions,
|
|
26
|
+
arg3?: TOptions,
|
|
27
|
+
): ParseQueryArgs<TOptions, TQueryKey> {
|
|
28
|
+
if (!isQueryKey(arg1)) {
|
|
29
|
+
const { queryKey: solidKey, ...opts } = arg1 as any
|
|
30
|
+
if (solidKey) {
|
|
31
|
+
return {
|
|
32
|
+
...opts,
|
|
33
|
+
queryKey: solidKey(),
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return arg1 as any
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (typeof arg2 === 'function') {
|
|
40
|
+
return { ...arg3, queryKey: arg1(), queryFn: arg2 } as any
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return { ...arg2, queryKey: arg1() } as any
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function parseFilterArgs<
|
|
47
|
+
TFilters extends SolidQueryFilters,
|
|
48
|
+
TOptions = unknown,
|
|
49
|
+
>(
|
|
50
|
+
arg1?: SolidQueryKey | TFilters,
|
|
51
|
+
arg2?: TFilters | TOptions,
|
|
52
|
+
arg3?: TOptions,
|
|
53
|
+
): [ParseFilterArgs<TFilters>, TOptions | undefined] {
|
|
54
|
+
return (
|
|
55
|
+
isQueryKey(arg1)
|
|
56
|
+
? [{ ...arg2, queryKey: arg1() }, arg3]
|
|
57
|
+
: [{ ...arg1, queryKey: arg1?.queryKey?.() }, arg2]
|
|
58
|
+
) as [ParseFilterArgs<TFilters>, TOptions]
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function shouldThrowError<T extends (...args: any[]) => boolean>(
|
|
62
|
+
_useErrorBoundary: boolean | T | undefined,
|
|
63
|
+
params: Parameters<T>,
|
|
64
|
+
): boolean {
|
|
65
|
+
// Allow useErrorBoundary function to override throwing behavior on a per-error basis
|
|
66
|
+
if (typeof _useErrorBoundary === 'function') {
|
|
67
|
+
return _useErrorBoundary(...params)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return !!_useErrorBoundary
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function sleep(timeout: number): Promise<void> {
|
|
74
|
+
return new Promise((resolve) => {
|
|
75
|
+
setTimeout(resolve, timeout)
|
|
76
|
+
})
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Schedules a microtask.
|
|
81
|
+
* This can be useful to schedule state updates after rendering.
|
|
82
|
+
*/
|
|
83
|
+
export function scheduleMicrotask(callback: () => void) {
|
|
84
|
+
sleep(0).then(callback)
|
|
85
|
+
}
|