@tanstack/solid-query 5.101.4 → 5.102.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/solid-query",
3
- "version": "5.101.4",
3
+ "version": "5.102.1",
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.101.4"
49
+ "@tanstack/query-core": "5.102.1"
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
- "tsup-preset-solid": "^2.2.0",
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:ts60": "node ../../node_modules/typescript60/lib/tsc.js --build tsconfig.legacy.json",
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": "tsup --tsconfig tsconfig.prod.json",
79
- "build:watch": "tsup --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('No QueryClient set, use QueryClientProvider to set one')
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
- queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>>
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
- queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>>
90
- }
87
+ > &
88
+ QueryKeyWithDataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
91
89
 
92
90
  export function infiniteQueryOptions(options: unknown) {
93
91
  return options
@@ -1,4 +1,8 @@
1
- import type { DataTag, DefaultError, QueryKey } from '@tanstack/query-core'
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
- queryKey: DataTag<TQueryKey, TQueryFnData, TError>
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
- queryKey: DataTag<TQueryKey, TQueryFnData, TError>
55
- }
56
+ > &
57
+ QueryKeyWithDataTag<TQueryKey, TQueryFnData, TError>
56
58
 
57
59
  export function queryOptions(options: unknown) {
58
60
  return options
@@ -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 { useQueryClient } from './QueryClientProvider'
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 client = createMemo(() => useQueryClient(queryClient?.()))
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
  })
@@ -1,5 +1,5 @@
1
- import { createMemo, createSignal, onCleanup } from 'solid-js'
2
- import { useQueryClient } from './QueryClientProvider'
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 client = createMemo(() => useQueryClient(queryClient?.()))
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
- const unsubscribe = queryCache().subscribe(() => {
17
+ createEffect(() => {
17
18
  setFetches(client().isFetching(filters?.()))
18
- })
19
19
 
20
- onCleanup(unsubscribe)
20
+ const unsubscribe = queryCache().subscribe(() => {
21
+ setFetches(client().isFetching(filters?.()))
22
+ })
23
+
24
+ onCleanup(unsubscribe)
25
+ })
21
26
 
22
27
  return fetches
23
28
  }
@@ -1,5 +1,5 @@
1
- import { createMemo, createSignal, onCleanup } from 'solid-js'
2
- import { useQueryClient } from './QueryClientProvider'
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 client = createMemo(() => useQueryClient(queryClient?.()))
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
- const unsubscribe = mutationCache().subscribe((_result) => {
19
+ createEffect(() => {
19
20
  setMutations(client().isMutating(filters?.()))
20
- })
21
21
 
22
- onCleanup(unsubscribe)
22
+ const unsubscribe = mutationCache().subscribe(() => {
23
+ setMutations(client().isMutating(filters?.()))
24
+ })
25
+
26
+ onCleanup(unsubscribe)
27
+ })
23
28
 
24
29
  return mutations
25
30
  }
@@ -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 { useQueryClient } from './QueryClientProvider'
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 client = createMemo(() => useQueryClient(queryClient?.()))
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
- > = (variables, mutateOptions) => {
39
- observer.mutate(variables, mutateOptions).catch(noop)
39
+ > = (...args) => {
40
+ observer.mutate(args[0] as TVariables, args[1]).catch(noop)
40
41
  }
41
42
 
42
43
  const [state, setState] = createStore<
@@ -1,6 +1,6 @@
1
1
  import { createEffect, createMemo, createSignal, onCleanup } from 'solid-js'
2
2
  import { replaceEqualDeep } from '@tanstack/query-core'
3
- import { useQueryClient } from './QueryClientProvider'
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 MutationStateOptions<TResult = MutationState> = {
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: Mutation) => TResult
30
+ select?: (mutation: TMutation) => TResult
16
31
  }
17
32
 
18
- function getResult<TResult = MutationState>(
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 ? options.select(mutation) : mutation.state) as TResult,
45
+ (options.select
46
+ ? options.select(mutation as TMutation)
47
+ : mutation.state) as TResult,
27
48
  )
28
49
  }
29
50
 
30
- export function useMutationState<TResult = MutationState>(
31
- options: Accessor<MutationStateOptions<TResult>> = () => ({}),
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 client = createMemo(() => useQueryClient(queryClient?.()))
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 { useQueryClient } from './QueryClientProvider'
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 client = createMemo(() => useQueryClient(queryClient?.()))
199
+ const resolveClient = useQueryClientResolver(queryClient)
200
+ const client = createMemo(() => resolveClient())
200
201
  const isRestoring = useIsRestoring()
201
202
 
202
203
  const defaultedQueries = createMemo(() =>