/
WebpackCLIPlugin.js
114 lines (89 loc) · 3.93 KB
/
WebpackCLIPlugin.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
const { packageExists } = require('../utils/package-exists');
const webpack = packageExists('webpack') ? require('webpack') : undefined;
const { getStatsOptions } = require('../utils/stats-options');
const { PluginName } = require('../utils/name');
class WebpackCLIPlugin {
constructor(options) {
this.options = options;
this.isWatch = false;
}
async apply(compiler) {
const { progress } = this.options;
if (progress) {
this.appendProgressPlugin(compiler, progress);
}
const logger = compiler.getInfrastructureLogger(PluginName);
const resolveName = (obj) => (obj.name ? `${obj.name} ` : '');
const done = (stats) => {
const printStats = (childCompiler, childStats) => {
const statusOptions = (value) => ({
version: value,
timings: value,
});
const statsOptions = {
...getStatsOptions(childCompiler),
...statusOptions(false),
};
const statsString = resolveName(childCompiler) + 'output:\n' + childStats.toString(statsOptions);
if (statsString.length) {
if (childStats.hasErrors()) {
logger.error(statsString);
} else if (childStats.hasWarnings()) {
logger.warn(statsString);
} else {
logger.info(statsString);
}
}
const status = childStats.toString({ preset: 'none', ...statusOptions(true) });
if (childStats.hasErrors()) {
logger.error(status);
} else if (childStats.hasWarnings()) {
logger.warn(status);
} else {
logger.info(status);
}
if (this.isWatch) {
logger.info(resolveName(childCompiler) + 'watching files for updates...');
}
};
if (compiler.compilers) {
compiler.compilers.forEach((compilerFromMultiCompileMode, index) => {
printStats(compilerFromMultiCompileMode, stats.stats[index]);
});
} else {
printStats(compiler, stats);
}
};
compiler.hooks.run.tap(PluginName, (compilation) => {
logger.info(resolveName(compilation) + 'compilation starting...');
});
compiler.hooks.watchRun.tap(PluginName, (compilation) => {
logger.info(resolveName(compilation) + 'compilation starting...');
if (compilation.options.bail) {
logger.warn('you are using "bail" with "watch". "bail" will still exit webpack when the first error is found.');
}
this.isWatch = true;
});
compiler.hooks.done.tap(PluginName, done);
}
appendProgressPlugin(compiler, progress) {
const { ProgressPlugin } = compiler.webpack || webpack;
const logger = compiler.getInfrastructureLogger(PluginName);
const compilers = compiler.compilers || [compiler];
for (const compiler of compilers) {
let progressPluginExists;
if (compiler.options.plugins) {
progressPluginExists = Boolean(compiler.options.plugins.find((plugin) => plugin instanceof ProgressPlugin));
}
if (!progressPluginExists) {
if (typeof progress === 'string' && progress !== 'profile') {
logger.error(`'${progress}' is an invalid value for the --progress option. Only 'profile' is allowed.`);
process.exit(2);
}
const isProfile = progress === 'profile';
new ProgressPlugin({ profile: isProfile }).apply(compiler);
}
}
}
}
module.exports = WebpackCLIPlugin;