@tanstack/solid-query 5.101.3 → 5.102.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/README.md +15 -1
- package/build/dev.cjs +418 -506
- package/build/dev.js +400 -499
- package/build/index.cjs +1 -540
- package/build/index.d.cts +132 -150
- package/build/index.d.cts.map +1 -0
- package/build/index.d.ts +132 -150
- package/build/index.d.ts.map +1 -0
- package/build/index.js +2 -521
- package/build/index.js.map +1 -0
- package/package.json +6 -8
- package/src/QueryClientProvider.tsx +24 -2
- package/src/infiniteQueryOptions.ts +5 -7
- package/src/queryOptions.ts +9 -7
- package/src/useBaseQuery.ts +3 -5
- package/src/useIsFetching.ts +11 -6
- package/src/useIsMutating.ts +11 -6
- package/src/useMutation.ts +5 -4
- package/src/useMutationState.ts +35 -9
- package/src/useQueries.ts +3 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/solid-query",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.102.0",
|
|
4
4
|
"description": "Primitives for managing, caching and syncing asynchronous and remote data in Solid",
|
|
5
5
|
"author": "tannerlinsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -46,13 +46,13 @@
|
|
|
46
46
|
"!src/__tests__"
|
|
47
47
|
],
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@tanstack/query-core": "5.
|
|
49
|
+
"@tanstack/query-core": "5.102.0"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@solidjs/testing-library": "^0.8.10",
|
|
53
53
|
"npm-run-all2": "^5.0.0",
|
|
54
54
|
"solid-js": "^1.9.7",
|
|
55
|
-
"
|
|
55
|
+
"unplugin-solid": "^2.0.0",
|
|
56
56
|
"vite-plugin-solid": "^2.11.6",
|
|
57
57
|
"@tanstack/query-test-utils": "0.0.0"
|
|
58
58
|
},
|
|
@@ -64,18 +64,16 @@
|
|
|
64
64
|
"compile": "tsc --build",
|
|
65
65
|
"test:eslint": "eslint --concurrency=auto ./src",
|
|
66
66
|
"test:types": "npm-run-all --serial test:types:*",
|
|
67
|
-
"test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js --build tsconfig.legacy.json",
|
|
68
|
-
"test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js --build tsconfig.legacy.json",
|
|
69
67
|
"test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js --build tsconfig.legacy.json",
|
|
70
68
|
"test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js --build tsconfig.legacy.json",
|
|
71
69
|
"test:types:ts58": "node ../../node_modules/typescript58/lib/tsc.js --build tsconfig.legacy.json",
|
|
72
70
|
"test:types:ts59": "node ../../node_modules/typescript59/lib/tsc.js --build tsconfig.legacy.json",
|
|
73
71
|
"test:types:tscurrent": "tsc --build",
|
|
74
|
-
"test:types:
|
|
72
|
+
"test:types:ts70": "node ../../node_modules/typescript70/lib/tsc.js --build tsconfig.legacy.json",
|
|
75
73
|
"test:lib": "vitest --retry=3",
|
|
76
74
|
"test:lib:dev": "pnpm run test:lib --watch",
|
|
77
75
|
"test:build": "publint --strict && attw --pack",
|
|
78
|
-
"build": "
|
|
79
|
-
"build:watch": "
|
|
76
|
+
"build": "tsdown --tsconfig tsconfig.prod.json",
|
|
77
|
+
"build:watch": "tsdown --watch"
|
|
80
78
|
}
|
|
81
79
|
}
|
|
@@ -5,12 +5,15 @@ import {
|
|
|
5
5
|
useContext,
|
|
6
6
|
} from 'solid-js'
|
|
7
7
|
import type { QueryClient } from './QueryClient'
|
|
8
|
-
import type { JSX } from 'solid-js'
|
|
8
|
+
import type { Accessor, JSX } from 'solid-js'
|
|
9
9
|
|
|
10
10
|
export const QueryClientContext = createContext<
|
|
11
11
|
(() => QueryClient) | undefined
|
|
12
12
|
>(undefined)
|
|
13
13
|
|
|
14
|
+
const queryClientContextError =
|
|
15
|
+
'No QueryClient set, use QueryClientProvider to set one'
|
|
16
|
+
|
|
14
17
|
export const useQueryClient = (queryClient?: QueryClient) => {
|
|
15
18
|
if (queryClient) {
|
|
16
19
|
return queryClient
|
|
@@ -18,12 +21,31 @@ export const useQueryClient = (queryClient?: QueryClient) => {
|
|
|
18
21
|
const client = useContext(QueryClientContext)
|
|
19
22
|
|
|
20
23
|
if (!client) {
|
|
21
|
-
throw new Error(
|
|
24
|
+
throw new Error(queryClientContextError)
|
|
22
25
|
}
|
|
23
26
|
|
|
24
27
|
return client()
|
|
25
28
|
}
|
|
26
29
|
|
|
30
|
+
export const useQueryClientResolver = (
|
|
31
|
+
queryClient?: Accessor<QueryClient | undefined>,
|
|
32
|
+
): Accessor<QueryClient> => {
|
|
33
|
+
const contextClient = useContext(QueryClientContext)
|
|
34
|
+
|
|
35
|
+
return () => {
|
|
36
|
+
const resolvedClient = queryClient?.()
|
|
37
|
+
if (resolvedClient) {
|
|
38
|
+
return resolvedClient
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (!contextClient) {
|
|
42
|
+
throw new Error(queryClientContextError)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return contextClient()
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
27
49
|
export type QueryClientProviderProps = {
|
|
28
50
|
client: QueryClient
|
|
29
51
|
children?: JSX.Element
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
DataTag,
|
|
3
2
|
DefaultError,
|
|
4
3
|
InfiniteData,
|
|
5
4
|
NonUndefinedGuard,
|
|
6
5
|
QueryKey,
|
|
6
|
+
QueryKeyWithDataTag,
|
|
7
7
|
} from '@tanstack/query-core'
|
|
8
8
|
import type { InfiniteQueryOptions } from './types'
|
|
9
9
|
import type { Accessor } from 'solid-js'
|
|
@@ -58,9 +58,8 @@ export function infiniteQueryOptions<
|
|
|
58
58
|
TQueryKey,
|
|
59
59
|
TPageParam
|
|
60
60
|
>
|
|
61
|
-
> &
|
|
62
|
-
|
|
63
|
-
}
|
|
61
|
+
> &
|
|
62
|
+
QueryKeyWithDataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
|
|
64
63
|
export function infiniteQueryOptions<
|
|
65
64
|
TQueryFnData,
|
|
66
65
|
TError = DefaultError,
|
|
@@ -85,9 +84,8 @@ export function infiniteQueryOptions<
|
|
|
85
84
|
TQueryKey,
|
|
86
85
|
TPageParam
|
|
87
86
|
>
|
|
88
|
-
> &
|
|
89
|
-
|
|
90
|
-
}
|
|
87
|
+
> &
|
|
88
|
+
QueryKeyWithDataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
|
|
91
89
|
|
|
92
90
|
export function infiniteQueryOptions(options: unknown) {
|
|
93
91
|
return options
|
package/src/queryOptions.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
DefaultError,
|
|
3
|
+
QueryKey,
|
|
4
|
+
QueryKeyWithDataTag,
|
|
5
|
+
} from '@tanstack/query-core'
|
|
2
6
|
import type { QueryOptions } from './types'
|
|
3
7
|
import type { Accessor } from 'solid-js'
|
|
4
8
|
|
|
@@ -35,9 +39,8 @@ export function queryOptions<
|
|
|
35
39
|
>,
|
|
36
40
|
): ReturnType<
|
|
37
41
|
UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
|
|
38
|
-
> &
|
|
39
|
-
|
|
40
|
-
}
|
|
42
|
+
> &
|
|
43
|
+
QueryKeyWithDataTag<TQueryKey, TQueryFnData, TError>
|
|
41
44
|
|
|
42
45
|
export function queryOptions<
|
|
43
46
|
TQueryFnData = unknown,
|
|
@@ -50,9 +53,8 @@ export function queryOptions<
|
|
|
50
53
|
>,
|
|
51
54
|
): ReturnType<
|
|
52
55
|
DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
|
|
53
|
-
> &
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
+
> &
|
|
57
|
+
QueryKeyWithDataTag<TQueryKey, TQueryFnData, TError>
|
|
56
58
|
|
|
57
59
|
export function queryOptions(options: unknown) {
|
|
58
60
|
return options
|
package/src/useBaseQuery.ts
CHANGED
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
onCleanup,
|
|
13
13
|
} from 'solid-js'
|
|
14
14
|
import { createStore, reconcile, unwrap } from 'solid-js/store'
|
|
15
|
-
import {
|
|
15
|
+
import { useQueryClientResolver } from './QueryClientProvider'
|
|
16
16
|
import { useIsRestoring } from './isRestoring'
|
|
17
17
|
import type { UseBaseQueryOptions } from './types'
|
|
18
18
|
import type { Accessor, Signal } from 'solid-js'
|
|
@@ -115,7 +115,8 @@ export function useBaseQuery<
|
|
|
115
115
|
) {
|
|
116
116
|
type ResourceData = QueryObserverResult<TData, TError>
|
|
117
117
|
|
|
118
|
-
const
|
|
118
|
+
const resolveClient = useQueryClientResolver(queryClient)
|
|
119
|
+
const client = createMemo(() => resolveClient())
|
|
119
120
|
const isRestoring = useIsRestoring()
|
|
120
121
|
// There are times when we run a query on the server but the resource is never read
|
|
121
122
|
// This could lead to times when the queryObserver is unsubscribed before the resource has loaded
|
|
@@ -132,9 +133,6 @@ export function useBaseQuery<
|
|
|
132
133
|
if (isServer) {
|
|
133
134
|
defaultOptions.retry = false
|
|
134
135
|
defaultOptions.throwOnError = true
|
|
135
|
-
// Enable prefetch during render for SSR - required for createResource to work
|
|
136
|
-
// Without this, queries wait for effects which never run on the server
|
|
137
|
-
defaultOptions.experimental_prefetchInRender = true
|
|
138
136
|
}
|
|
139
137
|
return defaultOptions
|
|
140
138
|
})
|
package/src/useIsFetching.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createMemo, createSignal, onCleanup } from 'solid-js'
|
|
2
|
-
import {
|
|
1
|
+
import { createEffect, createMemo, createSignal, onCleanup } from 'solid-js'
|
|
2
|
+
import { useQueryClientResolver } from './QueryClientProvider'
|
|
3
3
|
import type { QueryFilters } from '@tanstack/query-core'
|
|
4
4
|
import type { QueryClient } from './QueryClient'
|
|
5
5
|
import type { Accessor } from 'solid-js'
|
|
@@ -8,16 +8,21 @@ export function useIsFetching(
|
|
|
8
8
|
filters?: Accessor<QueryFilters>,
|
|
9
9
|
queryClient?: Accessor<QueryClient>,
|
|
10
10
|
): Accessor<number> {
|
|
11
|
-
const
|
|
11
|
+
const resolveClient = useQueryClientResolver(queryClient)
|
|
12
|
+
const client = createMemo(() => resolveClient())
|
|
12
13
|
const queryCache = createMemo(() => client().getQueryCache())
|
|
13
14
|
|
|
14
15
|
const [fetches, setFetches] = createSignal(client().isFetching(filters?.()))
|
|
15
16
|
|
|
16
|
-
|
|
17
|
+
createEffect(() => {
|
|
17
18
|
setFetches(client().isFetching(filters?.()))
|
|
18
|
-
})
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
const unsubscribe = queryCache().subscribe(() => {
|
|
21
|
+
setFetches(client().isFetching(filters?.()))
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
onCleanup(unsubscribe)
|
|
25
|
+
})
|
|
21
26
|
|
|
22
27
|
return fetches
|
|
23
28
|
}
|
package/src/useIsMutating.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createMemo, createSignal, onCleanup } from 'solid-js'
|
|
2
|
-
import {
|
|
1
|
+
import { createEffect, createMemo, createSignal, onCleanup } from 'solid-js'
|
|
2
|
+
import { useQueryClientResolver } from './QueryClientProvider'
|
|
3
3
|
import type { MutationFilters } from '@tanstack/query-core'
|
|
4
4
|
import type { QueryClient } from './QueryClient'
|
|
5
5
|
import type { Accessor } from 'solid-js'
|
|
@@ -8,18 +8,23 @@ export function useIsMutating(
|
|
|
8
8
|
filters?: Accessor<MutationFilters>,
|
|
9
9
|
queryClient?: Accessor<QueryClient>,
|
|
10
10
|
): Accessor<number> {
|
|
11
|
-
const
|
|
11
|
+
const resolveClient = useQueryClientResolver(queryClient)
|
|
12
|
+
const client = createMemo(() => resolveClient())
|
|
12
13
|
const mutationCache = createMemo(() => client().getMutationCache())
|
|
13
14
|
|
|
14
15
|
const [mutations, setMutations] = createSignal(
|
|
15
16
|
client().isMutating(filters?.()),
|
|
16
17
|
)
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
createEffect(() => {
|
|
19
20
|
setMutations(client().isMutating(filters?.()))
|
|
20
|
-
})
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
const unsubscribe = mutationCache().subscribe(() => {
|
|
23
|
+
setMutations(client().isMutating(filters?.()))
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
onCleanup(unsubscribe)
|
|
27
|
+
})
|
|
23
28
|
|
|
24
29
|
return mutations
|
|
25
30
|
}
|
package/src/useMutation.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { MutationObserver, noop, shouldThrowError } from '@tanstack/query-core'
|
|
2
2
|
import { createComputed, createMemo, on, onCleanup } from 'solid-js'
|
|
3
3
|
import { createStore } from 'solid-js/store'
|
|
4
|
-
import {
|
|
4
|
+
import { useQueryClientResolver } from './QueryClientProvider'
|
|
5
5
|
import type { DefaultError } from '@tanstack/query-core'
|
|
6
6
|
import type { QueryClient } from './QueryClient'
|
|
7
7
|
import type {
|
|
@@ -21,7 +21,8 @@ export function useMutation<
|
|
|
21
21
|
options: UseMutationOptions<TData, TError, TVariables, TOnMutateResult>,
|
|
22
22
|
queryClient?: Accessor<QueryClient>,
|
|
23
23
|
): UseMutationResult<TData, TError, TVariables, TOnMutateResult> {
|
|
24
|
-
const
|
|
24
|
+
const resolveClient = useQueryClientResolver(queryClient)
|
|
25
|
+
const client = createMemo(() => resolveClient())
|
|
25
26
|
|
|
26
27
|
const observer = new MutationObserver<
|
|
27
28
|
TData,
|
|
@@ -35,8 +36,8 @@ export function useMutation<
|
|
|
35
36
|
TError,
|
|
36
37
|
TVariables,
|
|
37
38
|
TOnMutateResult
|
|
38
|
-
> = (
|
|
39
|
-
observer.mutate(
|
|
39
|
+
> = (...args) => {
|
|
40
|
+
observer.mutate(args[0] as TVariables, args[1]).catch(noop)
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
const [state, setState] = createStore<
|
package/src/useMutationState.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createEffect, createMemo, createSignal, onCleanup } from 'solid-js'
|
|
2
2
|
import { replaceEqualDeep } from '@tanstack/query-core'
|
|
3
|
-
import {
|
|
3
|
+
import { useQueryClientResolver } from './QueryClientProvider'
|
|
4
4
|
import type {
|
|
5
5
|
Mutation,
|
|
6
6
|
MutationCache,
|
|
@@ -10,28 +10,54 @@ import type {
|
|
|
10
10
|
import type { Accessor } from 'solid-js'
|
|
11
11
|
import type { QueryClient } from './QueryClient'
|
|
12
12
|
|
|
13
|
-
type
|
|
13
|
+
type MutationTypeFromResult<TResult> = [TResult] extends [
|
|
14
|
+
MutationState<
|
|
15
|
+
infer TData,
|
|
16
|
+
infer TError,
|
|
17
|
+
infer TVariables,
|
|
18
|
+
infer TOnMutateResult
|
|
19
|
+
>,
|
|
20
|
+
]
|
|
21
|
+
? Mutation<TData, TError, TVariables, TOnMutateResult>
|
|
22
|
+
: Mutation
|
|
23
|
+
|
|
24
|
+
type MutationStateOptions<
|
|
25
|
+
TResult = MutationState,
|
|
26
|
+
TMutation extends Mutation<any, any, any, any> =
|
|
27
|
+
MutationTypeFromResult<TResult>,
|
|
28
|
+
> = {
|
|
14
29
|
filters?: MutationFilters
|
|
15
|
-
select?: (mutation:
|
|
30
|
+
select?: (mutation: TMutation) => TResult
|
|
16
31
|
}
|
|
17
32
|
|
|
18
|
-
function getResult<
|
|
33
|
+
function getResult<
|
|
34
|
+
TResult = MutationState,
|
|
35
|
+
TMutation extends Mutation<any, any, any, any> =
|
|
36
|
+
MutationTypeFromResult<TResult>,
|
|
37
|
+
>(
|
|
19
38
|
mutationCache: MutationCache,
|
|
20
|
-
options: MutationStateOptions<TResult>,
|
|
39
|
+
options: MutationStateOptions<TResult, TMutation>,
|
|
21
40
|
): Array<TResult> {
|
|
22
41
|
return mutationCache
|
|
23
42
|
.findAll(options.filters)
|
|
24
43
|
.map(
|
|
25
44
|
(mutation): TResult =>
|
|
26
|
-
(options.select
|
|
45
|
+
(options.select
|
|
46
|
+
? options.select(mutation as TMutation)
|
|
47
|
+
: mutation.state) as TResult,
|
|
27
48
|
)
|
|
28
49
|
}
|
|
29
50
|
|
|
30
|
-
export function useMutationState<
|
|
31
|
-
|
|
51
|
+
export function useMutationState<
|
|
52
|
+
TResult = MutationState,
|
|
53
|
+
TMutation extends Mutation<any, any, any, any> =
|
|
54
|
+
MutationTypeFromResult<TResult>,
|
|
55
|
+
>(
|
|
56
|
+
options: Accessor<MutationStateOptions<TResult, TMutation>> = () => ({}),
|
|
32
57
|
queryClient?: Accessor<QueryClient>,
|
|
33
58
|
): Accessor<Array<TResult>> {
|
|
34
|
-
const
|
|
59
|
+
const resolveClient = useQueryClientResolver(queryClient)
|
|
60
|
+
const client = createMemo(() => resolveClient())
|
|
35
61
|
const mutationCache = createMemo(() => client().getMutationCache())
|
|
36
62
|
|
|
37
63
|
const [result, setResult] = createSignal(
|
package/src/useQueries.ts
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
onCleanup,
|
|
12
12
|
onMount,
|
|
13
13
|
} from 'solid-js'
|
|
14
|
-
import {
|
|
14
|
+
import { useQueryClientResolver } from './QueryClientProvider'
|
|
15
15
|
import { useIsRestoring } from './isRestoring'
|
|
16
16
|
import type { QueryOptions, UseQueryResult } from './types'
|
|
17
17
|
import type { Accessor } from 'solid-js'
|
|
@@ -196,7 +196,8 @@ export function useQueries<
|
|
|
196
196
|
}>,
|
|
197
197
|
queryClient?: Accessor<QueryClient>,
|
|
198
198
|
): TCombinedResult {
|
|
199
|
-
const
|
|
199
|
+
const resolveClient = useQueryClientResolver(queryClient)
|
|
200
|
+
const client = createMemo(() => resolveClient())
|
|
200
201
|
const isRestoring = useIsRestoring()
|
|
201
202
|
|
|
202
203
|
const defaultedQueries = createMemo(() =>
|