/**
 * Extends interfaces in Vue.js
 */

import Vue from 'vue';

export {
    createDataProvider,
    createVuePlugin
}

type OptionalKeyOf<T> = {
    [key in keyof T]?: T[key]
}

declare module 'vue/types/vue' {
    interface Vue {
        $createDataProvider<T, V, FULLDATA, D = null, STATE>(args: {
            action: Function<Promise>;
            variables?: V;
            update?: function(FULLDATA): D;
            initData?: FULLDATA;
            skip?: Boolean;
            beforeSend?: Function;
            onSuccess?: function({
                loading: Boolean;
                data: any;
                fullData: any;
                error: any;
                variables: V;
                send: Function;
                init: Function;
                extra: T;
            }): any;
            onError?: Function;
            onComplete?: Function;
            extra?: T;
        }): {
            loading: Boolean;
            data: D extends null | undefined | never ? FULLDATA : D;
            fullData: FULLDATA;
            error: any;
            variables: V;
            send: function(OptionalKeyOf<V>?): Promise<D>;
            sending: function(OptionalKeyOf<V>?): Promise<D>;
            sends: function(): Promise<D>;
            sendings: function(): Promise<D>;
            setData: function(FULLDATA?);
            initData: Function;
            init: Function;
            extra: T;
            setVars: function(V, B);
            setExtra: function(T, B);
            times: number;
            successTimes: number;
            errorTimes: number;
        };
    };
}
