declare class JaidCorePlugin {
    /**
     * @param {string} message
     */
    log(message: string): void;
    /**
     * @param {string} message
     */
    logWarning(message: string): void;
    /**
     * @param {string} message
     */
    logError(message: string): void;
    /**
     * @param {string} message
     */
    logDebug(message: string): void;
}

/** @module jaid-core
 */
declare module "jaid-core" {
    /**
     * @typedef {Object} Options
     * @prop {string} name
     * @prop {string|string[]} [folder]
     * @prop {string} version
     * @prop {import("essential-config").Options} configSetup
     * @prop {boolean|string} database
     * @prop {import("sequelize").Options} sequelizeOptions
     * @prop {number} insecurePort
     * @prop {number} securePort
     * @prop {boolean} [http2=false]
     * @prop {"error"|"warn"|"info"|"debug"|"silly"} [serverLogLevel="debug"]
     * @prop {"error"|"warn"|"info"|"debug"|"silly"} [databaseLogLevel="debug"]
     * @prop {"error"|"warn"|"info"|"debug"|"silly"} [gotLogLevel="debug"]
     * @prop {boolean} [useGot=true]
     * @prop {boolean} [sqlite=false]
     * @prop {string[]|string|false} [databaseExtensions=false]
     * @prop {boolean|Object} [koaSession]
     */
    export type Options = {
        name: string;
        folder?: string | string[];
        version: string;
        database: boolean | string;
        insecurePort: number;
        securePort: number;
        http2?: boolean;
        serverLogLevel?: "error" | "warn" | "info" | "debug" | "silly";
        databaseLogLevel?: "error" | "warn" | "info" | "debug" | "silly";
        gotLogLevel?: "error" | "warn" | "info" | "debug" | "silly";
        useGot?: boolean;
        sqlite?: boolean;
        databaseExtensions?: string[] | string | false;
        koaSession?: boolean | any;
    };
    /**
     * @typedef {Object} BaseConfig
     * @prop {string} databaseDialect
     * @prop {string} databaseName
     * @prop {string} databaseUser
     * @prop {string} databaseHost
     * @prop {number} databasePort
     * @prop {"alter"|"sync"|"force"|false} databaseSchemaSync
     * @prop {string} timezone
     * @prop {number} insecurePort
     * @prop {number} securePort
     * @prop {string} databasePath
     * @prop {string[]|string} koaKeys
     * @prop {string[]|string} disabledPlugins
     */
    export type BaseConfig = {
        databaseDialect: string;
        databaseName: string;
        databaseUser: string;
        databaseHost: string;
        databasePort: number;
        databaseSchemaSync: "alter" | "sync" | "force" | false;
        timezone: string;
        insecurePort: number;
        securePort: number;
        databasePath: string;
        koaKeys: string[] | string;
        disabledPlugins: string[] | string;
    };
    /**
     * @typedef {Object} SequelizeDefinition
     * @prop {import("sequelize").ModelAttributes} schema
     * @prop {import("sequelize").IndexesOptions[]} indexes
     * @prop {typeof import("sequelize").Model} default
     */
    export type SequelizeDefinition = {};
    /**
     * @constructor
     * @param {Options} options
     */
    export class JaidCore {
        constructor(options: Options);
        /**
         * @type {Date}
         */
        startTime: Date;
        /**
         * @type {Set}
         */
        unusedPluginEvents: Set;
        /**
         * @type {string}
         */
        defaultLogLevel: string;
        /**
         * @type {boolean}
         */
        hasDatabase: boolean;
        /**
         * @type {boolean}
         */
        hasInsecureServer: boolean;
        /**
         * @type {boolean}
         */
        hasSecureServer: boolean;
        /**
         * @type {boolean}
         */
        hasServer: boolean;
        /**
         * @type {string}
         */
        camelName: string;
        /**
         * @type {string[]}
         */
        appPath: string[];
        /**
         * @type {import("jaid-logger").JaidLogger}
         */
        logger: any;
        /**
         * @type {string}
         */
        appFolder: string;
        /**
         * @type {string}
         */
        logFolder: string;
        /**
         * @type {string[]}
         */
        databaseExtensions: string[];
        /**
         * @type {BaseConfig}
         */
        config: BaseConfig;
        /**
         * @type {boolean}
         */
        hasPlugins: boolean;
        /**
         * @type {Object}
         */
        plugins: any;
        /**
         * @type {import("sequelize").Sequelize}
         */
        database: any;
        /**
         * @type {import("koa")}
         */
        koa: any;
        /**
         * @type {import("got").GotInstance}
         */
        got: any;
        /**
         * @type {require("http2").Http2Server}
         */
        insecureServer: require;
        /**
         * @type {require("http2").Http2SecureServer}
         */
        secureServer: require;
        /**
         * @type {import("essential-config").Options}
         */
        configSetup: any;
        /**
         * @param {string} modelName
         * @param {SequelizeDefinition} definition
         */
        registerModel(modelName: string, definition: SequelizeDefinition): void;
        /**
         * @param {string} modelName
         * @param {(superClass, classGenerationContext) => SequelizeDefinition} generateDefinition
         * @param {Object} Sequelize
         * @param {Object} plugin
         */
        registerModelDynamic(modelName: string, generateDefinition: any, Sequelize: any, plugin: any): void;
        /**
         * @returns {Promise<void>}
         */
        close(): Promise<void>;
        /**
         * @param {string} memberName
         * @param {...*} args
         * @return {Promise<Object>}
         */
        callPlugins(memberName: string, ...args: any[]): Promise<object>;
        /**
         * @param {string} memberName
         * @param {...*} args
         * @return {Promise<void>}
         */
        callAndRemovePlugins(memberName: string, ...args: any[]): Promise<void>;
        /**
         * @param {Function} job
         */
        doForManagedPluginsSync(job: (...params: any[]) => any): void;
        /**
         * @param {Function} job
         * @return {Promise<void>}
         */
        doForManagedPlugins(job: (...params: any[]) => any): Promise<void>;
        /**
         * @param {string} pluginId
         * @return {string}
         */
        formatPluginName(pluginId: string): string;
        /**
         * @param {string} pluginId
         * @param {Object} plugin
         * @return {string}
         */
        formatPluginNameDetailed(pluginId: string, plugin: any): string;
        /**
         * @param {Object} [plugins={}]
         * @returns {Promise<void>}
         */
        init(plugins?: any): Promise<void>;
        /**
         * @type {import("koa")}
         */
        koa: any;
    }
    /**
     * @typedef {Object} ModelDefinitionContext
     * @prop {JaidCore} core
     * @prop {JaidCorePlugin} parentPlugin
     * @prop {import("sequelize").default} sequelize
     * @prop {Object<string, import("sequelize").Model)} models
     */
    export type ModelDefinitionContext = {
        core: JaidCore;
        parentPlugin: JaidCorePlugin;
    };
}