import { DBTable, DataSourceItem, FieldItem, ModelItem, RelationShipItem } from '../type';
export interface EventContext<P = any> {
    data?: P;
    [propName: string]: any;
}
/**
 * 将事件上下文转成事件对象。
 */
export type PluginEvent<T, P = any> = {
    context: T;
    type: string;
    preventDefault: () => void;
    stopPropagation: () => void;
    setData: (data: P) => void;
    prevented?: boolean;
    stoped?: boolean;
    pending?: Promise<any>;
    data?: P;
};
export type PluginEventFn = (e: PluginEvent<EventContext>) => false | void;
/**
 * 创建事件。
 * @param type
 * @param context
 */
export declare function createEvent<T extends EventContext>(type: string, context: T): PluginEvent<T>;
export interface AddModelEventContext extends EventContext {
    datasource: DataSourceItem;
    data: ModelItem;
}
export interface UpdateModelEventContext extends AddModelEventContext {
}
export interface AddFieldsEventContext extends EventContext {
    datasource: DataSourceItem;
    model: ModelItem;
    data: FieldItem | Array<FieldItem>;
}
export interface AddRelationEventContext extends EventContext {
    datasource: DataSourceItem;
    model: ModelItem;
    models: ModelItem[];
    data: RelationShipItem;
    dbTable?: DBTable;
}
export interface RemoveFieldEventContext extends EventContext {
    datasource: DataSourceItem;
    model: ModelItem;
    data: FieldItem;
}
export interface RemoveRelationEventContext extends AddRelationEventContext {
}
export interface RemoveModelEventContext extends EventContext {
    datasource: DataSourceItem;
    data: ModelItem;
}
export interface PluginEventListener {
    /** 添加模型相关 */
    beforeAddModel?: (event: PluginEvent<AddModelEventContext>) => false | void;
    afterAddModel?: (event: PluginEvent<AddModelEventContext>) => void;
    beforeUpdateModel?: (event: PluginEvent<AddModelEventContext>) => false | void;
    afterUpdateModel?: (event: PluginEvent<AddModelEventContext>) => void;
    /** 添加字段相关事件 */
    beforeAddFields?: (event: PluginEvent<AddFieldsEventContext>) => false | void;
    afterAddFields?: (event: PluginEvent<AddFieldsEventContext>) => void;
    /** 删除字段 */
    beforeRemoveField?: (event: PluginEvent<RemoveFieldEventContext>) => false | void;
    afterRemoveField?: (event: PluginEvent<RemoveFieldEventContext>) => void;
    /** 添加关系相关事件 */
    beforeAddRelation?: (event: PluginEvent<AddRelationEventContext>) => false | void;
    afterAddRelation?: (event: PluginEvent<AddRelationEventContext>) => void;
    /** 删除关系事件 */
    beforeRemoveRelation?: (event: PluginEvent<RemoveRelationEventContext>) => false | void;
    afterRemoveRelation?: (event: PluginEvent<RemoveRelationEventContext>) => void;
    /** 删除模型 */
    beforeRemoveModel?: (event: PluginEvent<RemoveModelEventContext>) => false | void;
    afterRemoveModel?: (event: PluginEvent<RemoveModelEventContext>) => void;
}
export declare class EventEmitter {
    readonly listeners: Array<{
        type: string;
        fn: PluginEventFn;
    }>;
    on(event: string, fn: PluginEventFn): void;
    off(event: string, fn: PluginEventFn): void;
    /**
     * 派发事件。
     * @param type
     * @param context
     */
    trigger<T extends EventContext>(type: string, context: T, additionalListeners?: Array<{
        type: string;
        fn: PluginEventFn;
    }>): PluginEvent<T>;
}
