import { SupportConfigExtensions } from './constants';
import { Environment } from './environment';
import { Logger } from './logger';
import type { Plugin } from './plugin';
import type { Json, JsonArray, ObjectValues, UserConfig } from './types';
export declare type UserConfigFn = () => UserConfig | Promise<UserConfig>;
export declare type UserConfigExport = UserConfig | Promise<UserConfig> | UserConfigFn;
/**
 * 支持的插件类型
 */
export declare type PluginOption = Plugin | [string, Json] | string;
/**
 * 插件类型
 */
export declare enum PluginTypes {
    /**
     * 通过 npm 自动载入的
     */
    auto = "auto",
    /**
     * 通过 use 方法传入
     */
    use = "use",
    /**
     * 通过 Runner.run 方法直接指定
     */
    runner = "runner",
    /**
     * 通过 userConfig 传入
     */
    config = "config",
    /**
     * 通过 命令行选项 传入
     */
    cli = "cli"
}
export declare type UsedPluginsMap = Map<string, {
    plugin: Plugin;
    pluginType: PluginTypes;
    version: string;
}>;
/**
 * 配置文件过滤条件类型
 */
export declare type ConfigFilterType = string[] | string | undefined;
/**
 * 支持的配置文件后缀名类型
 */
export declare type SupportConfigExtensionTypes = ObjectValues<typeof SupportConfigExtensions>;
/**
 * 多配置选项
 */
export interface MultipleConfigOptions {
    /**
     * 多配置字段名称
     */
    by: string;
}
/**
 * 用户配置支持
 * 1. 支持自定义 配置 配置文件的名称
 * 2. 支持 js、ts、mjs、json 四种配置文件方式
 * 3. 不同的文件使用不同的方式载入
 * 4. 支持用户自定义配置文件名称, 并指定配置文件的支持类型
 * 5. 支持通过插件注册配置字段和校验schema
 * 6. 支持 开启配置数组, 并通过用户指定的 字段来区分
 * 7. 支持配置合并
 */
