import type { AxiosInstance } from 'axios';
import type { AxiosResponse } from 'axios';
import type { CancelToken } from 'axios';
import type { CancelTokenSource } from 'axios';
import type { InternalAxiosRequestConfig } from 'axios';

/**
 * axios serializer wrapper function
 *
 * @param instance - axios or axios instance
 * @param options - serializer options
 * @return - axios instance with serializer feature
 */
declare function axiosSeries(instance: AxiosInstance, options?: SerializerOptions): {
    <T = any, R = AxiosResponse<T, any>, D = any>(config: SerializerRequestOptions<D>): Promise<R>;
    <T_1 = any, R_1 = AxiosResponse<T_1, any>, D_1 = any>(url: string, config?: SerializerRequestOptions<D_1> | undefined): Promise<R_1>;
    /**
     * all waiting series
     */
    series: WaitingList;
    /**
     * clear all series
     */
    clear(): void;
};
export default axiosSeries;

export declare interface SerializerOptions extends Record<string, unknown> {
    unique?: boolean;
    orderly?: boolean;
    onCancel?: (err: any, config: InternalAxiosRequestConfig) => void;
}

export declare interface SerializerRequestOptions<D = any> extends InternalAxiosRequestConfig<D> {
    unique?: boolean;
    orderly?: boolean;
    cancelToken?: CancelToken;
    signal?: AbortSignal;
    type?: string;
    error?: boolean;
}

export declare interface Series {
    promiseKey: symbol;
    promise: Promise<any>;
    source: CancelTokenSource;
    abortController?: AbortController;
}

export declare type WaitingList = Record<string, Series[]>;

export { }
