import type { L2Chain } from "../../../data/chains.js";
import type { LogEntry } from "../../../utils/formatters.js";
import type { ConfigHandler } from "../ModulesConfigHandler.js";
export declare enum ModuleCategory {
    Node = "node",
    Dapp = "dapp",
    Explorer = "explorer",
    Service = "service",
    Other = "other"
}
export type DefaultModuleFields = {
    name: string;
    description: string;
    category: ModuleCategory;
};
export declare const modulesPath: string;
export declare const createModulesFolder: () => void;
type ModuleConfigDefault = Record<string, unknown>;
declare abstract class Module<TModuleConfig = ModuleConfigDefault> {
    configHandler: ConfigHandler;
    name: DefaultModuleFields["name"];
    description: DefaultModuleFields["description"];
    category: DefaultModuleFields["category"];
    package: {
        name: string;
        version: string;
        symlinked: boolean;
    };
    isNodeSupported(_: NodeInfo): boolean | Promise<boolean>;
    abstract isInstalled(): Promise<boolean>;
    abstract install(): Promise<void>;
    abstract isRunning(): Promise<boolean>;
    get startAfterNode(): boolean;
    abstract start(): Promise<void>;
    getStartupInfo(): LogEntry[] | Promise<LogEntry[]>;
    getLogs(): Promise<void | string[]>;
    get version(): string | undefined;
    getLatestVersion(): Promise<string | undefined>;
    update(): Promise<void>;
    abstract stop(): Promise<void>;
    abstract clean(): Promise<void>;
    get dataDirPath(): string;
    get configPath(): string;
    get moduleConfig(): TModuleConfig;
    setModuleConfig(config: TModuleConfig): void;
    removeDataDir(): void;
    constructor(data: DefaultModuleFields, configHandler: ConfigHandler);
}
export default Module;
export type NodeInfo = L2Chain;
export declare abstract class ModuleNode<TModuleConfig = ModuleConfigDefault> extends Module<TModuleConfig> {
    abstract get nodeInfo(): NodeInfo;
    constructor(data: Omit<DefaultModuleFields, "category">, modulesConfigHandler: ConfigHandler);
}
