@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.
Files changed (108) hide show
  1. package/build/lib/QueryClientProvider.d.ts +24 -0
  2. package/build/lib/QueryClientProvider.esm.js +68 -0
  3. package/build/lib/QueryClientProvider.esm.js.map +1 -0
  4. package/build/lib/QueryClientProvider.js +74 -0
  5. package/build/lib/QueryClientProvider.js.map +1 -0
  6. package/build/lib/QueryClientProvider.mjs +68 -0
  7. package/build/lib/QueryClientProvider.mjs.map +1 -0
  8. package/build/lib/createBaseQuery.d.ts +4 -0
  9. package/build/lib/createBaseQuery.esm.js +77 -0
  10. package/build/lib/createBaseQuery.esm.js.map +1 -0
  11. package/build/lib/createBaseQuery.js +81 -0
  12. package/build/lib/createBaseQuery.js.map +1 -0
  13. package/build/lib/createBaseQuery.mjs +77 -0
  14. package/build/lib/createBaseQuery.mjs.map +1 -0
  15. package/build/lib/createInfiniteQuery.d.ts +5 -0
  16. package/build/lib/createInfiniteQuery.esm.js +20 -0
  17. package/build/lib/createInfiniteQuery.esm.js.map +1 -0
  18. package/build/lib/createInfiniteQuery.js +24 -0
  19. package/build/lib/createInfiniteQuery.js.map +1 -0
  20. package/build/lib/createInfiniteQuery.mjs +20 -0
  21. package/build/lib/createInfiniteQuery.mjs.map +1 -0
  22. package/build/lib/createMutation.d.ts +6 -0
  23. package/build/lib/createMutation.esm.js +45 -0
  24. package/build/lib/createMutation.esm.js.map +1 -0
  25. package/build/lib/createMutation.js +49 -0
  26. package/build/lib/createMutation.js.map +1 -0
  27. package/build/lib/createMutation.mjs +45 -0
  28. package/build/lib/createMutation.mjs.map +1 -0
  29. package/build/lib/createQueries.d.ts +49 -0
  30. package/build/lib/createQueries.esm.js +54 -0
  31. package/build/lib/createQueries.esm.js.map +1 -0
  32. package/build/lib/createQueries.js +58 -0
  33. package/build/lib/createQueries.js.map +1 -0
  34. package/build/lib/createQueries.mjs +54 -0
  35. package/build/lib/createQueries.mjs.map +1 -0
  36. package/build/lib/createQuery.d.ts +23 -0
  37. package/build/lib/createQuery.esm.js +25 -0
  38. package/build/lib/createQuery.esm.js.map +1 -0
  39. package/build/lib/createQuery.js +29 -0
  40. package/build/lib/createQuery.js.map +1 -0
  41. package/build/lib/createQuery.mjs +25 -0
  42. package/build/lib/createQuery.mjs.map +1 -0
  43. package/build/lib/index.d.ts +10 -0
  44. package/build/lib/index.esm.js +9 -0
  45. package/build/lib/index.esm.js.map +1 -0
  46. package/build/lib/index.js +31 -0
  47. package/build/lib/index.js.map +1 -0
  48. package/build/lib/index.mjs +9 -0
  49. package/build/lib/index.mjs.map +1 -0
  50. package/build/lib/types.d.ts +47 -0
  51. package/build/lib/useIsFetching.d.ts +7 -0
  52. package/build/lib/useIsFetching.esm.js +29 -0
  53. package/build/lib/useIsFetching.esm.js.map +1 -0
  54. package/build/lib/useIsFetching.js +33 -0
  55. package/build/lib/useIsFetching.js.map +1 -0
  56. package/build/lib/useIsFetching.mjs +29 -0
  57. package/build/lib/useIsFetching.mjs.map +1 -0
  58. package/build/lib/useIsMutating.d.ts +8 -0
  59. package/build/lib/useIsMutating.esm.js +22 -0
  60. package/build/lib/useIsMutating.esm.js.map +1 -0
  61. package/build/lib/useIsMutating.js +26 -0
  62. package/build/lib/useIsMutating.js.map +1 -0
  63. package/build/lib/useIsMutating.mjs +22 -0
  64. package/build/lib/useIsMutating.mjs.map +1 -0
  65. package/build/lib/utils.d.ts +14 -0
  66. package/build/lib/utils.esm.js +63 -0
  67. package/build/lib/utils.esm.js.map +1 -0
  68. package/build/lib/utils.js +72 -0
  69. package/build/lib/utils.js.map +1 -0
  70. package/build/lib/utils.mjs +63 -0
  71. package/build/lib/utils.mjs.map +1 -0
  72. package/build/solid/QueryClientProvider.jsx +42 -0
  73. package/build/solid/createBaseQuery.js +69 -0
  74. package/build/solid/createInfiniteQuery.js +16 -0
  75. package/build/solid/createMutation.js +40 -0
  76. package/build/solid/createQueries.js +39 -0
  77. package/build/solid/createQuery.js +16 -0
  78. package/build/solid/index.js +11 -0
  79. package/build/solid/types.js +1 -0
  80. package/build/solid/useIsFetching.js +23 -0
  81. package/build/solid/useIsMutating.js +16 -0
  82. package/build/solid/utils.js +45 -0
  83. package/build/umd/index.development.js +3467 -0
  84. package/build/umd/index.development.js.map +1 -0
  85. package/build/umd/index.production.js +2 -0
  86. package/build/umd/index.production.js.map +1 -0
  87. package/package.json +52 -0
  88. package/src/QueryClientProvider.tsx +100 -0
  89. package/src/__tests__/QueryClientProvider.test.tsx +267 -0
  90. package/src/__tests__/createInfiniteQuery.test.tsx +1889 -0
  91. package/src/__tests__/createMutation.test.tsx +1205 -0
  92. package/src/__tests__/createQueries.test.tsx +1163 -0
  93. package/src/__tests__/createQuery.test.tsx +6487 -0
  94. package/src/__tests__/createQuery.types.test.tsx +160 -0
  95. package/src/__tests__/suspense.test.tsx +1093 -0
  96. package/src/__tests__/useIsFetching.test.tsx +298 -0
  97. package/src/__tests__/useIsMutating.test.tsx +301 -0
  98. package/src/__tests__/utils.tsx +75 -0
  99. package/src/createBaseQuery.ts +121 -0
  100. package/src/createInfiniteQuery.ts +116 -0
  101. package/src/createMutation.ts +131 -0
  102. package/src/createQueries.ts +203 -0
  103. package/src/createQuery.ts +157 -0
  104. package/src/index.ts +17 -0
  105. package/src/types.ts +167 -0
  106. package/src/useIsFetching.ts +58 -0
  107. package/src/useIsMutating.ts +42 -0
  108. 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
+ }