webpack 4.15.0 → 4.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -20
- package/README.md +761 -758
- package/SECURITY.md +9 -9
- package/buildin/amd-define.js +3 -3
- package/buildin/amd-options.js +2 -2
- package/buildin/global.js +20 -20
- package/buildin/harmony-module.js +24 -24
- package/buildin/module.js +22 -22
- package/buildin/system.js +7 -7
- package/hot/dev-server.js +61 -61
- package/hot/emitter.js +2 -2
- package/hot/log-apply-result.js +44 -44
- package/hot/log.js +45 -45
- package/hot/only-dev-server.js +105 -105
- package/hot/poll.js +40 -37
- package/hot/signal.js +62 -62
- package/lib/APIPlugin.js +84 -84
- package/lib/AmdMainTemplatePlugin.js +87 -87
- package/lib/AsyncDependencyToInitialChunkError.js +31 -31
- package/lib/AutomaticPrefetchPlugin.js +1 -1
- package/lib/BannerPlugin.js +117 -117
- package/lib/BasicEvaluatedExpression.js +211 -211
- package/lib/CachePlugin.js +102 -102
- package/lib/CaseSensitiveModulesWarning.js +67 -67
- package/lib/Chunk.js +833 -811
- package/lib/ChunkGroup.js +4 -4
- package/lib/ChunkRenderError.js +32 -32
- package/lib/CommentCompilationWarning.js +2 -2
- package/lib/CompatibilityPlugin.js +70 -70
- package/lib/Compilation.js +46 -15
- package/lib/ConcurrentCompilationError.js +19 -19
- package/lib/ConstPlugin.js +258 -258
- package/lib/ContextExclusionPlugin.js +28 -17
- package/lib/ContextModule.js +844 -739
- package/lib/ContextModuleFactory.js +262 -256
- package/lib/ContextReplacementPlugin.js +133 -133
- package/lib/DefinePlugin.js +49 -0
- package/lib/DelegatedModule.js +5 -0
- package/lib/DelegatedModuleFactoryPlugin.js +95 -89
- package/lib/DelegatedPlugin.js +39 -39
- package/lib/DependenciesBlock.js +1 -1
- package/lib/Dependency.js +10 -4
- package/lib/DllModule.js +60 -54
- package/lib/DllModuleFactory.js +29 -29
- package/lib/DllPlugin.js +44 -44
- package/lib/DllReferencePlugin.js +132 -84
- package/lib/EntryModuleNotFoundError.js +21 -21
- package/lib/Entrypoint.js +54 -54
- package/lib/EnvironmentPlugin.js +72 -65
- package/lib/ErrorHelpers.js +60 -60
- package/lib/EvalDevToolModulePlugin.js +27 -27
- package/lib/EvalSourceMapDevToolModuleTemplatePlugin.js +115 -115
- package/lib/EvalSourceMapDevToolPlugin.js +41 -41
- package/lib/ExportPropertyMainTemplatePlugin.js +53 -53
- package/lib/ExternalModule.js +165 -159
- package/lib/ExternalsPlugin.js +23 -23
- package/lib/FlagDependencyExportsPlugin.js +146 -146
- package/lib/FlagInitialModulesAsUsedPlugin.js +36 -36
- package/lib/FunctionModuleTemplatePlugin.js +100 -100
- package/lib/Generator.js +60 -52
- package/lib/HarmonyLinkingError.js +17 -17
- package/lib/HashedModuleIdsPlugin.js +53 -53
- package/lib/HotModuleReplacementPlugin.js +411 -413
- package/lib/IgnorePlugin.js +90 -90
- package/lib/JavascriptGenerator.js +229 -229
- package/lib/JavascriptModulesPlugin.js +179 -179
- package/lib/JsonGenerator.js +55 -55
- package/lib/JsonModulesPlugin.js +30 -30
- package/lib/JsonParser.js +27 -27
- package/lib/LibManifestPlugin.js +86 -86
- package/lib/LibraryTemplatePlugin.js +153 -153
- package/lib/LoaderOptionsPlugin.js +53 -53
- package/lib/LoaderTargetPlugin.js +24 -24
- package/lib/MemoryOutputFileSystem.js +5 -5
- package/lib/Module.js +431 -391
- package/lib/ModuleBuildError.js +52 -52
- package/lib/ModuleDependencyError.js +35 -35
- package/lib/ModuleDependencyWarning.js +25 -25
- package/lib/ModuleError.js +36 -36
- package/lib/ModuleFilenameHelpers.js +178 -178
- package/lib/ModuleNotFoundError.js +23 -23
- package/lib/ModuleParseError.js +57 -57
- package/lib/ModuleTemplate.js +93 -93
- package/lib/ModuleWarning.js +36 -36
- package/lib/MultiCompiler.js +283 -283
- package/lib/MultiModule.js +87 -81
- package/lib/MultiModuleFactory.js +23 -23
- package/lib/MultiStats.js +92 -92
- package/lib/MultiWatching.js +38 -38
- package/lib/NamedChunksPlugin.js +29 -29
- package/lib/NamedModulesPlugin.js +57 -57
- package/lib/NoEmitOnErrorsPlugin.js +20 -20
- package/lib/NoModeWarning.js +23 -23
- package/lib/NodeStuffPlugin.js +197 -179
- package/lib/NormalModule.js +542 -536
- package/lib/NormalModuleFactory.js +526 -526
- package/lib/NormalModuleReplacementPlugin.js +51 -51
- package/lib/NullFactory.js +12 -12
- package/lib/OptionsApply.js +10 -10
- package/lib/OptionsDefaulter.js +84 -84
- package/lib/Parser.js +2202 -2193
- package/lib/ParserHelpers.js +103 -103
- package/lib/PrefetchPlugin.js +37 -37
- package/lib/ProgressPlugin.js +246 -246
- package/lib/ProvidePlugin.js +86 -86
- package/lib/RawModule.js +56 -56
- package/lib/RecordIdsPlugin.js +230 -230
- package/lib/RemovedPluginError.js +11 -11
- package/lib/RequestShortener.js +83 -83
- package/lib/RequireJsStuffPlugin.js +69 -69
- package/lib/ResolverFactory.js +64 -64
- package/lib/RuntimeTemplate.js +12 -0
- package/lib/SetVarMainTemplatePlugin.js +69 -69
- package/lib/SingleEntryPlugin.js +6 -1
- package/lib/SizeFormatHelpers.js +24 -24
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +49 -49
- package/lib/SourceMapDevToolPlugin.js +301 -301
- package/lib/Stats.js +28 -5
- package/lib/TemplatedPathPlugin.js +173 -173
- package/lib/UnsupportedFeatureWarning.js +22 -22
- package/lib/UseStrictPlugin.js +54 -54
- package/lib/WarnCaseSensitiveModulesPlugin.js +37 -37
- package/lib/WarnNoModeSetPlugin.js +17 -17
- package/lib/WatchIgnorePlugin.js +100 -100
- package/lib/Watching.js +194 -194
- package/lib/WebpackOptionsApply.js +92 -10
- package/lib/WebpackOptionsDefaulter.js +368 -354
- package/lib/debug/ProfilingPlugin.js +430 -430
- package/lib/dependencies/AMDPlugin.js +250 -250
- package/lib/dependencies/AMDRequireArrayDependency.js +49 -49
- package/lib/dependencies/AMDRequireContextDependency.js +20 -20
- package/lib/dependencies/AMDRequireDependency.js +135 -135
- package/lib/dependencies/AMDRequireItemDependency.js +22 -22
- package/lib/dependencies/CommonJsPlugin.js +161 -161
- package/lib/dependencies/CommonJsRequireContextDependency.js +23 -23
- package/lib/dependencies/CommonJsRequireDependency.js +22 -22
- package/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +6 -0
- package/lib/dependencies/ConstDependency.js +33 -33
- package/lib/dependencies/ContextDependency.js +68 -68
- package/lib/dependencies/ContextDependencyHelpers.js +142 -142
- package/lib/dependencies/ContextDependencyTemplateAsId.js +42 -42
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +38 -38
- package/lib/dependencies/ContextElementDependency.js +21 -21
- package/lib/dependencies/CriticalDependencyWarning.js +20 -20
- package/lib/dependencies/DelegatedSourceDependency.js +18 -18
- package/lib/dependencies/DllEntryDependency.js +20 -20
- package/lib/dependencies/HarmonyAcceptDependency.js +45 -45
- package/lib/dependencies/HarmonyCompatibilityDependency.js +31 -31
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +92 -92
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +139 -139
- package/lib/dependencies/HarmonyExportHeaderDependency.js +30 -30
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +2 -1
- package/lib/dependencies/HarmonyImportDependency.js +109 -109
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +222 -222
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +31 -31
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +167 -167
- package/lib/dependencies/HarmonyInitDependency.js +60 -60
- package/lib/dependencies/HarmonyModulesPlugin.js +146 -146
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +26 -26
- package/lib/dependencies/ImportContextDependency.js +23 -23
- package/lib/dependencies/ImportDependenciesBlock.js +18 -18
- package/lib/dependencies/ImportDependency.js +34 -34
- package/lib/dependencies/ImportEagerDependency.js +32 -32
- package/lib/dependencies/ImportParserPlugin.js +263 -263
- package/lib/dependencies/ImportPlugin.js +82 -82
- package/lib/dependencies/ImportWeakDependency.js +34 -34
- package/lib/dependencies/LoaderPlugin.js +18 -1
- package/lib/dependencies/LocalModule.js +23 -23
- package/lib/dependencies/LocalModulesHelpers.js +52 -52
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +17 -17
- package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +17 -17
- package/lib/dependencies/ModuleHotAcceptDependency.js +23 -23
- package/lib/dependencies/ModuleHotDeclineDependency.js +23 -23
- package/lib/dependencies/NullDependency.js +20 -20
- package/lib/dependencies/PrefetchDependency.js +18 -18
- package/lib/dependencies/RequireContextDependency.js +22 -22
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +56 -56
- package/lib/dependencies/RequireContextPlugin.js +143 -143
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +33 -33
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +116 -116
- package/lib/dependencies/RequireEnsureDependency.js +58 -58
- package/lib/dependencies/RequireEnsureItemDependency.js +21 -21
- package/lib/dependencies/RequireEnsurePlugin.js +74 -74
- package/lib/dependencies/RequireHeaderDependency.js +26 -26
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +23 -23
- package/lib/dependencies/RequireIncludePlugin.js +61 -61
- package/lib/dependencies/RequireResolveContextDependency.js +23 -23
- package/lib/dependencies/RequireResolveDependency.js +22 -22
- package/lib/dependencies/RequireResolveDependencyParserPlugin.js +85 -85
- package/lib/dependencies/RequireResolveHeaderDependency.js +26 -26
- package/lib/dependencies/SystemPlugin.js +125 -125
- package/lib/dependencies/UnsupportedDependency.js +27 -27
- package/lib/dependencies/WebAssemblyExportImportedDependency.js +29 -29
- package/lib/dependencies/WebAssemblyImportDependency.js +48 -48
- package/lib/dependencies/WebpackMissingModule.js +20 -20
- package/lib/formatLocation.js +75 -61
- package/lib/node/NodeChunkTemplatePlugin.js +31 -31
- package/lib/node/NodeEnvironmentPlugin.js +28 -28
- package/lib/node/NodeHotUpdateChunkTemplatePlugin.js +36 -36
- package/lib/node/NodeMainTemplate.runtime.js +27 -27
- package/lib/node/NodeMainTemplatePlugin.js +323 -323
- package/lib/node/NodeOutputFileSystem.js +22 -22
- package/lib/node/NodeSourcePlugin.js +144 -144
- package/lib/node/NodeTargetPlugin.js +18 -18
- package/lib/node/NodeTemplatePlugin.js +31 -31
- package/lib/node/NodeWatchFileSystem.js +99 -99
- package/lib/node/ReadFileCompileWasmTemplatePlugin.js +61 -61
- package/lib/optimize/AggressiveMergingPlugin.js +87 -87
- package/lib/optimize/AggressiveSplittingPlugin.js +287 -287
- package/lib/optimize/ConcatenatedModule.js +5 -0
- package/lib/optimize/EnsureChunkConditionsPlugin.js +70 -70
- package/lib/optimize/FlagIncludedChunksPlugin.js +99 -99
- package/lib/optimize/LimitChunkCountPlugin.js +66 -66
- package/lib/optimize/MergeDuplicateChunksPlugin.js +78 -78
- package/lib/optimize/MinChunkSizePlugin.js +77 -77
- package/lib/optimize/NaturalChunkOrderPlugin.js +41 -0
- package/lib/optimize/OccurrenceChunkOrderPlugin.js +61 -0
- package/lib/optimize/OccurrenceModuleOrderPlugin.js +103 -0
- package/lib/optimize/OccurrenceOrderPlugin.js +135 -133
- package/lib/optimize/RemoveEmptyChunksPlugin.js +42 -42
- package/lib/optimize/RemoveParentModulesPlugin.js +127 -127
- package/lib/optimize/RuntimeChunkPlugin.js +41 -41
- package/lib/optimize/SideEffectsFlagPlugin.js +168 -168
- package/lib/optimize/SplitChunksPlugin.js +866 -850
- package/lib/performance/AssetsOverSizeLimitWarning.js +30 -30
- package/lib/performance/EntrypointsOverSizeLimitWarning.js +30 -30
- package/lib/performance/NoAsyncChunksWarning.js +21 -21
- package/lib/performance/SizeLimitsPlugin.js +105 -105
- package/lib/util/SortableSet.js +1 -0
- package/lib/util/StackedSetMap.js +144 -135
- package/lib/util/TrackingSet.js +35 -35
- package/lib/util/cachedMerge.js +35 -35
- package/lib/util/deterministicGrouping.js +251 -251
- package/lib/util/identifier.js +103 -103
- package/lib/util/objectToMap.js +16 -16
- package/lib/validateSchema.js +67 -67
- package/lib/wasm/UnsupportedWebAssemblyFeatureError.js +17 -17
- package/lib/wasm/WasmFinalizeExportsPlugin.js +1 -1
- package/lib/wasm/WebAssemblyGenerator.js +16 -2
- package/lib/wasm/WebAssemblyJavascriptGenerator.js +147 -133
- package/lib/wasm/WebAssemblyParser.js +174 -174
- package/lib/wasm/WebAssemblyUtils.js +59 -59
- package/lib/web/FetchCompileWasmTemplatePlugin.js +37 -37
- package/lib/web/JsonpExportMainTemplatePlugin.js +47 -47
- package/lib/web/JsonpHotUpdateChunkTemplatePlugin.js +39 -39
- package/lib/web/JsonpMainTemplate.runtime.js +65 -65
- package/lib/web/JsonpMainTemplatePlugin.js +1 -1
- package/lib/web/JsonpTemplatePlugin.js +23 -23
- package/lib/web/WebEnvironmentPlugin.js +18 -18
- package/lib/webpack.js +5 -0
- package/lib/webworker/WebWorkerChunkTemplatePlugin.js +35 -35
- package/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +40 -40
- package/lib/webworker/WebWorkerMainTemplate.runtime.js +65 -65
- package/lib/webworker/WebWorkerMainTemplatePlugin.js +196 -196
- package/lib/webworker/WebWorkerTemplatePlugin.js +25 -25
- package/package.json +22 -13
- package/schemas/WebpackOptions.json +2062 -2036
- package/schemas/ajv.absolutePath.js +55 -55
- package/schemas/plugins/BannerPlugin.json +96 -96
- package/schemas/plugins/DllPlugin.json +32 -32
- package/schemas/plugins/DllReferencePlugin.json +99 -99
- package/schemas/plugins/HashedModuleIdsPlugin.json +24 -24
- package/schemas/plugins/LoaderOptionsPlugin.json +26 -26
- package/schemas/plugins/SourceMapDevToolPlugin.json +187 -187
- package/schemas/plugins/WatchIgnorePlugin.json +16 -16
- package/schemas/plugins/debug/ProfilingPlugin.json +12 -12
- package/schemas/plugins/optimize/AggressiveSplittingPlugin.json +22 -22
- package/schemas/plugins/optimize/LimitChunkCountPlugin.json +15 -15
- package/schemas/plugins/optimize/MinChunkSizePlugin.json +13 -13
- package/schemas/plugins/optimize/OccurrenceOrderChunkIdsPlugin.json +10 -0
- package/schemas/plugins/optimize/OccurrenceOrderModuleIdsPlugin.json +10 -0
@@ -1,168 +1,168 @@
|
|
1
|
-
/*
|
2
|
-
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
-
Author Tobias Koppers @sokra
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
const mm = require("micromatch");
|
8
|
-
const HarmonyExportImportedSpecifierDependency = require("../dependencies/HarmonyExportImportedSpecifierDependency");
|
9
|
-
const HarmonyImportSideEffectDependency = require("../dependencies/HarmonyImportSideEffectDependency");
|
10
|
-
const HarmonyImportSpecifierDependency = require("../dependencies/HarmonyImportSpecifierDependency");
|
11
|
-
|
12
|
-
/** @typedef {import("../Module")} Module */
|
13
|
-
/** @typedef {import("../Dependency")} Dependency */
|
14
|
-
|
15
|
-
/**
|
16
|
-
* @typedef {Object} ExportInModule
|
17
|
-
* @property {Module} module the module
|
18
|
-
* @property {string} exportName the name of the export
|
19
|
-
*/
|
20
|
-
|
21
|
-
class SideEffectsFlagPlugin {
|
22
|
-
apply(compiler) {
|
23
|
-
compiler.hooks.normalModuleFactory.tap("SideEffectsFlagPlugin", nmf => {
|
24
|
-
nmf.hooks.module.tap("SideEffectsFlagPlugin", (module, data) => {
|
25
|
-
const resolveData = data.resourceResolveData;
|
26
|
-
if (
|
27
|
-
resolveData &&
|
28
|
-
resolveData.descriptionFileData &&
|
29
|
-
resolveData.relativePath
|
30
|
-
) {
|
31
|
-
const sideEffects = resolveData.descriptionFileData.sideEffects;
|
32
|
-
const hasSideEffects = SideEffectsFlagPlugin.moduleHasSideEffects(
|
33
|
-
resolveData.relativePath,
|
34
|
-
sideEffects
|
35
|
-
);
|
36
|
-
if (!hasSideEffects) {
|
37
|
-
module.factoryMeta.sideEffectFree = true;
|
38
|
-
}
|
39
|
-
}
|
40
|
-
|
41
|
-
return module;
|
42
|
-
});
|
43
|
-
nmf.hooks.module.tap("SideEffectsFlagPlugin", (module, data) => {
|
44
|
-
if (data.settings.sideEffects === false) {
|
45
|
-
module.factoryMeta.sideEffectFree = true;
|
46
|
-
} else if (data.settings.sideEffects === true) {
|
47
|
-
module.factoryMeta.sideEffectFree = false;
|
48
|
-
}
|
49
|
-
});
|
50
|
-
});
|
51
|
-
compiler.hooks.compilation.tap("SideEffectsFlagPlugin", compilation => {
|
52
|
-
compilation.hooks.optimizeDependencies.tap(
|
53
|
-
"SideEffectsFlagPlugin",
|
54
|
-
modules => {
|
55
|
-
/** @type {Map<Module, Map<string, ExportInModule>>} */
|
56
|
-
const reexportMaps = new Map();
|
57
|
-
|
58
|
-
// Capture reexports of sideEffectFree modules
|
59
|
-
for (const module of modules) {
|
60
|
-
/** @type {Dependency[]} */
|
61
|
-
const removeDependencies = [];
|
62
|
-
for (const dep of module.dependencies) {
|
63
|
-
if (dep instanceof HarmonyImportSideEffectDependency) {
|
64
|
-
if (dep.module && dep.module.factoryMeta.sideEffectFree) {
|
65
|
-
removeDependencies.push(dep);
|
66
|
-
}
|
67
|
-
} else if (
|
68
|
-
dep instanceof HarmonyExportImportedSpecifierDependency
|
69
|
-
) {
|
70
|
-
if (module.factoryMeta.sideEffectFree) {
|
71
|
-
const mode = dep.getMode(true);
|
72
|
-
if (mode.type === "safe-reexport") {
|
73
|
-
let map = reexportMaps.get(module);
|
74
|
-
if (!map) {
|
75
|
-
reexportMaps.set(module, (map = new Map()));
|
76
|
-
}
|
77
|
-
for (const pair of mode.map) {
|
78
|
-
map.set(pair[0], {
|
79
|
-
module: mode.module,
|
80
|
-
exportName: pair[1]
|
81
|
-
});
|
82
|
-
}
|
83
|
-
}
|
84
|
-
}
|
85
|
-
}
|
86
|
-
}
|
87
|
-
}
|
88
|
-
|
89
|
-
// Flatten reexports
|
90
|
-
for (const map of reexportMaps.values()) {
|
91
|
-
for (const pair of map) {
|
92
|
-
let mapping = pair[1];
|
93
|
-
while (mapping) {
|
94
|
-
const innerMap = reexportMaps.get(mapping.module);
|
95
|
-
if (!innerMap) break;
|
96
|
-
const newMapping = innerMap.get(mapping.exportName);
|
97
|
-
if (newMapping) {
|
98
|
-
map.set(pair[0], newMapping);
|
99
|
-
}
|
100
|
-
mapping = newMapping;
|
101
|
-
}
|
102
|
-
}
|
103
|
-
}
|
104
|
-
|
105
|
-
// Update imports along the reexports from sideEffectFree modules
|
106
|
-
for (const pair of reexportMaps) {
|
107
|
-
const module = pair[0];
|
108
|
-
const map = pair[1];
|
109
|
-
let newReasons = undefined;
|
110
|
-
for (let i = 0; i < module.reasons.length; i++) {
|
111
|
-
const reason = module.reasons[i];
|
112
|
-
const dep = reason.dependency;
|
113
|
-
if (
|
114
|
-
dep instanceof HarmonyImportSpecifierDependency &&
|
115
|
-
!dep.namespaceObjectAsContext
|
116
|
-
) {
|
117
|
-
const mapping = map.get(dep.id);
|
118
|
-
if (mapping) {
|
119
|
-
dep.redirectedModule = mapping.module;
|
120
|
-
dep.redirectedId = mapping.exportName;
|
121
|
-
mapping.module.addReason(
|
122
|
-
reason.module,
|
123
|
-
dep,
|
124
|
-
reason.explanation
|
125
|
-
? reason.explanation +
|
126
|
-
" (skipped side-effect-free modules)"
|
127
|
-
: "(skipped side-effect-free modules)"
|
128
|
-
);
|
129
|
-
// removing the currect reason, by not adding it to the newReasons array
|
130
|
-
// lazily create the newReasons array
|
131
|
-
if (newReasons === undefined) {
|
132
|
-
newReasons = i === 0 ? [] : module.reasons.slice(0, i);
|
133
|
-
}
|
134
|
-
continue;
|
135
|
-
}
|
136
|
-
}
|
137
|
-
if (newReasons !== undefined) newReasons.push(reason);
|
138
|
-
}
|
139
|
-
if (newReasons !== undefined) {
|
140
|
-
module.reasons = newReasons;
|
141
|
-
}
|
142
|
-
}
|
143
|
-
}
|
144
|
-
);
|
145
|
-
});
|
146
|
-
}
|
147
|
-
|
148
|
-
static moduleHasSideEffects(moduleName, flagValue) {
|
149
|
-
switch (typeof flagValue) {
|
150
|
-
case "undefined":
|
151
|
-
return true;
|
152
|
-
case "boolean":
|
153
|
-
return flagValue;
|
154
|
-
case "string":
|
155
|
-
if (process.platform === "win32") {
|
156
|
-
flagValue = flagValue.replace(/\\/g, "/");
|
157
|
-
}
|
158
|
-
return mm.isMatch(moduleName, flagValue, {
|
159
|
-
matchBase: true
|
160
|
-
});
|
161
|
-
case "object":
|
162
|
-
return flagValue.some(glob =>
|
163
|
-
SideEffectsFlagPlugin.moduleHasSideEffects(moduleName, glob)
|
164
|
-
);
|
165
|
-
}
|
166
|
-
}
|
167
|
-
}
|
168
|
-
module.exports = SideEffectsFlagPlugin;
|
1
|
+
/*
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
+
Author Tobias Koppers @sokra
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
const mm = require("micromatch");
|
8
|
+
const HarmonyExportImportedSpecifierDependency = require("../dependencies/HarmonyExportImportedSpecifierDependency");
|
9
|
+
const HarmonyImportSideEffectDependency = require("../dependencies/HarmonyImportSideEffectDependency");
|
10
|
+
const HarmonyImportSpecifierDependency = require("../dependencies/HarmonyImportSpecifierDependency");
|
11
|
+
|
12
|
+
/** @typedef {import("../Module")} Module */
|
13
|
+
/** @typedef {import("../Dependency")} Dependency */
|
14
|
+
|
15
|
+
/**
|
16
|
+
* @typedef {Object} ExportInModule
|
17
|
+
* @property {Module} module the module
|
18
|
+
* @property {string} exportName the name of the export
|
19
|
+
*/
|
20
|
+
|
21
|
+
class SideEffectsFlagPlugin {
|
22
|
+
apply(compiler) {
|
23
|
+
compiler.hooks.normalModuleFactory.tap("SideEffectsFlagPlugin", nmf => {
|
24
|
+
nmf.hooks.module.tap("SideEffectsFlagPlugin", (module, data) => {
|
25
|
+
const resolveData = data.resourceResolveData;
|
26
|
+
if (
|
27
|
+
resolveData &&
|
28
|
+
resolveData.descriptionFileData &&
|
29
|
+
resolveData.relativePath
|
30
|
+
) {
|
31
|
+
const sideEffects = resolveData.descriptionFileData.sideEffects;
|
32
|
+
const hasSideEffects = SideEffectsFlagPlugin.moduleHasSideEffects(
|
33
|
+
resolveData.relativePath,
|
34
|
+
sideEffects
|
35
|
+
);
|
36
|
+
if (!hasSideEffects) {
|
37
|
+
module.factoryMeta.sideEffectFree = true;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
return module;
|
42
|
+
});
|
43
|
+
nmf.hooks.module.tap("SideEffectsFlagPlugin", (module, data) => {
|
44
|
+
if (data.settings.sideEffects === false) {
|
45
|
+
module.factoryMeta.sideEffectFree = true;
|
46
|
+
} else if (data.settings.sideEffects === true) {
|
47
|
+
module.factoryMeta.sideEffectFree = false;
|
48
|
+
}
|
49
|
+
});
|
50
|
+
});
|
51
|
+
compiler.hooks.compilation.tap("SideEffectsFlagPlugin", compilation => {
|
52
|
+
compilation.hooks.optimizeDependencies.tap(
|
53
|
+
"SideEffectsFlagPlugin",
|
54
|
+
modules => {
|
55
|
+
/** @type {Map<Module, Map<string, ExportInModule>>} */
|
56
|
+
const reexportMaps = new Map();
|
57
|
+
|
58
|
+
// Capture reexports of sideEffectFree modules
|
59
|
+
for (const module of modules) {
|
60
|
+
/** @type {Dependency[]} */
|
61
|
+
const removeDependencies = [];
|
62
|
+
for (const dep of module.dependencies) {
|
63
|
+
if (dep instanceof HarmonyImportSideEffectDependency) {
|
64
|
+
if (dep.module && dep.module.factoryMeta.sideEffectFree) {
|
65
|
+
removeDependencies.push(dep);
|
66
|
+
}
|
67
|
+
} else if (
|
68
|
+
dep instanceof HarmonyExportImportedSpecifierDependency
|
69
|
+
) {
|
70
|
+
if (module.factoryMeta.sideEffectFree) {
|
71
|
+
const mode = dep.getMode(true);
|
72
|
+
if (mode.type === "safe-reexport") {
|
73
|
+
let map = reexportMaps.get(module);
|
74
|
+
if (!map) {
|
75
|
+
reexportMaps.set(module, (map = new Map()));
|
76
|
+
}
|
77
|
+
for (const pair of mode.map) {
|
78
|
+
map.set(pair[0], {
|
79
|
+
module: mode.module,
|
80
|
+
exportName: pair[1]
|
81
|
+
});
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}
|
85
|
+
}
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
// Flatten reexports
|
90
|
+
for (const map of reexportMaps.values()) {
|
91
|
+
for (const pair of map) {
|
92
|
+
let mapping = pair[1];
|
93
|
+
while (mapping) {
|
94
|
+
const innerMap = reexportMaps.get(mapping.module);
|
95
|
+
if (!innerMap) break;
|
96
|
+
const newMapping = innerMap.get(mapping.exportName);
|
97
|
+
if (newMapping) {
|
98
|
+
map.set(pair[0], newMapping);
|
99
|
+
}
|
100
|
+
mapping = newMapping;
|
101
|
+
}
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
// Update imports along the reexports from sideEffectFree modules
|
106
|
+
for (const pair of reexportMaps) {
|
107
|
+
const module = pair[0];
|
108
|
+
const map = pair[1];
|
109
|
+
let newReasons = undefined;
|
110
|
+
for (let i = 0; i < module.reasons.length; i++) {
|
111
|
+
const reason = module.reasons[i];
|
112
|
+
const dep = reason.dependency;
|
113
|
+
if (
|
114
|
+
dep instanceof HarmonyImportSpecifierDependency &&
|
115
|
+
!dep.namespaceObjectAsContext
|
116
|
+
) {
|
117
|
+
const mapping = map.get(dep.id);
|
118
|
+
if (mapping) {
|
119
|
+
dep.redirectedModule = mapping.module;
|
120
|
+
dep.redirectedId = mapping.exportName;
|
121
|
+
mapping.module.addReason(
|
122
|
+
reason.module,
|
123
|
+
dep,
|
124
|
+
reason.explanation
|
125
|
+
? reason.explanation +
|
126
|
+
" (skipped side-effect-free modules)"
|
127
|
+
: "(skipped side-effect-free modules)"
|
128
|
+
);
|
129
|
+
// removing the currect reason, by not adding it to the newReasons array
|
130
|
+
// lazily create the newReasons array
|
131
|
+
if (newReasons === undefined) {
|
132
|
+
newReasons = i === 0 ? [] : module.reasons.slice(0, i);
|
133
|
+
}
|
134
|
+
continue;
|
135
|
+
}
|
136
|
+
}
|
137
|
+
if (newReasons !== undefined) newReasons.push(reason);
|
138
|
+
}
|
139
|
+
if (newReasons !== undefined) {
|
140
|
+
module.reasons = newReasons;
|
141
|
+
}
|
142
|
+
}
|
143
|
+
}
|
144
|
+
);
|
145
|
+
});
|
146
|
+
}
|
147
|
+
|
148
|
+
static moduleHasSideEffects(moduleName, flagValue) {
|
149
|
+
switch (typeof flagValue) {
|
150
|
+
case "undefined":
|
151
|
+
return true;
|
152
|
+
case "boolean":
|
153
|
+
return flagValue;
|
154
|
+
case "string":
|
155
|
+
if (process.platform === "win32") {
|
156
|
+
flagValue = flagValue.replace(/\\/g, "/");
|
157
|
+
}
|
158
|
+
return mm.isMatch(moduleName, flagValue, {
|
159
|
+
matchBase: true
|
160
|
+
});
|
161
|
+
case "object":
|
162
|
+
return flagValue.some(glob =>
|
163
|
+
SideEffectsFlagPlugin.moduleHasSideEffects(moduleName, glob)
|
164
|
+
);
|
165
|
+
}
|
166
|
+
}
|
167
|
+
}
|
168
|
+
module.exports = SideEffectsFlagPlugin;
|