UNPKG

@morjs/utils

Version:
142 lines (141 loc) 4.8 kB
/// <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 {};