export declare class Config {
    /**
     * 配置基础名称
     */
    private _name;
    /**
     * option 名称
     */
    optionName: string;
    /**
     * option 别名
     */
    optionNameAlias?: string;
    /**
     * 是否开启多配置支持
     * 默认为 `false`
     * 多配置支持示例: `[{ name: 'config-one' }, { name: 'config-two' }]`
     */
    multipleConfigEnabled: boolean;
    /**
     * 是否开启通过 package.json 读取配置
     * 如: `{ takin： {} }`
     */
    packageJsonConfigEnabled: boolean;
    /**
     * 是否开启了 env 支持
     */
    env: Environment;
    /**
     * 多配置名称字段
     * 默认为 `name`
     */
    multipleConfigNameField?: string;
    /**
     * 允许自定义支持的配置文件类型
     */
    supportConfigExtensions: (".ts" | ".js" | ".mjs" | ".json" | ".jsonc" | ".json5")[];
    /**
     * 支持设置用户配置文件名称, 不包含后缀设置
     * 默认为 `takin.config`
     */
    supportConfigNames: string[];
    /**
     * 当前项目 package.json 内容
     */
    pkg?: Json;
    /**
     * 当前项目的 package.json 路径
     */
    pkgPath: string;
    /**
     * 用户配置文件内容
     */
    userConfig?: UserConfig[];
    /**
     * 用户配置文件地址
     */
    userConfigFilePath?: string;
    /**
     * 已使用的插件
     */
    usedPlugins: UsedPluginsMap;
    /**
     * 配置专用 logger
     */
    logger: Logger;
    /**
     * 插件动态载入规则配置, 支持一组正则
     */
    private pluginAutoLoadPatterns;
    /**
     * 项目执行文件根目录, 默认为 `process.cwd()`
     */
    cwd: string;
    /**
     * 缓存文件夹
     */
    private cacheDir?;
    /**
     * 临时文件夹
     */
    private tempDir?;
    /**
     * 初始化时使用的配置文件名称
     * @param name - 配置文件名称
     */
    constructor(name: string);
    /**
     * 设置全局名称
     * @param name - 命令行全局名称
     * @return this
     */
    setName(name: string): this;
    /**
     * 获取 cli 全局名称
     */
    get name(): string;
    /**
     * 设置 option 名称和别名, 用于命令行
     * @param name - 名称
     * @param alias - 别名
     * @return this
     */
    setOptionName(name: string, alias?: string): this;
    /**
     * 配置支持的配置文件名称
     * @param names - 文件名称, 如 `['takin.config']`
     * @return this
     */
    setSupportConfigFileNames(names: string[]): this;
    /**
     * 配置支持的配置文件名称
     * @param extensions - 后缀名, 如 `['.js']`
     * @return this
     */
    setSupportConfigFileExtensions(extensions: SupportConfigExtensionTypes[]): this;
    /**
     * 开启通过 package.json 读取用户配置
     * @return this
     */
    enablePackageJsonConfig(): this;
    /**
     * 关闭通过 package.json 读取用户配置
     * @return this
     */
    disablePackageJsonConfig(): this;
    /**
     * 开启多配置支持
     * @param opts - 多配置支持选项
     * @return this
     */
    enableMultipleConfig(opts?: MultipleConfigOptions): this;
    /**
     * 关闭多配置支持
     * @return this
     */
    disableMultipleConfig(): this;
    /**
     * 设置插件自动加载规则
     * @param patterns - 规则
     * @return this
     */
    setPluginAutoLoadPatterns(patterns: RegExp[]): this;
    /**
     * 从 package.json 的 dependencies 和 devDependencies 中基于规则自动载入插件-
     */
    autoLoadPlugins(): Promise<void>;
    /**
     * @private
     * 设置内部插件
     */
    usePlugins(plugins: PluginOption[], pluginType: PluginTypes): void;
    /**
     * @private
     * 警告插件重复
     * @returns true 为 重复, false 为不重复
     */
    warnDuplicatePlugin(plugins: UsedPluginsMap, pluginName: string, version: string): boolean;
    /**
     * @private
     * 加载用户 插件列表, 并执行
     * 支持的格式
     * ```
     *   plugins: [
     *     'plugin_name',
     *     ['plugin_name', { somePluginOption: 1 }],
     *     new Plugin({}),
     *   ]
     * ```
     * @param plugins - 插件列表
     * @param invokeOnUse - 是否触发插件 onUse 回调
     * @param pluginType - 插件调用类型
     */
    resolveUserPlugins(plugins: PluginOption[], invokeOnUse: boolean, pluginType: PluginTypes): UsedPluginsMap;
    /**
     * 对用户使用的插件进行排序
     *   plugin.enforce 属性只处理 pre 和 post 两个值, 其他值会忽略
     *   原则上除了将部分插件提前或置后之外, 不改变用户自行设定的插件顺序
     *   plugin.enforce = 'pre' 会排在所有插件最前面
     *   plugin.enforce = 'post' 会排在所有插件最后面
     * @param plugins - 插件列表
     */
    sortUserPlugins(plugins: (Plugin | Plugin[])[] | undefined): [Plugin[], Plugin[], Plugin[]];
    /**
     * 解析配置过滤条件
     * @param filters - 过滤条件
     * @returns 解析后的过滤条件
     */
    parseFilter(filters?: ConfigFilterType): Set<string> | undefined;
    /**
     * 过滤用户配置
     * @param filters - 过滤条件
     * @param userConfigs - 需要过滤的用户配置
     * @returns 过滤后的用户配置
     */
    protected filterBy(filters?: ConfigFilterType, userConfigs?: UserConfig[]): UserConfig[];
    /**
     * 载入和返回 package.json 的内容, 并存储在 this.pkg 中
     * @returns
     */
    private loadPackageJson;
    /**
     * 载入用户配置文件
     * @param configFile - 配置文件地址
     * @returns 配置文件内容
     */
    loadConfigFromFile(configFile?: string): Promise<JsonArray | null>;
    /**
     * 获取临时目录文件夹
     * @returns 当前 cwd 下的临时文件夹, 通常为 .[name] 文件夹
     */
    getTempDir(): string;
    /**
     * 设置临时文件夹
     */
    setTempDir(tempDir: string): void;
    /**
     * 清空临时文件夹
     */
    clearTempDir(): void;
    /**
     * 清空缓存文件夹
     */
    clearCacheDir(): void;
    /**
     * 写入到 cache 文件夹
     * @param fileName - 文件名称
     * @param content - 文件内容
     * @returns 缓存文件完整路径
     */
    writeToCacheDir(fileName: string, content: string): string;
    /**
     * 读取缓存文件
     * @param fileName - 文件名称
     * @returns 文件内容
     */
    loadCachedFile(fileName: string): Promise<string | undefined>;
    /**
     * 根据文件名称, 获取缓存文件完整地址
     * @param fileName - 文件名称
     * @returns 缓存文件完整地址
     */
    getCachedFilePath(fileName: string): string;
    /**
     * 获取 缓存 文件夹
     * @returns 文件夹地址
     */
    getCacheDir(): string;
}
