import { type PrimaryFieldType } from "../core";
import type { ApiFetcher } from "../Api";
export type { PrimaryFieldType };
export type BaseModuleApiOptions = {
    host: string;
    basepath?: string;
    token?: string;
    headers?: Headers;
    token_transport?: "header" | "cookie" | "none";
    verbose?: boolean;
};
/** @deprecated */
export type ApiResponse<Data = any> = {
    success: boolean;
    status: number;
    body: Data;
    data?: Data extends {
        data: infer R;
    } ? R : any;
    res: Response;
};
export type TInput = string | (string | number | PrimaryFieldType)[];
export declare abstract class ModuleApi<Options extends BaseModuleApiOptions = BaseModuleApiOptions> {
    protected readonly _options: Partial<Options>;
    protected fetcher: ApiFetcher;
    constructor(_options?: Partial<Options>, fetcher?: ApiFetcher);
    protected getDefaultOptions(): Partial<Options>;
    get options(): Options;
    /**
     * used for SWR invalidation of basepath
     */
    key(): string;
    protected getUrl(path: string): string;
    protected request<Data = any>(_input: TInput, _query?: Record<string, any> | URLSearchParams, _init?: RequestInit): FetchPromise<ResponseObject<Data>>;
    get<Data = any>(_input: TInput, _query?: Record<string, any> | URLSearchParams, _init?: RequestInit): FetchPromise<ResponseObject<Data, Data extends {
        data: infer R;
    } ? R : Data>>;
    post<Data = any>(_input: TInput, body?: any, _init?: RequestInit): FetchPromise<ResponseObject<Data, Data extends {
        data: infer R;
    } ? R : Data>>;
    patch<Data = any>(_input: TInput, body?: any, _init?: RequestInit): FetchPromise<ResponseObject<Data, Data extends {
        data: infer R;
    } ? R : Data>>;
    put<Data = any>(_input: TInput, body?: any, _init?: RequestInit): FetchPromise<ResponseObject<Data, Data extends {
        data: infer R;
    } ? R : Data>>;
    delete<Data = any>(_input: TInput, body?: any, _init?: RequestInit): FetchPromise<ResponseObject<Data, Data extends {
        data: infer R;
    } ? R : Data>>;
}
export type ResponseObject<Body = any, Data = Body extends {
    data: infer R;
} ? R : Body> = Data & {
    raw: Response;
    res: Response;
    data: Data;
    body: Body;
    ok: boolean;
    status: number;
    toJSON(): Data;
};
export declare function createResponseProxy<Body = any, Data = any>(raw: Response, body: Body, data?: Data): ResponseObject<Body, Data>;
export declare class FetchPromise<T = ApiResponse<any>> implements Promise<T> {
    request: Request;
    protected options?: {
        fetcher?: ApiFetcher;
        verbose?: boolean;
    } | undefined;
    protected refineData?: ((data: any) => any) | undefined;
    [Symbol.toStringTag]: "FetchPromise";
    constructor(request: Request, options?: {
        fetcher?: ApiFetcher;
        verbose?: boolean;
    } | undefined, refineData?: ((data: any) => any) | undefined);
    get verbose(): boolean;
    refine<N>(fn: (data: T) => N): FetchPromise<ApiResponse<N>>;
    execute(): Promise<ResponseObject<T>>;
    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined): Promise<TResult1 | TResult2>;
    catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<T | TResult>;
    finally(onfinally?: (() => void) | null | undefined): Promise<T>;
    path(): string;
    key(options?: {
        search: boolean;
    }): string;
    keyArray(options?: {
        search: boolean;
    }): string[];
    toString(): string;
    toJSON(): {
        url: string;
        method: string;
    };
}
