import type { Resolvable } from './common-types';
import * as Bluebird from 'bluebird';
export declare type RollbackAction = () => Resolvable<void>;
export declare type HookFn = (...args: any[]) => any;
export interface HookBlueprint {
    HOOK: HookFn;
    effects: boolean;
}
export declare type InstantiatedHooks<T extends object> = {
    [key in keyof T]: Hook[];
};
export declare class Hook {
    private hookFn;
    constructor(hookFn: HookFn);
    run(...args: any[]): Promise<any>;
}
export declare class SideEffectHook extends Hook {
    private rollbackFns;
    private rolledBack;
    constructor(hookFn: HookFn);
    registerRollback(fn: RollbackAction): void;
    rollback(): Bluebird<void> | undefined;
}
export declare const rollbackRequestHooks: <T extends InstantiatedHooks<any>>(hooks: T | undefined) => void;
export declare const instantiateHooks: <T extends { [key in keyof T]: HookBlueprint[]; }>(hooks: T) => InstantiatedHooks<T>;
