import type { Connection } from "../../data/connection";
import type { EntityManager } from "../../data/entities/EntityManager";
import * as proto from "../../data/prototype";
import { type ModuleBuildContext } from "../Module";
import { type ModuleConfigs, type Modules, type ModuleKey, ModuleManager, type ModuleManagerOptions } from "../ModuleManager";
export type { ModuleBuildContext };
export type ConfigTable<Json = ModuleConfigs> = {
    id?: number;
    version: number;
    type: "config" | "diff" | "backup";
    json: Json;
    created_at?: Date;
    updated_at?: Date;
};
export declare const __bknd: import("../..").Entity<"__bknd", {
    version: import("../../data/fields").NumberField<true>;
    type: import("../../data/fields").EnumField<true, string>;
    json: import("../../data/fields").JsonSchemaField<true, object>;
    created_at: import("../../data/fields").DateField<false> & {
        required: () => import("../../data/fields").DateField<true>;
    };
    updated_at: import("../../data/fields").DateField<false> & {
        required: () => import("../../data/fields").DateField<true>;
    };
}>;
type ConfigTable2 = proto.Schema<typeof __bknd>;
interface T_INTERNAL_EM {
    __bknd: ConfigTable2;
}
export declare class DbModuleManager extends ModuleManager {
    __em: EntityManager<T_INTERNAL_EM>;
    private _version;
    private readonly _booted_with?;
    private _stable_configs;
    buildSyncConfig: {
        force?: boolean;
        drop?: boolean;
    };
    constructor(connection: Connection, options?: Partial<ModuleManagerOptions>);
    /**
     * This is set through module's setListener
     * It's called everytime a module's config is updated in SchemaObject
     * Needs to rebuild modules and save to database
     */
    protected onModuleConfigUpdated(key: string, config: any): Promise<void>;
    private repo;
    private mutator;
    private get db();
    syncConfigTable(): Promise<{
        sql: string;
        parameters: readonly unknown[];
    }[]>;
    private fetch;
    save(): Promise<this>;
    private revertModules;
    /**
     * Validates received diffs for an additional security control.
     * Checks:
     *   - check if module is registered
     *   - run modules onBeforeUpdate() for added protection
     *
     * **Important**: Throw `Error` so it won't get catched.
     *
     * @param diffs
     * @private
     */
    private validateDiffs;
    build(opts?: {
        fetch?: boolean;
    }): Promise<this>;
    protected buildModules(options?: {
        graceful?: boolean;
        ignoreFlags?: boolean;
    }): Promise<{
        built: boolean;
        modules: ModuleKey[];
        synced: boolean;
        saved: boolean;
        reloaded: boolean;
    }>;
    protected setupInitial(): Promise<void>;
    mutateConfigSafe<Module extends keyof Modules>(name: Module): Pick<ReturnType<Modules[Module]["schema"]>, "set" | "patch" | "overwrite" | "remove">;
    version(): number;
}
