<%
const { myConfig } = it;
const errorType = myConfig.httpClientType === 'axios' ? 'AxiosError<any>' : 'any';
%>
import { AxiosError } from 'axios';

import {
  UseInfiniteQueryOptions,
  UseMutationOptions,
  UseQueryOptions,
  UseSuspenseQueryOptions,
  UseSuspenseInfiniteQueryOptions,
} from '@tanstack/react-query';


/**
 * !DO NOT EDIT THIS FILE
 *
 * 스크립트가 실행될때, 파일을 항상 새로 쓰기 때문에 파일 수정시 작성내용이 제거 될 수 있습니다.
 */

 

export type QueryHookParams<
  T extends CustomRequestFn,
  Error = <%~ errorType %>,
  TData = RequestFnReturn<T>,
  OriginData = RequestFnReturn<T>,
  Variables = Parameter<T>,
> = {
  options?: Omit<
    UseQueryOptions<OriginData, Error, TData>,
    'queryKey' | 'queryFn'
  >;
} & OptionalVariables<Variables>;

export type InfiniteQueryHookParams<
  T extends CustomRequestFn,
  Error = <%~ errorType %>,
  TData = RequestFnReturn<T>,
  OriginData = RequestFnReturn<T>,
  Variables = Parameter<T>,
  TPageParam = string
> = {
  options?: Partial<
    Omit<
      UseInfiniteQueryOptions<OriginData, Error, TData, any, TPageParam>,
      'queryKey' | 'queryFn'
    >
  >;
} & OptionalVariables<Variables>;

export type MutationHookParams<
  T extends CustomRequestFn,
  Error = <%~ errorType %>,
  Data = RequestFnReturn<T>,
  Variables = Parameter<T>,
> = {
  options?: Omit<
    UseMutationOptions<Data, Error, Variables>,
    'mutationFn' | 'mutationKey'
  >;
};

export type SuspenseQueryHookParams<
  T extends CustomRequestFn,
  Error = <%~ errorType %>,
  TData = RequestFnReturn<T>,
  OriginData = RequestFnReturn<T>,
  Variables = Parameter<T>,
> = {
  options?: Omit<
    UseSuspenseQueryOptions<OriginData, Error, TData>,
    'queryKey' | 'queryFn'
  >;
} & OptionalVariables<Variables>;

export type SuspenseInfiniteQueryHookParams<
  T extends CustomRequestFn,
  Error = <%~ errorType %>,
  TData = RequestFnReturn<T>,
  OriginData = RequestFnReturn<T>,
  Variables = Parameter<T>,
  TPageParam = string
> = {
  options?: Partial<
    Omit<
      UseSuspenseInfiniteQueryOptions<OriginData, Error, TData, any, TPageParam>,
      'queryKey' | 'queryFn'
    >
  >;
} & OptionalVariables<Variables>;

export type OptionalVariables<T> = undefined extends T
  ? { variables?: T }
  : { variables: T };

export type Parameter<T> = T extends (param: infer U) => any ? U : never;

export type CustomRequestFn = (variables?: any) => Promise<any>;

export type RequestFnReturn<T extends CustomRequestFn> = Awaited<ReturnType<T>>;
