diff --git a/docs/framework/angular/guides/disabling-queries.md b/docs/framework/angular/guides/disabling-queries.md index 10f29cdf52..8d707e235f 100644 --- a/docs/framework/angular/guides/disabling-queries.md +++ b/docs/framework/angular/guides/disabling-queries.md @@ -67,3 +67,27 @@ export class TodosComponent { ``` [//]: # 'Example2' +[//]: # 'Example3' + +```ts +@Component({ + selector: 'todos', + template: ` +
+ // 🚀 applying the filter will enable and execute the query + + +
+ `, +}) +export class TodosComponent { + filter = signal('') + + todosQuery = injectQuery(() => ({ + queryKey: ['todos', this.filter()], + queryFn: this.filter ? () => fetchTodos(this.filter()) : skipToken, + })) +} +``` + +[//]: # 'Example3' diff --git a/docs/framework/react/guides/disabling-queries.md b/docs/framework/react/guides/disabling-queries.md index 9de977e0d0..f7ad9b212e 100644 --- a/docs/framework/react/guides/disabling-queries.md +++ b/docs/framework/react/guides/disabling-queries.md @@ -12,7 +12,9 @@ When `enabled` is `false`: - The query will not automatically fetch on mount. - The query will not automatically refetch in the background. - The query will ignore query client `invalidateQueries` and `refetchQueries` calls that would normally result in the query refetching. -- `refetch` returned from `useQuery` can be used to manually trigger the query to fetch. +- `refetch` returned from `useQuery` can be used to manually trigger the query to fetch. However, it will not work with `skipToken`. + +> Typescript users may prefer to use [skipToken](#typesafe-disabling-of-queries-using-skiptoken) as an alternative to `enabled = false`. [//]: # 'Example' @@ -92,3 +94,33 @@ If you are using disabled or lazy queries, you can use the `isLoading` flag inst `isPending && isFetching` so it will only be true if the query is currently fetching for the first time. + +## Typesafe disabling of queries using `skipToken` + +If you are using TypeScript, you can use the `skipToken` to disable a query. This is useful when you want to disable a query based on a condition, but you still want to keep the query to be type safe. + +> IMPORTANT: `refetch` from `useQuery` will not work with `skipToken`. Other than that, `skipToken` works the same as `enabled: false`. + +[//]: # 'Example3' + +```tsx +function Todos() { + const [filter, setFilter] = React.useState() + + const { data } = useQuery({ + queryKey: ['todos', filter], + // ⬇️ disabled as long as the filter is undefined or empty + queryFn: filter ? () => fetchTodos(filter) : skipToken, + }) + + return ( +
+ // 🚀 applying the filter will enable and execute the query + + {data && +
+ ) +} +``` + +[//]: # 'Example3' diff --git a/docs/framework/react/react-native.md b/docs/framework/react/react-native.md index 88f400f34c..d773cb730c 100644 --- a/docs/framework/react/react-native.md +++ b/docs/framework/react/react-native.md @@ -138,6 +138,6 @@ function MyComponent() { notifyOnChangeProps, }) - return
DataUpdatedAt: {dataUpdatedAt}
+ return DataUpdatedAt: {dataUpdatedAt} } ``` diff --git a/docs/framework/react/typescript.md b/docs/framework/react/typescript.md index 36a6f8d210..acf4b8d544 100644 --- a/docs/framework/react/typescript.md +++ b/docs/framework/react/typescript.md @@ -227,3 +227,8 @@ For tips and tricks around type inference, have a look at [React Query and TypeS the Community Resources. To find out how to get the best possible type-safety, you can read [Type-safe React Query](./community/tkdodos-blog#19-type-safe-react-query). [//]: # 'Materials' + +## Typesafe disabling of queries using `skipToken` + +If you are using TypeScript, you can use the `skipToken` to disable a query. This is useful when you want to disable a query based on a condition, but you still want to keep the query to be type safe. +Read more about it in the [Disabling Queries](./guides/disabling-queries.md) guide. diff --git a/docs/framework/vue/guides/disabling-queries.md b/docs/framework/vue/guides/disabling-queries.md index 6f1434d07d..bd0de7532f 100644 --- a/docs/framework/vue/guides/disabling-queries.md +++ b/docs/framework/vue/guides/disabling-queries.md @@ -53,3 +53,24 @@ const { data } = useQuery({ ``` [//]: # 'Example2' +[//]: # 'Example3' + +```vue + + + +``` + +[//]: # 'Example3' diff --git a/examples/angular/basic/package.json b/examples/angular/basic/package.json index e9dc2dc6a4..d22b458d8a 100644 --- a/examples/angular/basic/package.json +++ b/examples/angular/basic/package.json @@ -17,7 +17,7 @@ "@angular/platform-browser": "^17.1.3", "@angular/platform-browser-dynamic": "^17.1.3", "@angular/router": "^17.1.3", - "@tanstack/angular-query-experimental": "^5.24.8", + "@tanstack/angular-query-experimental": "^5.25.0", "rxjs": "^7.8.1", "tslib": "^2.6.2", "zone.js": "^0.14.3" @@ -26,7 +26,7 @@ "@angular-devkit/build-angular": "^17.1.3", "@angular/cli": "^17.1.3", "@angular/compiler-cli": "^17.1.3", - "@tanstack/angular-query-devtools-experimental": "^5.24.8", + "@tanstack/angular-query-devtools-experimental": "^5.25.0", "typescript": "5.2.2" }, "overrides": { diff --git a/examples/angular/infinite-query-with-max-pages/package.json b/examples/angular/infinite-query-with-max-pages/package.json index fcaf73671c..91a8201481 100644 --- a/examples/angular/infinite-query-with-max-pages/package.json +++ b/examples/angular/infinite-query-with-max-pages/package.json @@ -17,7 +17,7 @@ "@angular/platform-browser": "^17.1.3", "@angular/platform-browser-dynamic": "^17.1.3", "@angular/router": "^17.1.3", - "@tanstack/angular-query-experimental": "^5.24.8", + "@tanstack/angular-query-experimental": "^5.25.0", "rxjs": "^7.8.1", "tslib": "^2.6.2", "zone.js": "^0.14.3" @@ -26,7 +26,7 @@ "@angular-devkit/build-angular": "^17.1.3", "@angular/cli": "^17.1.3", "@angular/compiler-cli": "^17.1.3", - "@tanstack/angular-query-devtools-experimental": "^5.24.8", + "@tanstack/angular-query-devtools-experimental": "^5.25.0", "typescript": "5.2.2" }, "overrides": { diff --git a/examples/angular/router/package.json b/examples/angular/router/package.json index fe674a1bee..8f82524bd7 100644 --- a/examples/angular/router/package.json +++ b/examples/angular/router/package.json @@ -17,7 +17,7 @@ "@angular/platform-browser": "^17.1.3", "@angular/platform-browser-dynamic": "^17.1.3", "@angular/router": "^17.1.3", - "@tanstack/angular-query-experimental": "^5.24.8", + "@tanstack/angular-query-experimental": "^5.25.0", "rxjs": "^7.8.1", "tslib": "^2.6.2", "zone.js": "^0.14.3" @@ -26,7 +26,7 @@ "@angular-devkit/build-angular": "^17.1.3", "@angular/cli": "^17.1.3", "@angular/compiler-cli": "^17.1.3", - "@tanstack/angular-query-devtools-experimental": "^5.24.8", + "@tanstack/angular-query-devtools-experimental": "^5.25.0", "typescript": "5.2.2" }, "overrides": { diff --git a/examples/angular/simple/package.json b/examples/angular/simple/package.json index 3a3cca6351..0fb3864ad0 100644 --- a/examples/angular/simple/package.json +++ b/examples/angular/simple/package.json @@ -17,7 +17,7 @@ "@angular/platform-browser": "^17.1.3", "@angular/platform-browser-dynamic": "^17.1.3", "@angular/router": "^17.1.3", - "@tanstack/angular-query-experimental": "^5.24.8", + "@tanstack/angular-query-experimental": "^5.25.0", "rxjs": "^7.8.1", "tslib": "^2.6.2", "zone.js": "^0.14.3" @@ -26,7 +26,7 @@ "@angular-devkit/build-angular": "^17.1.3", "@angular/cli": "^17.1.3", "@angular/compiler-cli": "^17.1.3", - "@tanstack/angular-query-devtools-experimental": "^5.24.8", + "@tanstack/angular-query-devtools-experimental": "^5.25.0", "typescript": "5.2.2" }, "overrides": { diff --git a/examples/react/algolia/package.json b/examples/react/algolia/package.json index 1eb9ad9d31..e11879130e 100644 --- a/examples/react/algolia/package.json +++ b/examples/react/algolia/package.json @@ -11,8 +11,8 @@ "dependencies": { "@algolia/client-search": "4.22.1", "@algolia/transporter": "4.22.1", - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "algoliasearch": "4.22.1", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/examples/react/algolia/src/SearchResults.tsx b/examples/react/algolia/src/SearchResults.tsx index 59b353a7dd..9298419931 100644 --- a/examples/react/algolia/src/SearchResults.tsx +++ b/examples/react/algolia/src/SearchResults.tsx @@ -25,7 +25,6 @@ export default function SearchResults({ query = '' }: SearchResultsProps) { hitsPerPage: 5, staleTime: 1000 * 30, // 30s gcTime: 1000 * 60 * 15, // 15m - enabled: !!query, }) if (!query) return null diff --git a/examples/react/algolia/src/useAlgolia.ts b/examples/react/algolia/src/useAlgolia.ts index 0199589a78..3c0fb2eec7 100644 --- a/examples/react/algolia/src/useAlgolia.ts +++ b/examples/react/algolia/src/useAlgolia.ts @@ -1,4 +1,4 @@ -import { useInfiniteQuery } from '@tanstack/react-query' +import { useInfiniteQuery, skipToken } from '@tanstack/react-query' import { search } from './algolia' export type UseAlgoliaOptions = { @@ -7,7 +7,6 @@ export type UseAlgoliaOptions = { hitsPerPage?: number staleTime?: number gcTime?: number - enabled?: boolean } export default function useAlgolia({ @@ -16,17 +15,17 @@ export default function useAlgolia({ hitsPerPage = 10, staleTime, gcTime, - enabled, }: UseAlgoliaOptions) { const queryInfo = useInfiniteQuery({ queryKey: ['algolia', indexName, query, hitsPerPage], - queryFn: ({ pageParam }) => - search({ indexName, query, pageParam, hitsPerPage }), + queryFn: query + ? ({ pageParam }) => + search({ indexName, query, pageParam, hitsPerPage }) + : skipToken, initialPageParam: 0, getNextPageParam: (lastPage) => lastPage?.nextPage, staleTime, gcTime, - enabled, }) const hits = queryInfo.data?.pages.map((page) => page.hits).flat() diff --git a/examples/react/auto-refetching/package.json b/examples/react/auto-refetching/package.json index 58c7d57215..5e9c1d2df4 100644 --- a/examples/react/auto-refetching/package.json +++ b/examples/react/auto-refetching/package.json @@ -7,8 +7,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "axios": "^1.6.7", "isomorphic-unfetch": "4.0.2", "next": "^14.0.0", diff --git a/examples/react/basic-graphql-request/package.json b/examples/react/basic-graphql-request/package.json index a91357cc18..52f6d0fe35 100644 --- a/examples/react/basic-graphql-request/package.json +++ b/examples/react/basic-graphql-request/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "graphql": "^16.8.1", "graphql-request": "^6.1.0", "react": "^18.2.0", diff --git a/examples/react/basic-typescript/package.json b/examples/react/basic-typescript/package.json index 186096e070..7705aef431 100644 --- a/examples/react/basic-typescript/package.json +++ b/examples/react/basic-typescript/package.json @@ -9,10 +9,10 @@ "test:types": "tsc" }, "dependencies": { - "@tanstack/query-sync-storage-persister": "^5.24.8", - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", - "@tanstack/react-query-persist-client": "^5.24.8", + "@tanstack/query-sync-storage-persister": "^5.25.0", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", + "@tanstack/react-query-persist-client": "^5.25.0", "axios": "^1.6.7", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/examples/react/basic-typescript/src/index.tsx b/examples/react/basic-typescript/src/index.tsx index 34b931bbc4..09d700c7c1 100644 --- a/examples/react/basic-typescript/src/index.tsx +++ b/examples/react/basic-typescript/src/index.tsx @@ -2,7 +2,12 @@ import * as React from 'react' import ReactDOM from 'react-dom/client' import axios from 'axios' -import { useQuery, useQueryClient, QueryClient } from '@tanstack/react-query' +import { + QueryClient, + skipToken, + useQuery, + useQueryClient, +} from '@tanstack/react-query' import { PersistQueryClientProvider } from '@tanstack/react-query-persist-client' import { createSyncStoragePersister } from '@tanstack/query-sync-storage-persister' import { ReactQueryDevtools } from '@tanstack/react-query-devtools' @@ -95,8 +100,7 @@ const getPostById = async (id: number): Promise => { function usePost(postId: number) { return useQuery({ queryKey: ['post', postId], - queryFn: () => getPostById(postId), - enabled: !!postId, + queryFn: postId ? () => getPostById(postId) : skipToken, }) } diff --git a/examples/react/basic/package.json b/examples/react/basic/package.json index 81f4a39b72..644dbc7105 100644 --- a/examples/react/basic/package.json +++ b/examples/react/basic/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "axios": "^1.6.7", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/examples/react/default-query-function/package.json b/examples/react/default-query-function/package.json index fd51caba5b..13ead2c7dc 100644 --- a/examples/react/default-query-function/package.json +++ b/examples/react/default-query-function/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "axios": "^1.6.7", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/examples/react/infinite-query-with-max-pages/package.json b/examples/react/infinite-query-with-max-pages/package.json index 581fa01d36..3b9d552cc8 100644 --- a/examples/react/infinite-query-with-max-pages/package.json +++ b/examples/react/infinite-query-with-max-pages/package.json @@ -7,8 +7,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "axios": "^1.6.7", "isomorphic-unfetch": "4.0.2", "next": "^14.0.0", diff --git a/examples/react/load-more-infinite-scroll/package.json b/examples/react/load-more-infinite-scroll/package.json index c0a7e9e1ff..3a6468a603 100644 --- a/examples/react/load-more-infinite-scroll/package.json +++ b/examples/react/load-more-infinite-scroll/package.json @@ -7,8 +7,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "axios": "^1.6.7", "isomorphic-unfetch": "4.0.2", "next": "^14.0.0", diff --git a/examples/react/nextjs-suspense-streaming/package.json b/examples/react/nextjs-suspense-streaming/package.json index e05d886f93..18a9773985 100644 --- a/examples/react/nextjs-suspense-streaming/package.json +++ b/examples/react/nextjs-suspense-streaming/package.json @@ -8,9 +8,9 @@ "test:types": "tsc" }, "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", - "@tanstack/react-query-next-experimental": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", + "@tanstack/react-query-next-experimental": "^5.25.0", "next": "^14.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/examples/react/nextjs/package.json b/examples/react/nextjs/package.json index 91f7d98ac6..1c5e642ecd 100644 --- a/examples/react/nextjs/package.json +++ b/examples/react/nextjs/package.json @@ -7,8 +7,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "ky": "^1.2.0", "next": "^14.0.0", "react": "^18.2.0", diff --git a/examples/react/offline/package.json b/examples/react/offline/package.json index 4dd4b2720b..efcd0317a2 100644 --- a/examples/react/offline/package.json +++ b/examples/react/offline/package.json @@ -8,11 +8,11 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-sync-storage-persister": "^5.24.8", + "@tanstack/query-sync-storage-persister": "^5.25.0", "@tanstack/react-location": "^3.7.4", - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", - "@tanstack/react-query-persist-client": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", + "@tanstack/react-query-persist-client": "^5.25.0", "ky": "^1.2.0", "msw": "^2.1.7", "react": "^18.2.0", diff --git a/examples/react/optimistic-updates-cache/package.json b/examples/react/optimistic-updates-cache/package.json index 8ae674e4b0..af1bfa6731 100755 --- a/examples/react/optimistic-updates-cache/package.json +++ b/examples/react/optimistic-updates-cache/package.json @@ -8,8 +8,8 @@ "test:types": "tsc" }, "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "axios": "^1.6.7", "isomorphic-unfetch": "4.0.2", "next": "^14.0.0", diff --git a/examples/react/optimistic-updates-ui/package.json b/examples/react/optimistic-updates-ui/package.json index 0a42e13611..071a36efd3 100755 --- a/examples/react/optimistic-updates-ui/package.json +++ b/examples/react/optimistic-updates-ui/package.json @@ -7,8 +7,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "axios": "^1.6.7", "isomorphic-unfetch": "4.0.2", "next": "^14.0.0", diff --git a/examples/react/pagination/package.json b/examples/react/pagination/package.json index 12187da866..9553267f3e 100644 --- a/examples/react/pagination/package.json +++ b/examples/react/pagination/package.json @@ -7,8 +7,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "axios": "^1.6.7", "isomorphic-unfetch": "4.0.2", "next": "^14.0.0", diff --git a/examples/react/playground/package.json b/examples/react/playground/package.json index 1ae4f45673..10b816ff6d 100644 --- a/examples/react/playground/package.json +++ b/examples/react/playground/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/examples/react/prefetching/package.json b/examples/react/prefetching/package.json index 1c5ba1b5c4..dd72fd56b9 100644 --- a/examples/react/prefetching/package.json +++ b/examples/react/prefetching/package.json @@ -7,8 +7,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "axios": "^1.6.7", "isomorphic-unfetch": "4.0.2", "next": "^14.0.0", diff --git a/examples/react/react-native/package.json b/examples/react/react-native/package.json index 1eb624e540..7d3d70b99e 100644 --- a/examples/react/react-native/package.json +++ b/examples/react/react-native/package.json @@ -14,8 +14,8 @@ "@react-native-community/netinfo": "^11.1.0", "@react-navigation/native": "^6.1.6", "@react-navigation/stack": "^6.3.16", - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "expo": "^50.0.6", "expo-constants": "^15.4.5", "expo-status-bar": "^1.11.1", diff --git a/examples/react/react-router/package.json b/examples/react/react-router/package.json index c17acc209a..114de1c966 100644 --- a/examples/react/react-router/package.json +++ b/examples/react/react-router/package.json @@ -9,8 +9,8 @@ "test:types": "tsc" }, "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "localforage": "^1.10.0", "match-sorter": "^6.3.4", "react": "^18.2.0", diff --git a/examples/react/rick-morty/package.json b/examples/react/rick-morty/package.json index 988a51cd93..917aea5561 100644 --- a/examples/react/rick-morty/package.json +++ b/examples/react/rick-morty/package.json @@ -12,8 +12,8 @@ "@emotion/styled": "^11.11.0", "@mui/material": "^5.15.2", "@mui/styles": "^5.15.2", - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router": "^6.22.0", diff --git a/examples/react/simple/package.json b/examples/react/simple/package.json index c56bcf176f..086b476b4b 100644 --- a/examples/react/simple/package.json +++ b/examples/react/simple/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "axios": "^1.6.7", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/examples/react/star-wars/package.json b/examples/react/star-wars/package.json index 863bf15514..447e3877de 100644 --- a/examples/react/star-wars/package.json +++ b/examples/react/star-wars/package.json @@ -12,8 +12,8 @@ "@emotion/styled": "^11.11.0", "@mui/material": "^5.15.2", "@mui/styles": "^5.15.2", - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router": "^6.22.0", diff --git a/examples/react/suspense/package.json b/examples/react/suspense/package.json index 1cb8ee78cf..1ea2c141d7 100644 --- a/examples/react/suspense/package.json +++ b/examples/react/suspense/package.json @@ -3,8 +3,8 @@ "private": true, "type": "module", "dependencies": { - "@tanstack/react-query": "^5.24.8", - "@tanstack/react-query-devtools": "^5.24.8", + "@tanstack/react-query": "^5.25.0", + "@tanstack/react-query-devtools": "^5.25.0", "axios": "^1.6.7", "font-awesome": "^4.7.0", "react": "^18.2.0", diff --git a/examples/solid/basic-graphql-request/package.json b/examples/solid/basic-graphql-request/package.json index f61208d480..83f5047b2b 100644 --- a/examples/solid/basic-graphql-request/package.json +++ b/examples/solid/basic-graphql-request/package.json @@ -9,8 +9,8 @@ "test:types": "tsc" }, "dependencies": { - "@tanstack/solid-query": "^5.24.8", - "@tanstack/solid-query-devtools": "^5.24.8", + "@tanstack/solid-query": "^5.25.0", + "@tanstack/solid-query-devtools": "^5.25.0", "graphql": "^16.8.1", "graphql-request": "^6.1.0", "solid-js": "^1.8.14" diff --git a/examples/solid/basic-typescript/package.json b/examples/solid/basic-typescript/package.json index 4321f200bc..0824231644 100644 --- a/examples/solid/basic-typescript/package.json +++ b/examples/solid/basic-typescript/package.json @@ -9,8 +9,8 @@ "test:types": "tsc" }, "dependencies": { - "@tanstack/solid-query": "^5.24.8", - "@tanstack/solid-query-devtools": "^5.24.8", + "@tanstack/solid-query": "^5.25.0", + "@tanstack/solid-query-devtools": "^5.25.0", "solid-js": "^1.8.14" }, "devDependencies": { diff --git a/examples/solid/default-query-function/package.json b/examples/solid/default-query-function/package.json index 86d4e5dd90..0ace3fc4fd 100644 --- a/examples/solid/default-query-function/package.json +++ b/examples/solid/default-query-function/package.json @@ -9,8 +9,8 @@ "test:types": "tsc" }, "dependencies": { - "@tanstack/solid-query": "^5.24.8", - "@tanstack/solid-query-devtools": "^5.24.8", + "@tanstack/solid-query": "^5.25.0", + "@tanstack/solid-query-devtools": "^5.25.0", "solid-js": "^1.8.14" }, "devDependencies": { diff --git a/examples/solid/simple/package.json b/examples/solid/simple/package.json index bc94352da8..cc1cb7bddc 100644 --- a/examples/solid/simple/package.json +++ b/examples/solid/simple/package.json @@ -9,8 +9,8 @@ "test:types": "tsc" }, "dependencies": { - "@tanstack/solid-query": "^5.24.8", - "@tanstack/solid-query-devtools": "^5.24.8", + "@tanstack/solid-query": "^5.25.0", + "@tanstack/solid-query-devtools": "^5.25.0", "solid-js": "^1.8.14" }, "devDependencies": { diff --git a/examples/solid/solid-start-streaming/package.json b/examples/solid/solid-start-streaming/package.json index b9a60d9ad0..aaa5bf2fb4 100644 --- a/examples/solid/solid-start-streaming/package.json +++ b/examples/solid/solid-start-streaming/package.json @@ -11,8 +11,8 @@ "@solidjs/meta": "^0.29.3", "@solidjs/router": "^0.12.0", "@solidjs/start": "^0.5.4", - "@tanstack/solid-query": "^5.24.8", - "@tanstack/solid-query-devtools": "^5.24.8", + "@tanstack/solid-query": "^5.25.0", + "@tanstack/solid-query-devtools": "^5.25.0", "solid-js": "^1.8.14", "vinxi": "^0.3.3" }, diff --git a/examples/svelte/auto-refetching/package.json b/examples/svelte/auto-refetching/package.json index 5e436e5313..410c506602 100644 --- a/examples/svelte/auto-refetching/package.json +++ b/examples/svelte/auto-refetching/package.json @@ -9,8 +9,8 @@ "test:types": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json" }, "dependencies": { - "@tanstack/svelte-query": "^5.24.8", - "@tanstack/svelte-query-devtools": "^5.24.8" + "@tanstack/svelte-query": "^5.25.0", + "@tanstack/svelte-query-devtools": "^5.25.0" }, "devDependencies": { "@sveltejs/adapter-auto": "^3.1.1", diff --git a/examples/svelte/basic/package.json b/examples/svelte/basic/package.json index 9d978697e1..51bf6a25d4 100644 --- a/examples/svelte/basic/package.json +++ b/examples/svelte/basic/package.json @@ -9,8 +9,8 @@ "test:types": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json" }, "dependencies": { - "@tanstack/svelte-query": "^5.24.8", - "@tanstack/svelte-query-devtools": "^5.24.8" + "@tanstack/svelte-query": "^5.25.0", + "@tanstack/svelte-query-devtools": "^5.25.0" }, "devDependencies": { "@sveltejs/adapter-auto": "^3.1.1", diff --git a/examples/svelte/load-more-infinite-scroll/package.json b/examples/svelte/load-more-infinite-scroll/package.json index 3edf3e116d..cd39dc2ca5 100644 --- a/examples/svelte/load-more-infinite-scroll/package.json +++ b/examples/svelte/load-more-infinite-scroll/package.json @@ -9,8 +9,8 @@ "test:types": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json" }, "dependencies": { - "@tanstack/svelte-query": "^5.24.8", - "@tanstack/svelte-query-devtools": "^5.24.8" + "@tanstack/svelte-query": "^5.25.0", + "@tanstack/svelte-query-devtools": "^5.25.0" }, "devDependencies": { "@sveltejs/adapter-auto": "^3.1.1", diff --git a/examples/svelte/optimistic-updates-typescript/package.json b/examples/svelte/optimistic-updates-typescript/package.json index 846be3cae2..7fdc38007f 100644 --- a/examples/svelte/optimistic-updates-typescript/package.json +++ b/examples/svelte/optimistic-updates-typescript/package.json @@ -9,8 +9,8 @@ "test:types": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json" }, "dependencies": { - "@tanstack/svelte-query": "^5.24.8", - "@tanstack/svelte-query-devtools": "^5.24.8" + "@tanstack/svelte-query": "^5.25.0", + "@tanstack/svelte-query-devtools": "^5.25.0" }, "devDependencies": { "@sveltejs/adapter-auto": "^3.1.1", diff --git a/examples/svelte/playground/package.json b/examples/svelte/playground/package.json index efa09e9ff6..d9ead2fb3b 100644 --- a/examples/svelte/playground/package.json +++ b/examples/svelte/playground/package.json @@ -9,8 +9,8 @@ "test:types": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json" }, "dependencies": { - "@tanstack/svelte-query": "^5.24.8", - "@tanstack/svelte-query-devtools": "^5.24.8" + "@tanstack/svelte-query": "^5.25.0", + "@tanstack/svelte-query-devtools": "^5.25.0" }, "devDependencies": { "@sveltejs/adapter-auto": "^3.1.1", diff --git a/examples/svelte/simple/package.json b/examples/svelte/simple/package.json index b8c9478083..97ed563f0e 100644 --- a/examples/svelte/simple/package.json +++ b/examples/svelte/simple/package.json @@ -9,8 +9,8 @@ "test:types": "svelte-check --tsconfig ./tsconfig.json" }, "dependencies": { - "@tanstack/svelte-query": "^5.24.8", - "@tanstack/svelte-query-devtools": "^5.24.8" + "@tanstack/svelte-query": "^5.25.0", + "@tanstack/svelte-query-devtools": "^5.25.0" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^3.0.2", diff --git a/examples/svelte/ssr/package.json b/examples/svelte/ssr/package.json index d70bb49a90..204efa5eb8 100644 --- a/examples/svelte/ssr/package.json +++ b/examples/svelte/ssr/package.json @@ -9,8 +9,8 @@ "test:types": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json" }, "dependencies": { - "@tanstack/svelte-query": "^5.24.8", - "@tanstack/svelte-query-devtools": "^5.24.8" + "@tanstack/svelte-query": "^5.25.0", + "@tanstack/svelte-query-devtools": "^5.25.0" }, "devDependencies": { "@sveltejs/adapter-auto": "^3.1.1", diff --git a/examples/svelte/star-wars/package.json b/examples/svelte/star-wars/package.json index 29c6bc1c53..f9864c47b2 100644 --- a/examples/svelte/star-wars/package.json +++ b/examples/svelte/star-wars/package.json @@ -9,8 +9,8 @@ "test:types": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json" }, "dependencies": { - "@tanstack/svelte-query": "^5.24.8", - "@tanstack/svelte-query-devtools": "^5.24.8" + "@tanstack/svelte-query": "^5.25.0", + "@tanstack/svelte-query-devtools": "^5.25.0" }, "devDependencies": { "@sveltejs/adapter-auto": "^3.1.1", diff --git a/examples/vue/2.6-basic/package.json b/examples/vue/2.6-basic/package.json index b13a45f38e..a77bab9347 100644 --- a/examples/vue/2.6-basic/package.json +++ b/examples/vue/2.6-basic/package.json @@ -8,7 +8,7 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/vue-query": "^5.24.8", + "@tanstack/vue-query": "^5.25.0", "@vue/composition-api": "1.7.2", "vue": "2.6.14", "vue-template-compiler": "2.6.14" diff --git a/examples/vue/basic/package.json b/examples/vue/basic/package.json index f89d209818..db0e8c32fe 100644 --- a/examples/vue/basic/package.json +++ b/examples/vue/basic/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/vue-query": "^5.24.8", - "@tanstack/vue-query-devtools": "^5.24.8", + "@tanstack/vue-query": "^5.25.0", + "@tanstack/vue-query-devtools": "^5.25.0", "vue": "^3.3.0" }, "devDependencies": { diff --git a/examples/vue/dependent-queries/package.json b/examples/vue/dependent-queries/package.json index 187a660822..521c7f279f 100644 --- a/examples/vue/dependent-queries/package.json +++ b/examples/vue/dependent-queries/package.json @@ -8,7 +8,7 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/vue-query": "^5.24.8", + "@tanstack/vue-query": "^5.25.0", "vue": "^3.3.0" }, "devDependencies": { diff --git a/examples/vue/nuxt3/package.json b/examples/vue/nuxt3/package.json index 5b66a3dace..f02791354c 100644 --- a/examples/vue/nuxt3/package.json +++ b/examples/vue/nuxt3/package.json @@ -7,7 +7,7 @@ "start": "node .output/server/index.mjs" }, "dependencies": { - "@tanstack/vue-query": "^5.24.8" + "@tanstack/vue-query": "^5.25.0" }, "devDependencies": { "nuxt": "^3.5.2" diff --git a/examples/vue/persister/package.json b/examples/vue/persister/package.json index 01fa2758f6..a35c64135b 100644 --- a/examples/vue/persister/package.json +++ b/examples/vue/persister/package.json @@ -8,10 +8,10 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-core": "^5.24.8", - "@tanstack/query-persist-client-core": "^5.24.8", - "@tanstack/query-sync-storage-persister": "^5.24.8", - "@tanstack/vue-query": "^5.24.8", + "@tanstack/query-core": "^5.25.0", + "@tanstack/query-persist-client-core": "^5.25.0", + "@tanstack/query-sync-storage-persister": "^5.25.0", + "@tanstack/vue-query": "^5.25.0", "idb-keyval": "^6.2.1", "vue": "^3.3.0" }, diff --git a/examples/vue/simple/package.json b/examples/vue/simple/package.json index de1816108c..f97ca9175f 100644 --- a/examples/vue/simple/package.json +++ b/examples/vue/simple/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/vue-query": "^5.24.8", - "@tanstack/vue-query-devtools": "^5.24.8", + "@tanstack/vue-query": "^5.25.0", + "@tanstack/vue-query-devtools": "^5.25.0", "vue": "^3.3.0" }, "devDependencies": { diff --git a/packages/angular-query-devtools-experimental/package.json b/packages/angular-query-devtools-experimental/package.json index d16c28edcb..f7f1ea548b 100644 --- a/packages/angular-query-devtools-experimental/package.json +++ b/packages/angular-query-devtools-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/angular-query-devtools-experimental", - "version": "5.24.8", + "version": "5.25.0", "description": "Developer tools to interact with and visualize the TanStack/angular-query cache", "author": "Arnoud de Vries", "license": "MIT", diff --git a/packages/angular-query-experimental/package.json b/packages/angular-query-experimental/package.json index 1e7cf97fd1..f3534e29b8 100644 --- a/packages/angular-query-experimental/package.json +++ b/packages/angular-query-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/angular-query-experimental", - "version": "5.24.8", + "version": "5.25.0", "description": "Signals for managing, caching and syncing asynchronous and remote data in Angular", "author": "Arnoud de Vries", "license": "MIT", diff --git a/packages/angular-query-experimental/src/inject-queries.ts b/packages/angular-query-experimental/src/inject-queries.ts index f5f722f270..7664e9148c 100644 --- a/packages/angular-query-experimental/src/inject-queries.ts +++ b/packages/angular-query-experimental/src/inject-queries.ts @@ -11,6 +11,7 @@ import type { QueryKey, QueryObserverOptions, QueryObserverResult, + SkipToken, ThrowOnError, } from '@tanstack/query-core' @@ -52,7 +53,9 @@ type GetOptions = ? QueryObserverOptionsForCreateQueries : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided T extends { - queryFn?: QueryFunction + queryFn?: + | QueryFunction + | SkipToken select: (data: any) => infer TData throwOnError?: ThrowOnError } @@ -63,10 +66,9 @@ type GetOptions = TQueryKey > : T extends { - queryFn?: QueryFunction< - infer TQueryFnData, - infer TQueryKey - > + queryFn?: + | QueryFunction + | SkipToken throwOnError?: ThrowOnError } ? QueryObserverOptionsForCreateQueries< diff --git a/packages/query-async-storage-persister/package.json b/packages/query-async-storage-persister/package.json index e0eea27e8e..386cc99d12 100644 --- a/packages/query-async-storage-persister/package.json +++ b/packages/query-async-storage-persister/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-async-storage-persister", - "version": "5.24.8", + "version": "5.25.0", "description": "A persister for asynchronous storages, to be used with TanStack/Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-broadcast-client-experimental/package.json b/packages/query-broadcast-client-experimental/package.json index b44114784e..63bfeffecf 100644 --- a/packages/query-broadcast-client-experimental/package.json +++ b/packages/query-broadcast-client-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-broadcast-client-experimental", - "version": "5.24.8", + "version": "5.25.0", "description": "An experimental plugin to for broadcasting the state of your queryClient between browser tabs/windows", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-core/package.json b/packages/query-core/package.json index ebb79d1a72..360a02b2d8 100644 --- a/packages/query-core/package.json +++ b/packages/query-core/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-core", - "version": "5.24.8", + "version": "5.25.0", "description": "The framework agnostic core that powers TanStack Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-core/src/index.ts b/packages/query-core/src/index.ts index 830a49f600..0d6dd2f264 100644 --- a/packages/query-core/src/index.ts +++ b/packages/query-core/src/index.ts @@ -20,8 +20,9 @@ export { matchQuery, matchMutation, keepPreviousData, + skipToken, } from './utils' -export type { MutationFilters, QueryFilters, Updater } from './utils' +export type { MutationFilters, QueryFilters, Updater, SkipToken } from './utils' export { isCancelledError } from './retryer' export { dehydrate, diff --git a/packages/query-core/src/infiniteQueryBehavior.ts b/packages/query-core/src/infiniteQueryBehavior.ts index 73ddd9e51e..dd79ba8098 100644 --- a/packages/query-core/src/infiniteQueryBehavior.ts +++ b/packages/query-core/src/infiniteQueryBehavior.ts @@ -1,4 +1,4 @@ -import { addToEnd, addToStart } from './utils' +import { addToEnd, addToStart, skipToken } from './utils' import type { QueryBehavior } from './query' import type { InfiniteData, @@ -38,11 +38,20 @@ export function infiniteQueryBehavior( // Get query function const queryFn = - context.options.queryFn || - (() => - Promise.reject( - new Error(`Missing queryFn: '${context.options.queryHash}'`), - )) + context.options.queryFn && context.options.queryFn !== skipToken + ? context.options.queryFn + : () => { + if (process.env.NODE_ENV !== 'production') { + if (context.options.queryFn === skipToken) { + console.error( + `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${context.options.queryHash}'`, + ) + } + } + return Promise.reject( + new Error(`Missing queryFn: '${context.options.queryHash}'`), + ) + } // Create function to fetch a page const fetchPage = async ( diff --git a/packages/query-core/src/query.ts b/packages/query-core/src/query.ts index 6018f5071d..fcca677bdd 100644 --- a/packages/query-core/src/query.ts +++ b/packages/query-core/src/query.ts @@ -1,4 +1,4 @@ -import { noop, replaceData, timeUntilStale } from './utils' +import { noop, replaceData, skipToken, timeUntilStale } from './utils' import { notifyManager } from './notifyManager' import { canFetch, createRetryer, isCancelledError } from './retryer' import { Removable } from './removable' @@ -387,11 +387,20 @@ export class Query< // Create fetch function const fetchFn = () => { - if (!this.options.queryFn) { + if (process.env.NODE_ENV !== 'production') { + if (this.options.queryFn === skipToken) { + console.error( + `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${this.options.queryHash}'`, + ) + } + } + + if (!this.options.queryFn || this.options.queryFn === skipToken) { return Promise.reject( new Error(`Missing queryFn: '${this.options.queryHash}'`), ) } + this.#abortSignalConsumed = false if (this.options.persister) { return this.options.persister( diff --git a/packages/query-core/src/queryClient.ts b/packages/query-core/src/queryClient.ts index d54cacf55c..2f0d4cf0b4 100644 --- a/packages/query-core/src/queryClient.ts +++ b/packages/query-core/src/queryClient.ts @@ -4,6 +4,7 @@ import { hashQueryKeyByOptions, noop, partialMatchKey, + skipToken, } from './utils' import { QueryCache } from './queryCache' import { MutationCache } from './mutationCache' @@ -537,6 +538,13 @@ export class QueryClient { defaultedOptions.networkMode = 'offlineFirst' } + if ( + defaultedOptions.enabled !== true && + defaultedOptions.queryFn === skipToken + ) { + defaultedOptions.enabled = false + } + return defaultedOptions as DefaultedQueryObserverOptions< TQueryFnData, TError, diff --git a/packages/query-core/src/tests/queryClient.test.tsx b/packages/query-core/src/tests/queryClient.test.tsx index a975db3971..eaad117718 100644 --- a/packages/query-core/src/tests/queryClient.test.tsx +++ b/packages/query-core/src/tests/queryClient.test.tsx @@ -10,6 +10,7 @@ import { hydrate, onlineManager, } from '..' +import { skipToken } from '../utils' import { createQueryClient, mockOnlineManagerIsOnline, @@ -1354,6 +1355,7 @@ describe('queryClient', () => { test('should refetch all active queries', async () => { const key1 = queryKey() const key2 = queryKey() + const key3 = queryKey() const queryFn1 = vi.fn, string>().mockReturnValue('data1') const queryFn2 = vi.fn, string>().mockReturnValue('data2') const observer1 = new QueryObserver(queryClient, { @@ -1366,13 +1368,21 @@ describe('queryClient', () => { queryFn: queryFn2, enabled: false, }) + const observer3 = new QueryObserver(queryClient, { + queryKey: key3, + queryFn: skipToken, + }) + let didSkipTokenRun = false observer1.subscribe(() => undefined) observer2.subscribe(() => undefined) + observer3.subscribe(() => (didSkipTokenRun = true)) await queryClient.resetQueries() + observer3.destroy() observer2.destroy() observer1.destroy() expect(queryFn1).toHaveBeenCalledTimes(2) expect(queryFn2).toHaveBeenCalledTimes(0) + expect(didSkipTokenRun).toBe(false) }) }) diff --git a/packages/query-core/src/types.ts b/packages/query-core/src/types.ts index c4b2b29d4d..faaea7bb84 100644 --- a/packages/query-core/src/types.ts +++ b/packages/query-core/src/types.ts @@ -3,7 +3,7 @@ import type { MutationState } from './mutation' import type { FetchDirection, Query, QueryBehavior } from './query' import type { RetryDelayValue, RetryValue } from './retryer' -import type { QueryFilters, QueryTypeFilter } from './utils' +import type { QueryFilters, QueryTypeFilter, SkipToken } from './utils' import type { QueryCache } from './queryCache' import type { MutationCache } from './mutationCache' @@ -147,7 +147,7 @@ export interface QueryOptions< * Setting it to `Infinity` will disable garbage collection. */ gcTime?: number - queryFn?: QueryFunction + queryFn?: QueryFunction | SkipToken persister?: QueryPersister< NoInfer, NoInfer, diff --git a/packages/query-core/src/utils.ts b/packages/query-core/src/utils.ts index 91af0759c1..3962b12645 100644 --- a/packages/query-core/src/utils.ts +++ b/packages/query-core/src/utils.ts @@ -342,3 +342,6 @@ export function addToStart(items: Array, item: T, max = 0): Array { const newItems = [item, ...items] return max && newItems.length > max ? newItems.slice(0, -1) : newItems } + +export const skipToken = Symbol() +export type SkipToken = typeof skipToken diff --git a/packages/query-persist-client-core/package.json b/packages/query-persist-client-core/package.json index 12d9646030..1aaffd4ac8 100644 --- a/packages/query-persist-client-core/package.json +++ b/packages/query-persist-client-core/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-persist-client-core", - "version": "5.24.8", + "version": "5.25.0", "description": "Set of utilities for interacting with persisters, which can save your queryClient for later use", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-sync-storage-persister/package.json b/packages/query-sync-storage-persister/package.json index bcd80080d2..8bf154d84d 100644 --- a/packages/query-sync-storage-persister/package.json +++ b/packages/query-sync-storage-persister/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-sync-storage-persister", - "version": "5.24.8", + "version": "5.25.0", "description": "A persister for synchronous storages, to be used with TanStack/Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-devtools/package.json b/packages/react-query-devtools/package.json index a90b487076..6892c933b8 100644 --- a/packages/react-query-devtools/package.json +++ b/packages/react-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query-devtools", - "version": "5.24.8", + "version": "5.25.0", "description": "Developer tools to interact with and visualize the TanStack/react-query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-next-experimental/package.json b/packages/react-query-next-experimental/package.json index d314371377..0c7b5ebded 100644 --- a/packages/react-query-next-experimental/package.json +++ b/packages/react-query-next-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query-next-experimental", - "version": "5.24.8", + "version": "5.25.0", "description": "Hydration utils for React Query in the NextJs app directory", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-persist-client/package.json b/packages/react-query-persist-client/package.json index 7f802c43a6..501010e972 100644 --- a/packages/react-query-persist-client/package.json +++ b/packages/react-query-persist-client/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query-persist-client", - "version": "5.24.8", + "version": "5.25.0", "description": "React bindings to work with persisters in TanStack/react-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query/package.json b/packages/react-query/package.json index a454d730b9..a444988661 100644 --- a/packages/react-query/package.json +++ b/packages/react-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query", - "version": "5.24.8", + "version": "5.25.0", "description": "Hooks for managing, caching and syncing asynchronous and remote data in React", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query/src/__tests__/queryOptions.test-d.tsx b/packages/react-query/src/__tests__/queryOptions.test-d.tsx index 449e4923e0..dcb8d0ca47 100644 --- a/packages/react-query/src/__tests__/queryOptions.test-d.tsx +++ b/packages/react-query/src/__tests__/queryOptions.test-d.tsx @@ -1,6 +1,5 @@ import { describe, expect, expectTypeOf, it } from 'vitest' -import { QueryClient } from '@tanstack/query-core' -import { dataTagSymbol } from '@tanstack/query-core' +import { QueryClient, dataTagSymbol, skipToken } from '@tanstack/query-core' import { queryOptions } from '../queryOptions' import { useQuery } from '../useQuery' import { useQueries } from '../useQueries' @@ -43,6 +42,7 @@ describe('queryOptions', () => { const { data } = useSuspenseQuery(options) expectTypeOf(data).toEqualTypeOf() }) + it('should work when passed to fetchQuery', async () => { const options = queryOptions({ queryKey: ['key'], @@ -147,4 +147,26 @@ describe('queryOptions', () => { const data = queryClient.setQueryData(queryKey, 5) expectTypeOf(data).toEqualTypeOf() }) + + it('should infer even if there is a conditional skipToken', () => { + const options = queryOptions({ + queryKey: ['key'], + queryFn: Math.random() > 0.5 ? skipToken : () => Promise.resolve(5), + }) + + const queryClient = new QueryClient() + const data = queryClient.getQueryData(options.queryKey) + expectTypeOf(data).toEqualTypeOf() + }) + + it('should infer to unknown if we disable a query with just a skipToken', () => { + const options = queryOptions({ + queryKey: ['key'], + queryFn: skipToken, + }) + + const queryClient = new QueryClient() + const data = queryClient.getQueryData(options.queryKey) + expectTypeOf(data).toEqualTypeOf() + }) }) diff --git a/packages/react-query/src/__tests__/suspense.test-d.tsx b/packages/react-query/src/__tests__/suspense.test-d.tsx index 9367866753..6d333a817a 100644 --- a/packages/react-query/src/__tests__/suspense.test-d.tsx +++ b/packages/react-query/src/__tests__/suspense.test-d.tsx @@ -1,6 +1,7 @@ import { describe, expectTypeOf, it } from 'vitest' import { useSuspenseQuery } from '../useSuspenseQuery' import { useSuspenseInfiniteQuery } from '../useSuspenseInfiniteQuery' +import type { UseSuspenseQueryOptions } from '..' import type { InfiniteData } from '@tanstack/query-core' describe('useSuspenseQuery', () => { @@ -121,4 +122,14 @@ describe('useSuspenseInfiniteQuery', () => { // @ts-expect-error TS2339 query.isPlaceholderData }) + + it('should not accept skipToken type for queryFn in useSuspenseQuery', () => { + const query: UseSuspenseQueryOptions = { + // @ts-expect-error + queryFn: skipToken, + queryKey: [1], + } + + return query + }) }) diff --git a/packages/react-query/src/__tests__/useQueries.test.tsx b/packages/react-query/src/__tests__/useQueries.test.tsx index d52492f64f..7b8f3d5512 100644 --- a/packages/react-query/src/__tests__/useQueries.test.tsx +++ b/packages/react-query/src/__tests__/useQueries.test.tsx @@ -2,7 +2,7 @@ import { describe, expect, expectTypeOf, it, vi } from 'vitest' import { fireEvent, render, waitFor } from '@testing-library/react' import * as React from 'react' import { ErrorBoundary } from 'react-error-boundary' -import { QueryCache, queryOptions, useQueries } from '..' +import { QueryCache, queryOptions, skipToken, useQueries } from '..' import { createQueryClient, expectTypeNotAny, @@ -17,7 +17,7 @@ import type { UseQueryOptions, UseQueryResult, } from '..' -import type { QueryFunctionContext } from '@tanstack/query-core' +import type { QueryFunctionContext, SkipToken } from '@tanstack/query-core' describe('useQueries', () => { const queryCache = new QueryCache() @@ -704,15 +704,18 @@ describe('useQueries', () => { // no need to type the mapped query (query) => { const { queryFn: fn, queryKey: key } = query - expectTypeOf | undefined>(fn) + expectTypeOf< + QueryFunction | undefined | SkipToken + >(fn) return { queryKey: key, - queryFn: fn - ? (ctx: QueryFunctionContext) => { - expectTypeOf(ctx.queryKey) - return fn.call({}, ctx) - } - : undefined, + queryFn: + fn && fn !== skipToken + ? (ctx: QueryFunctionContext) => { + expectTypeOf(ctx.queryKey) + return fn.call({}, ctx) + } + : undefined, } }, ), diff --git a/packages/react-query/src/__tests__/useQuery.test.tsx b/packages/react-query/src/__tests__/useQuery.test.tsx index 18888856a9..762f612c3a 100644 --- a/packages/react-query/src/__tests__/useQuery.test.tsx +++ b/packages/react-query/src/__tests__/useQuery.test.tsx @@ -2,6 +2,7 @@ import { describe, expect, expectTypeOf, it, test, vi } from 'vitest' import { act, fireEvent, render, waitFor } from '@testing-library/react' import * as React from 'react' import { ErrorBoundary } from 'react-error-boundary' +import { skipToken } from '@tanstack/query-core' import { QueryCache, keepPreviousData, useQuery } from '..' import { Blink, @@ -6329,4 +6330,51 @@ describe('useQuery', () => { expect(() => render()).toThrow('Bad argument type') consoleMock.mockRestore() }) + + it('should respect skipToken and refetch when skipToken is taken away', async () => { + const key = queryKey() + + function Page({ enabled }: { enabled: boolean }) { + const { data, status } = useQuery({ + queryKey: [key], + queryFn: enabled + ? async () => { + await sleep(10) + + return Promise.resolve('data') + } + : skipToken, + retry: false, + retryOnMount: false, + refetchOnMount: false, + refetchOnWindowFocus: false, + }) + + return ( +
+
status: {status}
+
data: {String(data)}
+
+ ) + } + + function App() { + const [enabled, toggle] = React.useReducer((x) => !x, false) + + return ( +
+ + +
+ ) + } + + const rendered = renderWithClient(queryClient, ) + + await waitFor(() => rendered.getByText('status: pending')) + + fireEvent.click(rendered.getByRole('button', { name: 'enable' })) + await waitFor(() => rendered.getByText('status: success')) + await waitFor(() => rendered.getByText('data: data')) + }) }) diff --git a/packages/react-query/src/useQueries.ts b/packages/react-query/src/useQueries.ts index 34e9b38be0..9da316d90e 100644 --- a/packages/react-query/src/useQueries.ts +++ b/packages/react-query/src/useQueries.ts @@ -32,6 +32,7 @@ import type { QueryClient, QueryFunction, QueryKey, + SkipToken, ThrowOnError, } from '@tanstack/query-core' @@ -73,7 +74,9 @@ type GetOptions = ? UseQueryOptionsForUseQueries : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided T extends { - queryFn?: QueryFunction + queryFn?: + | QueryFunction + | SkipToken select?: (data: any) => infer TData throwOnError?: ThrowOnError } @@ -84,10 +87,9 @@ type GetOptions = TQueryKey > : T extends { - queryFn?: QueryFunction< - infer TQueryFnData, - infer TQueryKey - > + queryFn?: + | QueryFunction + | SkipToken throwOnError?: ThrowOnError } ? UseQueryOptionsForUseQueries< @@ -133,7 +135,7 @@ type GetResults = ? GetDefinedOrUndefinedQueryResult : // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided T extends { - queryFn?: QueryFunction + queryFn?: QueryFunction | SkipToken select?: (data: any) => infer TData throwOnError?: ThrowOnError } @@ -143,7 +145,9 @@ type GetResults = unknown extends TError ? DefaultError : TError > : T extends { - queryFn?: QueryFunction + queryFn?: + | QueryFunction + | SkipToken throwOnError?: ThrowOnError } ? GetDefinedOrUndefinedQueryResult< diff --git a/packages/react-query/src/useSuspenseQueries.ts b/packages/react-query/src/useSuspenseQueries.ts index 1d58da0c53..1802e3a207 100644 --- a/packages/react-query/src/useSuspenseQueries.ts +++ b/packages/react-query/src/useSuspenseQueries.ts @@ -6,6 +6,7 @@ import type { DefaultError, QueryClient, QueryFunction, + SkipToken, ThrowOnError, } from '@tanstack/query-core' @@ -33,7 +34,9 @@ type GetSuspenseOptions = ? UseSuspenseQueryOptions : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided T extends { - queryFn?: QueryFunction + queryFn?: + | QueryFunction + | SkipToken select?: (data: any) => infer TData throwOnError?: ThrowOnError } @@ -44,10 +47,9 @@ type GetSuspenseOptions = TQueryKey > : T extends { - queryFn?: QueryFunction< - infer TQueryFnData, - infer TQueryKey - > + queryFn?: + | QueryFunction + | SkipToken throwOnError?: ThrowOnError } ? UseSuspenseQueryOptions< diff --git a/packages/react-query/src/useSuspenseQuery.ts b/packages/react-query/src/useSuspenseQuery.ts index 3bf6039d01..9bc53e6fd6 100644 --- a/packages/react-query/src/useSuspenseQuery.ts +++ b/packages/react-query/src/useSuspenseQuery.ts @@ -1,5 +1,5 @@ 'use client' -import { QueryObserver } from '@tanstack/query-core' +import { QueryObserver, skipToken } from '@tanstack/query-core' import { useBaseQuery } from './useBaseQuery' import { defaultThrowOnError } from './suspense' import type { UseSuspenseQueryOptions, UseSuspenseQueryResult } from './types' @@ -14,6 +14,12 @@ export function useSuspenseQuery< options: UseSuspenseQueryOptions, queryClient?: QueryClient, ): UseSuspenseQueryResult { + if (process.env.NODE_ENV !== 'production') { + if (options.queryFn === skipToken) { + console.error('skipToken is not allowed for useSuspenseQuery') + } + } + return useBaseQuery( { ...options, diff --git a/packages/solid-query-devtools/package.json b/packages/solid-query-devtools/package.json index 0fadc21a93..97c85367e4 100644 --- a/packages/solid-query-devtools/package.json +++ b/packages/solid-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-query-devtools", - "version": "5.24.8", + "version": "5.25.0", "description": "Developer tools to interact with and visualize the TanStack/solid-query Query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query-persist-client/package.json b/packages/solid-query-persist-client/package.json index 97314bfce2..1c9a1177bf 100644 --- a/packages/solid-query-persist-client/package.json +++ b/packages/solid-query-persist-client/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-query-persist-client", - "version": "5.24.8", + "version": "5.25.0", "description": "Solid.js bindings to work with persisters in TanStack/solid-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query/package.json b/packages/solid-query/package.json index ea7ebc907d..aa681ab493 100644 --- a/packages/solid-query/package.json +++ b/packages/solid-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-query", - "version": "5.24.8", + "version": "5.25.0", "description": "Primitives for managing, caching and syncing asynchronous and remote data in Solid", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query/src/__tests__/createQueries.test.tsx b/packages/solid-query/src/__tests__/createQueries.test.tsx index 294e336b30..5dffe87246 100644 --- a/packages/solid-query/src/__tests__/createQueries.test.tsx +++ b/packages/solid-query/src/__tests__/createQueries.test.tsx @@ -10,7 +10,11 @@ import { createQueries, } from '..' import { createQueryClient, expectTypeNotAny, queryKey, sleep } from './utils' -import type { QueryFunctionContext, QueryKey } from '@tanstack/query-core' +import type { + QueryFunctionContext, + QueryKey, + SkipToken, +} from '@tanstack/query-core' import type { CreateQueryResult, QueryFunction, @@ -581,13 +585,18 @@ describe('useQueries', () => { // no need to type the mapped query (query) => { const { queryFn: fn, queryKey: key } = query - expectTypeOf | undefined>(fn) + expectTypeOf< + QueryFunction | SkipToken | undefined + >(fn) return { queryKey: key, queryFn: fn ? (ctx: QueryFunctionContext) => { expectTypeOf(ctx.queryKey) - return fn.call({}, ctx) + return (fn as QueryFunction).call( + {}, + ctx, + ) } : undefined, } diff --git a/packages/solid-query/src/createQueries.ts b/packages/solid-query/src/createQueries.ts index 9fffdf60cb..fc4d8a9368 100644 --- a/packages/solid-query/src/createQueries.ts +++ b/packages/solid-query/src/createQueries.ts @@ -23,6 +23,7 @@ import type { QueryFunction, QueryKey, QueryObserverResult, + SkipToken, ThrowOnError, } from '@tanstack/query-core' @@ -64,7 +65,9 @@ type GetOptions = ? CreateQueryOptionsForCreateQueries : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided T extends { - queryFn?: QueryFunction + queryFn?: + | QueryFunction + | SkipToken select?: (data: any) => infer TData throwOnError?: ThrowOnError } @@ -75,10 +78,9 @@ type GetOptions = TQueryKey > : T extends { - queryFn?: QueryFunction< - infer TQueryFnData, - infer TQueryKey - > + queryFn?: + | QueryFunction + | SkipToken throwOnError?: ThrowOnError } ? CreateQueryOptionsForCreateQueries< diff --git a/packages/svelte-query-devtools/package.json b/packages/svelte-query-devtools/package.json index b6a6989928..b8d029ebce 100644 --- a/packages/svelte-query-devtools/package.json +++ b/packages/svelte-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/svelte-query-devtools", - "version": "5.24.8", + "version": "5.25.0", "description": "Developer tools to interact with and visualize the TanStack/svelte-query cache", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/svelte-query-persist-client/package.json b/packages/svelte-query-persist-client/package.json index affc033eec..b9b0c4983f 100644 --- a/packages/svelte-query-persist-client/package.json +++ b/packages/svelte-query-persist-client/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/svelte-query-persist-client", - "version": "5.24.8", + "version": "5.25.0", "description": "Svelte bindings to work with persisters in TanStack/svelte-query", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/svelte-query/package.json b/packages/svelte-query/package.json index 3f05c51276..9447e7ed09 100644 --- a/packages/svelte-query/package.json +++ b/packages/svelte-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/svelte-query", - "version": "5.24.8", + "version": "5.25.0", "description": "Primitives for managing, caching and syncing asynchronous and remote data in Svelte", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/svelte-query/src/createQueries.ts b/packages/svelte-query/src/createQueries.ts index cb8d0c4bd1..48eb64fe5e 100644 --- a/packages/svelte-query/src/createQueries.ts +++ b/packages/svelte-query/src/createQueries.ts @@ -14,6 +14,7 @@ import type { QueryKey, QueryObserverOptions, QueryObserverResult, + SkipToken, ThrowOnError, } from '@tanstack/query-core' @@ -55,7 +56,9 @@ type GetOptions = ? QueryObserverOptionsForCreateQueries : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided T extends { - queryFn?: QueryFunction + queryFn?: + | QueryFunction + | SkipToken select?: (data: any) => infer TData throwOnError?: ThrowOnError } @@ -66,10 +69,9 @@ type GetOptions = TQueryKey > : T extends { - queryFn?: QueryFunction< - infer TQueryFnData, - infer TQueryKey - > + queryFn?: + | QueryFunction + | SkipToken throwOnError?: ThrowOnError } ? QueryObserverOptionsForCreateQueries< diff --git a/packages/vue-query-devtools/package.json b/packages/vue-query-devtools/package.json index e340435211..895ea060ed 100644 --- a/packages/vue-query-devtools/package.json +++ b/packages/vue-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/vue-query-devtools", - "version": "5.24.8", + "version": "5.25.0", "description": "Developer tools to interact with and visualize the TanStack/vue-query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/vue-query/package.json b/packages/vue-query/package.json index 734b2b1d71..855984448f 100644 --- a/packages/vue-query/package.json +++ b/packages/vue-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/vue-query", - "version": "5.24.8", + "version": "5.25.0", "description": "Hooks for managing, caching and syncing asynchronous and remote data in Vue", "author": "Damian Osipiuk", "license": "MIT", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f95ed92c00..8aa0338e74 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -146,7 +146,7 @@ importers: specifier: ^17.1.3 version: 17.1.3(@angular/common@17.1.3)(@angular/core@17.1.3)(@angular/platform-browser@17.1.3)(rxjs@7.8.1) '@tanstack/angular-query-experimental': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.1 @@ -168,7 +168,7 @@ importers: specifier: ^17.1.3 version: 17.1.3(@angular/compiler@17.1.3)(typescript@5.2.2) '@tanstack/angular-query-devtools-experimental': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/angular-query-devtools-experimental typescript: specifier: 5.2.2 @@ -201,7 +201,7 @@ importers: specifier: ^17.1.3 version: 17.1.3(@angular/common@17.1.3)(@angular/core@17.1.3)(@angular/platform-browser@17.1.3)(rxjs@7.8.1) '@tanstack/angular-query-experimental': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.1 @@ -223,7 +223,7 @@ importers: specifier: ^17.1.3 version: 17.1.3(@angular/compiler@17.1.3)(typescript@5.2.2) '@tanstack/angular-query-devtools-experimental': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/angular-query-devtools-experimental typescript: specifier: 5.2.2 @@ -256,7 +256,7 @@ importers: specifier: ^17.1.3 version: 17.1.3(@angular/common@17.1.3)(@angular/core@17.1.3)(@angular/platform-browser@17.1.3)(rxjs@7.8.1) '@tanstack/angular-query-experimental': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.1 @@ -278,7 +278,7 @@ importers: specifier: ^17.1.3 version: 17.1.3(@angular/compiler@17.1.3)(typescript@5.2.2) '@tanstack/angular-query-devtools-experimental': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/angular-query-devtools-experimental typescript: specifier: 5.2.2 @@ -311,7 +311,7 @@ importers: specifier: ^17.1.3 version: 17.1.3(@angular/common@17.1.3)(@angular/core@17.1.3)(@angular/platform-browser@17.1.3)(rxjs@7.8.1) '@tanstack/angular-query-experimental': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.1 @@ -333,7 +333,7 @@ importers: specifier: ^17.1.3 version: 17.1.3(@angular/compiler@17.1.3)(typescript@5.2.2) '@tanstack/angular-query-devtools-experimental': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/angular-query-devtools-experimental typescript: specifier: 5.2.2 @@ -348,10 +348,10 @@ importers: specifier: 4.22.1 version: 4.22.1 '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools algoliasearch: specifier: 4.22.1 @@ -385,10 +385,10 @@ importers: examples/react/auto-refetching: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools axios: specifier: ^1.6.7 @@ -409,10 +409,10 @@ importers: examples/react/basic: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools axios: specifier: ^1.6.7 @@ -437,10 +437,10 @@ importers: examples/react/basic-graphql-request: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools graphql: specifier: ^16.8.1 @@ -465,16 +465,16 @@ importers: examples/react/basic-typescript: dependencies: '@tanstack/query-sync-storage-persister': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/query-sync-storage-persister '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools '@tanstack/react-query-persist-client': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-persist-client axios: specifier: ^1.6.7 @@ -514,10 +514,10 @@ importers: examples/react/default-query-function: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools axios: specifier: ^1.6.7 @@ -539,10 +539,10 @@ importers: examples/react/infinite-query-with-max-pages: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools axios: specifier: ^1.6.7 @@ -566,10 +566,10 @@ importers: examples/react/load-more-infinite-scroll: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools axios: specifier: ^1.6.7 @@ -593,10 +593,10 @@ importers: examples/react/nextjs: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools ky: specifier: ^1.2.0 @@ -620,13 +620,13 @@ importers: examples/react/nextjs-suspense-streaming: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools '@tanstack/react-query-next-experimental': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-next-experimental next: specifier: ^14.0.0 @@ -654,19 +654,19 @@ importers: examples/react/offline: dependencies: '@tanstack/query-sync-storage-persister': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/query-sync-storage-persister '@tanstack/react-location': specifier: ^3.7.4 version: 3.7.4(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools '@tanstack/react-query-persist-client': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-persist-client ky: specifier: ^1.2.0 @@ -694,10 +694,10 @@ importers: examples/react/optimistic-updates-cache: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools axios: specifier: ^1.6.7 @@ -731,10 +731,10 @@ importers: examples/react/optimistic-updates-ui: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools axios: specifier: ^1.6.7 @@ -768,10 +768,10 @@ importers: examples/react/pagination: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools axios: specifier: ^1.6.7 @@ -792,10 +792,10 @@ importers: examples/react/playground: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools react: specifier: ^18.2.0 @@ -814,10 +814,10 @@ importers: examples/react/prefetching: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools axios: specifier: ^1.6.7 @@ -847,10 +847,10 @@ importers: specifier: ^6.3.16 version: 6.3.16(@react-navigation/native@6.1.6)(react-native-gesture-handler@2.15.0)(react-native-safe-area-context@4.9.0)(react-native-screens@3.29.0)(react-native@0.73.4)(react@18.2.0) '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools expo: specifier: ^50.0.6 @@ -899,10 +899,10 @@ importers: examples/react/react-router: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools localforage: specifier: ^1.10.0 @@ -963,10 +963,10 @@ importers: specifier: ^5.15.2 version: 5.15.2(@types/react@18.2.55)(react@18.2.0) '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools react: specifier: ^18.2.0 @@ -991,10 +991,10 @@ importers: examples/react/simple: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools axios: specifier: ^1.6.7 @@ -1028,10 +1028,10 @@ importers: specifier: ^5.15.2 version: 5.15.2(@types/react@18.2.55)(react@18.2.0) '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools react: specifier: ^18.2.0 @@ -1056,10 +1056,10 @@ importers: examples/react/suspense: dependencies: '@tanstack/react-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/react-query-devtools axios: specifier: ^1.6.7 @@ -1087,10 +1087,10 @@ importers: examples/solid/basic-graphql-request: dependencies: '@tanstack/solid-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/solid-query-devtools graphql: specifier: ^16.8.1 @@ -1115,10 +1115,10 @@ importers: examples/solid/basic-typescript: dependencies: '@tanstack/solid-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.8.14 @@ -1137,10 +1137,10 @@ importers: examples/solid/default-query-function: dependencies: '@tanstack/solid-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.8.14 @@ -1159,10 +1159,10 @@ importers: examples/solid/simple: dependencies: '@tanstack/solid-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.8.14 @@ -1193,10 +1193,10 @@ importers: specifier: ^0.5.4 version: 0.5.4(@testing-library/jest-dom@6.4.2)(rollup@4.6.0)(solid-js@1.8.14)(vinxi@0.3.3)(vite@4.5.1) '@tanstack/solid-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.8.14 @@ -1208,10 +1208,10 @@ importers: examples/svelte/auto-refetching: dependencies: '@tanstack/svelte-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1239,10 +1239,10 @@ importers: examples/svelte/basic: dependencies: '@tanstack/svelte-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1270,10 +1270,10 @@ importers: examples/svelte/load-more-infinite-scroll: dependencies: '@tanstack/svelte-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1301,10 +1301,10 @@ importers: examples/svelte/optimistic-updates-typescript: dependencies: '@tanstack/svelte-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1332,10 +1332,10 @@ importers: examples/svelte/playground: dependencies: '@tanstack/svelte-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1363,10 +1363,10 @@ importers: examples/svelte/simple: dependencies: '@tanstack/svelte-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/vite-plugin-svelte': @@ -1391,10 +1391,10 @@ importers: examples/svelte/ssr: dependencies: '@tanstack/svelte-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1422,10 +1422,10 @@ importers: examples/svelte/star-wars: dependencies: '@tanstack/svelte-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1462,10 +1462,10 @@ importers: examples/vue/basic: dependencies: '@tanstack/vue-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/vue-query '@tanstack/vue-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/vue-query-devtools vue: specifier: ^3.3.0 @@ -1484,7 +1484,7 @@ importers: examples/vue/dependent-queries: dependencies: '@tanstack/vue-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/vue-query vue: specifier: ^3.3.0 @@ -1503,16 +1503,16 @@ importers: examples/vue/persister: dependencies: '@tanstack/query-core': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/query-core '@tanstack/query-persist-client-core': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/query-persist-client-core '@tanstack/query-sync-storage-persister': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/query-sync-storage-persister '@tanstack/vue-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/vue-query idb-keyval: specifier: ^6.2.1 @@ -1534,10 +1534,10 @@ importers: examples/vue/simple: dependencies: '@tanstack/vue-query': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/vue-query '@tanstack/vue-query-devtools': - specifier: ^5.24.8 + specifier: ^5.25.0 version: link:../../../packages/vue-query-devtools vue: specifier: ^3.3.0