import { QueryCache, MutationCache, DefaultError, OmitKeyof, QueryObserverOptions, MutationObserverOptions, HydrateOptions, DehydrateOptions } from '@tanstack/query-core';
import { Ref, ComputedRef, UnwrapRef } from 'vue-demi';

type Primitive = string | number | boolean | bigint | symbol | undefined | null;
type UnwrapLeaf = Primitive | Function | Date | Error | RegExp | Map<any, any> | WeakMap<any, any> | Set<any> | WeakSet<any>;
type MaybeRef<T> = Ref<T> | ComputedRef<T> | T;
type MaybeRefOrGetter<T> = MaybeRef<T> | (() => T);
type MaybeRefDeep<T> = MaybeRef<T extends Function ? T : T extends object ? {
    [Property in keyof T]: MaybeRefDeep<T[Property]>;
} : T>;
type NoUnknown<T> = Equal<unknown, T> extends true ? never : T;
type Equal<TTargetA, TTargetB> = (<T>() => T extends TTargetA ? 1 : 2) extends <T>() => T extends TTargetB ? 1 : 2 ? true : false;
type DeepUnwrapRef<T> = T extends UnwrapLeaf ? T : T extends Ref<infer U> ? DeepUnwrapRef<U> : T extends {} ? {
    [Property in keyof T]: DeepUnwrapRef<T[Property]>;
} : UnwrapRef<T>;
type ShallowOption = {
    /**
     * Return data in a shallow ref object (it is `false` by default). It can be set to `true` to return data in a shallow ref object, which can improve performance if your data does not need to be deeply reactive.
     */
    shallow?: boolean;
};
interface DefaultOptions<TError = DefaultError> {
    queries?: OmitKeyof<QueryObserverOptions<unknown, TError>, 'queryKey'> & ShallowOption;
    mutations?: MutationObserverOptions<unknown, TError, unknown, unknown> & ShallowOption;
    hydrate?: HydrateOptions['defaultOptions'];
    dehydrate?: DehydrateOptions;
}
interface QueryClientConfig {
    queryCache?: QueryCache;
    mutationCache?: MutationCache;
    defaultOptions?: DefaultOptions;
}

export type { DeepUnwrapRef, DefaultOptions, Equal, MaybeRef, MaybeRefDeep, MaybeRefOrGetter, NoUnknown, QueryClientConfig, ShallowOption };
