webpack-cli
Version:
CLI for webpack & friends
100 lines (99 loc) • 4.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
class CLIPlugin {
logger;
options;
constructor(options) {
this.options = options;
}
async setupBundleAnalyzerPlugin(compiler) {
// @ts-expect-error No types right now
const { BundleAnalyzerPlugin } = (await import("webpack-bundle-analyzer")).default;
const bundleAnalyzerPlugin = compiler.options.plugins.some((plugin) => plugin instanceof BundleAnalyzerPlugin);
if (!bundleAnalyzerPlugin) {
new BundleAnalyzerPlugin().apply(compiler);
}
}
static #progressStates = [];
setupProgressPlugin(compiler) {
const { ProgressPlugin } = compiler.webpack;
const progressPlugin = compiler.options.plugins.some((plugin) => plugin instanceof ProgressPlugin);
if (progressPlugin) {
return;
}
const isProfile = this.options.progress === "profile";
const options = {
profile: isProfile,
};
if (this.options.isMultiCompiler && ProgressPlugin.createDefaultHandler) {
const handler = ProgressPlugin.createDefaultHandler(isProfile, compiler.getInfrastructureLogger("webpack.Progress"));
const idx = CLIPlugin.#progressStates.length;
CLIPlugin.#progressStates[idx] = [0];
options.handler = (progress, msg, ...args) => {
CLIPlugin.#progressStates[idx] = [progress, msg, ...args];
let sum = 0;
for (const [progress] of CLIPlugin.#progressStates) {
sum += progress;
}
handler(sum / CLIPlugin.#progressStates.length, `[${compiler.name || idx}] ${msg}`, ...args);
};
}
new ProgressPlugin(options).apply(compiler);
}
setupHelpfulOutput(compiler) {
const pluginName = "webpack-cli";
const getCompilationName = () => (compiler.name ? ` '${compiler.name}'` : "");
const logCompilation = (message) => {
if (process.env.WEBPACK_CLI_START_FINISH_FORCE_LOG) {
process.stderr.write(message);
}
else {
this.logger.log(message);
}
};
const { configPath } = this.options;
compiler.hooks.run.tap(pluginName, () => {
const name = getCompilationName();
logCompilation(`Compiler${name} starting... `);
if (configPath) {
this.logger.log(`Compiler${name} is using config: ${configPath.map((path) => `'${path}'`).join(", ")}`);
}
});
compiler.hooks.watchRun.tap(pluginName, (compiler) => {
const { bail, watch } = compiler.options;
if (bail && watch) {
this.logger.warn('You are using "bail" with "watch". "bail" will still exit webpack when the first error is found.');
}
const name = getCompilationName();
logCompilation(`Compiler${name} starting... `);
if (configPath) {
this.logger.log(`Compiler${name} is using config: '${configPath}'`);
}
});
compiler.hooks.invalid.tap(pluginName, (filename, changeTime) => {
const date = new Date(changeTime);
this.logger.log(`File '${filename}' was modified`);
this.logger.log(`Changed time is ${date} (timestamp is ${changeTime})`);
});
compiler.hooks.afterDone.tap(pluginName, () => {
const name = getCompilationName();
logCompilation(`Compiler${name} finished`);
process.nextTick(() => {
if (compiler.watchMode) {
this.logger.log(`Compiler${name} is watching files for updates...`);
}
});
});
}
apply(compiler) {
this.logger = compiler.getInfrastructureLogger("webpack-cli");
if (this.options.progress) {
this.setupProgressPlugin(compiler);
}
if (this.options.analyze) {
this.setupBundleAnalyzerPlugin(compiler);
}
this.setupHelpfulOutput(compiler);
}
}
exports.default = CLIPlugin;