import { ToRefs } from 'vue-demi';
import { DefaultError, MutationObserverOptions, MutateFunction, MutationObserverResult } from '@tanstack/query-core';
import { MaybeRefDeep, DistributiveOmit } from './types.cjs';
import { QueryClient } from './queryClient.cjs';

type MutationResult<TData, TError, TVariables, TContext> = DistributiveOmit<MutationObserverResult<TData, TError, TVariables, TContext>, 'mutate' | 'reset'>;
type UseMutationOptions<TData = unknown, TError = DefaultError, TVariables = void, TContext = unknown> = MaybeRefDeep<MutationObserverOptions<TData, TError, TVariables, TContext>>;
type MutateSyncFunction<TData = unknown, TError = DefaultError, TVariables = void, TContext = unknown> = (...options: Parameters<MutateFunction<TData, TError, TVariables, TContext>>) => void;
type UseMutationReturnType<TData, TError, TVariables, TContext, Result = MutationResult<TData, TError, TVariables, TContext>> = ToRefs<Readonly<Result>> & {
    mutate: MutateSyncFunction<TData, TError, TVariables, TContext>;
    mutateAsync: MutateFunction<TData, TError, TVariables, TContext>;
    reset: MutationObserverResult<TData, TError, TVariables, TContext>['reset'];
};
declare function useMutation<TData = unknown, TError = DefaultError, TVariables = void, TContext = unknown>(mutationOptions: MaybeRefDeep<MutationObserverOptions<TData, TError, TVariables, TContext>>, queryClient?: QueryClient): UseMutationReturnType<TData, TError, TVariables, TContext>;

export { type UseMutationOptions, type UseMutationReturnType, useMutation };
