From dab6c6cfd08513311d8800ea29964044dc806030 Mon Sep 17 00:00:00 2001 From: Damian Osipiuk Date: Fri, 9 Sep 2022 23:17:32 +0200 Subject: [PATCH] feat: initialData type narrowing (#240) --- package-lock.json | 14 +++---- package.json | 2 +- src/vuejs/useQuery.ts | 98 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 103 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 53f78c2..768f2aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0-semantic", "license": "MIT", "dependencies": { - "@tanstack/query-core": "^4.0.5", + "@tanstack/query-core": "^4.2.3", "@vue/devtools-api": "^6.2.1", "match-sorter": "^6.3.1", "vue-demi": "^0.13.5" @@ -2004,9 +2004,9 @@ } }, "node_modules/@tanstack/query-core": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.0.5.tgz", - "integrity": "sha512-QOJ2gLbwlf8p0487pMey6vv8EF5X2ib1zINayaD7mb9/LibUtXmZ12uJgTqcnjgNY/4tWZn5qJnEk2ePG5AVGA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.2.3.tgz", + "integrity": "sha512-zdt5lYWs1dZaA3IxJbCgtAfHZJScRZONpiLL7YkeOkrme5MfjQqTpjq7LYbzpyuwPOh2Jx68le0PLl57JFv5hQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -10779,9 +10779,9 @@ } }, "@tanstack/query-core": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.0.5.tgz", - "integrity": "sha512-QOJ2gLbwlf8p0487pMey6vv8EF5X2ib1zINayaD7mb9/LibUtXmZ12uJgTqcnjgNY/4tWZn5qJnEk2ePG5AVGA==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.2.3.tgz", + "integrity": "sha512-zdt5lYWs1dZaA3IxJbCgtAfHZJScRZONpiLL7YkeOkrme5MfjQqTpjq7LYbzpyuwPOh2Jx68le0PLl57JFv5hQ==" }, "@tootallnate/once": { "version": "2.0.0", diff --git a/package.json b/package.json index 074119d..a38e59c 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "homepage": "https://github.com/DamianOsipiuk/vue-query#readme", "dependencies": { "@vue/devtools-api": "^6.2.1", - "@tanstack/query-core": "^4.0.5", + "@tanstack/query-core": "^4.2.3", "match-sorter": "^6.3.1", "vue-demi": "^0.13.5" }, diff --git a/src/vuejs/useQuery.ts b/src/vuejs/useQuery.ts index 81c231a..a44ebea 100644 --- a/src/vuejs/useQuery.ts +++ b/src/vuejs/useQuery.ts @@ -1,9 +1,10 @@ -import type { UnwrapRef } from "vue-demi"; +import type { ToRefs, UnwrapRef } from "vue-demi"; import { QueryObserver } from "@tanstack/query-core"; import type { QueryFunction, QueryKey, QueryObserverResult, + DefinedQueryObserverResult, } from "@tanstack/query-core"; import { useBaseQuery, UseQueryReturnType as UQRT } from "./useBaseQuery"; import type { WithQueryClientKey, VueQueryObserverOptions } from "./types"; @@ -16,6 +17,15 @@ type UseQueryReturnType = Omit< remove: QueryObserverResult["remove"]; }; +type UseQueryDefinedReturnType = Omit< + ToRefs>>, + "refetch" | "remove" +> & { + suspense: () => Promise>; + refetch: QueryObserverResult["refetch"]; + remove: QueryObserverResult["remove"]; +}; + export type UseQueryOptions< TQueryFnData = unknown, TError = unknown, @@ -25,6 +35,30 @@ export type UseQueryOptions< VueQueryObserverOptions >; +export function useQuery< + TQueryFnData = unknown, + TError = unknown, + TData = TQueryFnData, + TQueryKey extends QueryKey = QueryKey +>( + options: Omit< + UseQueryOptions, + "initialData" + > & { initialData?: () => undefined } +): UseQueryReturnType; + +export function useQuery< + TQueryFnData = unknown, + TError = unknown, + TData = TQueryFnData, + TQueryKey extends QueryKey = QueryKey +>( + options: Omit< + UseQueryOptions, + "initialData" + > & { initialData: TQueryFnData | (() => TQueryFnData) } +): UseQueryDefinedReturnType; + export function useQuery< TQueryFnData = unknown, TError = unknown, @@ -33,6 +67,33 @@ export function useQuery< >( options: UseQueryOptions ): UseQueryReturnType; + +export function useQuery< + TQueryFnData = unknown, + TError = unknown, + TData = TQueryFnData, + TQueryKey extends QueryKey = QueryKey +>( + queryKey: TQueryKey, + options?: Omit< + UseQueryOptions, + "queryKey" | "initialData" + > & { initialData?: () => undefined } +): UseQueryReturnType; + +export function useQuery< + TQueryFnData = unknown, + TError = unknown, + TData = TQueryFnData, + TQueryKey extends QueryKey = QueryKey +>( + queryKey: TQueryKey, + options?: Omit< + UseQueryOptions, + "queryKey" | "initialData" + > & { initialData: TQueryFnData | (() => TQueryFnData) } +): UseQueryDefinedReturnType; + export function useQuery< TQueryFnData = unknown, TError = unknown, @@ -45,6 +106,35 @@ export function useQuery< "queryKey" > ): UseQueryReturnType; + +export function useQuery< + TQueryFnData = unknown, + TError = unknown, + TData = TQueryFnData, + TQueryKey extends QueryKey = QueryKey +>( + queryKey: TQueryKey, + queryFn: QueryFunction, + options?: Omit< + UseQueryOptions, + "queryKey" | "queryFn" | "initialData" + > & { initialData?: () => undefined } +): UseQueryReturnType; + +export function useQuery< + TQueryFnData = unknown, + TError = unknown, + TData = TQueryFnData, + TQueryKey extends QueryKey = QueryKey +>( + queryKey: TQueryKey, + queryFn: QueryFunction, + options?: Omit< + UseQueryOptions, + "queryKey" | "queryFn" | "initialData" + > & { initialData: TQueryFnData | (() => TQueryFnData) } +): UseQueryDefinedReturnType; + export function useQuery< TQueryFnData = unknown, TError = unknown, @@ -52,7 +142,7 @@ export function useQuery< TQueryKey extends QueryKey = QueryKey >( queryKey: TQueryKey, - queryFn: QueryFunction>, + queryFn: QueryFunction, options?: Omit< UseQueryOptions, "queryKey" | "queryFn" @@ -70,7 +160,9 @@ export function useQuery< | QueryFunction> | UseQueryOptions, arg3?: UseQueryOptions -): UseQueryReturnType { +): + | UseQueryReturnType + | UseQueryDefinedReturnType { const result = useBaseQuery(QueryObserver, arg1, arg2, arg3); return {