From de920b44ca498f1a1aed871ae0ff612c4b43ec53 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Tue, 18 Oct 2022 15:09:56 -0400 Subject: [PATCH 01/40] update --- packages/vue-query/src/types.ts | 21 +++++--- packages/vue-query/src/useMutation.ts | 72 ++++++++++++++------------- 2 files changed, 51 insertions(+), 42 deletions(-) diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index a9c8a6f423..35ab598205 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -1,18 +1,25 @@ -/* istanbul ignore file */ - import type { QueryKey, QueryObserverOptions, InfiniteQueryObserverOptions, } from '@tanstack/query-core' -import type { Ref, UnwrapRef } from 'vue-demi' -import type { QueryClient } from './queryClient' +import type { Ref, UnwrapRef, ComputedRef } from 'vue-demi' +import type { QueryClient } from '@tanstack/vue-query' + +export type MaybeRef = Ref | T | ComputedRef +export type MaybeRefArgs = T extends Function + ? T + : + T extends object + ? { + [Property in keyof T]: MaybeRef + } + : T -export type MaybeRef = Ref | T export type MaybeRefDeep = T extends Function ? T : MaybeRef< - T extends object + T extends Array | Record | Map | Set ? { [Property in keyof T]: MaybeRefDeep } @@ -90,4 +97,4 @@ export type VueInfiniteQueryObserverOptions< TQueryKey >[Property] > -} +} \ No newline at end of file diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 07fd73ffda..70b68fce74 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -1,4 +1,4 @@ -import { onScopeDispose, reactive, readonly, toRefs, watch } from 'vue-demi' +import { onScopeDispose, reactive, readonly, toRefs, watch, computed } from 'vue-demi' import type { ToRefs } from 'vue-demi' import { MutationObserver } from '@tanstack/query-core' import type { @@ -11,7 +11,7 @@ import type { } from '@tanstack/query-core' import { cloneDeepUnref, isQueryKey, updateState } from './utils' import { useQueryClient } from './useQueryClient' -import type { WithQueryClientKey } from './types' +import type { MaybeRefArgs, WithQueryClientKey, MaybeRef } from './types' type MutationResult = Omit< MutationObserverResult, @@ -29,7 +29,7 @@ type MutateSyncFunction< TVariables = void, TContext = unknown, > = ( - ...options: Parameters> + ...options: Parameters>> ) => void export type UseMutationReturnType< @@ -50,7 +50,7 @@ export function useMutation< TVariables = void, TContext = unknown, >( - options: UseMutationOptions, + options: MaybeRefArgs>, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -58,11 +58,11 @@ export function useMutation< TVariables = void, TContext = unknown, >( - mutationFn: MutationFunction, - options?: Omit< + mutationFn: MaybeRef>, + options?: MaybeRefArgs, 'mutationFn' - >, + >>, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -70,11 +70,11 @@ export function useMutation< TVariables = void, TContext = unknown, >( - mutationKey: MutationKey, - options?: Omit< + mutationKey: MaybeRef, + options?: MaybeRefArgs, 'mutationKey' - >, + >>, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -82,12 +82,12 @@ export function useMutation< TVariables = void, TContext = unknown, >( - mutationKey: MutationKey, - mutationFn?: MutationFunction, - options?: Omit< + mutationKey: MaybeRef, + mutationFn?: MaybeRef>, + options?: MaybeRefArgs, 'mutationKey' | 'mutationFn' - >, + >>, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -96,23 +96,26 @@ export function useMutation< TContext = unknown, >( arg1: - | MutationKey - | MutationFunction - | UseMutationOptions, + | MaybeRef + | MaybeRef> + | MaybeRefArgs>, arg2?: - | MutationFunction - | UseMutationOptions, - arg3?: UseMutationOptions, + | MaybeRef> + | MaybeRefArgs>, + arg3?: MaybeRefArgs>, ): UseMutationReturnType { - const options = parseMutationArgs(arg1, arg2, arg3) - const queryClient = - options.queryClient ?? useQueryClient(options.queryClientKey) - const defaultedOptions = queryClient.defaultMutationOptions(options) - const observer = new MutationObserver(queryClient, defaultedOptions) + + const options = computed(() => { + return parseMutationArgs(arg1, arg2, arg3) + }) + + const queryClient = options.value.queryClient ?? useQueryClient(options.value.queryClientKey) + + const observer = new MutationObserver(queryClient, queryClient.defaultMutationOptions(options.value)) const state = reactive(observer.getCurrentResult()) - const unsubscribe = observer.subscribe((result) => { + let unsubscribe = observer.subscribe((result) => { updateState(state, result) }) @@ -125,11 +128,10 @@ export function useMutation< }) } - watch( - [() => arg1, () => arg2, () => arg3], + watch(options, () => { observer.setOptions( - queryClient.defaultMutationOptions(parseMutationArgs(arg1, arg2, arg3)), + queryClient.defaultMutationOptions(queryClient.defaultMutationOptions(options.value)), ) }, { deep: true }, @@ -158,13 +160,13 @@ export function parseMutationArgs< TContext = unknown, >( arg1: - | MutationKey - | MutationFunction - | UseMutationOptions, + | MaybeRef + | MaybeRef> + | MaybeRefArgs>, arg2?: - | MutationFunction - | UseMutationOptions, - arg3?: UseMutationOptions, + | MaybeRef> + | MaybeRefArgs>, + arg3?: MaybeRefArgs>, ): UseMutationOptions { let options = arg1 From 381b42251281c389efed73625147d6714126c587 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Tue, 18 Oct 2022 15:20:41 -0400 Subject: [PATCH 02/40] Update utils.ts --- packages/vue-query/src/utils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/vue-query/src/utils.ts b/packages/vue-query/src/utils.ts index 7c4e1ab796..017cf940e1 100644 --- a/packages/vue-query/src/utils.ts +++ b/packages/vue-query/src/utils.ts @@ -1,5 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import type { QueryKey } from '@tanstack/query-core' +import { MaybeRef } from './types' import { isRef, unref } from 'vue-demi' import type { UnwrapRef } from 'vue-demi' @@ -10,7 +11,7 @@ export function getClientKey(key?: string) { return `${VUE_QUERY_CLIENT}${suffix}` } -export function isQueryKey(value: unknown): value is QueryKey { +export function isQueryKey(value: unknown): value is MaybeRef { return Array.isArray(value) } From a7f9195785aae8d9012f6e38ecaf4da581003a1e Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Tue, 18 Oct 2022 15:40:50 -0400 Subject: [PATCH 03/40] Update types.ts --- packages/vue-query/src/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index 35ab598205..f24c4313c1 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -10,7 +10,7 @@ export type MaybeRef = Ref | T | ComputedRef export type MaybeRefArgs = T extends Function ? T : - T extends object + T extends Array | Record | Map | Set ? { [Property in keyof T]: MaybeRef } From 20a3ba947f93ab1e8276784cc2f16284b5ae9c9c Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Tue, 18 Oct 2022 16:03:10 -0400 Subject: [PATCH 04/40] potentail fix to parseArgs typing --- packages/vue-query/src/types.ts | 2 +- packages/vue-query/src/useMutation.ts | 10 +++++----- packages/vue-query/src/utils.ts | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index f24c4313c1..35ab598205 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -10,7 +10,7 @@ export type MaybeRef = Ref | T | ComputedRef export type MaybeRefArgs = T extends Function ? T : - T extends Array | Record | Map | Set + T extends object ? { [Property in keyof T]: MaybeRef } diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 70b68fce74..fb137591fb 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -1,4 +1,4 @@ -import { onScopeDispose, reactive, readonly, toRefs, watch, computed } from 'vue-demi' +import { onScopeDispose, reactive, readonly, toRefs, watch, computed, unref, ref } from 'vue-demi' import type { ToRefs } from 'vue-demi' import { MutationObserver } from '@tanstack/query-core' import type { @@ -168,17 +168,17 @@ export function parseMutationArgs< | MaybeRefArgs>, arg3?: MaybeRefArgs>, ): UseMutationOptions { - let options = arg1 + let options = { ...arg1 } - if (isQueryKey(arg1)) { - if (typeof arg2 === 'function') { + if (isQueryKey(unref(arg1))) { + if ((typeof unref(arg2)) === 'function') { options = { ...arg3, mutationKey: arg1, mutationFn: arg2 } } else { options = { ...arg2, mutationKey: arg1 } } } - if (typeof arg1 === 'function') { + if (typeof unref(arg1) === 'function') { options = { ...arg2, mutationFn: arg1 } } diff --git a/packages/vue-query/src/utils.ts b/packages/vue-query/src/utils.ts index 017cf940e1..e32539f5e4 100644 --- a/packages/vue-query/src/utils.ts +++ b/packages/vue-query/src/utils.ts @@ -11,7 +11,7 @@ export function getClientKey(key?: string) { return `${VUE_QUERY_CLIENT}${suffix}` } -export function isQueryKey(value: unknown): value is MaybeRef { +export function isQueryKey(value: unknown): value is QueryKey { return Array.isArray(value) } From cf78d2fe893a152ec2750eb731ae9fe3db521079 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Tue, 18 Oct 2022 16:10:18 -0400 Subject: [PATCH 05/40] change name of maybeRefArgs --- packages/vue-query/src/types.ts | 2 +- packages/vue-query/src/useMutation.ts | 24 ++++++++++++------------ packages/vue-query/src/utils.ts | 1 - 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index 35ab598205..1a96a0f93a 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -7,7 +7,7 @@ import type { Ref, UnwrapRef, ComputedRef } from 'vue-demi' import type { QueryClient } from '@tanstack/vue-query' export type MaybeRef = Ref | T | ComputedRef -export type MaybeRefArgs = T extends Function +export type MaybeRefKeys = T extends Function ? T : T extends object diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index fb137591fb..4e10e187e9 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -11,7 +11,7 @@ import type { } from '@tanstack/query-core' import { cloneDeepUnref, isQueryKey, updateState } from './utils' import { useQueryClient } from './useQueryClient' -import type { MaybeRefArgs, WithQueryClientKey, MaybeRef } from './types' +import type { MaybeRefKeys, WithQueryClientKey, MaybeRef } from './types' type MutationResult = Omit< MutationObserverResult, @@ -29,7 +29,7 @@ type MutateSyncFunction< TVariables = void, TContext = unknown, > = ( - ...options: Parameters>> + ...options: Parameters>> ) => void export type UseMutationReturnType< @@ -50,7 +50,7 @@ export function useMutation< TVariables = void, TContext = unknown, >( - options: MaybeRefArgs>, + options: MaybeRefKeys>, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -59,7 +59,7 @@ export function useMutation< TContext = unknown, >( mutationFn: MaybeRef>, - options?: MaybeRefArgs, 'mutationFn' >>, @@ -71,7 +71,7 @@ export function useMutation< TContext = unknown, >( mutationKey: MaybeRef, - options?: MaybeRefArgs, 'mutationKey' >>, @@ -84,7 +84,7 @@ export function useMutation< >( mutationKey: MaybeRef, mutationFn?: MaybeRef>, - options?: MaybeRefArgs, 'mutationKey' | 'mutationFn' >>, @@ -98,11 +98,11 @@ export function useMutation< arg1: | MaybeRef | MaybeRef> - | MaybeRefArgs>, + | MaybeRefKeys>, arg2?: | MaybeRef> - | MaybeRefArgs>, - arg3?: MaybeRefArgs>, + | MaybeRefKeys>, + arg3?: MaybeRefKeys>, ): UseMutationReturnType { const options = computed(() => { @@ -162,11 +162,11 @@ export function parseMutationArgs< arg1: | MaybeRef | MaybeRef> - | MaybeRefArgs>, + | MaybeRefKeys>, arg2?: | MaybeRef> - | MaybeRefArgs>, - arg3?: MaybeRefArgs>, + | MaybeRefKeys>, + arg3?: MaybeRefKeys>, ): UseMutationOptions { let options = { ...arg1 } diff --git a/packages/vue-query/src/utils.ts b/packages/vue-query/src/utils.ts index e32539f5e4..7c4e1ab796 100644 --- a/packages/vue-query/src/utils.ts +++ b/packages/vue-query/src/utils.ts @@ -1,6 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import type { QueryKey } from '@tanstack/query-core' -import { MaybeRef } from './types' import { isRef, unref } from 'vue-demi' import type { UnwrapRef } from 'vue-demi' From af9d5a2b363de8c3c0efc5d758b51170e99517d0 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Tue, 18 Oct 2022 16:14:55 -0400 Subject: [PATCH 06/40] Update useMutation.ts --- packages/vue-query/src/useMutation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 4e10e187e9..83072fdf7f 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -1,4 +1,4 @@ -import { onScopeDispose, reactive, readonly, toRefs, watch, computed, unref, ref } from 'vue-demi' +import { onScopeDispose, reactive, readonly, toRefs, watch, computed, unref } from 'vue-demi' import type { ToRefs } from 'vue-demi' import { MutationObserver } from '@tanstack/query-core' import type { From 927f5f3a97d31d231531ac4b12dfcc8a0c095351 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Tue, 18 Oct 2022 16:22:58 -0400 Subject: [PATCH 07/40] update --- packages/query-core/src/types.ts | 1 - packages/vue-query/src/mutationCache.ts | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/query-core/src/types.ts b/packages/query-core/src/types.ts index d9ad805cd9..6d3c8c1e84 100644 --- a/packages/query-core/src/types.ts +++ b/packages/query-core/src/types.ts @@ -1,5 +1,4 @@ /* istanbul ignore file */ - import type { MutationState } from './mutation' import type { QueryBehavior, Query } from './query' import type { RetryValue, RetryDelayValue } from './retryer' diff --git a/packages/vue-query/src/mutationCache.ts b/packages/vue-query/src/mutationCache.ts index d12edd522f..fed21c0e36 100644 --- a/packages/vue-query/src/mutationCache.ts +++ b/packages/vue-query/src/mutationCache.ts @@ -1,16 +1,16 @@ import { MutationCache as MC } from '@tanstack/query-core' import type { Mutation, MutationFilters } from '@tanstack/query-core' -import type { MaybeRefDeep } from './types' +import type { MaybeRefKeys } from './types' import { cloneDeepUnref } from './utils' export class MutationCache extends MC { find( - filters: MaybeRefDeep, + filters: MaybeRefKeys, ): Mutation | undefined { return super.find(cloneDeepUnref(filters) as MutationFilters) } - findAll(filters: MaybeRefDeep): Mutation[] { + findAll(filters: MaybeRefKeys): Mutation[] { return super.findAll(cloneDeepUnref(filters) as MutationFilters) } } From b5ec820846deefb624a8658ef3e2f1599f62d8f4 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Tue, 18 Oct 2022 16:29:42 -0400 Subject: [PATCH 08/40] revert some stuff --- packages/vue-query/src/mutationCache.ts | 6 +++--- packages/vue-query/src/types.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/vue-query/src/mutationCache.ts b/packages/vue-query/src/mutationCache.ts index fed21c0e36..d12edd522f 100644 --- a/packages/vue-query/src/mutationCache.ts +++ b/packages/vue-query/src/mutationCache.ts @@ -1,16 +1,16 @@ import { MutationCache as MC } from '@tanstack/query-core' import type { Mutation, MutationFilters } from '@tanstack/query-core' -import type { MaybeRefKeys } from './types' +import type { MaybeRefDeep } from './types' import { cloneDeepUnref } from './utils' export class MutationCache extends MC { find( - filters: MaybeRefKeys, + filters: MaybeRefDeep, ): Mutation | undefined { return super.find(cloneDeepUnref(filters) as MutationFilters) } - findAll(filters: MaybeRefKeys): Mutation[] { + findAll(filters: MaybeRefDeep): Mutation[] { return super.findAll(cloneDeepUnref(filters) as MutationFilters) } } diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index 1a96a0f93a..8796b462a0 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -19,7 +19,7 @@ export type MaybeRefKeys = T extends Function export type MaybeRefDeep = T extends Function ? T : MaybeRef< - T extends Array | Record | Map | Set + T extends object ? { [Property in keyof T]: MaybeRefDeep } From f4d0ebf3ed208e6223407b90213307af9d0aab28 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Tue, 18 Oct 2022 16:32:07 -0400 Subject: [PATCH 09/40] Update types.ts --- packages/vue-query/src/types.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index 8796b462a0..7e89864d52 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -3,10 +3,10 @@ import type { QueryObserverOptions, InfiniteQueryObserverOptions, } from '@tanstack/query-core' -import type { Ref, UnwrapRef, ComputedRef } from 'vue-demi' +import type { Ref, UnwrapRef } from 'vue-demi' import type { QueryClient } from '@tanstack/vue-query' -export type MaybeRef = Ref | T | ComputedRef +export type MaybeRef = Ref | T export type MaybeRefKeys = T extends Function ? T : From 972af367792dd8957d189c33990def26e6ae5719 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Tue, 18 Oct 2022 16:38:08 -0400 Subject: [PATCH 10/40] Update types.ts --- packages/query-core/src/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/query-core/src/types.ts b/packages/query-core/src/types.ts index 6d3c8c1e84..f45ee15f26 100644 --- a/packages/query-core/src/types.ts +++ b/packages/query-core/src/types.ts @@ -614,7 +614,7 @@ export type MutateFunction< TVariables = void, TContext = unknown, > = ( - variables: TVariables, + variables?: TVariables, options?: MutateOptions, ) => Promise From 046452b74d84ea721102277f446c266c17e18c3d Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Tue, 18 Oct 2022 16:41:18 -0400 Subject: [PATCH 11/40] update --- packages/query-core/src/types.ts | 2 +- packages/vue-query/src/__tests__/useMutation.test.ts | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/query-core/src/types.ts b/packages/query-core/src/types.ts index f45ee15f26..6d3c8c1e84 100644 --- a/packages/query-core/src/types.ts +++ b/packages/query-core/src/types.ts @@ -614,7 +614,7 @@ export type MutateFunction< TVariables = void, TContext = unknown, > = ( - variables?: TVariables, + variables: TVariables, options?: MutateOptions, ) => Promise diff --git a/packages/vue-query/src/__tests__/useMutation.test.ts b/packages/vue-query/src/__tests__/useMutation.test.ts index f28c74e189..16a7877008 100644 --- a/packages/vue-query/src/__tests__/useMutation.test.ts +++ b/packages/vue-query/src/__tests__/useMutation.test.ts @@ -35,11 +35,8 @@ describe('useMutation', () => { test('should return error when request fails', async () => { const mutation = useMutation(errorMutator) - - mutation.mutate() - + mutation.mutate({}) await flushPromises(10) - expect(mutation).toMatchObject({ isIdle: { value: false }, isLoading: { value: false }, @@ -237,7 +234,7 @@ describe('useMutation', () => { test('should throw on error', async () => { const mutation = useMutation(errorMutator) - await expect(mutation.mutateAsync()).rejects.toThrowError('Some error') + await expect(mutation.mutateAsync({})).rejects.toThrowError('Some error') expect(mutation).toMatchObject({ isIdle: { value: false }, From 17731e17e59c8b87729bda6d727a244dcbcc0561 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Tue, 18 Oct 2022 16:59:58 -0400 Subject: [PATCH 12/40] Update types.ts --- packages/vue-query/src/types.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index 7e89864d52..e06924fcfd 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -97,4 +97,3 @@ export type VueInfiniteQueryObserverOptions< TQueryKey >[Property] > -} \ No newline at end of file From cc669ddd93acd86343956cdbb2a9522bcd5f24fd Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Tue, 18 Oct 2022 17:00:23 -0400 Subject: [PATCH 13/40] Update types.ts --- packages/vue-query/src/types.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index e06924fcfd..7e89864d52 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -97,3 +97,4 @@ export type VueInfiniteQueryObserverOptions< TQueryKey >[Property] > +} \ No newline at end of file From 918755fbb9c1d398a8207ebd3bb6e1ada1a9f5ec Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 18:10:00 -0400 Subject: [PATCH 14/40] Update useMutation.ts --- packages/vue-query/src/useMutation.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 83072fdf7f..71146bcffe 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -168,8 +168,7 @@ export function parseMutationArgs< | MaybeRefKeys>, arg3?: MaybeRefKeys>, ): UseMutationOptions { - let options = { ...arg1 } - + let options if (isQueryKey(unref(arg1))) { if ((typeof unref(arg2)) === 'function') { options = { ...arg3, mutationKey: arg1, mutationFn: arg2 } From e826d0231cc952811dce6809ac4744a6f7f982d0 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 18:46:50 -0400 Subject: [PATCH 15/40] update --- packages/vue-query/src/useMutation.ts | 22 ++++++++++++++-------- packages/vue-query/tsconfig.json | 3 ++- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 71146bcffe..81a78b20c8 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -1,4 +1,4 @@ -import { onScopeDispose, reactive, readonly, toRefs, watch, computed, unref } from 'vue-demi' +import { onScopeDispose, reactive, readonly, toRefs, watch, computed, unref, isRef } from 'vue-demi' import type { ToRefs } from 'vue-demi' import { MutationObserver } from '@tanstack/query-core' import type { @@ -9,10 +9,14 @@ import type { MutateFunction, MutationObserverResult, } from '@tanstack/query-core' -import { cloneDeepUnref, isQueryKey, updateState } from './utils' +import { cloneDeepUnref, updateState } from './utils' import { useQueryClient } from './useQueryClient' import type { MaybeRefKeys, WithQueryClientKey, MaybeRef } from './types' +export function isMutationKey (value: unknown): value is MaybeRef { + return Array.isArray(value) +} + type MutationResult = Omit< MutationObserverResult, 'mutate' | 'reset' @@ -168,17 +172,19 @@ export function parseMutationArgs< | MaybeRefKeys>, arg3?: MaybeRefKeys>, ): UseMutationOptions { - let options - if (isQueryKey(unref(arg1))) { - if ((typeof unref(arg2)) === 'function') { - options = { ...arg3, mutationKey: arg1, mutationFn: arg2 } + let options = arg1 + if (isMutationKey(arg1)) { + const a = isRef(arg2) ? arg2.value : arg2 + if ((typeof (a) === 'function')) { + options = { ...arg3, mutationKey: arg1, mutationFn: a } } else { options = { ...arg2, mutationKey: arg1 } } } - if (typeof unref(arg1) === 'function') { - options = { ...arg2, mutationFn: arg1 } + const b = isRef(arg1) ? arg1.value : arg1 + if (typeof b === 'function') { + options = { ...arg2, mutationFn: b } } return cloneDeepUnref(options) as UseMutationOptions< diff --git a/packages/vue-query/tsconfig.json b/packages/vue-query/tsconfig.json index 85281afb6c..84f5351da5 100644 --- a/packages/vue-query/tsconfig.json +++ b/packages/vue-query/tsconfig.json @@ -4,7 +4,8 @@ "composite": true, "rootDir": "./src", "outDir": "./build/lib", - "tsBuildInfoFile": "./build/.tsbuildinfo" + "tsBuildInfoFile": "./build/.tsbuildinfo", + "noErrorTruncation": true }, "include": ["src"], "references": [ From c3908094c56a0d74798f6811e4092998e52b7b1b Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 18:47:38 -0400 Subject: [PATCH 16/40] update --- packages/vue-query/tsconfig.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/vue-query/tsconfig.json b/packages/vue-query/tsconfig.json index 84f5351da5..85281afb6c 100644 --- a/packages/vue-query/tsconfig.json +++ b/packages/vue-query/tsconfig.json @@ -4,8 +4,7 @@ "composite": true, "rootDir": "./src", "outDir": "./build/lib", - "tsBuildInfoFile": "./build/.tsbuildinfo", - "noErrorTruncation": true + "tsBuildInfoFile": "./build/.tsbuildinfo" }, "include": ["src"], "references": [ From 5079492e38458c3cef6b513800fabb581bda75c2 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 18:49:13 -0400 Subject: [PATCH 17/40] Update useMutation.ts --- packages/vue-query/src/useMutation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 81a78b20c8..291585e5ff 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -1,4 +1,4 @@ -import { onScopeDispose, reactive, readonly, toRefs, watch, computed, unref, isRef } from 'vue-demi' +import { onScopeDispose, reactive, readonly, toRefs, watch, computed, isRef } from 'vue-demi' import type { ToRefs } from 'vue-demi' import { MutationObserver } from '@tanstack/query-core' import type { From 857e2ce788e69ba872a36b890f1903ef168645f1 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 18:55:50 -0400 Subject: [PATCH 18/40] Update useMutation.ts --- packages/vue-query/src/useMutation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 291585e5ff..246ce881d8 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -14,7 +14,7 @@ import { useQueryClient } from './useQueryClient' import type { MaybeRefKeys, WithQueryClientKey, MaybeRef } from './types' export function isMutationKey (value: unknown): value is MaybeRef { - return Array.isArray(value) + return Array.isArray(isRef(value) ? value.value : value) } type MutationResult = Omit< From 6a9035bce902d67c0950759a87c6487a4849919c Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 19:13:52 -0400 Subject: [PATCH 19/40] PR feedback --- packages/vue-query/src/types.ts | 25 +++++++++++++------- packages/vue-query/src/useMutation.ts | 33 +++++++++++++-------------- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index 7e89864d52..c851bc675e 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -2,19 +2,12 @@ import type { QueryKey, QueryObserverOptions, InfiniteQueryObserverOptions, + MutationObserverOptions } from '@tanstack/query-core' import type { Ref, UnwrapRef } from 'vue-demi' import type { QueryClient } from '@tanstack/vue-query' export type MaybeRef = Ref | T -export type MaybeRefKeys = T extends Function - ? T - : - T extends object - ? { - [Property in keyof T]: MaybeRef - } - : T export type MaybeRefDeep = T extends Function ? T @@ -31,6 +24,22 @@ export type WithQueryClientKey = T & { queryClient?: QueryClient } +export type VueMutationObserverOptions< + TData = unknown, + TError = unknown, + TVariables = void, + TContext = unknown, +> = { + [Property in keyof MutationObserverOptions< + TData, + TError, + TVariables, + TContext + >]: MaybeRefDeep< + MutationObserverOptions[Property] + > +} + // A Vue version of QueriesObserverOptions from "@tanstack/query-core" // Accept refs as options export type VueQueryObserverOptions< diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 246ce881d8..d7c9b3643c 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -5,13 +5,12 @@ import type { MutateOptions, MutationFunction, MutationKey, - MutationObserverOptions, MutateFunction, MutationObserverResult, } from '@tanstack/query-core' import { cloneDeepUnref, updateState } from './utils' import { useQueryClient } from './useQueryClient' -import type { MaybeRefKeys, WithQueryClientKey, MaybeRef } from './types' +import type { VueMutationObserverOptions, WithQueryClientKey, MaybeRef, MaybeRefDeep } from './types' export function isMutationKey (value: unknown): value is MaybeRef { return Array.isArray(isRef(value) ? value.value : value) @@ -24,7 +23,7 @@ type MutationResult = Omit< export type UseMutationOptions = WithQueryClientKey< - MutationObserverOptions + VueMutationObserverOptions > type MutateSyncFunction< @@ -33,7 +32,7 @@ type MutateSyncFunction< TVariables = void, TContext = unknown, > = ( - ...options: Parameters>> + ...options: Parameters> ) => void export type UseMutationReturnType< @@ -54,7 +53,7 @@ export function useMutation< TVariables = void, TContext = unknown, >( - options: MaybeRefKeys>, + options: UseMutationOptions, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -63,10 +62,10 @@ export function useMutation< TContext = unknown, >( mutationFn: MaybeRef>, - options?: MaybeRefKeys, 'mutationFn' - >>, + >, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -75,10 +74,10 @@ export function useMutation< TContext = unknown, >( mutationKey: MaybeRef, - options?: MaybeRefKeys, 'mutationKey' - >>, + >, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -88,10 +87,10 @@ export function useMutation< >( mutationKey: MaybeRef, mutationFn?: MaybeRef>, - options?: MaybeRefKeys, 'mutationKey' | 'mutationFn' - >>, + >, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -102,11 +101,11 @@ export function useMutation< arg1: | MaybeRef | MaybeRef> - | MaybeRefKeys>, + | UseMutationOptions, arg2?: | MaybeRef> - | MaybeRefKeys>, - arg3?: MaybeRefKeys>, + | UseMutationOptions, + arg3?: UseMutationOptions, ): UseMutationReturnType { const options = computed(() => { @@ -166,11 +165,11 @@ export function parseMutationArgs< arg1: | MaybeRef | MaybeRef> - | MaybeRefKeys>, + | UseMutationOptions, arg2?: | MaybeRef> - | MaybeRefKeys>, - arg3?: MaybeRefKeys>, + | UseMutationOptions, + arg3?: UseMutationOptions, ): UseMutationOptions { let options = arg1 if (isMutationKey(arg1)) { From 7118264c85ed793ebd432debb8203a9d862b451a Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 19:27:14 -0400 Subject: [PATCH 20/40] Update useMutation.ts --- packages/vue-query/src/useMutation.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index d7c9b3643c..11601bed9c 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -7,9 +7,10 @@ import type { MutationKey, MutateFunction, MutationObserverResult, + MutationObserverOptions } from '@tanstack/query-core' import { cloneDeepUnref, updateState } from './utils' -import { useQueryClient } from './useQueryClient' +import { useQueryClient } from '@tanstack/vue-query' import type { VueMutationObserverOptions, WithQueryClientKey, MaybeRef, MaybeRefDeep } from './types' export function isMutationKey (value: unknown): value is MaybeRef { @@ -170,7 +171,7 @@ export function parseMutationArgs< | MaybeRef> | UseMutationOptions, arg3?: UseMutationOptions, -): UseMutationOptions { +): WithQueryClientKey> { let options = arg1 if (isMutationKey(arg1)) { const a = isRef(arg2) ? arg2.value : arg2 @@ -186,10 +187,10 @@ export function parseMutationArgs< options = { ...arg2, mutationFn: b } } - return cloneDeepUnref(options) as UseMutationOptions< + return cloneDeepUnref(options) as WithQueryClientKey + >> } From 95864b2b12346e040a52d691af9d5d891054e439 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 19:29:05 -0400 Subject: [PATCH 21/40] Update types.ts --- packages/query-core/src/types.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/query-core/src/types.ts b/packages/query-core/src/types.ts index 6d3c8c1e84..d9ad805cd9 100644 --- a/packages/query-core/src/types.ts +++ b/packages/query-core/src/types.ts @@ -1,4 +1,5 @@ /* istanbul ignore file */ + import type { MutationState } from './mutation' import type { QueryBehavior, Query } from './query' import type { RetryValue, RetryDelayValue } from './retryer' From 0a06a183536aa86c6bd03810d19a559a7d3123ef Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 19:32:12 -0400 Subject: [PATCH 22/40] Update useMutation.ts --- packages/vue-query/src/useMutation.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 11601bed9c..35656d69f0 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -1,4 +1,12 @@ -import { onScopeDispose, reactive, readonly, toRefs, watch, computed, isRef } from 'vue-demi' +import { + onScopeDispose, + reactive, + readonly, + toRefs, + watch, + computed, + isRef +} from 'vue-demi' import type { ToRefs } from 'vue-demi' import { MutationObserver } from '@tanstack/query-core' import type { @@ -11,7 +19,11 @@ import type { } from '@tanstack/query-core' import { cloneDeepUnref, updateState } from './utils' import { useQueryClient } from '@tanstack/vue-query' -import type { VueMutationObserverOptions, WithQueryClientKey, MaybeRef, MaybeRefDeep } from './types' +import type { + VueMutationObserverOptions, + WithQueryClientKey, + MaybeRef +} from './types' export function isMutationKey (value: unknown): value is MaybeRef { return Array.isArray(isRef(value) ? value.value : value) From 097de89240bca77af2a0f099f54ec4dd1ca41ed4 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 19:33:50 -0400 Subject: [PATCH 23/40] Update types.ts --- packages/vue-query/src/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index c851bc675e..c6cb0541eb 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -106,4 +106,4 @@ export type VueInfiniteQueryObserverOptions< TQueryKey >[Property] > -} \ No newline at end of file +} From a4ccbc4d230c490aad05c1138b13b6013e2dcca8 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 19:36:43 -0400 Subject: [PATCH 24/40] Update types.ts --- packages/vue-query/src/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index c6cb0541eb..4a0f86e4c1 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -5,7 +5,7 @@ import type { MutationObserverOptions } from '@tanstack/query-core' import type { Ref, UnwrapRef } from 'vue-demi' -import type { QueryClient } from '@tanstack/vue-query' +import type { QueryClient } from './queryClient' export type MaybeRef = Ref | T From 4976e2e24fec63bf95f2574b8bf8953af185f71b Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 19:39:13 -0400 Subject: [PATCH 25/40] Update useMutation.ts --- packages/vue-query/src/useMutation.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 35656d69f0..2aecf2a8b4 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -8,7 +8,6 @@ import { isRef } from 'vue-demi' import type { ToRefs } from 'vue-demi' -import { MutationObserver } from '@tanstack/query-core' import type { MutateOptions, MutationFunction, @@ -17,13 +16,14 @@ import type { MutationObserverResult, MutationObserverOptions } from '@tanstack/query-core' -import { cloneDeepUnref, updateState } from './utils' -import { useQueryClient } from '@tanstack/vue-query' import type { VueMutationObserverOptions, WithQueryClientKey, MaybeRef } from './types' +import { MutationObserver } from '@tanstack/query-core' +import { cloneDeepUnref, updateState } from './utils' +import { useQueryClient } from './useQueryClient' export function isMutationKey (value: unknown): value is MaybeRef { return Array.isArray(isRef(value) ? value.value : value) From ccf20b2069d78dcbb33523defb1c464d6417a0f2 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 20:37:20 -0400 Subject: [PATCH 26/40] Update types.ts --- packages/vue-query/src/types.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index 4a0f86e4c1..9ad9bcc16d 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -9,15 +9,14 @@ import type { QueryClient } from './queryClient' export type MaybeRef = Ref | T -export type MaybeRefDeep = T extends Function - ? T - : MaybeRef< - T extends object - ? { - [Property in keyof T]: MaybeRefDeep - } - : T - > +export type MaybeRefDeep = + MaybeRef< + T extends object + ? { + [Property in keyof T]: MaybeRefDeep + } + : T + > export type WithQueryClientKey = T & { queryClientKey?: string From 98904f8ba62254b97733f9fd8468d2f7db4e3fa1 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 20:50:07 -0400 Subject: [PATCH 27/40] Update useMutation.ts --- packages/vue-query/src/useMutation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 2aecf2a8b4..2075125f32 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -187,7 +187,7 @@ export function parseMutationArgs< let options = arg1 if (isMutationKey(arg1)) { const a = isRef(arg2) ? arg2.value : arg2 - if ((typeof (a) === 'function')) { + if (typeof a === 'function') { options = { ...arg3, mutationKey: arg1, mutationFn: a } } else { options = { ...arg2, mutationKey: arg1 } From 41be28aa09d87f7af0b7fb9edfe17bbde8a56048 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 22:27:11 -0400 Subject: [PATCH 28/40] update --- packages/vue-query/src/useMutation.ts | 6 +----- packages/vue-query/src/utils.ts | 7 ++++++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 2075125f32..028bac1960 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -22,13 +22,9 @@ import type { MaybeRef } from './types' import { MutationObserver } from '@tanstack/query-core' -import { cloneDeepUnref, updateState } from './utils' +import { cloneDeepUnref, updateState, isMutationKey } from './utils' import { useQueryClient } from './useQueryClient' -export function isMutationKey (value: unknown): value is MaybeRef { - return Array.isArray(isRef(value) ? value.value : value) -} - type MutationResult = Omit< MutationObserverResult, 'mutate' | 'reset' diff --git a/packages/vue-query/src/utils.ts b/packages/vue-query/src/utils.ts index 7c4e1ab796..235449ce10 100644 --- a/packages/vue-query/src/utils.ts +++ b/packages/vue-query/src/utils.ts @@ -1,7 +1,8 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import type { QueryKey } from '@tanstack/query-core' +import type { QueryKey, MutationKey } from '@tanstack/query-core' import { isRef, unref } from 'vue-demi' import type { UnwrapRef } from 'vue-demi' +import type { MaybeRef } from './types' export const VUE_QUERY_CLIENT = 'VUE_QUERY_CLIENT' @@ -14,6 +15,10 @@ export function isQueryKey(value: unknown): value is QueryKey { return Array.isArray(value) } +export function isMutationKey (value: unknown): value is MaybeRef { + return Array.isArray(isRef(value) ? value.value : value) +} + export function updateState( state: Record, update: Record, From 8a19aa149abb75102c50af78b32692da5ee6fcfe Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Wed, 19 Oct 2022 23:00:57 -0400 Subject: [PATCH 29/40] update fn names --- packages/vue-query/src/useMutation.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 028bac1960..7848ababf2 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -182,17 +182,17 @@ export function parseMutationArgs< ): WithQueryClientKey> { let options = arg1 if (isMutationKey(arg1)) { - const a = isRef(arg2) ? arg2.value : arg2 - if (typeof a === 'function') { - options = { ...arg3, mutationKey: arg1, mutationFn: a } + const plainFn = isRef(arg2) ? arg2.value : arg2 + if (typeof plainFn === 'function') { + options = { ...arg3, mutationKey: arg1, mutationFn: plainFn } } else { options = { ...arg2, mutationKey: arg1 } } } - const b = isRef(arg1) ? arg1.value : arg1 - if (typeof b === 'function') { - options = { ...arg2, mutationFn: b } + const plainFn = isRef(arg1) ? arg1.value : arg1 + if (typeof plainFn === 'function') { + options = { ...arg2, mutationFn: plainFn } } return cloneDeepUnref(options) as WithQueryClientKey Date: Thu, 20 Oct 2022 00:07:28 -0400 Subject: [PATCH 30/40] change subscribe to const --- packages/vue-query/src/useMutation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 7848ababf2..734a9358cf 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -127,7 +127,7 @@ export function useMutation< const state = reactive(observer.getCurrentResult()) - let unsubscribe = observer.subscribe((result) => { + const unsubscribe = observer.subscribe((result) => { updateState(state, result) }) From 3c888035b8d0dffbcc417c6188a8b88c32080cf9 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Thu, 20 Oct 2022 23:02:59 -0400 Subject: [PATCH 31/40] Update types.ts --- packages/vue-query/src/types.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index 9ad9bcc16d..46026da602 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -1,3 +1,5 @@ +/* istanbul ignore file */ + import type { QueryKey, QueryObserverOptions, From 34ced5c2cd55e3270765274bb51258ebd09e86ab Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Thu, 20 Oct 2022 23:15:36 -0400 Subject: [PATCH 32/40] Update useMutation.ts --- packages/vue-query/src/useMutation.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 734a9358cf..e4fb9e49d2 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -116,15 +116,12 @@ export function useMutation< | UseMutationOptions, arg3?: UseMutationOptions, ): UseMutationReturnType { - const options = computed(() => { return parseMutationArgs(arg1, arg2, arg3) }) - + const queryClient = options.value.queryClient ?? useQueryClient(options.value.queryClientKey) - const observer = new MutationObserver(queryClient, queryClient.defaultMutationOptions(options.value)) - const state = reactive(observer.getCurrentResult()) const unsubscribe = observer.subscribe((result) => { From fab0f73b07710338c0499b12e07f03653d7f668b Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Sat, 22 Oct 2022 16:30:44 -0400 Subject: [PATCH 33/40] wrong arg passed in useMutation, unnecessary changes in testing files potentially --- packages/vue-query/src/__tests__/useMutation.test.ts | 4 ++-- packages/vue-query/src/useMutation.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vue-query/src/__tests__/useMutation.test.ts b/packages/vue-query/src/__tests__/useMutation.test.ts index 16a7877008..5316866d59 100644 --- a/packages/vue-query/src/__tests__/useMutation.test.ts +++ b/packages/vue-query/src/__tests__/useMutation.test.ts @@ -35,7 +35,7 @@ describe('useMutation', () => { test('should return error when request fails', async () => { const mutation = useMutation(errorMutator) - mutation.mutate({}) + mutation.mutate() await flushPromises(10) expect(mutation).toMatchObject({ isIdle: { value: false }, @@ -234,7 +234,7 @@ describe('useMutation', () => { test('should throw on error', async () => { const mutation = useMutation(errorMutator) - await expect(mutation.mutateAsync({})).rejects.toThrowError('Some error') + await expect(mutation.mutateAsync()).rejects.toThrowError('Some error') expect(mutation).toMatchObject({ isIdle: { value: false }, diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index e4fb9e49d2..5d85fe0027 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -140,7 +140,7 @@ export function useMutation< watch(options, () => { observer.setOptions( - queryClient.defaultMutationOptions(queryClient.defaultMutationOptions(options.value)), + queryClient.defaultMutationOptions(options.value), ) }, { deep: true }, From e6b1641808fe780247e394499786b90548ddfa71 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Sat, 22 Oct 2022 16:59:52 -0400 Subject: [PATCH 34/40] update --- .../src/__tests__/useMutation.test.ts | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/packages/vue-query/src/__tests__/useMutation.test.ts b/packages/vue-query/src/__tests__/useMutation.test.ts index 5316866d59..8b958b1b21 100644 --- a/packages/vue-query/src/__tests__/useMutation.test.ts +++ b/packages/vue-query/src/__tests__/useMutation.test.ts @@ -1,4 +1,4 @@ -import { reactive } from 'vue-demi' +import { reactive, ref } from 'vue-demi' import { errorMutator, flushPromises, successMutator } from './test-utils' import { parseMutationArgs, useMutation } from '../useMutation' import { useQueryClient } from '../useQueryClient' @@ -35,7 +35,7 @@ describe('useMutation', () => { test('should return error when request fails', async () => { const mutation = useMutation(errorMutator) - mutation.mutate() + mutation.mutate({}) await flushPromises(10) expect(mutation).toMatchObject({ isIdle: { value: false }, @@ -85,6 +85,31 @@ describe('useMutation', () => { expect(mutations?.options.mutationKey).toEqual(['bar']) }) + test('should update reactive options deeply', async () => { + type MutationKeyTest = { + entity: string, + otherObject: { + name: string, + someFn: Function + } + } + const mutationKey = ref([{ entity: 'test', otherObject: { name: 'objectName', someFn: () => null } }]) + const queryClient = useQueryClient() + const mutationCache = queryClient.getMutationCache() + const options = { mutationKey: mutationKey } + const mutation = useMutation( + (params: string) => successMutator(params), + options, + ) + mutationKey.value[0]!.otherObject.name = 'someOtherObjectName' + await flushPromises() + mutation.mutate('xyz') + await flushPromises() + const mutations = mutationCache.getAll() + const m = mutations[0]?.options.mutationKey as MutationKeyTest[] + expect(m[0]?.otherObject.name === 'someOtherObjectName') + }) + test('should reset state after invoking mutation.reset', async () => { const mutation = useMutation((params: string) => errorMutator(params)) @@ -234,7 +259,7 @@ describe('useMutation', () => { test('should throw on error', async () => { const mutation = useMutation(errorMutator) - await expect(mutation.mutateAsync()).rejects.toThrowError('Some error') + await expect(mutation.mutateAsync({})).rejects.toThrowError('Some error') expect(mutation).toMatchObject({ isIdle: { value: false }, From fab13aa5dc8aa768b0c8cb3cb12f801bde445a63 Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Sat, 22 Oct 2022 17:55:41 -0400 Subject: [PATCH 35/40] update --- packages/vue-query/src/types.ts | 17 ------- packages/vue-query/src/useMutation.ts | 66 +++++++++++++++++---------- 2 files changed, 42 insertions(+), 41 deletions(-) diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index 46026da602..4aa92b51c9 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -4,7 +4,6 @@ import type { QueryKey, QueryObserverOptions, InfiniteQueryObserverOptions, - MutationObserverOptions } from '@tanstack/query-core' import type { Ref, UnwrapRef } from 'vue-demi' import type { QueryClient } from './queryClient' @@ -25,22 +24,6 @@ export type WithQueryClientKey = T & { queryClient?: QueryClient } -export type VueMutationObserverOptions< - TData = unknown, - TError = unknown, - TVariables = void, - TContext = unknown, -> = { - [Property in keyof MutationObserverOptions< - TData, - TError, - TVariables, - TContext - >]: MaybeRefDeep< - MutationObserverOptions[Property] - > -} - // A Vue version of QueriesObserverOptions from "@tanstack/query-core" // Accept refs as options export type VueQueryObserverOptions< diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 5d85fe0027..07b607f432 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -17,9 +17,9 @@ import type { MutationObserverOptions } from '@tanstack/query-core' import type { - VueMutationObserverOptions, WithQueryClientKey, - MaybeRef + MaybeRef, + MaybeRefDeep } from './types' import { MutationObserver } from '@tanstack/query-core' import { cloneDeepUnref, updateState, isMutationKey } from './utils' @@ -32,9 +32,25 @@ type MutationResult = Omit< export type UseMutationOptions = WithQueryClientKey< - VueMutationObserverOptions + MutationObserverOptions > +export type VueMutationObserverOptions< + TData = unknown, + TError = unknown, + TVariables = void, + TContext = unknown, +> = { + [Property in keyof UseMutationOptions< + TData, + TError, + TVariables, + TContext + >]: MaybeRefDeep< + UseMutationOptions[Property] + > +} + type MutateSyncFunction< TData = unknown, TError = unknown, @@ -62,7 +78,7 @@ export function useMutation< TVariables = void, TContext = unknown, >( - options: UseMutationOptions, + options: MaybeRef>, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -71,10 +87,10 @@ export function useMutation< TContext = unknown, >( mutationFn: MaybeRef>, - options?: Omit< - UseMutationOptions, + options?: MaybeRef, 'mutationFn' - >, + >>, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -83,10 +99,10 @@ export function useMutation< TContext = unknown, >( mutationKey: MaybeRef, - options?: Omit< - UseMutationOptions, + options?: MaybeRef, 'mutationKey' - >, + >>, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -96,10 +112,10 @@ export function useMutation< >( mutationKey: MaybeRef, mutationFn?: MaybeRef>, - options?: Omit< - UseMutationOptions, + options?: MaybeRef, 'mutationKey' | 'mutationFn' - >, + >>, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -110,16 +126,16 @@ export function useMutation< arg1: | MaybeRef | MaybeRef> - | UseMutationOptions, + | MaybeRef>, arg2?: | MaybeRef> - | UseMutationOptions, - arg3?: UseMutationOptions, + | MaybeRef>, + arg3?: MaybeRef>, ): UseMutationReturnType { + const options = computed(() => { return parseMutationArgs(arg1, arg2, arg3) }) - const queryClient = options.value.queryClient ?? useQueryClient(options.value.queryClientKey) const observer = new MutationObserver(queryClient, queryClient.defaultMutationOptions(options.value)) const state = reactive(observer.getCurrentResult()) @@ -171,31 +187,33 @@ export function parseMutationArgs< arg1: | MaybeRef | MaybeRef> - | UseMutationOptions, + | MaybeRef>, arg2?: | MaybeRef> - | UseMutationOptions, - arg3?: UseMutationOptions, + | MaybeRef>, + arg3?: MaybeRef>, ): WithQueryClientKey> { let options = arg1 if (isMutationKey(arg1)) { const plainFn = isRef(arg2) ? arg2.value : arg2 + const plainOptions = isRef(arg3) ? arg3.value : arg3 if (typeof plainFn === 'function') { - options = { ...arg3, mutationKey: arg1, mutationFn: plainFn } + options = { ...plainOptions, mutationKey: arg1, mutationFn: plainFn } } else { options = { ...arg2, mutationKey: arg1 } } } const plainFn = isRef(arg1) ? arg1.value : arg1 + const plainOptions = isRef(arg2) ? arg2.value : arg2 if (typeof plainFn === 'function') { - options = { ...arg2, mutationFn: plainFn } + options = { ...plainOptions, mutationFn: plainFn } } - return cloneDeepUnref(options) as WithQueryClientKey> + > } From 7f96936296d1a0bfb9ed7a3dfa41dacc655f2d7b Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Sat, 22 Oct 2022 18:06:28 -0400 Subject: [PATCH 36/40] Update useMutation.test.ts --- packages/vue-query/src/__tests__/useMutation.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/vue-query/src/__tests__/useMutation.test.ts b/packages/vue-query/src/__tests__/useMutation.test.ts index 8b958b1b21..3a63c1c84e 100644 --- a/packages/vue-query/src/__tests__/useMutation.test.ts +++ b/packages/vue-query/src/__tests__/useMutation.test.ts @@ -101,9 +101,11 @@ describe('useMutation', () => { (params: string) => successMutator(params), options, ) + mutationKey.value[0]!.otherObject.name = 'someOtherObjectName' await flushPromises() mutation.mutate('xyz') + await flushPromises() const mutations = mutationCache.getAll() const m = mutations[0]?.options.mutationKey as MutationKeyTest[] From 412ab66d0e446c7104cc8fc6161f993186f0c4fd Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Sat, 22 Oct 2022 18:10:22 -0400 Subject: [PATCH 37/40] Update useMutation.test.ts --- packages/vue-query/src/__tests__/useMutation.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/vue-query/src/__tests__/useMutation.test.ts b/packages/vue-query/src/__tests__/useMutation.test.ts index 3a63c1c84e..211e4c232b 100644 --- a/packages/vue-query/src/__tests__/useMutation.test.ts +++ b/packages/vue-query/src/__tests__/useMutation.test.ts @@ -105,10 +105,12 @@ describe('useMutation', () => { mutationKey.value[0]!.otherObject.name = 'someOtherObjectName' await flushPromises() mutation.mutate('xyz') - + await flushPromises() + const mutations = mutationCache.getAll() const m = mutations[0]?.options.mutationKey as MutationKeyTest[] + expect(m[0]?.otherObject.name === 'someOtherObjectName') }) From f8799658fc2b03cd640e375ac0e2f6abc8e03b8e Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Sat, 22 Oct 2022 18:38:39 -0400 Subject: [PATCH 38/40] update --- package.json | 2 +- .../src/__tests__/useMutation.test.ts | 13 ++-- packages/vue-query/src/types.ts | 15 ++-- packages/vue-query/src/useMutation.ts | 72 +++++++++++-------- packages/vue-query/src/utils.ts | 2 +- 5 files changed, 60 insertions(+), 44 deletions(-) diff --git a/package.json b/package.json index dbfccfe3a5..e7400db44b 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "watch": "concurrently --kill-others \"rollup --config rollup.config.js -w\" \"pnpm run typecheck --watch\"", "dev": "pnpm run watch", "prettier": "prettier \"packages/*/{src/**,examples/**/src/**}.{md,js,jsx,ts,tsx,json}\"", - "prettier:write": "pnpm run prettier -- --write", + "prettier:write": "pnpm run prettier --write", "cipublish": "ts-node scripts/publish.ts" }, "namespace": "@tanstack", diff --git a/packages/vue-query/src/__tests__/useMutation.test.ts b/packages/vue-query/src/__tests__/useMutation.test.ts index 211e4c232b..56b31d0f04 100644 --- a/packages/vue-query/src/__tests__/useMutation.test.ts +++ b/packages/vue-query/src/__tests__/useMutation.test.ts @@ -87,13 +87,18 @@ describe('useMutation', () => { test('should update reactive options deeply', async () => { type MutationKeyTest = { - entity: string, + entity: string otherObject: { - name: string, + name: string someFn: Function } } - const mutationKey = ref([{ entity: 'test', otherObject: { name: 'objectName', someFn: () => null } }]) + const mutationKey = ref([ + { + entity: 'test', + otherObject: { name: 'objectName', someFn: () => null }, + }, + ]) const queryClient = useQueryClient() const mutationCache = queryClient.getMutationCache() const options = { mutationKey: mutationKey } @@ -107,7 +112,7 @@ describe('useMutation', () => { mutation.mutate('xyz') await flushPromises() - + const mutations = mutationCache.getAll() const m = mutations[0]?.options.mutationKey as MutationKeyTest[] diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index 4aa92b51c9..f4e6c827dc 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -10,14 +10,13 @@ import type { QueryClient } from './queryClient' export type MaybeRef = Ref | T -export type MaybeRefDeep = - MaybeRef< - T extends object - ? { - [Property in keyof T]: MaybeRefDeep - } - : T - > +export type MaybeRefDeep = MaybeRef< + T extends object + ? { + [Property in keyof T]: MaybeRefDeep + } + : T +> export type WithQueryClientKey = T & { queryClientKey?: string diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index 07b607f432..e53715c025 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -5,7 +5,7 @@ import { toRefs, watch, computed, - isRef + isRef, } from 'vue-demi' import type { ToRefs } from 'vue-demi' import type { @@ -14,13 +14,9 @@ import type { MutationKey, MutateFunction, MutationObserverResult, - MutationObserverOptions + MutationObserverOptions, } from '@tanstack/query-core' -import type { - WithQueryClientKey, - MaybeRef, - MaybeRefDeep -} from './types' +import type { WithQueryClientKey, MaybeRef, MaybeRefDeep } from './types' import { MutationObserver } from '@tanstack/query-core' import { cloneDeepUnref, updateState, isMutationKey } from './utils' import { useQueryClient } from './useQueryClient' @@ -78,7 +74,9 @@ export function useMutation< TVariables = void, TContext = unknown, >( - options: MaybeRef>, + options: MaybeRef< + VueMutationObserverOptions + >, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -87,10 +85,12 @@ export function useMutation< TContext = unknown, >( mutationFn: MaybeRef>, - options?: MaybeRef, - 'mutationFn' - >>, + options?: MaybeRef< + Omit< + VueMutationObserverOptions, + 'mutationFn' + > + >, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -99,10 +99,12 @@ export function useMutation< TContext = unknown, >( mutationKey: MaybeRef, - options?: MaybeRef, - 'mutationKey' - >>, + options?: MaybeRef< + Omit< + VueMutationObserverOptions, + 'mutationKey' + > + >, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -112,10 +114,12 @@ export function useMutation< >( mutationKey: MaybeRef, mutationFn?: MaybeRef>, - options?: MaybeRef, - 'mutationKey' | 'mutationFn' - >>, + options?: MaybeRef< + Omit< + VueMutationObserverOptions, + 'mutationKey' | 'mutationFn' + > + >, ): UseMutationReturnType export function useMutation< TData = unknown, @@ -130,14 +134,19 @@ export function useMutation< arg2?: | MaybeRef> | MaybeRef>, - arg3?: MaybeRef>, + arg3?: MaybeRef< + VueMutationObserverOptions + >, ): UseMutationReturnType { - const options = computed(() => { return parseMutationArgs(arg1, arg2, arg3) }) - const queryClient = options.value.queryClient ?? useQueryClient(options.value.queryClientKey) - const observer = new MutationObserver(queryClient, queryClient.defaultMutationOptions(options.value)) + const queryClient = + options.value.queryClient ?? useQueryClient(options.value.queryClientKey) + const observer = new MutationObserver( + queryClient, + queryClient.defaultMutationOptions(options.value), + ) const state = reactive(observer.getCurrentResult()) const unsubscribe = observer.subscribe((result) => { @@ -153,11 +162,10 @@ export function useMutation< }) } - watch(options, + watch( + options, () => { - observer.setOptions( - queryClient.defaultMutationOptions(options.value), - ) + observer.setOptions(queryClient.defaultMutationOptions(options.value)) }, { deep: true }, ) @@ -191,8 +199,12 @@ export function parseMutationArgs< arg2?: | MaybeRef> | MaybeRef>, - arg3?: MaybeRef>, -): WithQueryClientKey> { + arg3?: MaybeRef< + VueMutationObserverOptions + >, +): WithQueryClientKey< + MutationObserverOptions +> { let options = arg1 if (isMutationKey(arg1)) { const plainFn = isRef(arg2) ? arg2.value : arg2 diff --git a/packages/vue-query/src/utils.ts b/packages/vue-query/src/utils.ts index 235449ce10..2d719c9039 100644 --- a/packages/vue-query/src/utils.ts +++ b/packages/vue-query/src/utils.ts @@ -15,7 +15,7 @@ export function isQueryKey(value: unknown): value is QueryKey { return Array.isArray(value) } -export function isMutationKey (value: unknown): value is MaybeRef { +export function isMutationKey(value: unknown): value is MaybeRef { return Array.isArray(isRef(value) ? value.value : value) } From 96846981d710d1dbe06fc97a4582388e700afacd Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Sat, 22 Oct 2022 19:03:57 -0400 Subject: [PATCH 39/40] Update useMutation.test.ts --- .../vue-query/src/__tests__/useMutation.test.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/vue-query/src/__tests__/useMutation.test.ts b/packages/vue-query/src/__tests__/useMutation.test.ts index 56b31d0f04..28eced7c43 100644 --- a/packages/vue-query/src/__tests__/useMutation.test.ts +++ b/packages/vue-query/src/__tests__/useMutation.test.ts @@ -101,7 +101,7 @@ describe('useMutation', () => { ]) const queryClient = useQueryClient() const mutationCache = queryClient.getMutationCache() - const options = { mutationKey: mutationKey } + const options = reactive({ mutationKey }) const mutation = useMutation( (params: string) => successMutator(params), options, @@ -114,9 +114,17 @@ describe('useMutation', () => { await flushPromises() const mutations = mutationCache.getAll() - const m = mutations[0]?.options.mutationKey as MutationKeyTest[] + const relevantMutation = mutations.find((mutation) => { + return ( + Array.isArray(mutation.options.mutationKey) && + !!mutation.options.mutationKey[0].otherObject + ) + }) - expect(m[0]?.otherObject.name === 'someOtherObjectName') + expect( + (relevantMutation?.options.mutationKey as MutationKeyTest[])[0] + ?.otherObject.name === 'someOtherObjectName', + ) }) test('should reset state after invoking mutation.reset', async () => { From 830ecfca23b70d02f73368145e93c7214e338ecc Mon Sep 17 00:00:00 2001 From: Matthew Hausman Date: Sat, 22 Oct 2022 19:08:55 -0400 Subject: [PATCH 40/40] Update useMutation.test.ts --- packages/vue-query/src/__tests__/useMutation.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vue-query/src/__tests__/useMutation.test.ts b/packages/vue-query/src/__tests__/useMutation.test.ts index 28eced7c43..3ca4578f09 100644 --- a/packages/vue-query/src/__tests__/useMutation.test.ts +++ b/packages/vue-query/src/__tests__/useMutation.test.ts @@ -114,10 +114,10 @@ describe('useMutation', () => { await flushPromises() const mutations = mutationCache.getAll() - const relevantMutation = mutations.find((mutation) => { + const relevantMutation = mutations.find((m) => { return ( - Array.isArray(mutation.options.mutationKey) && - !!mutation.options.mutationKey[0].otherObject + Array.isArray(m.options.mutationKey) && + !!m.options.mutationKey[0].otherObject ) })