import { RequestInit } from 'node-fetch';
import { PromiseType } from 'utility-types';
export declare const CLOUD_FUNCTION_ROOT_ENDPOINT = "CLOUD_FUNCTION_ROOT_ENDPOINT";
export declare const defaultApiParams: () => {
    rootEndpoint: string;
};
export interface IApiParams {
    rootEndpoint: string;
}
export declare const fetchFn: (functionName: string, init?: RequestInit | undefined, params?: IApiParams) => Promise<import("node-fetch").Response>;
/**
 * Call function using Firebase HTTP call conventions
 * @param functionName Name of the function
 * @param authToken Authentication token
 * @param rootEndpoint Functions root endpoint
 */
export declare const callFn: <T, P = unknown>(functionName: string, params?: IApiParams) => (data: P, opts?: ICallOpts) => Promise<T>;
interface ICallOpts {
    authToken?: string;
}
declare type ParametersIf<T> = T extends (...args: unknown[]) => unknown ? Parameters<T> : [never];
declare type ReturnTypeIf<T> = T extends (...args: unknown[]) => unknown ? ReturnType<T> : never;
declare type PromiseTypeIf<T> = T extends Promise<unknown> ? PromiseType<T> : never;
export declare function apiOf<T>(params?: IApiParams): {
    callFn: <K extends keyof T>(name: K, param: ParametersIf<T[K]>[0], opts?: ICallOpts) => Promise<PromiseTypeIf<ReturnTypeIf<T[K]>>>;
};
export {};
