1 | "use strict";
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | const pluginName = 'FailOnUnexpectedModuleShakingPlugin';
|
7 |
|
8 | function isExcluded(module, exclude = []) {
|
9 | return exclude.find(excludePath => typeof excludePath === 'string' ? module === excludePath : excludePath.test(module));
|
10 | }
|
11 |
|
12 | function 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 |
|
24 | function isSideEffectFree(module) {
|
25 |
|
26 | return module.factoryMeta.sideEffectFree === true;
|
27 | }
|
28 |
|
29 | function 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 |
|
37 | exports.findUnexpectedRemovals = findUnexpectedRemovals;
|
38 |
|
39 | class 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 |
|
61 | exports.FailOnUnexpectedModuleShakingPlugin = FailOnUnexpectedModuleShakingPlugin; |
\ | No newline at end of file |