import type { Body, DefinePluginOpts, Meta, PluginOpts, State, Uppy, UppyFile } from '@uppy/core';
import { BasePlugin, EventManager } from '@uppy/core';
import { type FetcherOptions, type LocalUppyFile } from '@uppy/utils';
export interface XhrUploadOpts<M extends Meta, B extends Body> extends PluginOpts {
    endpoint: string | ((fileOrBundle: UppyFile<M, B> | UppyFile<M, B>[]) => string | Promise<string>);
    method?: 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'OPTIONS' | 'PATCH' | 'delete' | 'get' | 'head' | 'options' | 'post' | 'put' | string;
    formData?: boolean;
    fieldName?: string;
    headers?: Record<string, string> | ((file: UppyFile<M, B>) => Record<string, string>);
    timeout?: number;
    limit?: number;
    responseType?: XMLHttpRequestResponseType;
    withCredentials?: boolean;
    onBeforeRequest?: (xhr: XMLHttpRequest, retryCount: number, 
    /** The files to be uploaded. When `bundle` is `false` only one file is in the array.  */
    files: UppyFile<M, B>[]) => void | Promise<void>;
    shouldRetry?: FetcherOptions['shouldRetry'];
    onAfterResponse?: FetcherOptions['onAfterResponse'];
    getResponseData?: (xhr: XMLHttpRequest) => B | Promise<B>;
    allowedMetaFields?: boolean | string[];
    bundle?: boolean;
}
export type { XhrUploadOpts as XHRUploadOptions };
declare module '@uppy/utils' {
    interface LocalUppyFile<M extends Meta, B extends Body> {
        xhrUpload?: XhrUploadOpts<M, B>;
    }
    interface RemoteUppyFile<M extends Meta, B extends Body> {
        xhrUpload?: XhrUploadOpts<M, B>;
    }
}
declare module '@uppy/core' {
    interface State<M extends Meta, B extends Body> {
        xhrUpload?: XhrUploadOpts<M, B>;
    }
}
declare module '@uppy/core' {
    interface PluginTypeRegistry<M extends Meta, B extends Body> {
        XHRUpload: XHRUpload<M, B>;
    }
}
declare const defaultOptions: {
    formData: true;
    fieldName: string;
    method: string;
    allowedMetaFields: true;
    bundle: false;
    headers: {};
    timeout: number;
    limit: number;
    withCredentials: false;
    responseType: "";
};
type Opts<M extends Meta, B extends Body> = DefinePluginOpts<XhrUploadOpts<M, B>, keyof typeof defaultOptions>;
interface OptsWithHeaders<M extends Meta, B extends Body> extends Opts<M, B> {
    headers: Record<string, string>;
}
export default class XHRUpload<M extends Meta, B extends Body> extends BasePlugin<Opts<M, B>, M, B> {
    #private;
    static VERSION: string;
    uploaderEvents: Record<string, EventManager<M, B> | null>;
    constructor(uppy: Uppy<M, B>, opts: XhrUploadOpts<M, B>);
    getOptions(file: UppyFile<M, B>): OptsWithHeaders<M, B>;
    addMetadata(formData: FormData, meta: State<M, B>['meta'], opts: Opts<M, B>): void;
    createFormDataUpload(file: LocalUppyFile<M, B>, opts: Opts<M, B>): FormData;
    createBundledUpload(files: LocalUppyFile<M, B>[], opts: Opts<M, B>): FormData;
    install(): void;
    uninstall(): void;
}
//# sourceMappingURL=index.d.ts.map