UNPKG

2.19 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6const pluginName = 'FailOnUnexpectedModuleShakingPlugin';
7
8function isExcluded(module, exclude = []) {
9 return exclude.find(excludePath => typeof excludePath === 'string' ? module === excludePath : excludePath.test(module));
10}
11
12function isSideEffectImport(module) {
13 const {
14 buildMeta
15 } = module;
16
17 if (Array.isArray(buildMeta.providedExports) && buildMeta.providedExports.length > 0) {
18 return false;
19 }
20
21 return module.reasons.every(reason => reason.dependency.constructor.name === 'HarmonyImportSideEffectDependency');
22}
23
24function isSideEffectFree(module) {
25 // `webpack/lib/optimize/SideEffectsFlagPlugin` sets this value.
26 return module.factoryMeta.sideEffectFree === true;
27}
28
29function findUnexpectedRemovals(compilation, {
30 exclude
31}) {
32 const context = compilation.options.context;
33 const removed = compilation.modules.filter(module => Boolean(module.resource)).filter(isSideEffectImport).filter(isSideEffectFree).map(module => module.resource.replace(new RegExp(`^${context}/`), './'));
34 return removed.filter(module => !isExcluded(module, exclude));
35}
36
37exports.findUnexpectedRemovals = findUnexpectedRemovals;
38
39class FailOnUnexpectedModuleShakingPlugin {
40 constructor(options = {}) {
41 this.options = {
42 exclude: options.exclude || []
43 };
44 }
45
46 apply(compiler) {
47 compiler.hooks.compilation.tap(pluginName, compilation => {
48 compilation.hooks.afterOptimizeTree.tap(pluginName, () => {
49 const removed = findUnexpectedRemovals(compilation, this.options);
50
51 if (removed.length > 0) {
52 const moduleNames = removed.sort().join('",\n "');
53 compilation.errors.push(`webpack has removed these modules:\n "${moduleNames}"\n\n` + '• If a module is necessary for production, preserve it by adding it to package.json#sideEffects (for more information, see https://github.com/webpack/webpack/tree/master/examples/side-effects)\n' + `• If a module can be safely removed, add it to ${pluginName}'s 'exclude' list`);
54 }
55 });
56 });
57 }
58
59}
60
61exports.FailOnUnexpectedModuleShakingPlugin = FailOnUnexpectedModuleShakingPlugin;
\No newline at end of file