/// <reference types="node" />
/// <reference types="node" />
import EventEmitter from 'events';
import { IFs } from 'memfs';
import { Plugin, Runner, zod as z } from 'takin';
import webpack, { Compiler, Configuration, Watching } from 'webpack';
import WebpackChain from 'webpack-chain-5';
export declare type InputFileSystem = Compiler['inputFileSystem'];
/**
 * Webpack 相关用户配置
 */
declare const WebpackConfigSchema: z.ZodObject<{
    /**
     * webpack chain 支持, 允许定制 webpack 配置
     */
    webpackChain: z.ZodOptional<z.ZodFunction<z.ZodTuple<[z.ZodType<WebpackChain, z.ZodTypeDef, WebpackChain>], z.ZodUnknown>, z.ZodUnion<[z.ZodPromise<z.ZodVoid>, z.ZodVoid]>>>;
    /**
     * 允许额外 watch 一些被 ignore 的目录或文件
     */
    watchNodeModules: z.ZodOptional<z.ZodUnion<[z.ZodUnion<[z.ZodString, z.ZodType<RegExp, z.ZodTypeDef, RegExp>]>, z.ZodArray<z.ZodString, "many">]>>;
}, "strip", z.ZodTypeAny, {
    webpackChain?: (args_0: WebpackChain, ...args_1: unknown[]) => void | Promise<void>;
    watchNodeModules?: string | RegExp | string[];
}, {
    webpackChain?: (args_0: WebpackChain, ...args_1: unknown[]) => void | Promise<void>;
    watchNodeModules?: string | RegExp | string[];
}>;
/**
 * webpackChain 配置类型支持
 */
export declare type WebpackUserConfig = z.infer<typeof WebpackConfigSchema>;
declare type Universalify<T> = T extends (arg0: infer A, arg1: (arg0: null | NodeJS.ErrnoException, arg1: infer B) => void) => void ? ((arg0: A) => Promise<B>) & T : never;
export declare type UniversalifiedInputFileSystem = {
    readFile: Universalify<InputFileSystem['readFile']>;
    readJson: Universalify<InputFileSystem['readJson']>;
    readlink: Universalify<InputFileSystem['readlink']>;
    readdir: Universalify<InputFileSystem['readdir']>;
    stat: Universalify<InputFileSystem['stat']>;
    lstat: Universalify<InputFileSystem['lstat']>;
    realpath?: Universalify<InputFileSystem['realpath']>;
    fileExists: (arg: string) => Promise<boolean>;
    pathExists: (arg: string) => Promise<boolean>;
    purge?: (arg0?: string) => Promise<void>;
    join?: (arg0: string, arg1: string) => Promise<string>;
    relative?: (arg0: string, arg1: string) => Promise<string>;
    dirname?: (arg0: string) => Promise<string>;
    mem: IFs;
};
declare type CallbackFunction = Parameters<Compiler['run']>[0];
/**
 * webpack 封装
 * 主要目的是 共用 webpack 的能力
 */
export declare class WebpackWrapper extends EventEmitter {
    /**
     * webpack 实例, 初始化的时机为完成所有配置之后
     */
    compiler?: Compiler;
    /**
     * webpack 中的 带缓存 inputFileSystem, 共用这部分，以节省性能
     */
    private inputFileSystem;
    /**
     * webpack 中的 带缓存 fs, 共用这部分，以节省性能
     * 支持 promise 方式调用
     */
    fs: UniversalifiedInputFileSystem;
    /**
     * @deprecated
     * 请替换为直接使用 webpackWrapper.fs
     */
    promisifiedFs: UniversalifiedInputFileSystem;
    /**
     * webpack 配置
     * 该配置在 buildConfig 调用前 通过 webpackChain 生成
     */
    config?: Configuration;
    /**
     * webpack watcher 实例
     */
    watching?: Watching;
    /**
     * 提供 webpack chain 支持
     */
    private webpackChain;
    /**
     * watch 参数
     */
    private watchOptions?;
    /**
     * 是否开启 watch
     */
    watch?: boolean;
    /**
     * 需要额外 watch 文件或文件夹
     */
    watchNodeModules?: WebpackUserConfig['watchNodeModules'];
    constructor();
    /**
     * 合并当前配置到 webpack 配置中
     * @param cnf 需要合并的配置
     */
    merge(cnf: Configuration): this;
    /**
     * 获取 webpackChain 实例, 用于修改 webpack 配置
     */
    get chain(): WebpackChain;
    /**
     * @private
     * 准备 webpack 的 config
     * 该方法调用之后 基于 chain 的修改不再生效
     * NOTE: 该方法为 编译插件内部调用, 如无特别需要请勿自行调用
     */
    buildConfig(): Configuration;
    /**
     * @private
     * 准备 webpack 相关实例
     * NOTE: 该方法为 编译插件内部调用, 如无特别需要请勿自行调用
     */
    prepare(): this;
    /**
     * 运行 webpack
     * @param callback 回调函数
     */
    run(callback?: CallbackFunction): Promise<webpack.Stats>;
    /**
     * 生成默认回调函数, 用于优化 stats 信息显示
     * @returns 默认回调函数
     */
    private makeDefaultCallback;
}
/**
 * Webpack 插件, 提供如下能力
 * 1. hooks.webpackWrapper 的 hook 触发
 * 2. 提供 webpackChain 配置支持
 */
export declare class WebpackPlugin implements Plugin {
    name: string;
    apply(runner: Runner): void;
}
export {};
