import { type BatchOptions } from '../fetcher';
import { type LinkedType } from '../types';
import { type GraphqlOperation, ParseRequestOptions } from './generateGraphqlOperation';
import type { AxiosInstance, AxiosRequestConfig } from 'axios';
import { type Client as WSClient, type ClientOptions as WSClientOptions } from 'graphql-ws';
import { Observable } from 'zen-observable-ts';
type HeaderValue = string | string[] | number | boolean | null;
type RawHeaders = Record<string, HeaderValue>;
export type Headers = RawHeaders | (() => RawHeaders) | (() => Promise<RawHeaders>);
export interface ClientRequestConfig<D = any> extends AxiosRequestConfig<D> {
    headers?: RawHeaders;
}
export type BaseFetcher = {
    fetcherMethod: (operation: GraphqlOperation | GraphqlOperation[], config?: ClientRequestConfig) => Promise<any>;
    fetcherInstance: AxiosInstance | unknown | undefined;
};
export type ClientOptions = Omit<ClientRequestConfig, 'body' | 'headers'> & {
    url?: string;
    timeout?: number;
    batch?: BatchOptions | boolean;
    fetcherMethod?: BaseFetcher['fetcherMethod'];
    fetcherInstance?: BaseFetcher['fetcherInstance'];
    headers?: Headers;
    subscription?: {
        url?: string;
        headers?: Headers;
    } & Partial<WSClientOptions>;
    webSocketImpl?: unknown;
    generateGraphqlOperationOptions?: ParseRequestOptions;
};
export interface GraphQLClient {
    wsClient?: WSClient;
    query?: <T = any>(request: any, config?: ClientRequestConfig) => Promise<T>;
    mutation?: <T = any>(request: any, config?: ClientRequestConfig) => Promise<T>;
    subscription?: <T = any>(request: any, config?: ClientOptions) => Observable<T>;
    fetcherInstance: BaseFetcher['fetcherInstance'];
    fetcherMethod: BaseFetcher['fetcherMethod'];
}
export declare function createClient({ queryRoot, mutationRoot, subscriptionRoot, generateGraphqlOperationOptions, ...options }: ClientOptions & {
    queryRoot?: LinkedType;
    mutationRoot?: LinkedType;
    subscriptionRoot?: LinkedType;
}): GraphQLClient;
export {};
//# sourceMappingURL=createClient.d.ts.map